.buildpath\r
.externalToolBuilders\r
.settings\r
-#ignore OSX .DS_Store files \r
+#ignore OSX .DS_Store files\r
.DS_Store\r
\r
/nbproject/private/\r
[main]
host = https://www.transifex.com
-[friendica.addon_appnet_messagespo]
-file_filter = appnet/lang/<lang>/messages.po
-source_file = appnet/lang/C/messages.po
-source_lang = en
-type = PO
-
[friendica.addon_blackout_messagespo]
file_filter = blackout/lang/<lang>/messages.po
source_file = blackout/lang/C/messages.po
source_lang = en
type = PO
-[friendica.addon_cal_messagespo]
-file_filter = cal/lang/<lang>/messages.po
-source_file = cal/lang/C/messages.po
-source_lang = en
-type = PO
-
[friendica.addon_communityhome_messagespo]
file_filter = communityhome/lang/<lang>/messages.po
source_file = communityhome/lang/C/messages.po
source_lang = en
type = PO
-[friendica.addon_editplain_messagespo]
-file_filter = editplain/lang/<lang>/messages.po
-source_file = editplain/lang/C/messages.po
-source_lang = en
-type = PO
-
[friendica.addon_forumdirectory_messagespo]
file_filter = forumdirectory/lang/<lang>/messages.po
source_file = forumdirectory/lang/C/messages.po
source_lang = en
type = PO
-[friendica.addon_forumlist_messagespo]
-file_filter = forumlist/lang/<lang>/messages.po
-source_file = forumlist/lang/C/messages.po
-source_lang = en
-type = PO
-
[friendica.addon_fromapp_messagespo]
file_filter = fromapp/lang/<lang>/messages.po
source_file = fromapp/lang/C/messages.po
source_lang = en
type = PO
-[friendica.addon_gpluspost_messagespo]
-file_filter = gpluspost/lang/<lang>/messages.po
-source_file = gpluspost/lang/C/messages.po
-source_lang = en
-type = PO
-
[friendica.addon_gravatar_messagespo]
file_filter = gravatar/lang/<lang>/messages.po
source_file = gravatar/lang/C/messages.po
source_lang = en
type = PO
+[friendica.addon_securemail_messagespo]
+file_filter = securemail/lang/<lang>/messages.po
+source_file = securemail/lang/C/messages.po
+source_lang = en
+type = PO
+
[friendica.addon_showmore_messagespo]
file_filter = showmore/lang/<lang>/messages.po
source_file = showmore/lang/C/messages.po
source_lang = en
type = PO
-[friendica.addon_snautofollow_messagespo]
-file_filter = snautofollow/lang/<lang>/messages.po
-source_file = snautofollow/lang/C/messages.po
-source_lang = en
-type = PO
-
[friendica.addon_startpage_messagespo]
file_filter = startpage/lang/<lang>/messages.po
source_file = startpage/lang/C/messages.po
source_lang = en
type = PO
-[friendica.addon_uhremotestorage_messagespo]
-file_filter = uhremotestorage/lang/<lang>/messages.po
-source_file = uhremotestorage/lang/C/messages.po
+[friendica.addon_viewsrc_messagespo]
+file_filter = viewsrc/lang/<lang>/messages.po
+source_file = viewsrc/lang/C/messages.po
source_lang = en
type = PO
source_lang = en
type = PO
+[friendica.addon_xmpp_messagespo]
+file_filter = xmpp/lang/<lang>/messages.po
+source_file = xmpp/lang/C/messages.po
+source_lang = en
+type = PO
+
[friendica.addon_yourls_messagespo]
file_filter = yourls/lang/<lang>/messages.po
source_file = yourls/lang/C/messages.po
To install all addons using git, cd into your top level Friendica directory and
-git clone https://github.com/friendica/friendica-addons.git addon
+ git clone https://github.com/friendica/friendica-addons.git addon
+ util/composer.phar install -d addon
-This will clone the entire repository in a directory called addon. They can now be activated in the plugins section of your admin panel.
+This will clone the entire repository in a directory called addon. They can now be activated in the addons section of your admin panel.
********************
* Install Manually *
1. Download the archive (Download ZIP button) containing the addons.
2. Unzip the contents of the archive to your harddrive.
3. Upload the extracted directory and all it's contents to /path/to/friendica/addon. You will need to create the addon directory if this is the first addon you have installed.
-4. Activate the addon in the plugins section of your admin panel.
+4. Activate the addon in the addons section of your admin panel.
Addons for Friendica
====================
-This repository is a collection of plugins for the [Friendica Social Communications Server](https://github.com/friendica/friendica).
-You can add these plugins to the /addon directory of your Friendica installation
+This repository is a collection of addons for the [Friendica Social Communications Server](https://github.com/friendica/friendica).
+You can add these addons to the /addon directory of your Friendica installation
do extend the functionality of your node.
After uploading the addons to your server, you need to activate the desired addons
Connectors
----------
-Among these plugins there are also the [connectors](https://github.com/friendica/friendica/blob/master/doc/Connectors.md) for various other networks
+Among these addons there are also the [connectors](https://github.com/friendica/friendica/blob/master/doc/Connectors.md) for various other networks
(e.g. Twitter, pump.io, Google+) that are needed for communication when the
protocoll is not supported by Friendica core (DFRN, OStatus and Diaspora).
The addon interface of Friendica is very flexible and powerful, so if you are
missing functionality, your chances are high it may be added with an addon.
-See the [documentation](https://github.com/friendica/friendica/blob/master/doc/Plugins.md) for more informations on the plugin development.
+See the [documentation](https://github.com/friendica/friendica/blob/master/doc/Addons.md) for more informations on the addon development.
Addons can be translated like any other part of Friendica. Translations for the
addons included in this repository are done at the [Transifex project](https://www.transifex.com/projects/p/friendica/) for Friendica.
About
-----
-This plugin will allow you to enter a date/time period during which
+This addon will allow you to enter a date/time period during which
all your ~friendica visitors from the web will be redirected to a page
you can configure in the admin panel as well.
Calls to the API and the communication with other ~friendica nodes is
-not effected from this plugin.
+not effected from this addon.
If you enter a period the current date would be affected none of the
currently logged in users will be effected as well. But if they log
* About
* =====
*
- * This plugin will allow you to enter a date/time period during which
+ * This addon will allow you to enter a date/time period during which
* all your ~friendica visitors from the web will be redirected to a page
* you can configure in the admin panel as well.
*
* Calls to the API and the communication with other ~friendica nodes is
- * not effected from this plugin.
+ * not effected from this addon.
*
* If you enter a period the current date would be affected none of the
* currently logged in users will be effected as well. But if they log
* THE SOFTWARE.
*/
+use Friendica\Core\Config;
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
function blackout_install() {
- register_hook('page_header', 'addon/blackout/blackout.php', 'blackout_redirect');
+ Addon::registerHook('page_header', 'addon/blackout/blackout.php', 'blackout_redirect');
}
function blackout_uninstall() {
- unregister_hook('page_header', 'addon/blackout/blackout.php', 'blackout_redirect');
+ Addon::unregisterHook('page_header', 'addon/blackout/blackout.php', 'blackout_redirect');
}
function blackout_redirect ($a, $b) {
// if we have a logged in user, don't throw her out
}
}
-function blackout_plugin_admin(&$a, &$o) {
- $mystart = get_config('blackout','begindate');
+function blackout_addon_admin(&$a, &$o) {
+ $mystart = Config::get('blackout','begindate');
if (! is_string($mystart)) { $mystart = "YYYY-MM-DD:hhmm"; }
$myend = get_config('blackout','enddate');
if (! is_string($myend)) { $myend = "YYYY-MM-DD:hhmm"; }
$myurl = get_config('blackout','url');
if (! is_string($myurl)) { $myurl = "http://www.example.com"; }
$t = get_markup_template( "admin.tpl", "addon/blackout/" );
-
- $o = replace_macros($t, array(
- '$submit' => t('Save Settings'),
- '$rurl' => array("rurl", "Redirect URL", $myurl, "all your visitors from the web will be redirected to this URL"),
- '$startdate' => array("startdate", "Begin of the Blackout<br />(YYYY-MM-DD hh:mm)", $mystart, "format is <em>YYYY</em> year, <em>MM</em> month, <em>DD</em> day, <em>hh</em> hour and <em>mm</em> minute"),
- '$enddate' => array("enddate", "End of the Blackout<br />(YYYY-MM-DD hh:mm)", $myend, ""),
+
+ $o = replace_macros($t, [
+ '$submit' => L10n::t('Save Settings'),
+ '$rurl' => ["rurl", "Redirect URL", $myurl, "all your visitors from the web will be redirected to this URL"],
+ '$startdate' => ["startdate", "Begin of the Blackout<br />(YYYY-MM-DD hh:mm)", $mystart, "format is <em>YYYY</em> year, <em>MM</em> month, <em>DD</em> day, <em>hh</em> hour and <em>mm</em> minute"],
+ '$enddate' => ["enddate", "End of the Blackout<br />(YYYY-MM-DD hh:mm)", $myend, ""],
));
$date1 = DateTime::createFromFormat('Y-m-d G:i', $mystart);
$o = '<p>Please double check that the current settings for the blackout. Begin will be <strong>'.$mystart.'</strong> and it will end <strong>'.$myend.'</strong>.</p>' . $o;
}
}
-function blackout_plugin_admin_post (&$a) {
+function blackout_addon_admin_post (&$a) {
$begindate = trim($_POST['startdate']);
$enddate = trim($_POST['enddate']);
$url = trim($_POST['rurl']);
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014
+# fabrixxm <fabrix.xm@gmail.com>, 2014,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-06-22 13:18+0200\n"
-"PO-Revision-Date: 2014-09-10 10:22+0000\n"
+"PO-Revision-Date: 2018-03-19 19:50+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
<?php
-
-
/**
* Name: blockem
- * Description: block people
+ * Description: Allows users to hide content by collapsing posts and replies.
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*
*/
-
-function blockem_install() {
- register_hook('prepare_body', 'addon/blockem/blockem.php', 'blockem_prepare_body');
- register_hook('display_item', 'addon/blockem/blockem.php', 'blockem_display_item');
- register_hook('plugin_settings', 'addon/blockem/blockem.php', 'blockem_addon_settings');
- register_hook('plugin_settings_post', 'addon/blockem/blockem.php', 'blockem_addon_settings_post');
- register_hook('conversation_start', 'addon/blockem/blockem.php', 'blockem_conversation_start');
- register_hook('item_photo_menu', 'addon/blockem/blockem.php', 'blockem_item_photo_menu');
- register_hook('enotify_store', 'addon/blockem/blockem.php', 'blockem_enotify_store' );
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+
+function blockem_install()
+{
+ Addon::registerHook('prepare_body', 'addon/blockem/blockem.php', 'blockem_prepare_body');
+ Addon::registerHook('display_item', 'addon/blockem/blockem.php', 'blockem_display_item');
+ Addon::registerHook('addon_settings', 'addon/blockem/blockem.php', 'blockem_addon_settings');
+ Addon::registerHook('addon_settings_post', 'addon/blockem/blockem.php', 'blockem_addon_settings_post');
+ Addon::registerHook('conversation_start', 'addon/blockem/blockem.php', 'blockem_conversation_start');
+ Addon::registerHook('item_photo_menu', 'addon/blockem/blockem.php', 'blockem_item_photo_menu');
+ Addon::registerHook('enotify_store', 'addon/blockem/blockem.php', 'blockem_enotify_store');
}
-
-function blockem_uninstall() {
- unregister_hook('prepare_body', 'addon/blockem/blockem.php', 'blockem_prepare_body');
- unregister_hook('display_item', 'addon/blockem/blockem.php', 'blockem_display_item');
- unregister_hook('plugin_settings', 'addon/blockem/blockem.php', 'blockem_addon_settings');
- unregister_hook('plugin_settings_post', 'addon/blockem/blockem.php', 'blockem_addon_settings_post');
- unregister_hook('conversation_start', 'addon/blockem/blockem.php', 'blockem_conversation_start');
- unregister_hook('item_photo_menu', 'addon/blockem/blockem.php', 'blockem_item_photo_menu');
- unregister_hook('enotify_store', 'addon/blockem/blockem.php', 'blockem_enotify_store' );
-
+function blockem_uninstall()
+{
+ Addon::unregisterHook('prepare_body', 'addon/blockem/blockem.php', 'blockem_prepare_body');
+ Addon::unregisterHook('display_item', 'addon/blockem/blockem.php', 'blockem_display_item');
+ Addon::unregisterHook('addon_settings', 'addon/blockem/blockem.php', 'blockem_addon_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/blockem/blockem.php', 'blockem_addon_settings_post');
+ Addon::unregisterHook('conversation_start', 'addon/blockem/blockem.php', 'blockem_conversation_start');
+ Addon::unregisterHook('item_photo_menu', 'addon/blockem/blockem.php', 'blockem_item_photo_menu');
+ Addon::unregisterHook('enotify_store', 'addon/blockem/blockem.php', 'blockem_enotify_store');
}
-
-
-
-
-function blockem_addon_settings(&$a,&$s) {
+function blockem_addon_settings(&$a, &$s)
+{
if(! local_user())
return;
$a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' . $a->get_baseurl() . '/addon/blockem/blockem.css' . '" media="all" />' . "\r\n";
- $words = get_pconfig(local_user(),'blockem','words');
+ $words = PConfig::get(local_user(), 'blockem', 'words');
if(! $words)
$words = '';
$s .= '<span id="settings_blockem_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_blockem_expanded\'); openClose(\'settings_blockem_inflated\');">';
- $s .= '<h3>' . t('"Blockem"') . '</h3>';
+ $s .= '<h3>' . L10n::t('"Blockem"') . '</h3>';
$s .= '</span>';
$s .= '<div id="settings_blockem_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_blockem_expanded\'); openClose(\'settings_blockem_inflated\');">';
- $s .= '<h3>' . t('"Blockem"') . '</h3>';
+ $s .= '<h3>' . L10n::t('"Blockem"') . '</h3>';
$s .= '</span>';
$s .= '<div id="blockem-wrapper">';
- $s .= '<label id="blockem-label" for="blockem-words">' . t('Comma separated profile URLS to block') . ' </label>';
+ $s .= '<div id="blockem-desc">'. L10n::t("Hides user's content by collapsing posts. Also replaces their avatar with generic image.") . ' </div>';
+ $s .= '<label id="blockem-label" for="blockem-words">' . L10n::t('Comma separated profile URLS:') . ' </label>';
$s .= '<textarea id="blockem-words" type="text" name="blockem-words" >' . htmlspecialchars($words) . '</textarea>';
$s .= '</div><div class="clear"></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="blockem-submit" name="blockem-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="blockem-submit" name="blockem-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
return;
return;
if($_POST['blockem-submit']) {
- set_pconfig(local_user(),'blockem','words',trim($_POST['blockem-words']));
- info( t('BLOCKEM Settings saved.') . EOL);
+ PConfig::set(local_user(),'blockem','words',trim($_POST['blockem-words']));
+ info(L10n::t('BLOCKEM Settings saved.') . EOL);
}
}
-
function blockem_enotify_store(&$a,&$b) {
$words = get_pconfig($b['uid'],'blockem','words');
}
if($found) {
$rnd = random_string(8);
- $b['html'] = '<div id="blockem-wrap-' . $rnd . '" class="fakelink" onclick=openClose(\'blockem-' . $rnd . '\'); >' . sprintf( t('Blocked %s - Click to open/close'),$word ) . '</div><div id="blockem-' . $rnd . '" style="display: none; " >' . $b['html'] . '</div>';
+ $b['html'] = '<div id="blockem-wrap-' . $rnd . '" class="fakelink" onclick=openClose(\'blockem-' . $rnd . '\'); >' . L10n::t('Hidden content by %s - Click to open/close', $word) . '</div><div id="blockem-' . $rnd . '" style="display: none; " >' . $b['html'] . '</div>';
}
}
-
function blockem_display_item(&$a,&$b) {
if(strstr($b['output']['body'],'id="blockem-wrap-'))
$b['output']['thumb'] = $a->get_baseurl() . "/images/person-80.jpg";
}
-
function blockem_conversation_start(&$a,&$b) {
if(! local_user())
}
}
if($blocked)
- $b['menu'][ t('Unblock Author')] = 'javascript:blockemUnblock(\'' . $author . '\');';
+ $b['menu'][L10n::t('Unblock Author')] = 'javascript:blockemUnblock(\'' . $author . '\');';
else
- $b['menu'][ t('Block Author')] = 'javascript:blockemBlock(\'' . $author . '\');';
+ $b['menu'][L10n::t('Block Author')] = 'javascript:blockemBlock(\'' . $author . '\');';
}
function blockem_module() {}
$words = implode(',',$newarr);
}
- set_pconfig(local_user(),'blockem','words',$words);
- info( t('blockem settings updated') . EOL );
+ PConfig::set(local_user(),'blockem','words',$words);
+ info(L10n::t('blockem settings updated') . EOL );
killme();
}
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-22 13:18+0200\n"
+"POT-Creation-Date: 2018-02-09 13:00+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: blockem.php:53 blockem.php:57
+#: blockem.php:51 blockem.php:55
msgid "\"Blockem\""
msgstr ""
-#: blockem.php:61
-msgid "Comma separated profile URLS to block"
+#: blockem.php:59
+msgid ""
+"Hides user's content by collapsing posts. Also replaces their avatar with "
+"generic image."
+msgstr ""
+
+#: blockem.php:60
+msgid "Comma separated profile URLS:"
msgstr ""
-#: blockem.php:65
+#: blockem.php:64
msgid "Save Settings"
msgstr ""
-#: blockem.php:78
+#: blockem.php:77
msgid "BLOCKEM Settings saved."
msgstr ""
-#: blockem.php:142
+#: blockem.php:140
#, php-format
-msgid "Blocked %s - Click to open/close"
+msgid "Hidden content by %s - Click to open/close"
msgstr ""
-#: blockem.php:197
+#: blockem.php:193
msgid "Unblock Author"
msgstr ""
-#: blockem.php:199
+#: blockem.php:195
msgid "Block Author"
msgstr ""
-#: blockem.php:231
+#: blockem.php:227
msgid "blockem settings updated"
msgstr ""
#
#
# Translators:
-# bavatar <tobias.diekershoff@gmx.net>, 2014-2015
+# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2014
+# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-07-27 05:29+0000\n"
-"Last-Translator: bavatar <tobias.diekershoff@gmx.net>\n"
-"Language-Team: German (http://www.transifex.com/projects/p/friendica/language/de/)\n"
+"POT-Creation-Date: 2018-02-09 13:00+0100\n"
+"PO-Revision-Date: 2018-02-10 17:32+0000\n"
+"Last-Translator: Tobias Diekershoff <tobias.diekershoff@gmx.net>\n"
+"Language-Team: German (http://www.transifex.com/Friendica/friendica/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: blockem.php:51
-msgid "\"Blockem\" Settings"
-msgstr "\"Blockem\"-Einstellungen"
+#: blockem.php:51 blockem.php:55
+msgid "\"Blockem\""
+msgstr "\"Blockem\""
-#: blockem.php:53
-msgid "Comma separated profile URLS to block"
-msgstr "Profil-URLs, die geblockt werden sollen (durch Kommas getrennt)"
+#: blockem.php:59
+msgid ""
+"Hides user's content by collapsing posts. Also replaces their avatar with "
+"generic image."
+msgstr "Verbirgt Inhalte von Kontakten durch kollabieren der Beiträge. Des weiteren wird das Profilbild durch einen generischen Avatar ersetzt."
+
+#: blockem.php:60
+msgid "Comma separated profile URLS:"
+msgstr "Komma separierte Liste von Profil URLs"
-#: blockem.php:57
-msgid "Submit"
-msgstr "Senden"
+#: blockem.php:64
+msgid "Save Settings"
+msgstr "Einstellungen speichern"
-#: blockem.php:70
+#: blockem.php:77
msgid "BLOCKEM Settings saved."
msgstr "BLOCKEM-Einstellungen gesichert."
-#: blockem.php:105
+#: blockem.php:140
#, php-format
-msgid "Blocked %s - Click to open/close"
-msgstr "%s blockiert - Zum Öffnen/Schließen klicken"
+msgid "Hidden content by %s - Click to open/close"
+msgstr "Verborgene Inhalte von %s - Zum Öffnen/Schließen klicken"
-#: blockem.php:160
+#: blockem.php:193
msgid "Unblock Author"
msgstr "Autor freischalten"
-#: blockem.php:162
+#: blockem.php:195
msgid "Block Author"
msgstr "Autor blockieren"
-#: blockem.php:194
+#: blockem.php:227
msgid "blockem settings updated"
msgstr "blockem Einstellungen aktualisiert"
return ($n != 1);;
}}
;
-$a->strings["\"Blockem\" Settings"] = "\"Blockem\"-Einstellungen";
-$a->strings["Comma separated profile URLS to block"] = "Profil-URLs, die geblockt werden sollen (durch Kommas getrennt)";
-$a->strings["Submit"] = "Senden";
+$a->strings["\"Blockem\""] = "\"Blockem\"";
+$a->strings["Hides user's content by collapsing posts. Also replaces their avatar with generic image."] = "Verbirgt Inhalte von Kontakten durch kollabieren der Beiträge. Des weiteren wird das Profilbild durch einen generischen Avatar ersetzt.";
+$a->strings["Comma separated profile URLS:"] = "Komma separierte Liste von Profil URLs";
+$a->strings["Save Settings"] = "Einstellungen speichern";
$a->strings["BLOCKEM Settings saved."] = "BLOCKEM-Einstellungen gesichert.";
-$a->strings["Blocked %s - Click to open/close"] = "%s blockiert - Zum Öffnen/Schließen klicken";
+$a->strings["Hidden content by %s - Click to open/close"] = "Verborgene Inhalte von %s - Zum Öffnen/Schließen klicken";
$a->strings["Unblock Author"] = "Autor freischalten";
$a->strings["Block Author"] = "Autor blockieren";
$a->strings["blockem settings updated"] = "blockem Einstellungen aktualisiert";
--- /dev/null
+# ADDON blockem
+# Copyright (C)
+# This file is distributed under the same license as the Friendica blockem addon package.
+#
+#
+# Translators:
+# Andy H3 <andy@hubup.pro>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: friendica\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-02-09 13:00+0100\n"
+"PO-Revision-Date: 2018-03-15 14:10+0000\n"
+"Last-Translator: Andy H3 <andy@hubup.pro>\n"
+"Language-Team: English (United Kingdom) (http://www.transifex.com/Friendica/friendica/language/en_GB/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en_GB\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: blockem.php:51 blockem.php:55
+msgid "\"Blockem\""
+msgstr "\"Blockem\""
+
+#: blockem.php:59
+msgid ""
+"Hides user's content by collapsing posts. Also replaces their avatar with "
+"generic image."
+msgstr "Hides user's content by collapsing posts. Also replaces their avatar with generic image."
+
+#: blockem.php:60
+msgid "Comma separated profile URLS:"
+msgstr "Comma separated profile URLs:"
+
+#: blockem.php:64
+msgid "Save Settings"
+msgstr "Save settings"
+
+#: blockem.php:77
+msgid "BLOCKEM Settings saved."
+msgstr "Blockem settings saved."
+
+#: blockem.php:140
+#, php-format
+msgid "Hidden content by %s - Click to open/close"
+msgstr "Hidden content by %s - Reveal/hide"
+
+#: blockem.php:193
+msgid "Unblock Author"
+msgstr "Unblock author"
+
+#: blockem.php:195
+msgid "Block Author"
+msgstr "Block author"
+
+#: blockem.php:227
+msgid "blockem settings updated"
+msgstr "Blockem settings updated"
--- /dev/null
+<?php
+
+if(! function_exists("string_plural_select_en_gb")) {
+function string_plural_select_en_gb($n){
+ return ($n != 1);;
+}}
+;
+$a->strings["\"Blockem\""] = "\"Blockem\"";
+$a->strings["Hides user's content by collapsing posts. Also replaces their avatar with generic image."] = "Hides user's content by collapsing posts. Also replaces their avatar with generic image.";
+$a->strings["Comma separated profile URLS:"] = "Comma separated profile URLs:";
+$a->strings["Save Settings"] = "Save settings";
+$a->strings["BLOCKEM Settings saved."] = "Blockem settings saved.";
+$a->strings["Hidden content by %s - Click to open/close"] = "Hidden content by %s - Reveal/hide";
+$a->strings["Unblock Author"] = "Unblock author";
+$a->strings["Block Author"] = "Block author";
+$a->strings["blockem settings updated"] = "Blockem settings updated";
--- /dev/null
+# ADDON blockem
+# Copyright (C)
+# This file is distributed under the same license as the Friendica blockem addon package.
+#
+#
+# Translators:
+# Andy H3 <andy@hubup.pro>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: friendica\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-02-09 13:00+0100\n"
+"PO-Revision-Date: 2018-03-15 14:14+0000\n"
+"Last-Translator: Andy H3 <andy@hubup.pro>\n"
+"Language-Team: English (United States) (http://www.transifex.com/Friendica/friendica/language/en_US/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en_US\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: blockem.php:51 blockem.php:55
+msgid "\"Blockem\""
+msgstr "\"Blockem\""
+
+#: blockem.php:59
+msgid ""
+"Hides user's content by collapsing posts. Also replaces their avatar with "
+"generic image."
+msgstr "Hides user's content by collapsing posts. Also replaces their avatar with generic image."
+
+#: blockem.php:60
+msgid "Comma separated profile URLS:"
+msgstr "Comma separated profile URLs:"
+
+#: blockem.php:64
+msgid "Save Settings"
+msgstr "Save settings"
+
+#: blockem.php:77
+msgid "BLOCKEM Settings saved."
+msgstr "Blockem settings saved."
+
+#: blockem.php:140
+#, php-format
+msgid "Hidden content by %s - Click to open/close"
+msgstr "Hidden content by %s - Reveal/hide"
+
+#: blockem.php:193
+msgid "Unblock Author"
+msgstr "Unblock author"
+
+#: blockem.php:195
+msgid "Block Author"
+msgstr "Block author"
+
+#: blockem.php:227
+msgid "blockem settings updated"
+msgstr "Blockem settings updated"
--- /dev/null
+<?php
+
+if(! function_exists("string_plural_select_en_us")) {
+function string_plural_select_en_us($n){
+ return ($n != 1);;
+}}
+;
+$a->strings["\"Blockem\""] = "\"Blockem\"";
+$a->strings["Hides user's content by collapsing posts. Also replaces their avatar with generic image."] = "Hides user's content by collapsing posts. Also replaces their avatar with generic image.";
+$a->strings["Comma separated profile URLS:"] = "Comma separated profile URLs:";
+$a->strings["Save Settings"] = "Save settings";
+$a->strings["BLOCKEM Settings saved."] = "Blockem settings saved.";
+$a->strings["Hidden content by %s - Click to open/close"] = "Hidden content by %s - Reveal/hide";
+$a->strings["Unblock Author"] = "Unblock author";
+$a->strings["Block Author"] = "Block author";
+$a->strings["blockem settings updated"] = "Blockem settings updated";
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014
+# fabrixxm <fabrix.xm@gmail.com>, 2014,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-22 13:18+0200\n"
-"PO-Revision-Date: 2014-09-10 10:23+0000\n"
+"POT-Creation-Date: 2018-02-09 13:00+0100\n"
+"PO-Revision-Date: 2018-03-19 13:14+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: blockem.php:53 blockem.php:57
+#: blockem.php:51 blockem.php:55
msgid "\"Blockem\""
msgstr "\"Blockem\""
-#: blockem.php:61
-msgid "Comma separated profile URLS to block"
-msgstr "Lista, separata da virgola, di indirizzi da bloccare"
+#: blockem.php:59
+msgid ""
+"Hides user's content by collapsing posts. Also replaces their avatar with "
+"generic image."
+msgstr "Nascondi il contenuto degli utenti collassando i messaggi. Sostituisce anche gli avatar con un'immagine generica."
+
+#: blockem.php:60
+msgid "Comma separated profile URLS:"
+msgstr "URL profili separati da virgola:"
-#: blockem.php:65
+#: blockem.php:64
msgid "Save Settings"
msgstr "Salva Impostazioni"
-#: blockem.php:78
+#: blockem.php:77
msgid "BLOCKEM Settings saved."
msgstr "Impostazioni BLOCKEM salvate."
-#: blockem.php:142
+#: blockem.php:140
#, php-format
-msgid "Blocked %s - Click to open/close"
-msgstr "%s bloccato - Clicca per aprire/chiudere"
+msgid "Hidden content by %s - Click to open/close"
+msgstr "Contenuto di %s nascosto - Clicca per aprire/chiudere"
-#: blockem.php:197
+#: blockem.php:193
msgid "Unblock Author"
msgstr "Sblocca autore"
-#: blockem.php:199
+#: blockem.php:195
msgid "Block Author"
msgstr "Blocca autore"
-#: blockem.php:231
+#: blockem.php:227
msgid "blockem settings updated"
msgstr "Impostazioni 'blockem' aggiornate."
}}
;
$a->strings["\"Blockem\""] = "\"Blockem\"";
-$a->strings["Comma separated profile URLS to block"] = "Lista, separata da virgola, di indirizzi da bloccare";
+$a->strings["Hides user's content by collapsing posts. Also replaces their avatar with generic image."] = "Nascondi il contenuto degli utenti collassando i messaggi. Sostituisce anche gli avatar con un'immagine generica.";
+$a->strings["Comma separated profile URLS:"] = "URL profili separati da virgola:";
$a->strings["Save Settings"] = "Salva Impostazioni";
$a->strings["BLOCKEM Settings saved."] = "Impostazioni BLOCKEM salvate.";
-$a->strings["Blocked %s - Click to open/close"] = "%s bloccato - Clicca per aprire/chiudere";
+$a->strings["Hidden content by %s - Click to open/close"] = "Contenuto di %s nascosto - Clicca per aprire/chiudere";
$a->strings["Unblock Author"] = "Sblocca autore";
$a->strings["Block Author"] = "Blocca autore";
$a->strings["blockem settings updated"] = "Impostazioni 'blockem' aggiornate.";
<?php
-
/**
* Name: Blogger Post Connector
* Description: Post to Blogger (or anything else which uses blogger XMLRPC API)
*
*/
-function blogger_install() {
- register_hook('post_local', 'addon/blogger/blogger.php', 'blogger_post_local');
- register_hook('notifier_normal', 'addon/blogger/blogger.php', 'blogger_send');
- register_hook('jot_networks', 'addon/blogger/blogger.php', 'blogger_jot_nets');
- register_hook('connector_settings', 'addon/blogger/blogger.php', 'blogger_settings');
- register_hook('connector_settings_post', 'addon/blogger/blogger.php', 'blogger_settings_post');
-
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Util\Network;
+
+function blogger_install()
+{
+ Addon::registerHook('post_local', 'addon/blogger/blogger.php', 'blogger_post_local');
+ Addon::registerHook('notifier_normal', 'addon/blogger/blogger.php', 'blogger_send');
+ Addon::registerHook('jot_networks', 'addon/blogger/blogger.php', 'blogger_jot_nets');
+ Addon::registerHook('connector_settings', 'addon/blogger/blogger.php', 'blogger_settings');
+ Addon::registerHook('connector_settings_post', 'addon/blogger/blogger.php', 'blogger_settings_post');
}
-function blogger_uninstall() {
- unregister_hook('post_local', 'addon/blogger/blogger.php', 'blogger_post_local');
- unregister_hook('notifier_normal', 'addon/blogger/blogger.php', 'blogger_send');
- unregister_hook('jot_networks', 'addon/blogger/blogger.php', 'blogger_jot_nets');
- unregister_hook('connector_settings', 'addon/blogger/blogger.php', 'blogger_settings');
- unregister_hook('connector_settings_post', 'addon/blogger/blogger.php', 'blogger_settings_post');
- // obsolete - remove
- unregister_hook('post_local_end', 'addon/blogger/blogger.php', 'blogger_send');
- unregister_hook('plugin_settings', 'addon/blogger/blogger.php', 'blogger_settings');
- unregister_hook('plugin_settings_post', 'addon/blogger/blogger.php', 'blogger_settings_post');
+function blogger_uninstall()
+{
+ Addon::unregisterHook('post_local', 'addon/blogger/blogger.php', 'blogger_post_local');
+ Addon::unregisterHook('notifier_normal', 'addon/blogger/blogger.php', 'blogger_send');
+ Addon::unregisterHook('jot_networks', 'addon/blogger/blogger.php', 'blogger_jot_nets');
+ Addon::unregisterHook('connector_settings', 'addon/blogger/blogger.php', 'blogger_settings');
+ Addon::unregisterHook('connector_settings_post', 'addon/blogger/blogger.php', 'blogger_settings_post');
+ // obsolete - remove
+ Addon::unregisterHook('post_local_end', 'addon/blogger/blogger.php', 'blogger_send');
+ Addon::unregisterHook('addon_settings', 'addon/blogger/blogger.php', 'blogger_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/blogger/blogger.php', 'blogger_settings_post');
}
-function blogger_jot_nets(&$a,&$b) {
- if(! local_user())
- return;
+function blogger_jot_nets(&$a, &$b)
+{
+ if (!local_user()) {
+ return;
+ }
- $bl_post = get_pconfig(local_user(),'blogger','post');
- if(intval($bl_post) == 1) {
- $bl_defpost = get_pconfig(local_user(),'blogger','post_by_default');
- $selected = ((intval($bl_defpost) == 1) ? ' checked="checked" ' : '');
- $b .= '<div class="profile-jot-net"><input type="checkbox" name="blogger_enable" ' . $selected . ' value="1" /> '
- . t('Post to blogger') . '</div>';
- }
+ $bl_post = PConfig::get(local_user(), 'blogger', 'post');
+ if (intval($bl_post) == 1) {
+ $bl_defpost = PConfig::get(local_user(), 'blogger', 'post_by_default');
+ $selected = ((intval($bl_defpost) == 1) ? ' checked="checked" ' : '');
+ $b .= '<div class="profile-jot-net"><input type="checkbox" name="blogger_enable" ' . $selected . ' value="1" /> '
+ . L10n::t('Post to blogger') . '</div>';
+ }
}
-function blogger_settings(&$a,&$s) {
-
- if(! local_user())
- return;
+function blogger_settings(&$a, &$s)
+{
+ if (! local_user()) {
+ return;
+ }
/* Add our stylesheet to the page so we can make our settings look nice */
/* Get the current state of our config variables */
- $enabled = get_pconfig(local_user(),'blogger','post');
- $checked = (($enabled) ? ' checked="checked" ' : '');
- $css = (($enabled) ? '' : '-disabled');
+ $enabled = PConfig::get(local_user(), 'blogger', 'post');
+ $checked = (($enabled) ? ' checked="checked" ' : '');
+ $css = (($enabled) ? '' : '-disabled');
- $def_enabled = get_pconfig(local_user(),'blogger','post_by_default');
+ $def_enabled = PConfig::get(local_user(), 'blogger', 'post_by_default');
$def_checked = (($def_enabled) ? ' checked="checked" ' : '');
$bl_password = get_pconfig(local_user(), 'blogger', 'bl_password');
$bl_blog = get_pconfig(local_user(), 'blogger', 'bl_blog');
-
- /* Add some HTML to the existing form */
-
- $s .= '<span id="settings_blogger_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_blogger_expanded\'); openClose(\'settings_blogger_inflated\');">';
- $s .= '<img class="connector'.$css.'" src="images/blogger.png" /><h3 class="connector">'. t('Blogger Export').'</h3>';
- $s .= '</span>';
- $s .= '<div id="settings_blogger_expanded" class="settings-block" style="display: none;">';
- $s .= '<span class="fakelink" onclick="openClose(\'settings_blogger_expanded\'); openClose(\'settings_blogger_inflated\');">';
- $s .= '<img class="connector'.$css.'" src="images/blogger.png" /><h3 class="connector">'. t('Blogger Export').'</h3>';
- $s .= '</span>';
-
- $s .= '<div id="blogger-enable-wrapper">';
- $s .= '<label id="blogger-enable-label" for="blogger-checkbox">' . t('Enable Blogger Post Plugin') . '</label>';
- $s .= '<input id="blogger-checkbox" type="checkbox" name="blogger" value="1" ' . $checked . '/>';
- $s .= '</div><div class="clear"></div>';
-
- $s .= '<div id="blogger-username-wrapper">';
- $s .= '<label id="blogger-username-label" for="blogger-username">' . t('Blogger username') . '</label>';
- $s .= '<input id="blogger-username" type="text" name="bl_username" value="' . $bl_username . '" />';
- $s .= '</div><div class="clear"></div>';
-
- $s .= '<div id="blogger-password-wrapper">';
- $s .= '<label id="blogger-password-label" for="blogger-password">' . t('Blogger password') . '</label>';
- $s .= '<input id="blogger-password" type="password" name="bl_password" value="' . $bl_password . '" />';
- $s .= '</div><div class="clear"></div>';
-
- $s .= '<div id="blogger-blog-wrapper">';
- $s .= '<label id="blogger-blog-label" for="blogger-blog">' . t('Blogger API URL') . '</label>';
- $s .= '<input id="blogger-blog" type="text" name="bl_blog" value="' . $bl_blog . '" />';
- $s .= '</div><div class="clear"></div>';
-
- $s .= '<div id="blogger-bydefault-wrapper">';
- $s .= '<label id="blogger-bydefault-label" for="blogger-bydefault">' . t('Post to Blogger by default') . '</label>';
- $s .= '<input id="blogger-bydefault" type="checkbox" name="bl_bydefault" value="1" ' . $def_checked . '/>';
- $s .= '</div><div class="clear"></div>';
-
- /* provide a submit button */
-
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="blogger-submit" name="blogger-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
-
+ /* Add some HTML to the existing form */
+ $s .= '<span id="settings_blogger_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_blogger_expanded\'); openClose(\'settings_blogger_inflated\');">';
+ $s .= '<img class="connector'.$css.'" src="images/blogger.png" /><h3 class="connector">'. L10n::t('Blogger Export').'</h3>';
+ $s .= '</span>';
+ $s .= '<div id="settings_blogger_expanded" class="settings-block" style="display: none;">';
+ $s .= '<span class="fakelink" onclick="openClose(\'settings_blogger_expanded\'); openClose(\'settings_blogger_inflated\');">';
+ $s .= '<img class="connector'.$css.'" src="images/blogger.png" /><h3 class="connector">'. L10n::t('Blogger Export').'</h3>';
+ $s .= '</span>';
+
+ $s .= '<div id="blogger-enable-wrapper">';
+ $s .= '<label id="blogger-enable-label" for="blogger-checkbox">' . L10n::t('Enable Blogger Post Addon') . '</label>';
+ $s .= '<input id="blogger-checkbox" type="checkbox" name="blogger" value="1" ' . $checked . '/>';
+ $s .= '</div><div class="clear"></div>';
+
+ $s .= '<div id="blogger-username-wrapper">';
+ $s .= '<label id="blogger-username-label" for="blogger-username">' . L10n::t('Blogger username') . '</label>';
+ $s .= '<input id="blogger-username" type="text" name="bl_username" value="' . $bl_username . '" />';
+ $s .= '</div><div class="clear"></div>';
+
+ $s .= '<div id="blogger-password-wrapper">';
+ $s .= '<label id="blogger-password-label" for="blogger-password">' . L10n::t('Blogger password') . '</label>';
+ $s .= '<input id="blogger-password" type="password" name="bl_password" value="' . $bl_password . '" />';
+ $s .= '</div><div class="clear"></div>';
+
+ $s .= '<div id="blogger-blog-wrapper">';
+ $s .= '<label id="blogger-blog-label" for="blogger-blog">' . L10n::t('Blogger API URL') . '</label>';
+ $s .= '<input id="blogger-blog" type="text" name="bl_blog" value="' . $bl_blog . '" />';
+ $s .= '</div><div class="clear"></div>';
+
+ $s .= '<div id="blogger-bydefault-wrapper">';
+ $s .= '<label id="blogger-bydefault-label" for="blogger-bydefault">' . L10n::t('Post to Blogger by default') . '</label>';
+ $s .= '<input id="blogger-bydefault" type="checkbox" name="bl_bydefault" value="1" ' . $def_checked . '/>';
+ $s .= '</div><div class="clear"></div>';
+
+ /* provide a submit button */
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="blogger-submit" name="blogger-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
-function blogger_settings_post(&$a,&$b) {
-
- if(x($_POST,'blogger-submit')) {
-
- set_pconfig(local_user(),'blogger','post',intval($_POST['blogger']));
- set_pconfig(local_user(),'blogger','post_by_default',intval($_POST['bl_bydefault']));
- set_pconfig(local_user(),'blogger','bl_username',trim($_POST['bl_username']));
- set_pconfig(local_user(),'blogger','bl_password',trim($_POST['bl_password']));
- set_pconfig(local_user(),'blogger','bl_blog',trim($_POST['bl_blog']));
-
+function blogger_settings_post(&$a, &$b)
+{
+ if (x($_POST, 'blogger-submit')) {
+ PConfig::set(local_user(), 'blogger', 'post', intval($_POST['blogger']));
+ PConfig::set(local_user(), 'blogger', 'post_by_default', intval($_POST['bl_bydefault']));
+ PConfig::set(local_user(), 'blogger', 'bl_username', trim($_POST['bl_username']));
+ PConfig::set(local_user(), 'blogger', 'bl_password', trim($_POST['bl_password']));
+ PConfig::set(local_user(), 'blogger', 'bl_blog', trim($_POST['bl_blog']));
}
}
-function blogger_post_local(&$a,&$b) {
-
+function blogger_post_local(&$a, &$b)
+{
// This can probably be changed to allow editing by pointing to a different API endpoint
if($b['edit'])
if($b['private'] || $b['parent'])
return;
- $bl_post = intval(get_pconfig(local_user(),'blogger','post'));
+ $bl_post = intval(PConfig::get(local_user(), 'blogger', 'post'));
- $bl_enable = (($bl_post && x($_REQUEST,'blogger_enable')) ? intval($_REQUEST['blogger_enable']) : 0);
+ $bl_enable = (($bl_post && x($_REQUEST, 'blogger_enable')) ? intval($_REQUEST['blogger_enable']) : 0);
- if($b['api_source'] && intval(get_pconfig(local_user(),'blogger','post_by_default')))
+ if ($b['api_source'] && intval(PConfig::get(local_user(), 'blogger', 'post_by_default'))) {
$bl_enable = 1;
if(! $bl_enable)
-function blogger_send(&$a,&$b) {
-
- if($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited']))
- return;
-
- if(! strstr($b['postopts'],'blogger'))
- return;
-
- if($b['parent'] != $b['id'])
- return;
-
+function blogger_send(&$a, &$b)
+{
+ if ($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited'])) {
+ return;
+ }
- $bl_username = xmlify(get_pconfig($b['uid'],'blogger','bl_username'));
- $bl_password = xmlify(get_pconfig($b['uid'],'blogger','bl_password'));
- $bl_blog = get_pconfig($b['uid'],'blogger','bl_blog');
+ if (! strstr($b['postopts'], 'blogger')) {
+ return;
+ }
- if($bl_username && $bl_password && $bl_blog) {
- require_once('include/bbcode.php');
+ $bl_username = xmlify(PConfig::get($b['uid'], 'blogger', 'bl_username'));
+ $bl_password = xmlify(PConfig::get($b['uid'], 'blogger', 'bl_password'));
+ $bl_blog = PConfig::get($b['uid'], 'blogger', 'bl_blog');
- $title = '<title>' . (($b['title']) ? $b['title'] : t('Post from Friendica')) . '</title>';
- $post = $title . bbcode($b['body']);
+ if ($bl_username && $bl_password && $bl_blog) {
+ $title = '<title>' . (($b['title']) ? $b['title'] : L10n::t('Post from Friendica')) . '</title>';
+ $post = $title . BBCode::convert($b['body']);
$post = xmlify($post);
$xml = <<< EOT
logger('blogger: data: ' . $xml, LOGGER_DATA);
- if($bl_blog !== 'test')
- $x = post_url($bl_blog,$xml);
+ if ($bl_blog !== 'test') {
+ $x = Network::post($bl_blog, $xml);
+ }
+
logger('posted to blogger: ' . (($x) ? $x : ''), LOGGER_DEBUG);
}
}
-
msgstr ""
#: blogger.php:82
-msgid "Enable Blogger Post Plugin"
+msgid "Enable Blogger Post Addon"
msgstr ""
#: blogger.php:87
\r
$a->strings["Post to blogger"] = "Enviament a blogger";\r
$a->strings["Blogger Post Settings"] = "Ajustos d'enviament a blogger";\r
-$a->strings["Enable Blogger Post Plugin"] = "Habilita el Plugin d'Enviaments a Blogger";\r
+$a->strings["Enable Blogger Post Addon"] = "Habilita el Addon d'Enviaments a Blogger";\r
$a->strings["Blogger username"] = "Nom d'usuari a blogger";\r
$a->strings["Blogger password"] = "Contrasenya a blogger";\r
$a->strings["Blogger API URL"] = "Blogger API URL";\r
msgstr "Blogger Export"
#: blogger.php:82
-msgid "Enable Blogger Post Plugin"
-msgstr "Povolit Blogger Post Plugin"
+msgid "Enable Blogger Post Addon"
+msgstr "Povolit Blogger Post Addon"
#: blogger.php:87
msgid "Blogger username"
msgstr "Blogger Export"
#: blogger.php:82
-msgid "Enable Blogger Post Plugin"
-msgstr "Blogger-Post-Plugin aktivieren"
+msgid "Enable Blogger Post Addon"
+msgstr "Blogger-Post-Addon aktivieren"
#: blogger.php:87
msgid "Blogger username"
;
$a->strings["Post to blogger"] = "Auf Blogger posten";
$a->strings["Blogger Export"] = "Blogger Export";
-$a->strings["Enable Blogger Post Plugin"] = "Blogger-Post-Plugin aktivieren";
+$a->strings["Enable Blogger Post Addon"] = "Blogger-Post-Addon aktivieren";
$a->strings["Blogger username"] = "Blogger-Benutzername";
$a->strings["Blogger password"] = "Blogger-Passwort";
$a->strings["Blogger API URL"] = "Blogger-API-URL";
\r
$a->strings["Post to blogger"] = "Afiŝi al blogger";\r
$a->strings["Blogger Post Settings"] = "Agordo pri Blogger Afiŝoj";\r
-$a->strings["Enable Blogger Post Plugin"] = "Ŝalti la Blogger afiŝo kromprogramon";\r
+$a->strings["Enable Blogger Post Addon"] = "Ŝalti la Blogger afiŝo kromprogramon";\r
$a->strings["Blogger username"] = "Blogger uzantonomo";\r
$a->strings["Blogger password"] = "Blogger pasvorto";\r
$a->strings["Blogger API URL"] = "Blogger API URL";\r
msgstr "Esportar Blogger"
#: blogger.php:82
-msgid "Enable Blogger Post Plugin"
-msgstr "Activar plugin de entrada de Blogger"
+msgid "Enable Blogger Post Addon"
+msgstr "Activar addon de entrada de Blogger"
#: blogger.php:87
msgid "Blogger username"
;
$a->strings["Post to blogger"] = "Entrada para blogger";
$a->strings["Blogger Export"] = "Esportar Blogger";
-$a->strings["Enable Blogger Post Plugin"] = "Activar plugin de entrada de Blogger";
+$a->strings["Enable Blogger Post Addon"] = "Activar addon de entrada de Blogger";
$a->strings["Blogger username"] = "Nombre de usuario de Blogger";
$a->strings["Blogger password"] = "Contraseña de Blogger";
$a->strings["Blogger API URL"] = "URL API de Blogger";
msgstr ""
#: blogger.php:82
-msgid "Enable Blogger Post Plugin"
+msgid "Enable Blogger Post Addon"
msgstr "Activer le connecteur Blogger"
#: blogger.php:87
;
$a->strings["Post to blogger"] = "Poster sur Blogger";
$a->strings["Blogger Export"] = "";
-$a->strings["Enable Blogger Post Plugin"] = "Activer le connecteur Blogger";
+$a->strings["Enable Blogger Post Addon"] = "Activer le connecteur Blogger";
$a->strings["Blogger username"] = "Nom d'utilisateur Blogger";
$a->strings["Blogger password"] = "Mot de passe Blogger";
$a->strings["Blogger API URL"] = "URL de l'API de Blogger";
msgstr "Flytja út blogg"
#: blogger.php:82
-msgid "Enable Blogger Post Plugin"
+msgid "Enable Blogger Post Addon"
msgstr "Virkja sendiviðbót fyrir blogg"
#: blogger.php:87
;
$a->strings["Post to blogger"] = "Senda færslu á bloggara";
$a->strings["Blogger Export"] = "Flytja út blogg";
-$a->strings["Enable Blogger Post Plugin"] = "Virkja sendiviðbót fyrir blogg";
+$a->strings["Enable Blogger Post Addon"] = "Virkja sendiviðbót fyrir blogg";
$a->strings["Blogger username"] = "Notandanafn bloggara";
$a->strings["Blogger password"] = "Aðgangsorð bloggara";
$a->strings["Blogger API URL"] = "API slóð bloggs";
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014
+# fabrixxm <fabrix.xm@gmail.com>, 2014,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-06-22 13:18+0200\n"
-"PO-Revision-Date: 2014-09-10 10:24+0000\n"
+"PO-Revision-Date: 2018-03-19 13:21+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
msgstr "Esporta Blogger"
#: blogger.php:82
-msgid "Enable Blogger Post Plugin"
-msgstr "Abilita il plugin di invio a Blogger"
+msgid "Enable Blogger Post Addon"
+msgstr "Abilita il componente aggiuntivo di invio a Blogger"
#: blogger.php:87
msgid "Blogger username"
;
$a->strings["Post to blogger"] = "Invia a Blogger";
$a->strings["Blogger Export"] = "Esporta Blogger";
-$a->strings["Enable Blogger Post Plugin"] = "Abilita il plugin di invio a Blogger";
+$a->strings["Enable Blogger Post Addon"] = "Abilita il componente aggiuntivo di invio a Blogger";
$a->strings["Blogger username"] = "Nome utente Blogger";
$a->strings["Blogger password"] = "Password Blogger";
$a->strings["Blogger API URL"] = "Indirizzo API Blogger";
\r
$a->strings["Post to blogger"] = "";\r
$a->strings["Blogger Post Settings"] = "";\r
-$a->strings["Enable Blogger Post Plugin"] = "";\r
+$a->strings["Enable Blogger Post Addon"] = "";\r
$a->strings["Blogger username"] = "";\r
$a->strings["Blogger password"] = "";\r
$a->strings["Blogger API URL"] = "";\r
\r
$a->strings["Post to blogger"] = "Post na blogger";\r
$a->strings["Blogger Post Settings"] = "Ustawienia postów na Blogger";\r
-$a->strings["Enable Blogger Post Plugin"] = "";\r
+$a->strings["Enable Blogger Post Addon"] = "";\r
$a->strings["Blogger username"] = "Nazwa użytkownika na Blogger";\r
$a->strings["Blogger password"] = "Hasło do Blogger";\r
$a->strings["Blogger API URL"] = "";\r
msgstr "Exportador Blogger"
#: blogger.php:82
-msgid "Enable Blogger Post Plugin"
+msgid "Enable Blogger Post Addon"
msgstr "Habilitar plug-in para publicar no Blogger"
#: blogger.php:87
;
$a->strings["Post to blogger"] = "Publicar no Blogger";
$a->strings["Blogger Export"] = "Exportador Blogger";
-$a->strings["Enable Blogger Post Plugin"] = "Habilitar plug-in para publicar no Blogger";
+$a->strings["Enable Blogger Post Addon"] = "Habilitar plug-in para publicar no Blogger";
$a->strings["Blogger username"] = "Nome de usuário no Blogger";
$a->strings["Blogger password"] = "Senha do Blogger";
$a->strings["Blogger API URL"] = "URL da API do Blogger";
msgstr "Export pe Blogger "
#: blogger.php:82
-msgid "Enable Blogger Post Plugin"
+msgid "Enable Blogger Post Addon"
msgstr "Activare Modul Postare pe Blogger "
#: blogger.php:87
;
$a->strings["Post to blogger"] = "Postați pe Blogger";
$a->strings["Blogger Export"] = "Export pe Blogger ";
-$a->strings["Enable Blogger Post Plugin"] = "Activare Modul Postare pe Blogger ";
+$a->strings["Enable Blogger Post Addon"] = "Activare Modul Postare pe Blogger ";
$a->strings["Blogger username"] = "Utilizator Blogger";
$a->strings["Blogger password"] = "Parolă Blogger ";
$a->strings["Blogger API URL"] = "URL Cheie API Blogger ";
msgstr "Экспорт в Blogger"
#: blogger.php:82
-msgid "Enable Blogger Post Plugin"
+msgid "Enable Blogger Post Addon"
msgstr "Включить плагин Blogger"
#: blogger.php:87
;
$a->strings["Post to blogger"] = "Написать в Blogger";
$a->strings["Blogger Export"] = "Экспорт в Blogger";
-$a->strings["Enable Blogger Post Plugin"] = "Включить плагин Blogger";
+$a->strings["Enable Blogger Post Addon"] = "Включить плагин Blogger";
$a->strings["Blogger username"] = "Имя пользователя Blogger";
$a->strings["Blogger password"] = "Пароль Blogger";
$a->strings["Blogger API URL"] = "Blogger API URL";
\r
$a->strings["Post to blogger"] = "转播到blogger";\r
$a->strings["Blogger Post Settings"] = "Blogger转播设置";\r
-$a->strings["Enable Blogger Post Plugin"] = "使Blogger转播插件可用";\r
+$a->strings["Enable Blogger Post Addon"] = "使Blogger转播插件可用";\r
$a->strings["Blogger username"] = "Blogger用户名";\r
$a->strings["Blogger password"] = "Blogger密码";\r
$a->strings["Blogger API URL"] = "Blogger API URL";\r
Please use (your server address)/buffer/connect as Callback URL.
After the registration please enter the values for "Client ID" and "Client Secret" in the
-[administration](admin/plugins/buffer).
+[administration](admin/addons/buffer).
* Version: 0.2
* Author: Michael Vogel <http://pirati.ca/profile/heluecht>
*/
-require('addon/buffer/bufferapp.php');
+require 'addon/buffer/bufferapp.php';
+
+use Friendica\App;
+use Friendica\Content\Text\BBCode;
+use Friendica\Content\Text\Plaintext;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
function buffer_install() {
- register_hook('post_local', 'addon/buffer/buffer.php', 'buffer_post_local');
- register_hook('notifier_normal', 'addon/buffer/buffer.php', 'buffer_send');
- register_hook('jot_networks', 'addon/buffer/buffer.php', 'buffer_jot_nets');
- register_hook('connector_settings', 'addon/buffer/buffer.php', 'buffer_settings');
- register_hook('connector_settings_post', 'addon/buffer/buffer.php', 'buffer_settings_post');
+ Addon::registerHook('post_local', 'addon/buffer/buffer.php', 'buffer_post_local');
+ Addon::registerHook('notifier_normal', 'addon/buffer/buffer.php', 'buffer_send');
+ Addon::registerHook('jot_networks', 'addon/buffer/buffer.php', 'buffer_jot_nets');
+ Addon::registerHook('connector_settings', 'addon/buffer/buffer.php', 'buffer_settings');
+ Addon::registerHook('connector_settings_post', 'addon/buffer/buffer.php', 'buffer_settings_post');
}
function buffer_uninstall() {
- unregister_hook('post_local', 'addon/buffer/buffer.php', 'buffer_post_local');
- unregister_hook('notifier_normal', 'addon/buffer/buffer.php', 'buffer_send');
- unregister_hook('jot_networks', 'addon/buffer/buffer.php', 'buffer_jot_nets');
- unregister_hook('connector_settings', 'addon/buffer/buffer.php', 'buffer_settings');
- unregister_hook('connector_settings_post', 'addon/buffer/buffer.php', 'buffer_settings_post');
+ Addon::unregisterHook('post_local', 'addon/buffer/buffer.php', 'buffer_post_local');
+ Addon::unregisterHook('notifier_normal', 'addon/buffer/buffer.php', 'buffer_send');
+ Addon::unregisterHook('jot_networks', 'addon/buffer/buffer.php', 'buffer_jot_nets');
+ Addon::unregisterHook('connector_settings', 'addon/buffer/buffer.php', 'buffer_settings');
+ Addon::unregisterHook('connector_settings_post', 'addon/buffer/buffer.php', 'buffer_settings_post');
}
function buffer_module() {}
function buffer_content(&$a) {
if(! local_user()) {
- notice( t('Permission denied.') . EOL);
+ notice(L10n::t('Permission denied.') . EOL);
return '';
}
return $o;
}
-function buffer_plugin_admin(&$a, &$o){
- $t = get_markup_template( "admin.tpl", "addon/buffer/" );
+function buffer_addon_admin(&$a, &$o)
+{
+ $t = get_markup_template("admin.tpl", "addon/buffer/");
- $o = replace_macros($t, array(
- '$submit' => t('Save Settings'),
- // name, label, value, help, [extra values]
- '$client_id' => array('client_id', t('Client ID'), get_config('buffer', 'client_id' ), ''),
- '$client_secret' => array('client_secret', t('Client Secret'), get_config('buffer', 'client_secret' ), ''),
- ));
+ $o = replace_macros($t, [
+ '$submit' => L10n::t('Save Settings'),
+ // name, label, value, help, [extra values]
+ '$client_id' => ['client_id', L10n::t('Client ID'), Config::get('buffer', 'client_id'), ''],
+ '$client_secret' => ['client_secret', L10n::t('Client Secret'), Config::get('buffer', 'client_secret'), ''],
+ ]);
}
-function buffer_plugin_admin_post(&$a){
- $client_id = ((x($_POST,'client_id')) ? notags(trim($_POST['client_id'])) : '');
- $client_secret = ((x($_POST,'client_secret')) ? notags(trim($_POST['client_secret'])): '');
- set_config('buffer','client_id',$client_id);
- set_config('buffer','client_secret',$client_secret);
- info( t('Settings updated.'). EOL );
+function buffer_addon_admin_post(&$a)
+{
+ $client_id = ((x($_POST, 'client_id')) ? notags(trim($_POST['client_id'])) : '');
+ $client_secret = ((x($_POST, 'client_secret')) ? notags(trim($_POST['client_secret'])): '');
+ Config::set('buffer', 'client_id', $client_id);
+ Config::set('buffer', 'client_secret', $client_secret);
+ info(L10n::t('Settings updated.'). EOL);
}
function buffer_connect(&$a) {
if (isset($_REQUEST["error"])) {
- $o = t('Error when registering buffer connection:')." ".$_REQUEST["error"];
+ $o = L10n::t('Error when registering buffer connection:')." ".$_REQUEST["error"];
return $o;
}
// Start a session. This is necessary to hold on to a few keys the callback script will also need
$o .= '<a href="' . $buffer->get_login_url() . '">Connect to Buffer!</a>';
} else {
logger("buffer_connect: authenticated");
- $o .= t("You are now authenticated to buffer. ");
- $o .= '<br /><a href="'.$a->get_baseurl().'/settings/connectors">'.t("return to the connector page").'</a>';
- set_pconfig(local_user(), 'buffer','access_token', $buffer->access_token);
+ $o .= L10n::t("You are now authenticated to buffer. ");
+ $o .= '<br /><a href="'.$a->get_baseurl().'/settings/connectors">'.L10n::t("return to the connector page").'</a>';
+ PConfig::set(local_user(), 'buffer','access_token', $buffer->access_token);
}
return($o);
$buffer_defpost = get_pconfig(local_user(),'buffer','post_by_default');
$selected = ((intval($buffer_defpost) == 1) ? ' checked="checked" ' : '');
$b .= '<div class="profile-jot-net"><input type="checkbox" name="buffer_enable"' . $selected . ' value="1" /> '
- . t('Post to Buffer') . '</div>';
+ . L10n::t('Post to Buffer') . '</div>';
}
}
/* Add some HTML to the existing form */
$s .= '<span id="settings_buffer_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_buffer_expanded\'); openClose(\'settings_buffer_inflated\');">';
- $s .= '<img class="connector'.$css.'" src="images/buffer.png" /><h3 class="connector">'. t('Buffer Export').'</h3>';
+ $s .= '<img class="connector'.$css.'" src="images/buffer.png" /><h3 class="connector">'. L10n::t('Buffer Export').'</h3>';
$s .= '</span>';
$s .= '<div id="settings_buffer_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_buffer_expanded\'); openClose(\'settings_buffer_inflated\');">';
- $s .= '<img class="connector'.$css.'" src="images/buffer.png" /><h3 class="connector">'. t('Buffer Export').'</h3>';
+ $s .= '<img class="connector'.$css.'" src="images/buffer.png" /><h3 class="connector">'. L10n::t('Buffer Export').'</h3>';
$s .= '</span>';
$client_id = get_config("buffer", "client_id");
$s .= '<div id="buffer-password-wrapper">';
if ($access_token == "") {
$s .= '<div id="buffer-authenticate-wrapper">';
- $s .= '<a href="'.$a->get_baseurl().'/buffer/connect">'.t("Authenticate your Buffer connection").'</a>';
+ $s .= '<a href="'.$a->get_baseurl().'/buffer/connect">'.L10n::t("Authenticate your Buffer connection").'</a>';
$s .= '</div><div class="clear"></div>';
} else {
$s .= '<div id="buffer-enable-wrapper">';
- $s .= '<label id="buffer-enable-label" for="buffer-checkbox">' . t('Enable Buffer Post Plugin') . '</label>';
+ $s .= '<label id="buffer-enable-label" for="buffer-checkbox">' . L10n::t('Enable Buffer Post Addon') . '</label>';
$s .= '<input id="buffer-checkbox" type="checkbox" name="buffer" value="1" ' . $checked . '/>';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="buffer-bydefault-wrapper">';
- $s .= '<label id="buffer-bydefault-label" for="buffer-bydefault">' . t('Post to Buffer by default') . '</label>';
+ $s .= '<label id="buffer-bydefault-label" for="buffer-bydefault">' . L10n::t('Post to Buffer by default') . '</label>';
$s .= '<input id="buffer-bydefault" type="checkbox" name="buffer_bydefault" value="1" ' . $def_checked . '/>';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="buffer-delete-wrapper">';
- $s .= '<label id="buffer-delete-label" for="buffer-delete">' . t('Check to delete this preset') . '</label>';
+ $s .= '<label id="buffer-delete-label" for="buffer-delete">' . L10n::t('Check to delete this preset') . '</label>';
$s .= '<input id="buffer-delete" type="checkbox" name="buffer_delete" value="1" />';
$s .= '</div><div class="clear"></div>';
$profiles = $buffer->go('/profiles');
if (is_array($profiles)) {
$s .= '<div id="buffer-accounts-wrapper">';
- $s .= t("Posts are going to all accounts that are enabled by default:");
+ $s .= L10n::t("Posts are going to all accounts that are enabled by default:");
$s .= "<ul>";
foreach ($profiles as $profile) {
if (!$profile->default)
/* provide a submit button */
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="buffer-submit" name="buffer-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="buffer-submit" name="buffer-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
$client_secret = get_config("buffer", "client_secret");
$access_token = get_pconfig($b['uid'], "buffer","access_token");
- if($access_token) {
+ if ($access_token) {
$buffer = new BufferApp($client_id, $client_secret, $callback_url, $access_token);
- require_once("include/plaintext.php");
- require_once("include/network.php");
-
$profiles = $buffer->go('/profiles');
if (is_array($profiles)) {
logger("Will send these parameter ".print_r($b, true), LOGGER_DEBUG);
$item["body"] = preg_replace("(\[s\](.*?)\[\/s\])ism",'-$1-',$item["body"]);
}
- $post = plaintext($a, $item, $limit, $includedlinks, $htmlmode);
+ $post = BBCode::toPlaintext($item, $limit, $includedlinks, $htmlmode);
logger("buffer_send: converted message ".$b["id"]." result: ".print_r($post, true), LOGGER_DEBUG);
// The image proxy is used as a sanitizer. Buffer seems to be really picky about pictures
//if ($includedlinks) {
// if (isset($post["url"]))
- // $post["url"] = short_link($post["url"]);
+ // $post["url"] = Network::shortenUrl($post["url"]);
// if (isset($post["image"]))
- // $post["image"] = short_link($post["image"]);
+ // $post["image"] = Network::shortenUrl($post["image"]);
// if (isset($post["preview"]))
- // $post["preview"] = short_link($post["preview"]);
+ // $post["preview"] = Network::shortenUrl($post["preview"]);
//}
// Seems like a bug to me
if (($profile->service == "twitter") && isset($post["url"]) && ($post["type"] != "photo"))
$post["text"] .= " ".$post["url"];
elseif (($profile->service == "appdotnet") && isset($post["url"]) && isset($post["title"]) && ($post["type"] != "photo")) {
- $post["title"] = shortenmsg($post["title"], 90);
- $post["text"] = shortenmsg($post["text"], $limit - (24 + strlen($post["title"])));
+ $post["title"] = Plaintext::shorten($post["title"], 90);
+ $post["text"] = Plaintext::shorten($post["text"], $limit - (24 + strlen($post["title"])));
$post["text"] .= "\n[".$post["title"]."](".$post["url"].")";
} elseif (($profile->service == "appdotnet") && isset($post["url"]) && ($post["type"] != "photo"))
$post["text"] .= " ".$post["url"];
msgstr ""
#: buffer.php:146
-msgid "Enable Buffer Post Plugin"
+msgid "Enable Buffer Post Addon"
msgstr ""
#: buffer.php:151
msgstr "Přihlásit ke spojení na Buffer"
#: buffer.php:146
-msgid "Enable Buffer Post Plugin"
-msgstr "Povolit Buffer Post Plugin"
+msgid "Enable Buffer Post Addon"
+msgstr "Povolit Buffer Post Addon"
#: buffer.php:151
msgid "Post to Buffer by default"
$a->strings["Post to Buffer"] = "Příspěvek na Buffer";
$a->strings["Buffer Export"] = "Buffer Export";
$a->strings["Authenticate your Buffer connection"] = "Přihlásit ke spojení na Buffer";
-$a->strings["Enable Buffer Post Plugin"] = "Povolit Buffer Post Plugin";
+$a->strings["Enable Buffer Post Addon"] = "Povolit Buffer Post Addon";
$a->strings["Post to Buffer by default"] = "Defaultně zaslat na Buffer";
$a->strings["Check to delete this preset"] = "Zaškrtnout pro smazání tohoto nastavení";
$a->strings["Posts are going to all accounts that are enabled by default:"] = "Příspěvky jsou zasílány na všechny účty, které jsou defaultně povoleny:";
msgstr "Authentifiziere deine Verbindung zu buffer"
#: buffer.php:146
-msgid "Enable Buffer Post Plugin"
-msgstr "Buffer Post-Plugin aktivieren"
+msgid "Enable Buffer Post Addon"
+msgstr "Buffer Post-Addon aktivieren"
#: buffer.php:151
msgid "Post to Buffer by default"
$a->strings["Post to Buffer"] = "Auf buffer veröffentlichen";
$a->strings["Buffer Export"] = "Buffer Export";
$a->strings["Authenticate your Buffer connection"] = "Authentifiziere deine Verbindung zu buffer";
-$a->strings["Enable Buffer Post Plugin"] = "Buffer Post-Plugin aktivieren";
+$a->strings["Enable Buffer Post Addon"] = "Buffer Post-Addon aktivieren";
$a->strings["Post to Buffer by default"] = "Standardmäßig auf buffer veröffentlichen";
$a->strings["Check to delete this preset"] = "Markieren um dieses Preset zu löschen";
$a->strings["Posts are going to all accounts that are enabled by default:"] = "Beiträge werden an alle Accounts geschickt, die Standardmäßig aktiviert sind.";
msgstr "Autenticar su conexión de Buffer"
#: buffer.php:146
-msgid "Enable Buffer Post Plugin"
-msgstr "Active el plugin de publicación de Buffer"
+msgid "Enable Buffer Post Addon"
+msgstr "Active el addon de publicación de Buffer"
#: buffer.php:151
msgid "Post to Buffer by default"
$a->strings["Post to Buffer"] = "Publique en Buffer";
$a->strings["Buffer Export"] = "Exportar Buffer";
$a->strings["Authenticate your Buffer connection"] = "Autenticar su conexión de Buffer";
-$a->strings["Enable Buffer Post Plugin"] = "Active el plugin de publicación de Buffer";
+$a->strings["Enable Buffer Post Addon"] = "Active el addon de publicación de Buffer";
$a->strings["Post to Buffer by default"] = "Publicar en Buffer por defecto";
$a->strings["Check to delete this preset"] = "Verificar para eliminar este preajuste";
$a->strings["Posts are going to all accounts that are enabled by default:"] = "Las publicaciones van a todas las cuentas que estén habilitadas por defecto";
msgstr "Authentifier votre connexion à Buffer"
#: buffer.php:146
-msgid "Enable Buffer Post Plugin"
+msgid "Enable Buffer Post Addon"
msgstr "Activer le connecteur Buffer"
#: buffer.php:151
$a->strings["Post to Buffer"] = "Publier sur Buffer";
$a->strings["Buffer Export"] = "Export Buffer";
$a->strings["Authenticate your Buffer connection"] = "Authentifier votre connexion à Buffer";
-$a->strings["Enable Buffer Post Plugin"] = "Activer le connecteur Buffer";
+$a->strings["Enable Buffer Post Addon"] = "Activer le connecteur Buffer";
$a->strings["Post to Buffer by default"] = "Publier sur Buffer par défaut";
$a->strings["Check to delete this preset"] = "Cocher pour supprimer ce préréglage";
$a->strings["Posts are going to all accounts that are enabled by default:"] = "Les posts sont envoyés à tous les comptes activés par défault:";
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014
+# fabrixxm <fabrix.xm@gmail.com>, 2014,2018
# Sandro Santilli <strk@kbt.io>, 2015
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-06-22 13:18+0200\n"
-"PO-Revision-Date: 2015-11-01 11:05+0000\n"
-"Last-Translator: Sandro Santilli <strk@kbt.io>\n"
+"PO-Revision-Date: 2018-03-19 13:21+0000\n"
+"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
msgstr "Autentica la tua connessione a Buffer"
#: buffer.php:146
-msgid "Enable Buffer Post Plugin"
-msgstr "Abilita il plugin di invio a Buffer"
+msgid "Enable Buffer Post Addon"
+msgstr "Abilita il componente aggiuntivo di invio a Buffer"
#: buffer.php:151
msgid "Post to Buffer by default"
$a->strings["Post to Buffer"] = "Invia a Buffer";
$a->strings["Buffer Export"] = "Esporta Buffer";
$a->strings["Authenticate your Buffer connection"] = "Autentica la tua connessione a Buffer";
-$a->strings["Enable Buffer Post Plugin"] = "Abilita il plugin di invio a Buffer";
+$a->strings["Enable Buffer Post Addon"] = "Abilita il componente aggiuntivo di invio a Buffer";
$a->strings["Post to Buffer by default"] = "Invia sempre a Buffer";
$a->strings["Check to delete this preset"] = "Seleziona per eliminare questo preset";
$a->strings["Posts are going to all accounts that are enabled by default:"] = "I messaggi andranno a tutti gli account che sono abilitati:";
msgstr "Autenticar sua conexão de Buffer"
#: buffer.php:146
-msgid "Enable Buffer Post Plugin"
-msgstr "Habilita plugin para publicar no Buffer"
+msgid "Enable Buffer Post Addon"
+msgstr "Habilita addon para publicar no Buffer"
#: buffer.php:151
msgid "Post to Buffer by default"
$a->strings["Post to Buffer"] = "Publicar no Buffer";
$a->strings["Buffer Export"] = "Exportar Buffer";
$a->strings["Authenticate your Buffer connection"] = "Autenticar sua conexão de Buffer";
-$a->strings["Enable Buffer Post Plugin"] = "Habilita plugin para publicar no Buffer";
+$a->strings["Enable Buffer Post Addon"] = "Habilita addon para publicar no Buffer";
$a->strings["Post to Buffer by default"] = "Publica no Buffer por padrão";
$a->strings["Check to delete this preset"] = "Marque para excluir este perfil";
$a->strings["Posts are going to all accounts that are enabled by default:"] = "";
msgstr "Autentificați-vă conectarea la Buffer"
#: buffer.php:146
-msgid "Enable Buffer Post Plugin"
+msgid "Enable Buffer Post Addon"
msgstr "Activare Modul Postare pe Buffer"
#: buffer.php:151
$a->strings["Post to Buffer"] = "Postați pe Buffer";
$a->strings["Buffer Export"] = "Export pe Buffer ";
$a->strings["Authenticate your Buffer connection"] = "Autentificați-vă conectarea la Buffer";
-$a->strings["Enable Buffer Post Plugin"] = "Activare Modul Postare pe Buffer";
+$a->strings["Enable Buffer Post Addon"] = "Activare Modul Postare pe Buffer";
$a->strings["Post to Buffer by default"] = "Postați implicit pe Buffer";
$a->strings["Check to delete this preset"] = "Bifați pentru a șterge această presetare";
$a->strings["Posts are going to all accounts that are enabled by default:"] = "Posturile merg către toate conturile care sunt activate implicit:";
msgstr "Аутентифицируйте свое соединение с Buffer"
#: buffer.php:146
-msgid "Enable Buffer Post Plugin"
+msgid "Enable Buffer Post Addon"
msgstr "Включить плагин Buffer"
#: buffer.php:151
$a->strings["Post to Buffer"] = "Написать в Buffer";
$a->strings["Buffer Export"] = "Экспорт в Buffer";
$a->strings["Authenticate your Buffer connection"] = "Аутентифицируйте свое соединение с Buffer";
-$a->strings["Enable Buffer Post Plugin"] = "Включить плагин Buffer";
+$a->strings["Enable Buffer Post Addon"] = "Включить плагин Buffer";
$a->strings["Post to Buffer by default"] = "Отправлять в Buffer по умолчанию";
$a->strings["Check to delete this preset"] = "Отметьте для удаления этих настроек";
$a->strings["Posts are going to all accounts that are enabled by default:"] = "Сообщения уходят во все учетные записи по умолчанию:";
* Version: 1.0
* Author: Mike Macgirvin <mike@macgirvin.com>
*/
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+function buglink_install()
+{
+ Addon::registerHook('page_end', 'addon/buglink/buglink.php', 'buglink_active');
+}
-function buglink_install() { register_hook('page_end', 'addon/buglink/buglink.php', 'buglink_active'); }
+function buglink_uninstall()
+{
+ Addon::unregisterHook('page_end', 'addon/buglink/buglink.php', 'buglink_active');
+}
-
-function buglink_uninstall() { unregister_hook('page_end', 'addon/buglink/buglink.php', 'buglink_active'); }
-
-function buglink_active(&$a,&$b) { $b .= '<div id="buglink_wrapper" style="position: fixed; bottom: 5px; left: 5px;"><a href="https://github.com/friendica/friendica/issues" target="_blank" title="' . t('Report Bug') . '"><img src="addon/buglink/bug-x.gif" alt="' . t('Report Bug') . '" /></a></div>'; }
+function buglink_active(&$a, &$b)
+{
+ $b .= '<div id="buglink_wrapper" style="position: fixed; bottom: 5px; left: 5px;"><a href="https://github.com/friendica/friendica/issues" target="_blank" title="' . L10n::t('Report Bug') . '"><img src="addon/buglink/bug-x.gif" alt="' . L10n::t('Report Bug') . '" /></a></div>';
+}
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-06-22 13:18+0200\n"
-"PO-Revision-Date: 2014-09-10 10:27+0000\n"
+"PO-Revision-Date: 2017-09-20 06:07+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
* Version: 1.0\r
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>\r
*/\r
-\r
+use Friendica\Core\Addon;\r
\r
function calc_install() {\r
- register_hook('app_menu', 'addon/calc/calc.php', 'calc_app_menu');\r
+ Addon::registerHook('app_menu', 'addon/calc/calc.php', 'calc_app_menu');\r
}\r
\r
function calc_uninstall() {\r
- unregister_hook('app_menu', 'addon/calc/calc.php', 'calc_app_menu');\r
+ Addon::unregisterHook('app_menu', 'addon/calc/calc.php', 'calc_app_menu');\r
\r
}\r
\r
Community Home
--------------
-This plugin overwrites the default home page shown to not logged users.
-On sidebar there are the login form, last ten users (if they have
-choosed to be in site directory), last ten public photos and last ten
-"likes" sent by a site user or about a site user's item
+This addon overwrites the default home page shown to anonymous users.
+On the sidebar there are the login form, last ten users (if they chose
+to be in the site directory), last ten public photos and last ten
+"likes" sent by a site user or about a site user's item.
-In main content is shown the community stream. This plugin doesn't
-honour your community page visibility site setting: the community
+In the main content is shown the community stream. This addon doesn't
+honor your community page visibility site setting: the community
stream is shown also if you have choose to not show the community page.
-If 'home.html' is found in your friendica root, its content is inserted
+If 'home.html' is found in your friendica root, its content is inserted
before community stream
-Each elements can be show or not. At the moment, there is no admin page
-for settings, so this settings must be added to yout .htconfig.php
-
-
- $a->config['communityhome']['showcommunitystream'] = true;
- $a->config['communityhome']['showlastlike'] = true;
- $a->config['communityhome']['showlastphotos'] = true;
- $a->config['communityhome']['showactiveusers'] = true;
- $a->config['communityhome']['showlastusers'] = true;
-
-If you don't want to show something, set it to false.
-
-Note:
------
-
-- Default is "false". With no settings in .htconfig.php, nothing is
-shown, except login form and content of 'home.html'
-
-- Active users query can be heavy for db, and on some system don't work
+By default no features are enabled, you can edit this addon's settings
+through the admin panel.
\ No newline at end of file
aside #div_id_remember { overflow: auto; width: 100%; padding-top:120px;}
#login_openid input { width: 160px; }
+
+/* frio fix */
+body.mod-home .navbar.navbar-fixed-top ul.nav.navbar-nav #nav-login {
+ display: block;
+}
<?php
+
/**
* Name: Community home
* Description: Show last community activity in homepage
* Version: 2.0
* Author: Fabio Comuni <http://kirgroup.com/profile/fabrixxm>
+ * Status: Unsupported
*/
+use Friendica\App;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Module\Login;
-require_once('mod/community.php');
-
+require_once 'mod/community.php';
-function communityhome_install() {
- register_hook('home_content', 'addon/communityhome/communityhome.php', 'communityhome_home');
+function communityhome_install()
+{
+ Addon::registerHook('home_content', 'addon/communityhome/communityhome.php', 'communityhome_home');
logger("installed communityhome");
}
-function communityhome_uninstall() {
- unregister_hook('home_content', 'addon/communityhome/communityhome.php', 'communityhome_home');
+function communityhome_uninstall()
+{
+ Addon::unregisterHook('home_content', 'addon/communityhome/communityhome.php', 'communityhome_home');
logger("removed communityhome");
}
-function communityhome_home(&$a, &$o){
+function communityhome_getopts()
+{
+ return [
+ 'hidelogin' => L10n::t('Hide login form'),
+ 'showlastusers' => L10n::t('Show last new users'),
+ 'showlastphotos' => L10n::t('Show last photos'),
+ 'showlastlike' => L10n::t('Show last liked items'),
+ 'showcommunitystream' => L10n::t('Show community stream')
+ ];
+}
+
+function communityhome_addon_admin(App $a, &$o)
+{
+ $tpl = get_markup_template('settings.tpl', 'addon/communityhome/');
+
+ $opts = communityhome_getopts();
+ $ctx = [
+ '$submit' => L10n::t("Submit"),
+ '$fields' => [],
+ ];
+
+ foreach ($opts as $k => $v) {
+ $ctx['fields'][] = ['communityhome_' . $k, $v, Config::get('communityhome', $k)];
+ }
+ $o = replace_macros($tpl, $ctx);
+}
+
+function communityhome_addon_admin_post(App $a)
+{
+ if (x($_POST, 'communityhome-submit')) {
+ $opts = communityhome_getopts();
+ foreach ($opts as $k => $v) {
+ Config::set('communityhome', $k, x($_POST, 'communityhome_' . $k));
+ }
+ }
+}
+
+function communityhome_home(App $a, &$o)
+{
// custom css
- $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'.$a->get_baseurl().'/addon/communityhome/communityhome.css" media="all" />';
+ $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' . $a->get_baseurl() . '/addon/communityhome/communityhome.css" media="all" />';
- if (!get_config('communityhome','hidelogin')){
- $aside = array(
- '$tab_1' => t('Login'),
- '$tab_2' => t('OpenID'),
- '$noOid' => get_config('system','no_openid'),
- );
+ if (!Config::get('communityhome', 'hidelogin')) {
+ $aside = [
+ '$tab_1' => L10n::t('Login'),
+ '$tab_2' => L10n::t('OpenID'),
+ '$noOid' => Config::get('system', 'no_openid'),
+ ];
// login form
- $aside['$login_title'] = t('Login');
- $aside['$login_form'] = login(($a->config['register_policy'] == REGISTER_CLOSED) ? false : true);
- } else
- $aside = array(
- //'$tab_1' => t('Login'),
- //'$tab_2' => t('OpenID'),
- //'$noOid' => get_config('system','no_openid'),
- );
+ $aside['$login_title'] = L10n::t('Login');
+ $aside['$login_form'] = Login::form($a->query_string, $a->config['register_policy'] == REGISTER_CLOSED ? false : true);
+ } else {
+ $aside = [
+ //'$tab_1' => L10n::t('Login'),
+ //'$tab_2' => L10n::t('OpenID'),
+ //'$noOid' => Config::get('system','no_openid'),
+ ];
+ }
// last 12 users
- if (get_config('communityhome','showlastusers')===true){
- $aside['$lastusers_title'] = t('Latest users');
- $aside['$lastusers_items'] = array();
+ if (Config::get('communityhome', 'showlastusers')) {
+ $aside['$lastusers_title'] = L10n::t('Latest users');
+ $aside['$lastusers_items'] = [];
$sql_extra = "";
- $publish = (get_config('system','publish_all') ? '' : " AND `publish` = 1 " );
+ $publish = (Config::get('system', 'publish_all') ? '' : " AND `publish` = 1 " );
$order = " ORDER BY `register_date` DESC ";
$r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`
- FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid`
- WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra $order LIMIT %d , %d ",
+ FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid`
+ WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra $order LIMIT %d, %d ",
0,
12
);
- # $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl');
- $tpl = get_markup_template( 'directory_item.tpl', 'addon/communityhome/' );
- if(count($r)) {
+ # $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl');
+ $tpl = get_markup_template('directory_item.tpl', 'addon/communityhome/');
+ if (count($r)) {
$photo = 'thumb';
- foreach($r as $rr) {
+ foreach ($r as $rr) {
$profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
- $entry = replace_macros($tpl,array(
+ $entry = replace_macros($tpl, [
'$id' => $rr['id'],
'$profile_link' => $profile_link,
'$photo' => $a->get_cached_avatar_image($rr[$photo]),
}
}
}
- // 12 most active users (by posts and contacts)
- // this query don't work on some mysql versions
- if (get_config('communityhome','showactiveusers')===true){
- $r = q("SELECT `uni`.`contacts`,`uni`.`items`, `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname` FROM
- (SELECT COUNT(*) as `contacts`, `uid` FROM `contact` WHERE `self`=0 GROUP BY `uid`) AS `con`,
- (SELECT COUNT(*) as `items`, `uid` FROM `item` WHERE `item`.`changed` > DATE(NOW() - INTERVAL 1 MONTH) AND `item`.`wall` = 1 GROUP BY `uid`) AS `ite`,
- (
- SELECT `contacts`,`items`,`ite`.`uid` FROM `con` RIGHT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid`
- UNION ALL
- SELECT `contacts`,`items`,`con`.`uid` FROM `con` LEFT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid`
- ) AS `uni`, `user`, `profile`
- WHERE `uni`.`uid`=`user`.`uid`
- AND `uni`.`uid`=`profile`.`uid` AND `profile`.`publish`=1
- GROUP BY `uid`
- ORDER BY `items` DESC,`contacts` DESC
- LIMIT 0,10");
- if($r && count($r)) {
- $aside['$activeusers_title'] = t('Most active users');
- $aside['$activeusers_items'] = array();
- $photo = 'thumb';
- foreach($r as $rr) {
- $profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
- $entry = replace_macros($tpl,array(
- '$id' => $rr['id'],
- '$profile_link' => $profile_link,
- '$photo' => $rr[$photo],
- '$alt_text' => sprintf("%s (%s posts, %s contacts)",$rr['name'], ($rr['items']?$rr['items']:'0'), ($rr['contacts']?$rr['contacts']:'0'))
- ));
- $aside['$activeusers_items'][] = $entry;
- }
- }
- }
// last 12 photos
- if (get_config('communityhome','showlastphotos')===true){
- $aside['$photos_title'] = t('Latest photos');
- $aside['$photos_items'] = array();
- $r = q("SELECT `photo`.`id`, `photo`.`resource-id`, `photo`.`scale`, `photo`.`desc`, `user`.`nickname`, `user`.`username` FROM
- (SELECT `resource-id`, MAX(`scale`) as maxscale FROM `photo`
+ if (Config::get('communityhome', 'showlastphotos')) {
+ $aside['$photos_title'] = L10n::t('Latest photos');
+ $aside['$photos_items'] = [];
+ $r = q("SELECT `photo`.`id`, `photo`.`resource-id`, `photo`.`scale`, `photo`.`desc`, `user`.`nickname`, `user`.`username` FROM
+ (SELECT `resource-id`, MAX(`scale`) as maxscale FROM `photo`
WHERE `profile`=0 AND `contact-id`=0 AND `album` NOT IN ('Contact Photos', '%s', 'Profile Photos', '%s')
AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`='' GROUP BY `resource-id`) AS `t1`
INNER JOIN `photo` ON `photo`.`resource-id`=`t1`.`resource-id` AND `photo`.`scale` = `t1`.`maxscale`,
AND `user`.`hidewall` = 0
ORDER BY `photo`.`edited` DESC
LIMIT 0, 12",
- dbesc(t('Contact Photos')),
- dbesc(t('Profile Photos'))
- );
+ dbesc(L10n::t('Contact Photos')),
+ dbesc(L10n::t('Profile Photos'))
+ );
- if(count($r)) {
- # $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl');
- $tpl = get_markup_template( 'directory_item.tpl', 'addon/communityhome/' );
- foreach($r as $rr) {
+ if (count($r)) {
+ # $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl');
+ $tpl = get_markup_template('directory_item.tpl', 'addon/communityhome/');
+ foreach ($r as $rr) {
$photo_page = $a->get_baseurl() . '/photos/' . $rr['nickname'] . '/image/' . $rr['resource-id'];
- $photo_url = $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . $rr['scale'] .'.jpg';
+ $photo_url = $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . $rr['scale'] . '.jpg';
- $entry = replace_macros($tpl,array(
+ $entry = replace_macros($tpl, [
'$id' => $rr['id'],
'$profile_link' => $photo_page,
'$photo' => $photo_url,
}
// last 10 liked items
- if (get_config('communityhome','showlastlike')===true){
- $aside['$like_title'] = t('Latest likes');
- $aside['$like_items'] = array();
- $r = q("SELECT `T1`.`created`, `T1`.`liker`, `T1`.`liker-link`, `item`.* FROM
- (SELECT `parent-uri`, `created`, `author-name` AS `liker`,`author-link` AS `liker-link`
+ if (Config::get('communityhome', 'showlastlike')) {
+ $aside['$like_title'] = L10n::t('Latest likes');
+ $aside['$like_items'] = [];
+ $r = q("SELECT `T1`.`created`, `T1`.`liker`, `T1`.`liker-link`, `item`.* FROM
+ (SELECT `parent-uri`, `created`, `author-name` AS `liker`,`author-link` AS `liker-link`
FROM `item` WHERE `verb`='http://activitystrea.ms/schema/1.0/like' GROUP BY `parent-uri` ORDER BY `created` DESC) AS T1
INNER JOIN `item` ON `item`.`uri`=`T1`.`parent-uri`
WHERE `T1`.`liker-link` LIKE '%s%%' OR `item`.`author-link` LIKE '%s%%'
GROUP BY `uri`
ORDER BY `T1`.`created` DESC
LIMIT 0,10",
- $a->get_baseurl(),$a->get_baseurl()
- );
+ $a->get_baseurl(),
+ $a->get_baseurl()
+ );
foreach ($r as $rr) {
- $author = '<a href="' . $rr['liker-link'] . '">' . $rr['liker'] . '</a>';
- $objauthor = '<a href="' . $rr['author-link'] . '">' . $rr['author-name'] . '</a>';
+ $author = '<a href="' . $rr['liker-link'] . '">' . $rr['liker'] . '</a>';
+ $objauthor = '<a href="' . $rr['author-link'] . '">' . $rr['author-name'] . '</a>';
//var_dump($rr['verb'],$rr['object-type']); killme();
- switch($rr['verb']){
+ switch ($rr['verb']) {
case 'http://activitystrea.ms/schema/1.0/post':
- switch ($rr['object-type']){
+ switch ($rr['object-type']) {
case 'http://activitystrea.ms/schema/1.0/event':
- $post_type = t('event');
+ $post_type = L10n::t('event');
break;
default:
- $post_type = t('status');
+ $post_type = L10n::t('status');
}
break;
default:
- if ($rr['resource-id']){
- $post_type = t('photo');
- $m=array(); preg_match("/\[url=([^]]*)\]/", $rr['body'], $m);
+ if ($rr['resource-id']) {
+ $post_type = L10n::t('photo');
+ $m = [];
+ preg_match("/\[url=([^]]*)\]/", $rr['body'], $m);
$rr['plink'] = $m[1];
} else {
- $post_type = t('status');
+ $post_type = L10n::t('status');
}
}
$plink = '<a href="' . $rr['plink'] . '">' . $post_type . '</a>';
- $aside['$like_items'][] = sprintf( t('%1$s likes %2$s\'s %3$s'), $author, $objauthor, $plink);
-
+ $aside['$like_items'][] = L10n::t('%1$s likes %2$s\'s %3$s', $author, $objauthor, $plink);
}
}
$tpl = get_markup_template('communityhome.tpl', 'addon/communityhome/');
$a->page['aside'] = replace_macros($tpl, $aside);
- $o = '<h1>' . ((x($a->config,'sitename')) ? sprintf( t("Welcome to %s") ,$a->config['sitename']) : "" ) . '</h1>';
+ $o = '<h1>' . ((x($a->config, 'sitename')) ? L10n::t("Welcome to %s", $a->config['sitename']) : "" ) . '</h1>';
- if(file_exists('home.html'))
- $o = file_get_contents('home.html');
+ if (file_exists('home.html')) $o = file_get_contents('home.html');
- if (get_config('communityhome','showcommunitystream')===true){
- $oldset = get_config('system','community_page_style');
- if ($oldset == CP_NO_COMMUNITY_PAGE)
- set_config('system','community_page_style', CP_USERS_ON_SERVER);
+ if (Config::get('communityhome', 'showcommunitystream')) {
+ $oldset = Config::get('system', 'community_page_style');
+ if ($oldset == CP_NO_COMMUNITY_PAGE) Config::set('system', 'community_page_style', CP_USERS_ON_SERVER);
- $o .= community_content($a,1);
+ $o .= community_content($a, 1);
- if ($oldset == CP_NO_COMMUNITY_PAGE)
- set_config('system','community_page_style', $oldset);
+ if ($oldset == CP_NO_COMMUNITY_PAGE) Config::set('system', 'community_page_style', $oldset);
}
}
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2014-09-10 10:30+0000\n"
+"PO-Revision-Date: 2017-09-20 06:07+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
$("#tab_1").removeClass("active");
e.preventDefault();
return false;
-
+
});
-
+
});
</script>
{{if $noOid}}
{{/if}}
-{{if $activeusers_title}}
-<h3>{{$activeusers_title}}</h3>
-<div class='items-wrapper'>
-{{foreach $activeusers_items as $i}}
- {{$i}}
-{{/foreach}}
-</div>
-{{/if}}
-
{{if $photos_title}}
<h3>{{$photos_title}}</h3>
<div class='items-wrapper'>
* Version: 1.0\r
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>\r
*/\r
+use Friendica\Core\Addon;\r
\r
function convert_install() {\r
- register_hook('app_menu', 'addon/convert/convert.php', 'convert_app_menu');\r
+ Addon::registerHook('app_menu', 'addon/convert/convert.php', 'convert_app_menu');\r
}\r
\r
function convert_uninstall() {\r
- unregister_hook('app_menu', 'addon/convert/convert.php', 'convert_app_menu');\r
+ Addon::unregisterHook('app_menu', 'addon/convert/convert.php', 'convert_app_menu');\r
}\r
\r
function convert_app_menu($a,&$b) {\r
*
*/
-require_once('include/network.php');
-require_once("mod/proxy.php");
-require_once('include/text.php');
+require_once 'mod/proxy.php';
+require_once 'include/text.php';
+
+use Friendica\Core\Addon;
+use Friendica\Core\Cache;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Util\Network;
// get the weather data from OpenWeatherMap
function getWeather( $loc, $units='metric', $lang='en', $appid='', $cachetime=0) {
}
}
try {
- $res = new SimpleXMLElement(fetch_url($url));
+ $res = new SimpleXMLElement(Network::fetchUrl($url));
} catch (Exception $e) {
- info(t('Error fetching weather data.\nError was: '.$e->getMessage()));
+ info(L10n::t('Error fetching weather data.\nError was: '.$e->getMessage()));
return false;
}
if ((string)$res->temperature['unit']==='metric') {
return $r;
}
-function curweather_install() {
- register_hook('network_mod_init', 'addon/curweather/curweather.php', 'curweather_network_mod_init');
- register_hook('plugin_settings', 'addon/curweather/curweather.php', 'curweather_plugin_settings');
- register_hook('plugin_settings_post', 'addon/curweather/curweather.php', 'curweather_plugin_settings_post');
+function curweather_install()
+{
+ Addon::registerHook('network_mod_init', 'addon/curweather/curweather.php', 'curweather_network_mod_init');
+ Addon::registerHook('addon_settings', 'addon/curweather/curweather.php', 'curweather_addon_settings');
+ Addon::registerHook('addon_settings_post', 'addon/curweather/curweather.php', 'curweather_addon_settings_post');
}
function curweather_uninstall() {
- unregister_hook('network_mod_init', 'addon/curweather/curweather.php', 'curweather_network_mod_init');
- unregister_hook('plugin_settings', 'addon/curweather/curweather.php', 'curweather_plugin_settings');
- unregister_hook('plugin_settings_post', 'addon/curweather/curweather.php', 'curweather_plugin_settings_post');
+ Addon::unregisterHook('network_mod_init', 'addon/curweather/curweather.php', 'curweather_network_mod_init');
+ Addon::unregisterHook('addon_settings', 'addon/curweather/curweather.php', 'curweather_addon_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/curweather/curweather.php', 'curweather_addon_settings_post');
}
function curweather_network_mod_init(&$fk_app,&$b) {
if ($ok) {
$t = get_markup_template("widget.tpl", "addon/curweather/" );
- $curweather = replace_macros ($t, array(
- '$title' => t("Current Weather"),
+ $curweather = replace_macros ($t, [
+ '$title' => L10n::t("Current Weather"),
'$icon' => proxy_url('http://openweathermap.org/img/w/'.$res['icon'].'.png'),
'$city' => $res['city'],
'$lon' => $res['lon'],
'$lat' => $res['lat'],
'$description' => $res['descripion'],
'$temp' => $res['temperature'],
- '$relhumidity' => array('caption'=>t('Relative Humidity'), 'val'=>$res['humidity']),
- '$pressure' => array('caption'=>t('Pressure'), 'val'=>$res['pressure']),
- '$wind' => array('caption'=>t('Wind'), 'val'=> $res['wind']),
- '$lastupdate' => t('Last Updated').': '.$res['update'].'UTC',
- '$databy' => t('Data by'),
- '$showonmap' => t('Show on map')
- ));
+ '$relhumidity' => ['caption'=>L10n::t('Relative Humidity'), 'val'=>$res['humidity']],
+ '$pressure' => ['caption'=>L10n::t('Pressure'), 'val'=>$res['pressure']],
+ '$wind' => ['caption'=>L10n::t('Wind'), 'val'=> $res['wind']],
+ '$lastupdate' => L10n::t('Last Updated').': '.$res['update'].'UTC',
+ '$databy' => L10n::t('Data by'),
+ '$showonmap' => L10n::t('Show on map')
+ ]);
} else {
$t = get_markup_template('widget-error.tpl', 'addon/curweather/');
- $curweather = replace_macros( $t, array(
- '$problem' => t('There was a problem accessing the weather data. But have a look'),
+ $curweather = replace_macros( $t, [
+ '$problem' => L10n::t('There was a problem accessing the weather data. But have a look'),
'$rpt' => $rpt,
- '$atOWM' => t('at OpenWeatherMap')
- ));
+ '$atOWM' => L10n::t('at OpenWeatherMap')
+ ]);
}
$fk_app->page['aside'] = $curweather.$fk_app->page['aside'];
}
-function curweather_plugin_settings_post($a,$post) {
+function curweather_addon_settings_post($a,$post) {
if(! local_user() || (! x($_POST,'curweather-settings-submit')))
return;
set_pconfig(local_user(),'curweather','curweather_loc',trim($_POST['curweather_loc']));
set_pconfig(local_user(),'curweather','curweather_enable',intval($_POST['curweather_enable']));
set_pconfig(local_user(),'curweather','curweather_units',trim($_POST['curweather_units']));
- info( t('Current Weather settings updated.') . EOL);
+ info(L10n::t('Current Weather settings updated.') . EOL);
}
-function curweather_plugin_settings(&$a,&$s) {
+function curweather_addon_settings(&$a,&$s) {
if(! local_user())
return;
/* Get the current state of our config variable */
- $curweather_loc = get_pconfig(local_user(), 'curweather', 'curweather_loc');
- $curweather_units = get_pconfig(local_user(), 'curweather', 'curweather_units');
- $appid = get_config('curweather','appid');
- if ($appid=="") {
- $noappidtext = t('No APPID found, please contact your admin to obtain one.');
+ $curweather_loc = PConfig::get(local_user(), 'curweather', 'curweather_loc');
+ $curweather_units = PConfig::get(local_user(), 'curweather', 'curweather_units');
+ $appid = Config::get('curweather','appid');
+ if ($appid=="") {
+ $noappidtext = L10n::t('No APPID found, please contact your admin to obtain one.');
} else {
$noappidtext = '';
}
// load template and replace the macros
$t = get_markup_template("settings.tpl", "addon/curweather/" );
- $s = replace_macros ($t, array(
- '$submit' => t('Save Settings'),
- '$header' => t('Current Weather').' '.t('Settings'),
+ $s = replace_macros ($t, [
+ '$submit' => L10n::t('Save Settings'),
+ '$header' => L10n::t('Current Weather').' '.L10n::t('Settings'),
'$noappidtext' => $noappidtext,
- '$info' => t('Enter either the name of your location or the zip code.'),
- '$curweather_loc' => array( 'curweather_loc', t('Your Location'), $curweather_loc, t('Identifier of your location (name or zip code), e.g. <em>Berlin,DE</em> or <em>14476,DE</em>.') ),
- '$curweather_units' => array( 'curweather_units', t('Units'), $curweather_units, t('select if the temperature should be displayed in °C or °F'), array('metric'=>'°C', 'imperial'=>'°F')),
- '$enabled' => array( 'curweather_enable', t('Show weather data'), $enable, '')
- ));
+ '$info' => L10n::t('Enter either the name of your location or the zip code.'),
+ '$curweather_loc' => [ 'curweather_loc', L10n::t('Your Location'), $curweather_loc, L10n::t('Identifier of your location (name or zip code), e.g. <em>Berlin,DE</em> or <em>14476,DE</em>.') ],
+ '$curweather_units' => [ 'curweather_units', L10n::t('Units'), $curweather_units, L10n::t('select if the temperature should be displayed in °C or °F'), ['metric'=>'°C', 'imperial'=>'°F']],
+ '$enabled' => [ 'curweather_enable', L10n::t('Show weather data'), $enable, '']
+ ]);
return;
}
// Config stuff for the admin panel to let the admin of the node set a APPID
// for accessing the API of openweathermap
-function curweather_plugin_admin_post (&$a) {
+function curweather_addon_admin_post (&$a) {
if(! is_site_admin())
return;
if ($_POST['curweather-submit']) {
- set_config('curweather','appid',trim($_POST['appid']));
- set_config('curweather','cachetime',trim($_POST['cachetime']));
- info( t('Curweather settings saved.'.EOL));
+ Config::set('curweather','appid',trim($_POST['appid']));
+ Config::set('curweather','cachetime',trim($_POST['cachetime']));
+ info(L10n::t('Curweather settings saved.'.EOL));
}
}
-function curweather_plugin_admin (&$a, &$o) {
+function curweather_addon_admin (&$a, &$o) {
if(! is_site_admin())
return;
$appid = get_config('curweather','appid');
$cachetime = get_config('curweather','cachetime');
$t = get_markup_template("admin.tpl", "addon/curweather/" );
- $o = replace_macros ($t, array(
- '$submit' => t('Save Settings'),
- '$cachetime' => array('cachetime', t('Caching Interval'), $cachetime, t('For how long should the weather data be cached? Choose according your OpenWeatherMap account type.'), array('0'=>t('no cache'), '300'=>'5 '.t('minutes'), '900'=>'15 '.t('minutes'), '1800'=>'30 '.t('minutes'), '3600'=>'60 '.t('minutes'))),
- '$appid' => array('appid', t('Your APPID'), $appid, t('Your API key provided by OpenWeatherMap'))
- ));
+ $o = replace_macros ($t, [
+ '$submit' => L10n::t('Save Settings'),
+ '$cachetime' => ['cachetime', L10n::t('Caching Interval'), $cachetime, L10n::t('For how long should the weather data be cached? Choose according your OpenWeatherMap account type.'), ['0'=>L10n::t('no cache'), '300'=>'5 '.L10n::t('minutes'), '900'=>'15 '.L10n::t('minutes'), '1800'=>'30 '.L10n::t('minutes'), '3600'=>'60 '.L10n::t('minutes')]],
+ '$appid' => ['appid', L10n::t('Your APPID'), $appid, L10n::t('Your API key provided by OpenWeatherMap')]
+ ]);
}
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-09-25 17:17+0200\n"
-"PO-Revision-Date: 2016-11-22 06:43+0000\n"
+"PO-Revision-Date: 2017-09-20 06:07+0000\n"
"Last-Translator: Tobias Diekershoff <tobias.diekershoff@gmx.net>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
- aCal (http://andrew.mcmillan.net.nz/projects/aCal) works, available in F-Droid and Google Play
- CalDAV-Sync (http://dmfs.org/caldav/) works, non-free
-Installation
-After activating, serveral tables in the database have to be created. The admin-interface of the plugin will try to do this automatically.
+## Installation
+After activating, serveral tables in the database have to be created. The admin-interface of the addon will try to do this automatically.
In case of errors, the SQL-statement to create the tables manually are shown in the admin-interface.
-Author of this plugin (the parts that are not part of the libraries above):
+Author of this addon (the parts that are not part of the libraries above):
Tobias Hößl
http://friendica.hoessl.eu/profile/cato
http://www.hoessl.eu/
* Changed: The Sabre_VObject library now spawned into it's own project!
* New feature: Support for caldav notifications!
* Changed: Responsibility for dealing with the calendar-query is now
- moved from the CalDAV plugin to the CalDAV backends. This allows for
+ moved from the CalDAV addon to the CalDAV backends. This allows for
heavy optimizations.
* Changed: The CalDAV PDO backend is now a lot faster for common
calendar queries.
receiving "text/x-vcard; charset=utf-8" for a contenttype.
* Added: Sabre_DAV_Client now throws more specific exceptions in cases
where we already has an exception class.
- * Added: Sabre_DAV_PartialUpdate. This plugin allows you to use the
+ * Added: Sabre_DAV_PartialUpdate. This addon allows you to use the
PATCH method to update parts of a file.
* Added: Tons of timezone name mappings for Microsoft Exchange.
* Added: Support for an 'exception' event.
* Fixed: Issue 112: Stronger validation of iCalendar objects. Now making
sure every iCalendar object only contains 1 component, and disallowing
vcards, forcing every component to have a UID.
- * Fixed: Basic validation for vcards in the CardDAV plugin.
+ * Fixed: Basic validation for vcards in the CardDAV addon.
* Fixed: Issue 213: Workaround for an Evolution bug, that prevented it
from updating events.
* Fixed: Issue 211: A time-limit query on a non-relative alarm trigger in
a recurring event could result in an endless loop.
* Fixed: All uri fields are now a maximum of 200 characters. The Bynari
- outlook plugin used much longer strings so this should improve
+ outlook addon used much longer strings so this should improve
compatibility.
* Fixed: Added a workaround for a bug in KDE 4.8.2 contact syncing. See
https://bugs.kde.org/show_bug.cgi?id=300047
COUNT= parameter in the RRULE property.
* Added: Support for time-range filters on VALARM components.
* Fixed: Correctly filtering all-day events.
- * Fixed: Sending back correct mimetypes from the browser plugin (thanks
+ * Fixed: Sending back correct mimetypes from the browser addon (thanks
Jürgen).
* Fixed: Issue 195: Sabre_CardDAV pear package had an incorrect dependency.
* Fixed: Calendardata would be destroyed when performing a MOVE request.
* BC Break: Default Principals PDO backend now needs a new field in the
'principals' table. See the website for details.
* Added: Ability to create new calendars and addressbooks from within the
- browser plugin.
- * Added: Browser plugin: icons for various nodes.
+ browser addon.
+ * Added: Browser addon: icons for various nodes.
* Added: Support for FREEBUSY reports!
* Added: Support for creating principals with admin-level privileges.
* Added: Possibility to let server send out invitation emails on behalf of
* Changed: beforeCreateFile event now passes data argument by reference.
* Changed: The 'propertyMap' property from Sabre_VObject_Reader, must now
be specified in Sabre_VObject_Property::$classMap.
- * Added: Ability for plugins to tell the ACL plugin which principal
- plugins are searchable.
+ * Added: Ability for addons to tell the ACL addon which principal
+ addons are searchable.
* Added: [DAVACL] Per-node overriding of supported privileges. This allows
for custom privileges where needed.
- * Added: [DAVACL] Public 'principalSearch' method on the DAVACL plugin,
+ * Added: [DAVACL] Public 'principalSearch' method on the DAVACL addon,
which allows for easy searching for principals, based on their
properties.
* Added: Sabre_VObject_Component::getComponents() to return a list of only
* Fixed: VObject properties are now always encoded before components.
* Fixed: Sabre_DAVACL had issues with multiple levels of privilege
aggregration.
- * Changed: Added 'GuessContentType' plugin to fileserver.php example.
- * Fixed: The Browser plugin will now trigger the correct events when
+ * Changed: Added 'GuessContentType' addon to fileserver.php example.
+ * Fixed: The Browser addon will now trigger the correct events when
creating files.
* Fixed: The ICSExportPlugin now considers ACL's.
* Added: Made it optional to supply carddata from an Addressbook backend
files to be locked at the same time.
1.5.4-stable (2011-10-28)
- * Fixed: GuessContentType plugin now supports mixed case file extensions.
+ * Fixed: GuessContentType addon now supports mixed case file extensions.
* Fixed: DATE-TIME encoding was wrong in VObject. (we used 'DATETIME').
* Changed: Sending back HTTP 204 after a PUT request on an existing resource
instead of HTTP 200. This should fix Evolution CardDAV client
* Fixed: Issue 140: Not returning 201 Created if an event cancelled the
creation of a file.
* Fixed: Issue 150: Faster URLUtil::encodePath() implementation.
- * Fixed: Issue 144: Browser plugin could interfere with
+ * Fixed: Issue 144: Browser addon could interfere with
TemporaryFileFilterPlugin if it was loaded first.
* Added: It's not possible to specify more 'alternate uris' in principal
backends.
* Added: Clark-notation parser to XML utility.
* Added: unset() support to VObject components.
* Fixed: Refactored CalDAV property fetching to be faster and simpler.
- * Added: Central string-matcher for CalDAV and CardDAV plugins.
+ * Added: Central string-matcher for CalDAV and CardDAV addons.
* Added: i;unicode-casemap support
* Fixed: VObject bug: wouldn't parse parameters if they weren't specified
in uppercase.
* Fixed: VObject bug: Parameters with no value are now correctly parsed.
* Changed: If calendars don't specify which components they allow, 'all'
components are assumed (e.g.: VEVENT, VTODO, VJOURNAL).
- * Changed: Browser plugin now uses POST variable 'sabreAction' instead of
+ * Changed: Browser addon now uses POST variable 'sabreAction' instead of
'action' to reduce the chance of collisions.
1.4.4-stable (2011-07-07)
* Added: Ability to automatically generate full .ics feeds off calendars.
To use: Add the Sabre_CalDAV_ICSExportPlugin, and add ?export to your
calendar url.
- * Added: Plugins can now specify a pluginname, for easy access using
+ * Added: Plugins can now specify a addonname, for easy access using
Sabre_DAV_Server::getPlugin().
* Added: beforeGetProperties event.
* Added: updateProperties event.
break, so if you implement Sabre_DAV_ICollection directly, add the method.
* Changed: Almost all HTTP method implementations now take a uri argument,
including events. This allows for internal rerouting of certain calls.
- If you have custom plugins, make sure they use this argument. If they
+ If you have custom addons, make sure they use this argument. If they
don't, they will likely still work, but it might get in the way of
future changes.
* Changed: All getETag methods MUST now surround the etag with
instead.
* Removed: Sabre_DAV_IDirectory interface, use Sabre_DAV_ICollection
instead.
- * Added: Browser plugin now uses {DAV:}displayname if this property is
+ * Added: Browser addon now uses {DAV:}displayname if this property is
available.
* Added: Cache layer in the ObjectTree.
* Added: Tree classes now have a delete and getChildren method.
* Updated: Small improvements to example files.
1.2.0 (2010-05-24)
- * Fixed: Browser plugin now displays international characters.
+ * Fixed: Browser addon now displays international characters.
* Changed: More properties in CalDAV classes are now protected instead of
private.
* Update: Complete rewrite of property updating. Now easier to use and
atomic.
* Fixed: Issue 16, automatically adding trailing / to baseUri.
- * Added: text/plain is used for .txt files in GuessContentType plugin.
+ * Added: text/plain is used for .txt files in GuessContentType addon.
* Added: support for principal-property-search and
principal-search-property-set reports.
* Added: Issue 31: Hiding exception information by default. Can be turned
this.
* Added: PDO authentication backend.
* Added: Example sql for auth, caldav, locks for sqlite.
- * Added: Sabre_DAV_Browser_GuessContentType plugin
- * Changed: Authentication plugin refactored, making it possible to
+ * Added: Sabre_DAV_Browser_GuessContentType addon
+ * Changed: Authentication addon refactored, making it possible to
implement non-digest authentication.
- * Fixed: Better error display in browser plugin.
+ * Fixed: Better error display in browser addon.
* Added: Support for {DAV:}supported-report-set
* Added: XML utility class with helper functions for the WebDAV protocol.
* Added: Tons of unittests
Before, execution would be stopped by anything loosely evaluating to
false.
* Changed: the getPropertiesForPath method now takes a different set of
- arguments, and returns a different response. This allows plugin
+ arguments, and returns a different response. This allows addon
developers to return statuses for properties other than 200 and 404. The
hrefs are now also always calculated relative to the baseUri, and not
the uri of the request.
* Changed: generatePropFindResponse is renamed to generateMultiStatus, and
now takes a list of properties similar to the response of
getPropertiesForPath. This was also needed to improve flexibility for
- plugin development.
- * Changed: Auth plugins are no longer included. They were not yet stable
+ addon development.
+ * Changed: Auth addons are no longer included. They were not yet stable
quality, so they will probably be reintroduced in a later version.
* Changed: PROPPATCH also used generateMultiStatus now.
* Removed: unknownProperties event. This is replaced by the
* Fixed: Copy and Move could fail in the root directory. This is now
fixed.
* Added: Plugins can now be retrieved by their classname. This is useful
- for inter-plugin communication.
+ for inter-addon communication.
* Added: The Auth backend can now return usernames and user-id's.
* Added: The Auth backend got a getUsers method
* Added: Sabre_DAV_FSExt_Directory now returns quota info
* Fixed: UNLOCK bug. Unlock didn't work at all
0.12-beta (2009-09-10)
- * Updated: Browser plugin now shows multiple {DAV:}resourcetype values
+ * Updated: Browser addon now shows multiple {DAV:}resourcetype values
if available.
* Added: Experimental PDO backend for Locks Manager
* Fixed: Sending Content-Length: 0 for every empty response. This
* Added: Ability to choose to use auth-int, auth or both for HTTP Digest
authentication. (Issue 11)
* Changed: Made more methods in Sabre_DAV_Server public.
- * Fixed: TemporaryFileFilter plugin now intercepts HTTP LOCK requests
+ * Fixed: TemporaryFileFilter addon now intercepts HTTP LOCK requests
to non-existent files. (Issue 12)
* Added: Central list of defined xml namespace prefixes. This can reduce
Bandwidth and legibility for xml bodies with user-defined namespaces.
and IDirectory objects. If you created your own Tree objects,
this will most likely break in this release.
* Changed: Moved all the Locking logic from the Tree and Server classes
- into a separate plugin.
- * Changed: TemporaryFileFilter is now a plugin.
+ into a separate addon.
+ * Changed: TemporaryFileFilter is now a addon.
* Added: Comes with an autoloader script. This can be used instead of
the includer script, and is preferred by some people.
* Added: AWS Authentication class.
priority. This is for example needed to ensure that the Authentication
Plugin is used before any other Plugin.
* Added: 22 new tests.
- * Added: Users-manager plugin for .htdigest files. Experimental and
+ * Added: Users-manager addon for .htdigest files. Experimental and
subject to change.
* Added: RFC 2324 HTTP 418 status code
* Fixed: Exclusive locks could in some cases be picked up as shared locks
* Changed: Renamed all exceptions! This is a compatibility break. Every
Exception now follows Sabre_DAV_Exception_FileNotFound convention
instead of Sabre_DAV_FileNotFoundException.
- * Added: Browser plugin now allows uploading and creating directories
+ * Added: Browser addon now allows uploading and creating directories
straight from the browser.
* Added: 12 more unittests
* Fixed: Locking bug, which became prevalent on Windows Vista.
* Added: support for {DAV:}supportedlock.
* Added: support for {DAV:}lockdiscovery.
* Added: 6 new tests.
- * Added: New plugin system.
- * Added: Simple HTML directory plugin, for browser access.
+ * Added: New addon system.
+ * Added: Simple HTML directory addon, for browser access.
* Added: Server class now sends back standard pre-condition error xml
bodies. This was new since RFC4918.
* Added: Sabre_DAV_Tree_Aggregrate, which can 'host' multiple Tree objects
into one.
* Added: simple basis for HTTP REPORT method. This method is not used yet,
- but can be used by plugins to add reports.
+ but can be used by addons to add reports.
* Changed: ->getSize is only called for files, no longer for collections.
r303
* Changed: Sabre_DAV_FilterTree is now Sabre_DAV_Tree_Filter
/**
* ICS Exporter
*
- * This plugin adds the ability to export entire calendars as .ics files.
+ * This addon adds the ability to export entire calendars as .ics files.
* This is useful for clients that don't support CalDAV yet. They often do
* support ics files.
*
private $server;
/**
- * Initializes the plugin and registers event handlers
+ * Initializes the addon and registers event handlers
*
* @param Sabre_DAV_Server $server
* @return void
* This node represents a list of notifications.
*
* It provides no additional functionality, but you must implement this
- * interface to allow the Notifications plugin to mark the collection
+ * interface to allow the Notifications addon to mark the collection
* as a notifications collection.
*
* This collection should only return Sabre_CalDAV_Notifications_INode nodes as
* This node represents a list of notifications.
*
* It provides no additional functionality, but you must implement this
- * interface to allow the Notifications plugin to mark the collection
+ * interface to allow the Notifications addon to mark the collection
* as a notifications collection.
*
* This collection should only return Sabre_CalDAV_Notifications_INode nodes as
use Sabre\VObject;
/**
- * CalDAV plugin
+ * CalDAV addon
*
- * This plugin provides functionality added by CalDAV (RFC 4791)
+ * This addon provides functionality added by CalDAV (RFC 4791)
* It implements new reports, and the MKCALENDAR method.
*
* @package Sabre
}
/**
- * Use this method to tell the server this plugin defines additional
+ * Use this method to tell the server this addon defines additional
* HTTP methods.
*
* This method is passed a uri. It should only return HTTP methods that are
}
/**
- * Returns a plugin name.
+ * Returns a addon name.
*
- * Using this name other plugins will be able to access other plugins
+ * Using this name other addons will be able to access other addons
* using Sabre_DAV_Server::getPlugin
*
* @return string
}
/**
- * Returns a list of reports this plugin supports.
+ * Returns a list of reports this addon supports.
*
* This will be used in the {DAV:}supported-report-set property.
* Note that you still need to subscribe to the 'report' event to actually
}
/**
- * Initializes the plugin
+ * Initializes the addon
*
* @param Sabre_DAV_Server $server
* @return void
$acl = $this->server->getPlugin('acl');
if (!$acl) {
- throw new Sabre_DAV_Exception('The ACL plugin must be loaded for free-busy queries to work');
+ throw new Sabre_DAV_Exception('The ACL addon must be loaded for free-busy queries to work');
}
$uri = $this->server->getRequestUri();
$acl->checkPrivileges($uri,'{' . self::NS_CALDAV . '}read-free-busy');
/**
* This method is triggered before a file gets updated with new content.
*
- * This plugin uses this method to ensure that CalDAV objects receive
+ * This addon uses this method to ensure that CalDAV objects receive
* valid calendar data.
*
* @param string $path
/**
* This method is triggered before a new file is created.
*
- * This plugin uses this method to ensure that newly created calendar
+ * This addon uses this method to ensure that newly created calendar
* objects contain valid calendar data.
*
* @param string $path
/**
* This method allows us to intercept the 'mkcalendar' sabreAction. This
- * action enables the user to create new calendars from the browser plugin.
+ * action enables the user to create new calendars from the browser addon.
*
* @param string $uri
* @param string $action
*
* The outbox is mainly used as an endpoint in the tree for a client to do
* free-busy requests. This functionality is completely handled by the
- * Scheduling plugin, so this object is actually mostly static.
+ * Scheduling addon, so this object is actually mostly static.
*
* @package Sabre
* @subpackage CalDAV
use Sabre\VObject;
/**
- * CardDAV plugin
+ * CardDAV addon
*
- * The CardDAV plugin adds CardDAV functionality to the WebDAV server
+ * The CardDAV addon adds CardDAV functionality to the WebDAV server
*
* @package Sabre
* @subpackage CardDAV
protected $server;
/**
- * Initializes the plugin
+ * Initializes the addon
*
* @param Sabre_DAV_Server $server
* @return void
}
/**
- * Returns a list of reports this plugin supports.
+ * Returns a list of reports this addon supports.
*
* This will be used in the {DAV:}supported-report-set property.
* Note that you still need to subscribe to the 'report' event to actually
/**
* This method is triggered before a file gets updated with new content.
*
- * This plugin uses this method to ensure that Card nodes receive valid
+ * This addon uses this method to ensure that Card nodes receive valid
* vcard data.
*
* @param string $path
/**
* This method is triggered before a new file is created.
*
- * This plugin uses this method to ensure that Card nodes receive valid
+ * This addon uses this method to ensure that Card nodes receive valid
* vcard data.
*
* @param string $path
/**
* This method allows us to intercept the 'mkcalendar' sabreAction. This
- * action enables the user to create new calendars from the browser plugin.
+ * action enables the user to create new calendars from the browser addon.
*
* @param string $uri
* @param string $action
<?php
/**
- * This plugin provides Authentication for a WebDAV server.
+ * This addon provides Authentication for a WebDAV server.
*
* It relies on a Backend object, which provides user information.
*
}
/**
- * Initializes the plugin. This function is automatically called by the server
+ * Initializes the addon. This function is automatically called by the server
*
* @param Sabre_DAV_Server $server
* @return void
}
/**
- * Returns a plugin name.
+ * Returns a addon name.
*
- * Using this name other plugins will be able to access other plugins
+ * Using this name other addons will be able to access other addons
* using Sabre_DAV_Server::getPlugin
*
* @return string
<?php
/**
- * GuessContentType plugin
+ * GuessContentType addon
*
* A lot of the built-in File objects just return application/octet-stream
* as a content-type by default. This is a problem for some clients, because
);
/**
- * Initializes the plugin
+ * Initializes the addon
*
* @param Sabre_DAV_Server $server
* @return void
<?php
/**
- * This is a simple plugin that will map any GET request for non-files to
+ * This is a simple addon that will map any GET request for non-files to
* PROPFIND allprops-requests.
*
* This should allow easy debugging of PROPFIND
protected $server;
/**
- * Initializes the plugin and subscribes to events
+ * Initializes the addon and subscribes to events
*
* @param Sabre_DAV_Server $server
* @return void
/**
* Browser Plugin
*
- * This plugin provides a html representation, so that a WebDAV server may be accessed
+ * This addon provides a html representation, so that a WebDAV server may be accessed
* using a browser.
*
* The class intercepts GET requests to collection resources and generates a simple
protected $enablePost = true;
/**
- * By default the browser plugin will generate a favicon and other images.
+ * By default the browser addon will generate a favicon and other images.
* To turn this off, set this property to false.
*
* @var bool
}
/**
- * Initializes the plugin and subscribes to events
+ * Initializes the addon and subscribes to events
*
* @param Sabre_DAV_Server $server
* @return void
$node = $this->server->tree->getNodeForPath($uri);
} catch (Sabre_DAV_Exception_NotFound $e) {
// We're simply stopping when the file isn't found to not interfere
- // with other plugins.
+ // with other addons.
return;
}
if ($node instanceof Sabre_DAV_IFile)
<?php
/**
- * Locking plugin
+ * Locking addon
*
- * This plugin provides locking support to a WebDAV server.
+ * This addon provides locking support to a WebDAV server.
* The easiest way to get started, is by hooking it up as such:
*
* $lockBackend = new Sabre_DAV_Locks_Backend_File('./mylockdb');
}
/**
- * Initializes the plugin
+ * Initializes the addon
*
* This method is automatically called by the Server class after addPlugin.
*
}
/**
- * Returns a plugin name.
+ * Returns a addon name.
*
- * Using this name other plugins will be able to access other plugins
+ * Using this name other addons will be able to access other addons
* using Sabre_DAV_Server::getPlugin
*
* @return string
* This method is called by the Server if the user used an HTTP method
* the server didn't recognize.
*
- * This plugin intercepts the LOCK and UNLOCK methods.
+ * This addon intercepts the LOCK and UNLOCK methods.
*
* @param string $method
* @param string $uri
* This method is called before the logic for any HTTP method is
* handled.
*
- * This plugin uses that feature to intercept access to locked resources.
+ * This addon uses that feature to intercept access to locked resources.
*
* @param string $method
* @param string $uri
}
/**
- * Use this method to tell the server this plugin defines additional
+ * Use this method to tell the server this addon defines additional
* HTTP methods.
*
* This method is passed a uri. It should only return HTTP methods that are
<?php
/**
- * This plugin provides support for RFC4709: Mounting WebDAV servers
+ * This addon provides support for RFC4709: Mounting WebDAV servers
*
* Simply append ?mount to any collection to generate the davmount response.
*
private $server;
/**
- * Initializes the plugin and registers event handles
+ * Initializes the addon and registers event handles
*
* @param Sabre_DAV_Server $server
* @return void
<?php
/**
- * Partial update plugin (Patch method)
+ * Partial update addon (Patch method)
*
- * This plugin provides a way to modify only part of a target resource
+ * This addon provides a way to modify only part of a target resource
* It may bu used to update a file chunk, upload big a file into smaller
* chunks or resume an upload.
*
protected $server;
/**
- * Initializes the plugin
+ * Initializes the addon
*
* This method is automatically called by the Server class after addPlugin.
*
}
/**
- * Returns a plugin name.
+ * Returns a addon name.
*
- * Using this name other plugins will be able to access other plugins
+ * Using this name other addons will be able to access other addons
* using Sabre_DAV_Server::getPlugin
*
* @return string
* This method is called by the Server if the user used an HTTP method
* the server didn't recognize.
*
- * This plugin intercepts the PATCH methods.
+ * This addon intercepts the PATCH methods.
*
* @param string $method
* @param string $uri
}
/**
- * Use this method to tell the server this plugin defines additional
+ * Use this method to tell the server this addon defines additional
* HTTP methods.
*
* This method is passed a uri. It should only return HTTP methods that are
public $httpRequest;
/**
- * The list of plugins
+ * The list of addons
*
* @var array
*/
}
/**
- * Adds a plugin to the server
+ * Adds a addon to the server
*
* For more information, console the documentation of Sabre_DAV_ServerPlugin
*
}
/**
- * Returns an initialized plugin by it's name.
+ * Returns an initialized addon by it's name.
*
- * This function returns null if the plugin was not found.
+ * This function returns null if the addon was not found.
*
* @param string $name
* @return Sabre_DAV_ServerPlugin
}
/**
- * Returns all plugins
+ * Returns all addons
*
* @return array
*/
* It is possible to control the order of the callbacks through the
* priority argument.
*
- * This is for example used to make sure that the authentication plugin
+ * This is for example used to make sure that the authentication addon
* is triggered before anything else. If it's not needed to change this
* number, it is recommended to ommit.
*
$methods[] = 'MKCOL';
}
- // We're also checking if any of the plugins register any new methods
+ // We're also checking if any of the addons register any new methods
foreach($this->plugins as $plugin) $methods = array_merge($methods, $plugin->getHTTPMethods($uri));
array_unique($methods);
*
* Currently this is done by HTTP PUT and HTTP LOCK (in the Locks_Plugin).
* It was important to get this done through a centralized function,
- * allowing plugins to intercept this using the beforeCreateFile event.
+ * allowing addons to intercept this using the beforeCreateFile event.
*
* This method will return true if the file was actually created
*
}
if (!$hasError) {
- // Allowing plugins to take care of property updating
+ // Allowing addons to take care of property updating
$hasError = !$this->broadcastEvent('updateProperties',array(
&$remainingProperties,
&$result,
<?php
/**
- * The baseclass for all server plugins.
+ * The baseclass for all server addons.
*
* Plugins can modify or extend the servers behaviour.
*
abstract class Sabre_DAV_ServerPlugin {
/**
- * This initializes the plugin.
+ * This initializes the addon.
*
* This function is called by Sabre_DAV_Server, after
* addPlugin is called.
}
/**
- * Use this method to tell the server this plugin defines additional
+ * Use this method to tell the server this addon defines additional
* HTTP methods.
*
* This method is passed a uri. It should only return HTTP methods that are
}
/**
- * Returns a plugin name.
+ * Returns a addon name.
*
- * Using this name other plugins will be able to access other plugins
+ * Using this name other addons will be able to access other addons
* using Sabre_DAV_Server::getPlugin
*
* @return string
}
/**
- * Returns a list of reports this plugin supports.
+ * Returns a list of reports this addon supports.
*
* This will be used in the {DAV:}supported-report-set property.
* Note that you still need to subscribe to the 'report' event to actually
);
/**
- * This is the directory where this plugin
+ * This is the directory where this addon
* will store it's files.
*
* @var string
private $server;
/**
- * Creates the plugin.
+ * Creates the addon.
*
* Make sure you specify a directory for your files. If you don't, we
* will use PHP's directory for session-storage instead, and you might
}
/**
- * Initialize the plugin
+ * Initialize the addon
*
- * This is called automatically be the Server class after this plugin is
+ * This is called automatically be the Server class after this addon is
* added with Sabre_DAV_Server::addPlugin()
*
* @param Sabre_DAV_Server $server
/**
* SabreDAV ACL Plugin
*
- * This plugin provides functionality to enforce ACL permissions.
+ * This addon provides functionality to enforce ACL permissions.
* ACL is defined in RFC3744.
*
* In addition it also provides support for the {DAV:}current-user-principal
/**
* This string is prepended to the username of the currently logged in
- * user. This allows the plugin to determine the principal path based on
+ * user. This allows the addon to determine the principal path based on
* the username.
*
* @var string
public $adminPrincipals = array();
/**
- * Returns a list of features added by this plugin.
+ * Returns a list of features added by this addon.
*
* This list is used in the response of a HTTP OPTIONS request.
*
}
/**
- * Returns a plugin name.
+ * Returns a addon name.
*
- * Using this name other plugins will be able to access other plugins
+ * Using this name other addons will be able to access other addons
* using Sabre_DAV_Server::getPlugin
*
* @return string
}
/**
- * Returns a list of reports this plugin supports.
+ * Returns a list of reports this addon supports.
*
* This will be used in the {DAV:}supported-report-set property.
* Note that you still need to subscribe to the 'report' event to actually
}
/**
- * Returns the supported privilege structure for this ACL plugin.
+ * Returns the supported privilege structure for this ACL addon.
*
* See RFC3744 for more details. Currently we default on a simple,
* standard structure.
}
/**
- * Sets up the plugin
+ * Sets up the addon
*
* This method is automatically called by the server class.
*
* there.
*
* Other rfc's, such as ACL rely on this report, so it made sense to put
- * it in this plugin.
+ * it in this addon.
*
* @param DOMElement $dom
* @return void
),
/**
- * This property is actually used by the CardDAV plugin, where it gets
+ * This property is actually used by the CardDAV addon, where it gets
* mapped to {http://calendarserver.orgi/ns/}me-card.
*
* The reason we don't straight-up use that property, is because
You can either clone [this repo](https://github.com/laktek/really-simple-color-picker) or download the latest build as a zip from here - http://github.com/laktek/really-simple-color-picker/zipball/master
Color Picker requires jQuery 1.2.6 or higher. Make sure to load it before Color Picker (there's no other dependencies!).
-For default styles of the color picker load the CSS file that comes with the plugin.
+For default styles of the color picker load the CSS file that comes with the addon.
```html
<script language="javascript" type="text/javascript" src=jquery.min.js"></script>
<?php
+use Friendica\Util\DateTimeFormat;
define("DAV_ACL_READ", "{DAV:}read");
define("DAV_ACL_WRITE", "{DAV:}write");
*/
function wdcal_php2MySqlTime($phpDate)
{
- return date("Y-m-d H:i:s", $phpDate);
+ return date(DateTimeFormat::MYSQL, $phpDate);
}
/**
*/
function wdcal_mySql2PhpTime($sqlDate)
{
- $ts = DateTime::createFromFormat("Y-m-d H:i:s", $sqlDate);
+ $ts = DateTime::createFromFormat(DateTimeFormat::MYSQL, $sqlDate);
return $ts->format("U");
}
<?php
+use Friendica\Util\DateTimeFormat;
/**
q("INSERT INTO %s%sjqcalendar (`calendar_id`, `calendarobject_id`, `Summary`, `StartTime`, `EndTime`, `IsEditable`, `IsAllDayEvent`, `IsRecurring`, `Color`) VALUES
(%d, %d, '%s', CONVERT_TZ('%s', '$timezoneOffset', @@session.time_zone), CONVERT_TZ('%s', '$timezoneOffset', @@session.time_zone), %d, %d, %d, '%s')",
- CALDAV_SQL_DB, CALDAV_SQL_PREFIX, IntVal($calendar["id"]), IntVal($calendarobject["id"]), dbesc($event["summary"]), date("Y-m-d H:i:s", $start),
- date("Y-m-d H:i:s", $last_end), 1, $allday, $recurring, dbesc(substr($event["color"], 1))
+ CALDAV_SQL_DB, CALDAV_SQL_PREFIX, IntVal($calendar["id"]), IntVal($calendarobject["id"]), dbesc($event["summary"]), date(DateTimeFormat::MYSQL, $start),
+ date(DateTimeFormat::MYSQL, $last_end), 1, $allday, $recurring, dbesc(substr($event["color"], 1))
);
foreach ($alarms as $alarm) {
$alarm = renderCalDavEntry_calcalarm($alarm, $component);
$notified = ($alarm->getTimestamp() < time() ? 1 : 0);
q("INSERT INTO %s%snotifications (`calendar_id`, `calendarobject_id`, `alert_date`, `notified`) VALUES (%d, %d, CONVERT_TZ('%s', '$timezoneOffset', @@session.time_zone), %d)",
- CALDAV_SQL_DB, CALDAV_SQL_PREFIX, IntVal($calendar["id"]), IntVal($calendarobject["id"]), $alarm->format("Y-m-d H:i:s"), $notified
+ CALDAV_SQL_DB, CALDAV_SQL_PREFIX, IntVal($calendar["id"]), IntVal($calendarobject["id"]), $alarm->format(DateTimeFormat::MYSQL), $notified
);
}
<?php
+use Friendica\Core\L10n;
+
class Sabre_CalDAV_Backend_Private extends Sabre_CalDAV_Backend_Common
{
*/
public static function getBackendTypeName()
{
- return t("Private Events");
+ return L10n::t("Private Events");
}
/**
<?php
+use Friendica\Core\L10n;
+
class Sabre_CardDAV_Backend_Std extends Sabre_CardDAV_Backend_Common
{
*/
public static function getBackendTypeName()
{
- return t("Private Addressbooks");
+ return L10n::t("Private Addressbooks");
}
/**
\r
\r
if ($.fn.noSelect == undefined) {\r
- $.fn.noSelect = function (p) { //no select plugin by me :-)\r
+ $.fn.noSelect = function (p) { //no select addon by me :-)\r
var prevent;\r
if (p == null)\r
prevent = true;\r
<?php
-
-
+use Friendica\Core\L10n;
+use Friendica\Util\DateTimeFormat;
/**
* @param mixed $obj
$cs = wdcal_print_feed_getCal($server, DAV_ACL_WRITE);
if ($cs == null) {
echo wdcal_jsonp_encode(array('IsSuccess' => false,
- 'Msg' => t('No access')));
+ 'Msg' => L10n::t('No access')));
killme();
}
try {
else $type = Sabre\VObject\Property\DateTime::LOCALTZ;
$datetime_start = new Sabre\VObject\Property\DateTime("DTSTART");
- $datetime_start->setDateTime(new DateTime(date("Y-m-d H:i:s", IntVal($_REQUEST["CalendarStartTime"]))), $type);
+ $datetime_start->setDateTime(new DateTime(date(DateTimeFormat::MYSQL, IntVal($_REQUEST["CalendarStartTime"]))), $type);
$datetime_end = new Sabre\VObject\Property\DateTime("DTEND");
- $datetime_end->setDateTime(new DateTime(date("Y-m-d H:i:s", IntVal($_REQUEST["CalendarEndTime"]))), $type);
+ $datetime_end->setDateTime(new DateTime(date(DateTimeFormat::MYSQL, IntVal($_REQUEST["CalendarEndTime"]))), $type);
$component->add($datetime_start);
$component->add($datetime_end);
$r = q("SELECT `calendarobject_id`, `calendar_id` FROM %s%sjqcalendar WHERE `id`=%d", CALDAV_SQL_DB, CALDAV_SQL_PREFIX, IntVal($_REQUEST["jq_id"]));
if (count($r) != 1) {
echo wdcal_jsonp_encode(array('IsSuccess' => false,
- 'Msg' => t('No access')));
+ 'Msg' => L10n::t('No access')));
killme();
}
try {
if (!$component) {
echo wdcal_jsonp_encode(array('IsSuccess' => false,
- 'Msg' => t('No access')));
+ 'Msg' => L10n::t('No access')));
killme();
}
else $type = Sabre\VObject\Property\DateTime::LOCALTZ;
$datetime_start = new Sabre\VObject\Property\DateTime("DTSTART");
- $datetime_start->setDateTime(new DateTime(date("Y-m-d H:i:s", IntVal($_REQUEST["CalendarStartTime"]))), $type);
+ $datetime_start->setDateTime(new DateTime(date(DateTimeFormat::MYSQL, IntVal($_REQUEST["CalendarStartTime"]))), $type);
$datetime_end = new Sabre\VObject\Property\DateTime("DTEND");
- $datetime_end->setDateTime(new DateTime(date("Y-m-d H:i:s", IntVal($_REQUEST["CalendarEndTime"]))), $type);
+ $datetime_end->setDateTime(new DateTime(date(DateTimeFormat::MYSQL, IntVal($_REQUEST["CalendarEndTime"]))), $type);
$component->__unset("DTSTART");
$component->__unset("DTEND");
);
} catch (Exception $e) {
echo wdcal_jsonp_encode(array('IsSuccess' => false,
- 'Msg' => t('No access')));
+ 'Msg' => L10n::t('No access')));
killme();
}
break;
$r = q("SELECT `calendarobject_id`, `calendar_id` FROM %s%sjqcalendar WHERE `id`=%d", CALDAV_SQL_DB, CALDAV_SQL_PREFIX, IntVal($_REQUEST["jq_id"]));
if (count($r) != 1) {
echo wdcal_jsonp_encode(array('IsSuccess' => false,
- 'Msg' => t('No access')));
+ 'Msg' => L10n::t('No access')));
killme();
}
try {
);
} catch (Exception $e) {
echo wdcal_jsonp_encode(array('IsSuccess' => false,
- 'Msg' => t('No access')));
+ 'Msg' => L10n::t('No access')));
killme();
}
<?php
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+
abstract class wdcal_local
{
* @return string
*/
static function getName() {
- return t("U.S. Time Format (mm/dd/YYYY)");
+ return L10n::t("U.S. Time Format (mm/dd/YYYY)");
}
/**
* @return string
*/
static function getName() {
- return t("German Time Format (dd.mm.YYYY)");
+ return L10n::t("German Time Format (dd.mm.YYYY)");
}
/**
<?php
+use Friendica\Core\L10n;
+use Friendica\Util\DateTimeFormat;
+
/**
* @param wdcal_local $localization
* @param string $baseurl
$vObject = dav_get_current_user_calendarobject($server, $calendar, $obj_uri["uri"], DAV_ACL_WRITE);
$component = dav_get_eventComponent($vObject);
- if ($component == null) return t('Could not open component for editing');
+ if ($component == null) return L10n::t('Could not open component for editing');
/** @var Sabre\VObject\Property\DateTime $dtstart */
$dtstart = $component->__get("DTSTART");
$postto = $baseurl . "/dav/wdcal/" . ($uri == 0 ? "new/" : $calendar_id . "/" . $uri . "/edit/");
- $out = "<a href='" . $baseurl . "/dav/wdcal/'>" . t("Go back to the calendar") . "</a><br><br>";
+ $out = "<a href='" . $baseurl . "/dav/wdcal/'>" . L10n::t("Go back to the calendar") . "</a><br><br>";
$out .= "<form method='POST' action='$postto'>
<input type='hidden' name='form_security_token' value='" . get_form_security_token('caledit') . "'>\n";
- $out .= "<h2>" . t("Event data") . "</h2>";
+ $out .= "<h2>" . L10n::t("Event data") . "</h2>";
- $out .= "<label for='calendar' class='block'>" . t("Calendar") . ":</label><select id='calendar' name='calendar' size='1'>";
+ $out .= "<label for='calendar' class='block'>" . L10n::t("Calendar") . ":</label><select id='calendar' name='calendar' size='1'>";
$found = false;
$cal_col = "aaaaaa";
foreach ($calendars as $cal) {
$out .= "</select>";
$out .= " <label class='plain'><input type='checkbox' name='color_override' id='color_override' ";
if (!is_null($event["Color"])) $out .= "checked";
- $out .= "> " . t("Special color") . ":</label>";
+ $out .= "> " . L10n::t("Special color") . ":</label>";
$out .= "<span id='cal_color_holder' ";
if (is_null($event["Color"])) $out .= "style='display: none;'";
$out .= "><input name='color' id='cal_color' value='" . (is_null($event["Color"]) ? "#" . $cal_col : escape_tags($event["Color"])) . "'></span>";
$out .= "<br>\n";
- $out .= "<label class='block' for='cal_summary'>" . t("Subject") . ":</label>
+ $out .= "<label class='block' for='cal_summary'>" . L10n::t("Subject") . ":</label>
<input name='summary' id='cal_summary' value=\"" . escape_tags($event["Summary"]) . "\"><br>\n";
$out .= "<label class='block' for='cal_allday'>Is All-Day event:</label><input type='checkbox' name='allday' id='cal_allday' " . ($event["IsAllDayEvent"] ? "checked" : "") . "><br>\n";
- $out .= "<label class='block' for='cal_start_date'>" . t("Starts") . ":</label>";
+ $out .= "<label class='block' for='cal_start_date'>" . L10n::t("Starts") . ":</label>";
$out .= "<input name='start_date' value='" . $localization->dateformat_datepicker_php($event["StartTime"]) . "' id='cal_start_date'>";
$out .= "<input name='start_time' value='" . date("H:i", $event["StartTime"]) . "' id='cal_start_time'>";
$out .= "<br>\n";
- $out .= "<label class='block' for='cal_end_date'>" . t("Ends") . ":</label>";
+ $out .= "<label class='block' for='cal_end_date'>" . L10n::t("Ends") . ":</label>";
$out .= "<input name='end_date' value='" . $localization->dateformat_datepicker_php($event["EndTime"]) . "' id='cal_end_date'>";
$out .= "<input name='end_time' value='" . date("H:i", $event["EndTime"]) . "' id='cal_end_time'>";
$out .= "<br>\n";
- $out .= "<label class='block' for='cal_location'>" . t("Location") . ":</label><input name='location' id='cal_location' value=\"" . escape_tags($event["Location"]) . "\"><br>\n";
+ $out .= "<label class='block' for='cal_location'>" . L10n::t("Location") . ":</label><input name='location' id='cal_location' value=\"" . escape_tags($event["Location"]) . "\"><br>\n";
- $out .= "<label class='block' for='event-desc-textarea'>" . t("Description") . ":</label> <textarea id='event-desc-textarea' name='wdcal_desc' style='vertical-align: top; width: 400px; height: 100px;'>" . escape_tags($event["Description"]) . "</textarea>";
+ $out .= "<label class='block' for='event-desc-textarea'>" . L10n::t("Description") . ":</label> <textarea id='event-desc-textarea' name='wdcal_desc' style='vertical-align: top; width: 400px; height: 100px;'>" . escape_tags($event["Description"]) . "</textarea>";
$out .= "<br style='clear: both;'>";
- $out .= "<h2>" . t("Recurrence") . "</h2>";
+ $out .= "<h2>" . L10n::t("Recurrence") . "</h2>";
- $out .= "<label class='block' for='rec_frequency'>" . t("Frequency") . ":</label> <select id='rec_frequency' name='rec_frequency' size='1'>";
- $out .= "<option value=''>" . t("None") . "</option>\n";
+ $out .= "<label class='block' for='rec_frequency'>" . L10n::t("Frequency") . ":</label> <select id='rec_frequency' name='rec_frequency' size='1'>";
+ $out .= "<option value=''>" . L10n::t("None") . "</option>\n";
$out .= "<option value='daily' ";
if ($recurrence && $recurrence->frequency == "daily") $out .= "selected";
- $out .= ">" . t("Daily") . "</option>\n";
+ $out .= ">" . L10n::t("Daily") . "</option>\n";
$out .= "<option value='weekly' ";
if ($recurrence && $recurrence->frequency == "weekly") $out .= "selected";
- $out .= ">" . t("Weekly") . "</option>\n";
+ $out .= ">" . L10n::t("Weekly") . "</option>\n";
$out .= "<option value='monthly' ";
if ($recurrence && $recurrence->frequency == "monthly") $out .= "selected";
- $out .= ">" . t("Monthly") . "</option>\n";
+ $out .= ">" . L10n::t("Monthly") . "</option>\n";
$out .= "<option value='yearly' ";
if ($recurrence && $recurrence->frequency == "yearly") $out .= "selected";
- $out .= ">" . t("Yearly") . "</option>\n";
+ $out .= ">" . L10n::t("Yearly") . "</option>\n";
$out .= "</select><br>\n";
$out .= "<div id='rec_details'>";
$select .= ">$i</option>\n";
}
$select .= "</select>";
- $time = "<span class='rec_daily'>" . t("days") . "</span>";
- $time .= "<span class='rec_weekly'>" . t("weeks") . "</span>";
- $time .= "<span class='rec_monthly'>" . t("months") . "</span>";
- $time .= "<span class='rec_yearly'>" . t("years") . "</span>";
- $out .= "<label class='block'>" . t("Interval") . ":</label> " . str_replace(array("%select%", "%time%"), array($select, $time), t("All %select% %time%")) . "<br>";
+ $time = "<span class='rec_daily'>" . L10n::t("days") . "</span>";
+ $time .= "<span class='rec_weekly'>" . L10n::t("weeks") . "</span>";
+ $time .= "<span class='rec_monthly'>" . L10n::t("months") . "</span>";
+ $time .= "<span class='rec_yearly'>" . L10n::t("years") . "</span>";
+ $out .= "<label class='block'>" . L10n::t("Interval") . ":</label> " . str_replace(array("%select%", "%time%"), array($select, $time), L10n::t("All %select% %time%")) . "<br>";
$out .= "<div class='rec_daily'>";
- $out .= "<label class='block'>" . t("Days") . ":</label>";
+ $out .= "<label class='block'>" . L10n::t("Days") . ":</label>";
if ($recurrence && $recurrence->byDay) {
$byday = $recurrence->byDay;
} else {
if ($localization->getFirstDayOfWeek() == 0) {
$out .= "<label class='plain'><input class='rec_daily_byday' type='checkbox' name='rec_daily_byday[]' value='SU' ";
if (in_array("SU", $byday)) $out .= "checked";
- $out .= ">" . t("Sunday") . "</label> ";
+ $out .= ">" . L10n::t("Sunday") . "</label> ";
}
$out .= "<label class='plain'><input class='rec_daily_byday' type='checkbox' name='rec_daily_byday[]' value='MO' ";
if (in_array("MO", $byday)) $out .= "checked";
- $out .= ">" . t("Monday") . "</label> ";
+ $out .= ">" . L10n::t("Monday") . "</label> ";
$out .= "<label class='plain'><input class='rec_daily_byday' type='checkbox' name='rec_daily_byday[]' value='TU' ";
if (in_array("TU", $byday)) $out .= "checked";
- $out .= ">" . t("Tuesday") . "</label> ";
+ $out .= ">" . L10n::t("Tuesday") . "</label> ";
$out .= "<label class='plain'><input class='rec_daily_byday' type='checkbox' name='rec_daily_byday[]' value='WE' ";
if (in_array("WE", $byday)) $out .= "checked";
- $out .= ">" . t("Wednesday") . "</label> ";
+ $out .= ">" . L10n::t("Wednesday") . "</label> ";
$out .= "<label class='plain'><input class='rec_daily_byday' type='checkbox' name='rec_daily_byday[]' value='TH' ";
if (in_array("TH", $byday)) $out .= "checked";
- $out .= ">" . t("Thursday") . "</label> ";
+ $out .= ">" . L10n::t("Thursday") . "</label> ";
$out .= "<label class='plain'><input class='rec_daily_byday' type='checkbox' name='rec_daily_byday[]' value='FR' ";
if (in_array("FR", $byday)) $out .= "checked";
- $out .= ">" . t("Friday") . "</label> ";
+ $out .= ">" . L10n::t("Friday") . "</label> ";
$out .= "<label class='plain'><input class='rec_daily_byday' type='checkbox' name='rec_daily_byday[]' value='SA' ";
if (in_array("SA", $byday)) $out .= "checked";
- $out .= ">" . t("Saturday") . "</label> ";
+ $out .= ">" . L10n::t("Saturday") . "</label> ";
if ($localization->getFirstDayOfWeek() != 0) {
$out .= "<label class='plain'><input class='rec_daily_byday' type='checkbox' name='rec_daily_byday[]' value='SU' ";
if (in_array("SU", $byday)) $out .= "checked";
- $out .= ">" . t("Sunday") . "</label> ";
+ $out .= ">" . L10n::t("Sunday") . "</label> ";
}
$out .= "</div>";
$out .= "<div class='rec_weekly'>";
- $out .= "<label class='block'>" . t("Days") . ":</label>";
+ $out .= "<label class='block'>" . L10n::t("Days") . ":</label>";
if ($recurrence && $recurrence->byDay) {
$byday = $recurrence->byDay;
} else {
if ($localization->getFirstDayOfWeek() == 0) {
$out .= "<label class='plain'><input class='rec_weekly_byday' type='checkbox' name='rec_weekly_byday[]' value='SU' ";
if (in_array("SU", $byday)) $out .= "checked";
- $out .= ">" . t("Sunday") . "</label> ";
+ $out .= ">" . L10n::t("Sunday") . "</label> ";
}
$out .= "<label class='plain'><input class='rec_weekly_byday' type='checkbox' name='rec_weekly_byday[]' value='MO' ";
if (in_array("MO", $byday)) $out .= "checked";
- $out .= ">" . t("Monday") . "</label> ";
+ $out .= ">" . L10n::t("Monday") . "</label> ";
$out .= "<label class='plain'><input class='rec_weekly_byday' type='checkbox' name='rec_weekly_byday[]' value='TU' ";
if (in_array("TU", $byday)) $out .= "checked";
- $out .= ">" . t("Tuesday") . "</label> ";
+ $out .= ">" . L10n::t("Tuesday") . "</label> ";
$out .= "<label class='plain'><input class='rec_weekly_byday' type='checkbox' name='rec_weekly_byday[]' value='WE' ";
if (in_array("WE", $byday)) $out .= "checked";
- $out .= ">" . t("Wednesday") . "</label> ";
+ $out .= ">" . L10n::t("Wednesday") . "</label> ";
$out .= "<label class='plain'><input class='rec_weekly_byday' type='checkbox' name='rec_weekly_byday[]' value='TH' ";
if (in_array("TH", $byday)) $out .= "checked";
- $out .= ">" . t("Thursday") . "</label> ";
+ $out .= ">" . L10n::t("Thursday") . "</label> ";
$out .= "<label class='plain'><input class='rec_weekly_byday' type='checkbox' name='rec_weekly_byday[]' value='FR' ";
if (in_array("FR", $byday)) $out .= "checked";
- $out .= ">" . t("Friday") . "</label> ";
+ $out .= ">" . L10n::t("Friday") . "</label> ";
$out .= "<label class='plain'><input class='rec_weekly_byday' type='checkbox' name='rec_weekly_byday[]' value='SA' ";
if (in_array("SA", $byday)) $out .= "checked";
- $out .= ">" . t("Saturday") . "</label> ";
+ $out .= ">" . L10n::t("Saturday") . "</label> ";
if ($localization->getFirstDayOfWeek() != 0) {
$out .= "<label class='plain'><input class='rec_weekly_byday' type='checkbox' name='rec_weekly_byday[]' value='SU' ";
if (in_array("SU", $byday)) $out .= "checked";
- $out .= ">" . t("Sunday") . "</label> ";
+ $out .= ">" . L10n::t("Sunday") . "</label> ";
}
$out .= "<br>";
- $out .= "<label class='block'>" . t("First day of week:") . "</label>";
+ $out .= "<label class='block'>" . L10n::t("First day of week:") . "</label>";
if ($recurrence && $recurrence->weekStart != "") $wkst = $recurrence->weekStart;
else {
if ($localization->getFirstDayOfWeek() == 0) $wkst = "SU";
}
$out .= "<label class='plain'><input type='radio' name='rec_weekly_wkst' value='SU' ";
if ($wkst == "SU") $out .= "checked";
- $out .= ">" . t("Sunday") . "</label> ";
+ $out .= ">" . L10n::t("Sunday") . "</label> ";
$out .= "<label class='plain'><input type='radio' name='rec_weekly_wkst' value='MO' ";
if ($wkst == "MO") $out .= "checked";
- $out .= ">" . t("Monday") . "</label><br>\n";
+ $out .= ">" . L10n::t("Monday") . "</label><br>\n";
$out .= "</div>";
}
$out .= "<div class='rec_monthly'>";
- $out .= "<label class='block' for='rec_monthly_day'>" . t("Day of month") . ":</label>";
+ $out .= "<label class='block' for='rec_monthly_day'>" . L10n::t("Day of month") . ":</label>";
$out .= "<select id='rec_monthly_day' name='rec_monthly_day' size='1'>";
$out .= "<option value='bymonthday' ";
if ($monthly_rule == "bymonthday") $out .= "selected";
- $out .= ">" . t("#num#th of each month") . "</option>\n";
+ $out .= ">" . L10n::t("#num#th of each month") . "</option>\n";
$out .= "<option value='bymonthday_neg' ";
if ($monthly_rule == "bymonthday_neg") $out .= "selected";
- $out .= ">" . t("#num#th-last of each month") . "</option>\n";
+ $out .= ">" . L10n::t("#num#th-last of each month") . "</option>\n";
$out .= "<option value='byday' ";
if ($monthly_rule == "byday") $out .= "selected";
- $out .= ">" . t("#num#th #wkday# of each month") . "</option>\n";
+ $out .= ">" . L10n::t("#num#th #wkday# of each month") . "</option>\n";
$out .= "<option value='byday_neg' ";
if ($monthly_rule == "byday_neg") $out .= "selected";
- $out .= ">" . t("#num#th-last #wkday# of each month") . "</option>\n";
+ $out .= ">" . L10n::t("#num#th-last #wkday# of each month") . "</option>\n";
$out .= "</select>";
$out .= "</div>\n";
}
$out .= "<div class='rec_yearly'>";
- $out .= "<label class='block'>" . t("Month") . ":</label> <span class='rec_month_name'>#month#</span><br>\n";
- $out .= "<label class='block' for='rec_yearly_day'>" . t("Day of month") . ":</label>";
+ $out .= "<label class='block'>" . L10n::t("Month") . ":</label> <span class='rec_month_name'>#month#</span><br>\n";
+ $out .= "<label class='block' for='rec_yearly_day'>" . L10n::t("Day of month") . ":</label>";
$out .= "<select id='rec_yearly_day' name='rec_yearly_day' size='1'>";
$out .= "<option value='bymonthday' ";
if ($monthly_rule == "bymonthday") $out .= "selected";
- $out .= ">" . t("#num#th of the given month") . "</option>\n";
+ $out .= ">" . L10n::t("#num#th of the given month") . "</option>\n";
$out .= "<option value='bymonthday_neg' ";
if ($monthly_rule == "bymonthday_neg") $out .= "selected";
- $out .= ">" . t("#num#th-last of the given month") . "</option>\n";
+ $out .= ">" . L10n::t("#num#th-last of the given month") . "</option>\n";
$out .= "<option value='byday' ";
if ($monthly_rule == "byday") $out .= "selected";
- $out .= ">" . t("#num#th #wkday# of the given month") . "</option>\n";
+ $out .= ">" . L10n::t("#num#th #wkday# of the given month") . "</option>\n";
$out .= "<option value='byday_neg' ";
if ($monthly_rule == "byday_neg") $out .= "selected";
- $out .= ">" . t("#num#th-last #wkday# of the given month") . "</option>\n";
+ $out .= ">" . L10n::t("#num#th-last #wkday# of the given month") . "</option>\n";
$out .= "</select>";
$out .= "</div>\n";
$rule_until_date = time();
$rule_until_count = 1;
}
- $out .= "<label class='block' for='rec_until_type'>" . t("Repeat until") . ":</label> ";
+ $out .= "<label class='block' for='rec_until_type'>" . L10n::t("Repeat until") . ":</label> ";
$out .= "<select name='rec_until_type' id='rec_until_type' size='1'>";
$out .= "<option value='infinite' ";
if ($rule_type == "infinite") $out .= "selected";
- $out .= ">" . t("Infinite") . "</option>\n";
+ $out .= ">" . L10n::t("Infinite") . "</option>\n";
$out .= "<option value='date' ";
if ($rule_type == "date") $out .= "selected";
- $out .= ">" . t("Until the following date") . ":</option>\n";
+ $out .= ">" . L10n::t("Until the following date") . ":</option>\n";
$out .= "<option value='count' ";
if ($rule_type == "count") $out .= "selected";
- $out .= ">" . t("Number of times") . ":</option>\n";
+ $out .= ">" . L10n::t("Number of times") . ":</option>\n";
$out .= "</select>";
$out .= "<input name='rec_until_date' value='" . $localization->dateformat_datepicker_php($rule_until_date) . "' id='rec_until_date'>";
$out .= "<input name='rec_until_count' value='$rule_until_count' id='rec_until_count'><br>";
- $out .= "<label class='block'>" . t("Exceptions") . ":</label><div class='rec_exceptions'>";
+ $out .= "<label class='block'>" . L10n::t("Exceptions") . ":</label><div class='rec_exceptions'>";
$out .= "<div class='rec_exceptions_none' ";
if (count($recurrentce_exdates) > 0) $out .= "style='display: none;'";
- $out .= ">" . t("none") . "</div>";
+ $out .= ">" . L10n::t("none") . "</div>";
$out .= "<div class='rec_exceptions_holder' ";
if (count($recurrentce_exdates) == 0) $out .= "style='display: none;'";
$out .= ">";
$out .= "</div><br>";
- $out .= "<h2>" . t("Notification") . "</h2>";
+ $out .= "<h2>" . L10n::t("Notification") . "</h2>";
if (!$notifications) $notifications = array();
$notifications["new"] = array(
$out .= "<div class='noti_holder' ";
if (!is_numeric($index) && $index == "new") $out .= "style='display: none;' id='noti_new_row'";
- $out .= "><label class='block' for='noti_type_" . $index . "'>" . t("Notify by") . ":</label>";
+ $out .= "><label class='block' for='noti_type_" . $index . "'>" . L10n::t("Notify by") . ":</label>";
$out .= "<select name='noti_type[$index]' size='1' id='noti_type_" . $index . "'>";
- $out .= "<option value=''>- " . t("Remove") . " -</option>\n";
- $out .= "<option value='email' "; if (!$unparsable && $noti["action"] == "email") $out .= "selected"; $out .= ">" . t("E-Mail") . "</option>\n";
- $out .= "<option value='display' "; if (!$unparsable && $noti["action"] == "display") $out .= "selected"; $out .= ">" . t("On Friendica / Display") . "</option>\n";
- //$out .= "<option value='other' "; if ($unparsable) $out .= "selected"; $out .= ">- " . t("other (leave it untouched)") . " -</option>\n"; // @TODO
+ $out .= "<option value=''>- " . L10n::t("Remove") . " -</option>\n";
+ $out .= "<option value='email' "; if (!$unparsable && $noti["action"] == "email") $out .= "selected"; $out .= ">" . L10n::t("E-Mail") . "</option>\n";
+ $out .= "<option value='display' "; if (!$unparsable && $noti["action"] == "display") $out .= "selected"; $out .= ">" . L10n::t("On Friendica / Display") . "</option>\n";
+ //$out .= "<option value='other' "; if ($unparsable) $out .= "selected"; $out .= ">- " . L10n::t("other (leave it untouched)") . " -</option>\n"; // @TODO
$out .= "</select><br>";
- $out .= "<label class='block'>" . t("Time") . ":</label>";
+ $out .= "<label class='block'>" . L10n::t("Time") . ":</label>";
$out .= "<input name='noti_value[$index]' size='5' style='width: 5em;' value='" . $noti["trigger_value"] . "'>";
$out .= "<select name='noti_unit[$index]' size='1'>";
- $out .= "<option value='H' "; if ($noti["trigger_unit"] == "hour") $out .= "selected"; $out .= ">" . t("Hours") . "</option>\n";
- $out .= "<option value='M' "; if ($noti["trigger_unit"] == "minute") $out .= "selected"; $out .= ">" . t("Minutes") . "</option>\n";
- $out .= "<option value='S' "; if ($noti["trigger_unit"] == "second") $out .= "selected"; $out .= ">" . t("Seconds") . "</option>\n";
- $out .= "<option value='D' "; if ($noti["trigger_unit"] == "day") $out .= "selected"; $out .= ">" . t("Days") . "</option>\n";
- $out .= "<option value='W' "; if ($noti["trigger_unit"] == "week") $out .= "selected"; $out .= ">" . t("Weeks") . "</option>\n";
+ $out .= "<option value='H' "; if ($noti["trigger_unit"] == "hour") $out .= "selected"; $out .= ">" . L10n::t("Hours") . "</option>\n";
+ $out .= "<option value='M' "; if ($noti["trigger_unit"] == "minute") $out .= "selected"; $out .= ">" . L10n::t("Minutes") . "</option>\n";
+ $out .= "<option value='S' "; if ($noti["trigger_unit"] == "second") $out .= "selected"; $out .= ">" . L10n::t("Seconds") . "</option>\n";
+ $out .= "<option value='D' "; if ($noti["trigger_unit"] == "day") $out .= "selected"; $out .= ">" . L10n::t("Days") . "</option>\n";
+ $out .= "<option value='W' "; if ($noti["trigger_unit"] == "week") $out .= "selected"; $out .= ">" . L10n::t("Weeks") . "</option>\n";
$out .= "</select>";
- $out .= " <label class='plain'>" . t("before the") . " <select name='noti_ref[$index]' size='1'>";
- $out .= "<option value='start' "; if ($noti["rel"] == "start") $out .= "selected"; $out .= ">" . t("start of the event") . "</option>\n";
- $out .= "<option value='end' "; if ($noti["rel"] == "end") $out .= "selected"; $out .= ">" . t("end of the event") . "</option>\n";
+ $out .= " <label class='plain'>" . L10n::t("before the") . " <select name='noti_ref[$index]' size='1'>";
+ $out .= "<option value='start' "; if ($noti["rel"] == "start") $out .= "selected"; $out .= ">" . L10n::t("start of the event") . "</option>\n";
+ $out .= "<option value='end' "; if ($noti["rel"] == "end") $out .= "selected"; $out .= ">" . L10n::t("end of the event") . "</option>\n";
$out .= "</select></label>\n";
$out .= "</div>";
}
- $out .= "<input type='hidden' name='new_alarm' id='new_alarm' value='0'><div id='new_alarm_adder'><a href='#'>" . t("Add a notification") . "</a></div>";
+ $out .= "<input type='hidden' name='new_alarm' id='new_alarm' value='0'><div id='new_alarm_adder'><a href='#'>" . L10n::t("Add a notification") . "</a></div>";
$out .= "<script>\$(function() {
wdcal_edit_init('" . $localization->dateformat_datepicker_js() . "', '${baseurl}/dav/');
$type = Sabre\VObject\Property\DateTime::LOCALTZ;
}
$datetime_start = new Sabre\VObject\Property\DateTime("DTSTART");
- $datetime_start->setDateTime(new DateTime(date("Y-m-d H:i:s", $ts_start)), $type);
+ $datetime_start->setDateTime(new DateTime(date(DateTimeFormat::MYSQL, $ts_start)), $type);
$datetime_end = new Sabre\VObject\Property\DateTime("DTEND");
- $datetime_end->setDateTime(new DateTime(date("Y-m-d H:i:s", $ts_end)), $type);
+ $datetime_end->setDateTime(new DateTime(date(DateTimeFormat::MYSQL, $ts_end)), $type);
$component->__unset("DTSTART");
$component->__unset("DTEND");
$date = $localization->date_local2timestamp($_REQUEST["rec_until_date"]);
$part_until = ";UNTIL=" . date("Ymd", $date);
$datetime_until = new Sabre\VObject\Property\DateTime("UNTIL");
- $datetime_until->setDateTime(new DateTime(date("Y-m-d H:i:s", $date)), Sabre\VObject\Property\DateTime::DATE);
+ $datetime_until->setDateTime(new DateTime(date(DateTimeFormat::MYSQL, $date)), Sabre\VObject\Property\DateTime::DATE);
break;
case "count":
$part_until = ";COUNT=" . IntVal($_REQUEST["rec_until_count"]);
if (isset($_REQUEST["rec_exceptions"])) {
$arr = array();
foreach ($_REQUEST["rec_exceptions"] as $except) {
- $arr[] = new DateTime(date("Y-m-d H:i:s", $except));
+ $arr[] = new DateTime(date(DateTimeFormat::MYSQL, $except));
}
/** @var Sabre\VObject\Property\MultiDateTime $prop */
$prop = Sabre\VObject\Property::create("EXDATE");
"#date#", "#name",
), array(
$localization->date_timestamp2local($dtstart), $summary,
- ), t("The event #name# will start at #date"));
+ ), L10n::t("The event #name# will start at #date"));
$alarm->add(new Sabre\VObject\Property("ACTION", "EMAIL"));
$alarm->add(new Sabre\VObject\Property("SUMMARY", $summary));
break;
case "display":
$alarm->add(new Sabre\VObject\Property("ACTION", "DISPLAY"));
- $text = str_replace("#name#", $summary, t("#name# is about to begin."));
+ $text = str_replace("#name#", $summary, L10n::t("#name# is about to begin."));
$alarm->add(new Sabre\VObject\Property("DESCRIPTION", $text));
break;
default:
$vObject = dav_get_current_user_calendarobject($server, $calendar, $obj_uri, DAV_ACL_WRITE);
$component = dav_get_eventComponent($vObject);
- if ($component == null) return array("ok" => false, "msg" => t('Could not open component for editing'));
+ if ($component == null) return array("ok" => false, "msg" => L10n::t('Could not open component for editing'));
} else {
$calendar = dav_get_current_user_calendar_by_id($server, $_REQUEST["calendar"], DAV_ACL_WRITE);
$vObject = dav_create_empty_vevent();
$obj = $calendar->getChild($obj_uri);
$obj->put($data);
}
- return array("ok" => false, "msg" => t("Saved"));
+ return array("ok" => false, "msg" => L10n::t("Saved"));
}
<?php
+use Friendica\Core\L10n;
+
$a = get_app();
$uri = parse_url($a->get_baseurl());
$path = "/";
{
$stms = array();
$a = get_app();
- $uris = array(
- 'private' => t("Private Calendar"),
- CALDAV_FRIENDICA_MINE => t("Friendica Events: Mine"),
- CALDAV_FRIENDICA_CONTACTS => t("Friendica Events: Contacts"),
- );
+ $uris = [
+ 'private' => L10n::t("Private Calendar"),
+ CALDAV_FRIENDICA_MINE => L10n::t("Friendica Events: Mine"),
+ CALDAV_FRIENDICA_CONTACTS => L10n::t("Friendica Events: Contacts"),
+ ];
foreach ($uris as $uri => $name) {
$cals = q("SELECT * FROM %s%scalendars WHERE `namespace` = %d AND `namespace_id` = %d AND `uri` = '%s'",
CALDAV_SQL_DB, CALDAV_SQL_PREFIX, CALDAV_NAMESPACE_PRIVATE, IntVal($user_id), dbesc($uri));
{
$stms = array();
$a = get_app();
- $uris = array(
- 'private' => t("Private Addresses"),
- CARDDAV_FRIENDICA_CONTACT => t("Friendica Contacts"),
- );
+ $uris = [
+ 'private' => L10n::t("Private Addresses"),
+ CARDDAV_FRIENDICA_CONTACT => L10n::t("Friendica Contacts"),
+ ];
foreach ($uris as $uri => $name) {
$cals = q("SELECT * FROM %s%saddressbooks WHERE `namespace` = %d AND `namespace_id` = %d AND `uri` = '%s'",
CALDAV_SQL_DB, CALDAV_SQL_PREFIX, CALDAV_NAMESPACE_PRIVATE, IntVal($user_id), dbesc($uri));
<?php
+use Friendica\Core\L10n;
+use Friendica\Util\DateTimeFormat;
+
class Sabre_CalDAV_Backend_Friendica extends Sabre_CalDAV_Backend_Virtual
{
* @return string
*/
public static function getBackendTypeName() {
- return t("Friendica-Native events");
+ return L10n::t("Friendica-Native events");
}
/**
$component = dav_get_eventComponent($vevent);
if ($row["adjust"]) {
- $start = datetime_convert('UTC', date_default_timezone_get(), $row["start"]);
- $finish = datetime_convert('UTC', date_default_timezone_get(), $row["finish"]);
+ $start = DateTimeFormat::local($row["start"]);
+ $finish = DateTimeFormat::local($row["finish"]);
} else {
$start = $row["start"];
$finish = $row["finish"];
$type = ($allday ? Sabre\VObject\Property\DateTime::DATE : Sabre\VObject\Property\DateTime::LOCALTZ);
$datetime_start = new Sabre\VObject\Property\DateTime("DTSTART");
- $datetime_start->setDateTime(new DateTime(date("Y-m-d H:i:s", $ts_start)), $type);
+ $datetime_start->setDateTime(new DateTime(date(DateTimeFormat::MYSQL, $ts_start)), $type);
$datetime_end = new Sabre\VObject\Property\DateTime("DTEND");
- $datetime_end->setDateTime(new DateTime(date("Y-m-d H:i:s", $ts_end)), $type);
+ $datetime_end->setDateTime(new DateTime(date(DateTimeFormat::MYSQL, $ts_end)), $type);
$component->add($datetime_start);
$component->add($datetime_end);
private function jqcal2wdcal($row, $calendar, $base_path)
{
if ($row["adjust"]) {
- $start = datetime_convert('UTC', date_default_timezone_get(), $row["start"]);
- $finish = datetime_convert('UTC', date_default_timezone_get(), $row["finish"]);
+ $start = DateTimeFormat::local($row["start"]);
+ $finish = DateTimeFormat::local($row["finish"]);
} else {
$start = $row["start"];
$finish = $row["finish"];
}
if ($date_from != "") {
- if (is_numeric($date_from)) $sql_where .= " AND `finish` >= '" . date("Y-m-d H:i:s", $date_from) . "'";
+ if (is_numeric($date_from)) $sql_where .= " AND `finish` >= '" . date(DateTimeFormat::MYSQL, $date_from) . "'";
else $sql_where .= " AND `finish` >= '" . dbesc($date_from) . "'";
}
if ($date_to != "") {
- if (is_numeric($date_to)) $sql_where .= " AND `start` <= '" . date("Y-m-d H:i:s", $date_to) . "'";
+ if (is_numeric($date_to)) $sql_where .= " AND `start` <= '" . date(DateTimeFormat::MYSQL, $date_to) . "'";
else $sql_where .= " AND `start` <= '" . dbesc($date_to) . "'";
}
$ret = array();
<?php
+use Friendica\Core\L10n;
+
class Sabre_CardDAV_Backend_Friendica extends Sabre_CardDAV_Backend_Virtual
{
* @return string
*/
public static function getBackendTypeName() {
- return t("Friendica-Contacts");
+ return L10n::t("Friendica-Contacts");
}
/**
'id' => $books[0]["id"],
'uri' => "friendica",
'principaluri' => $principalUri,
- '{DAV:}displayname' => t("Friendica-Contacts"),
- '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' => t("Your Friendica-Contacts"),
+ '{DAV:}displayname' => L10n::t("Friendica-Contacts"),
+ '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' => L10n::t("Your Friendica-Contacts"),
'{http://calendarserver.org/ns/}getctag' => $ctag,
'{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}supported-address-data' =>
new Sabre_CardDAV_Property_SupportedAddressData(),
<?php
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
/**
*
if (!isset($imported[$uid])) $imported[$uid] = "";
$imported[$uid] .= $c->serialize();
} catch (Exception $e) {
- notice(t("Something went wrong when trying to import the file. Sorry. Maybe some events were imported anyway."));
+ notice(L10n::t("Something went wrong when trying to import the file. Sorry. Maybe some events were imported anyway."));
}
if (isset($_REQUEST["overwrite"])) {
$calendar->createFile("import-" . $i . ".ics", $str);
$i++;
} catch (Exception $e) {
- notice(t("Something went wrong when trying to import the file. Sorry."));
+ notice(L10n::t("Something went wrong when trying to import the file. Sorry."));
}
- $o = t("The ICS-File has been imported.");
+ $o = L10n::t("The ICS-File has been imported.");
} catch (Exception $e) {
- notice(t("Something went wrong when trying to import the file. Sorry. Maybe some events were imported anyway."));
+ notice(L10n::t("Something went wrong when trying to import the file. Sorry. Maybe some events were imported anyway."));
} else {
- notice(t("No file was uploaded."));
+ notice(L10n::t("No file was uploaded."));
}
}
- $o .= "<a href='" . $a->get_baseurl() . "/dav/wdcal/'>" . t("Go back to the calendar") . "</a><br><br>";
+ $o .= "<a href='" . $a->get_baseurl() . "/dav/wdcal/'>" . L10n::t("Go back to the calendar") . "</a><br><br>";
$num = q("SELECT COUNT(*) num FROM %s%scalendarobjects WHERE `calendar_id` = %d", CALDAV_SQL_DB, CALDAV_SQL_PREFIX, $calendar_id);
- $o .= "<h2>" . t("Import a ICS-file") . "</h2>";
+ $o .= "<h2>" . L10n::t("Import a ICS-file") . "</h2>";
$o .= '<form method="POST" action="' . $a->get_baseurl() . '/dav/wdcal/' . $calendar_id . '/ics-import/" enctype="multipart/form-data">';
$o .= "<input type='hidden' name='form_security_token' value='" . get_form_security_token('icsimport') . "'>\n";
- $o .= "<label for='ics_file'>" . t("ICS-File") . "</label><input type='file' name='ics_file' id='ics_file'><br>\n";
- if ($num[0]["num"] > 0) $o .= "<label for='overwrite'>" . str_replace("#num#", $num[0]["num"], t("Overwrite all #num# existing events")) . "</label> <input name='overwrite' id='overwrite' type='checkbox'><br>\n";
- $o .= "<input type='submit' name='save' value='" . t("Upload") . "'>";
+ $o .= "<label for='ics_file'>" . L10n::t("ICS-File") . "</label><input type='file' name='ics_file' id='ics_file'><br>\n";
+ if ($num[0]["num"] > 0) $o .= "<label for='overwrite'>" . str_replace("#num#", $num[0]["num"], L10n::t("Overwrite all #num# existing events")) . "</label> <input name='overwrite' id='overwrite' type='checkbox'><br>\n";
+ $o .= "<input type='submit' name='save' value='" . L10n::t("Upload") . "'>";
$o .= '</form>';
return $o;
$x .= '<div class="ctoolbar">
<div class="fbutton faddbtn" style="float: right;">
- <div><a href="' . $a->get_baseurl() . '/dav/settings/"><span>' . t("Settings") . ' / ' . t("Help") . '</span></a></div>
+ <div><a href="' . $a->get_baseurl() . '/dav/settings/"><span>' . L10n::t("Settings") . ' / ' . L10n::t("Help") . '</span></a></div>
</div>
<div class="fbutton addcal">
- <div><a href="' . $a->get_baseurl() . '/dav/wdcal/new/" class="addcal">' . t("New event") . '</a></div>
+ <div><a href="' . $a->get_baseurl() . '/dav/wdcal/new/" class="addcal">' . L10n::t("New event") . '</a></div>
</div>
<div class="btnseparator"></div>
<div class="fbutton showtodaybtn">
- <div><span class="showtoday">' . t("Today") . '</span></div>
+ <div><span class="showtoday">' . L10n::t("Today") . '</span></div>
</div>
<div class="btnseparator"></div>
if ($view == "day") $x .= 'fcurrent';
- $x .= '">' . t("Day") . '</span></div>
+ $x .= '">' . L10n::t("Day") . '</span></div>
</div>
<div class="fbutton showweekbtn ';
if ($view == "week") $x .= "fcurrent";
$x .= '">
- <div><span title="Week" class="showweekview">' . t("Week") . '</span></div>
+ <div><span title="Week" class="showweekview">' . L10n::t("Week") . '</span></div>
</div>
<div class="showmonthbtn fbutton ';
if ($view == "month") $x .= 'fcurrent';
$x .= '">
- <div><span title="Month" class="showmonthview">' . t("Month") . '</span></div>
+ <div><span title="Month" class="showmonthview">' . L10n::t("Month") . '</span></div>
</div>
<div class="btnseparator"></div>
<div class="fbutton showreflashbtn">
- <div><span class="showdayflash">' . t("Reload") . '</span></div>
+ <div><span class="showdayflash">' . L10n::t("Reload") . '</span></div>
</div>
<div class="btnseparator"></div>
- <div title="' . t("Previous") . '" class="fbutton sfprevbtn">
+ <div title="' . L10n::t("Previous") . '" class="fbutton sfprevbtn">
<span class="fprev"></span>
</div>
- <div title="' . t("Next") . '" class="fbutton sfnextbtn">
+ <div title="' . L10n::t("Next") . '" class="fbutton sfnextbtn">
<span class="fnext"></span>
</div>
<div class="fshowdatep fbutton" style="white-space: nowrap; position: relative;">
<input name="txtshow" class="hdtxtshow" style="position: absolute; bottom: 0; left: 0; width: 0; height: 0; border: 0; padding: 0; margin: 0;">
- <span class="txtdatetimeshow">' . t("Date") . '</span>
+ <span class="txtdatetimeshow">' . L10n::t("Date") . '</span>
</div>
<div style="float: right;">
<div class="clear"></div>
$details = $obj;
} catch (Exception $e) {
- info(t("Error") . ": " . $e);
- goaway($a->get_baseurl() . "/dav/wdcal/");
+ info(L10n::t("Error") . ": " . $e);
+ goaway('dav/wdcal/');
}
return print_r($details, true);
{
if (!local_user()) {
- notice(t('Permission denied.') . EOL);
+ notice(L10n::t('Permission denied.') . EOL);
return '';
}
if (isset($_REQUEST["save"])) {
check_form_security_token_redirectOnErr('/dav/settings/', 'calprop');
- set_pconfig($a->user["uid"], "dav", "dateformat", $_REQUEST["wdcal_date_format"]);
- info(t('The new values have been saved.'));
+ PConfig::set($a->user["uid"], "dav", "dateformat", $_REQUEST["wdcal_date_format"]);
+ info(L10n::t('The new values have been saved.'));
}
if (isset($_REQUEST["save_cals"])) {
if ($change_sql != "") {
q("UPDATE %s%scalendars SET `ctag` = `ctag` + 1 $change_sql WHERE `id` = %d AND `namespace_id` = %d AND `namespace_id` = %d",
CALDAV_SQL_DB, CALDAV_SQL_PREFIX, $cal["id"], CALDAV_NAMESPACE_PRIVATE, IntVal($a->user["uid"]));
- info(t('The calendar has been updated.'));
+ info(L10n::t('The calendar has been updated.'));
}
}
CALDAV_SQL_DB, CALDAV_SQL_PREFIX, CALDAV_NAMESPACE_PRIVATE, IntVal($a->user["uid"]), $neworder, dbesc(strtolower(substr($_REQUEST["color"]["new"], 1))),
dbesc($_REQUEST["name"]["new"]), dbesc($a->timezone), dbesc($_REQUEST["uri"]["new"])
);
- info(t('The new calendar has been created.'));
+ info(L10n::t('The new calendar has been created.'));
}
}
q("DELETE FROM %s%scalendars WHERE `id` = %s", CALDAV_SQL_DB, CALDAV_SQL_PREFIX, IntVal($_REQUEST["remove_cal"]));
q("UPDATE %s%scalendars SET `ctag` = `ctag` + 1 WHERE `id` = " . CALDAV_SQL_DB, CALDAV_SQL_PREFIX, $newcal[0]["id"]);
- info(t('The calendar has been deleted.'));
+ info(L10n::t('The calendar has been deleted.'));
}
$o = "";
- $o .= "<a href='" . $a->get_baseurl() . "/dav/wdcal/'>" . t("Go back to the calendar") . "</a><br><br>";
+ $o .= "<a href='" . $a->get_baseurl() . "/dav/wdcal/'>" . L10n::t("Go back to the calendar") . "</a><br><br>";
- $o .= '<h3>' . t('Calendar Settings') . '</h3>';
+ $o .= '<h3>' . L10n::t('Calendar Settings') . '</h3>';
$current_format = wdcal_local::getInstanceByUser($a->user["uid"]);
$o .= '<form method="POST" action="' . $a->get_baseurl() . '/dav/settings/">';
$o .= "<input type='hidden' name='form_security_token' value='" . get_form_security_token('calprop') . "'>\n";
- $o .= '<label for="wdcal_date_format">' . t('Date format') . ':</label><select name="wdcal_date_format" id="wdcal_date_format" size="1">';
+ $o .= '<label for="wdcal_date_format">' . L10n::t('Date format') . ':</label><select name="wdcal_date_format" id="wdcal_date_format" size="1">';
$classes = wdcal_local::getInstanceClasses();
foreach ($classes as $c) {
$o .= '<option value="' . $c::getID() . '" ';
}
$o .= '</select><br>';
- $o .= '<label for="wdcal_time_zone">' . t('Time zone') . ':</label><input id="wdcal_time_zone" value="' . $a->timezone . '" disabled><br>';
+ $o .= '<label for="wdcal_time_zone">' . L10n::t('Time zone') . ':</label><input id="wdcal_time_zone" value="' . $a->timezone . '" disabled><br>';
- $o .= '<input type="submit" name="save" value="' . t('Save') . '">';
+ $o .= '<input type="submit" name="save" value="' . L10n::t('Save') . '">';
$o .= '</form>';
- $o .= '<br><br><h3>' . t('Calendars') . '</h3>';
+ $o .= '<br><br><h3>' . L10n::t('Calendars') . '</h3>';
$o .= '<form method="POST" action="' . $a->get_baseurl() . '/dav/settings/">';
$o .= "<input type='hidden' name='form_security_token' value='" . get_form_security_token('calprop') . "'>\n";
$o .= "<table><tr><th>Type</th><th>Color</th><th>Name</th><th>URI (for CalDAV)</th><th>ICS</th></tr>";
$o .= "</tr>\n";
$o .= "</table>";
- $o .= "<div style='text-align: center;'>[<a href='#' class='calendar_add_caller'>" . t("Create a new calendar") . "</a>]</div>";
- $o .= '<input type="submit" name="save_cals" value="' . t('Save') . '">';
+ $o .= "<div style='text-align: center;'>[<a href='#' class='calendar_add_caller'>" . L10n::t("Create a new calendar") . "</a>]</div>";
+ $o .= '<input type="submit" name="save_cals" value="' . L10n::t('Save') . '">';
$o .= '</form>';
$baseurl = $a->get_baseurl();
$o .= "<script>\$(function() {
});</script>";
- $o .= "<br><h3>" . t("Limitations") . "</h3>";
+ $o .= "<br><h3>" . L10n::t("Limitations") . "</h3>";
$o .= "- The native friendica events are embedded as read-only, half-transparent in the calendar.<br>";
- $o .= "<br><h3>" . t("Warning") . "</h3>";
+ $o .= "<br><h3>" . L10n::t("Warning") . "</h3>";
- $o .= "This plugin still is in a very early stage of development. Expect major bugs!<br>";
+ $o .= "This addon still is in a very early stage of development. Expect major bugs!<br>";
- $o .= "<br><h3>" . t("Synchronization (iPhone, Thunderbird Lightning, Android, ...)") . "</h3>";
+ $o .= "<br><h3>" . L10n::t("Synchronization (iPhone, Thunderbird Lightning, Android, ...)") . "</h3>";
- $o .= 'This plugin enables synchronization of your dates and contacts with CalDAV- and CardDAV-enabled programs or devices.<br>
+ $o .= 'This addon enables synchronization of your dates and contacts with CalDAV- and CardDAV-enabled programs or devices.<br>
As an example, the instructions how to set up two-way synchronization with an iPhone/iPodTouch are provided below.<br>
Unfortunately, Android does not have native support for CalDAV or CardDAV, so an app has to be installed.<br>
- On desktops, the Lightning-extension to Mozilla Thunderbird should be able to use this plugin as a backend.<br><br>';
+ On desktops, the Lightning-extension to Mozilla Thunderbird should be able to use this addon as a backend.<br><br>';
- $o .= '<h4>' . t('Synchronizing this calendar with the iPhone') . '</h4>';
+ $o .= '<h4>' . L10n::t('Synchronizing this calendar with the iPhone') . '</h4>';
$o .= "<ul>
<li>Go to the settings</li>
<li><b>Server:</b> " . $a->get_baseurl() . "/dav/ / <b>Username/Password:</b> <em>the same as your friendica-login</em></li>
</ul>";
- $o .= '<h4>' . t('Synchronizing your Friendica-Contacts with the iPhone') . '</h4>';
+ $o .= '<h4>' . L10n::t('Synchronizing your Friendica-Contacts with the iPhone') . '</h4>';
$o .= "<ul>
<li>Go to the settings</li>
<?php
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Module\Login;
+use Friendica\Util\Emailer;
+
require_once('include/security.php');
function dav_install()
{
- register_hook('event_created', 'addon/dav/dav.php', 'dav_event_created_hook');
- register_hook('event_updated', 'addon/dav/dav.php', 'dav_event_updated_hook');
- register_hook('profile_tabs', 'addon/dav/dav.php', 'dav_profile_tabs_hook');
- register_hook('cron', 'addon/dav/dav.php', 'dav_cron');
+ Addon::registerHook('event_created', 'addon/dav/dav.php', 'dav_event_created_hook');
+ Addon::registerHook('event_updated', 'addon/dav/dav.php', 'dav_event_updated_hook');
+ Addon::registerHook('profile_tabs', 'addon/dav/dav.php', 'dav_profile_tabs_hook');
+ Addon::registerHook('cron', 'addon/dav/dav.php', 'dav_cron');
}
function dav_uninstall()
{
- unregister_hook('event_created', 'addon/dav/dav.php', 'dav_event_created_hook');
- unregister_hook('event_updated', 'addon/dav/dav.php', 'dav_event_updated_hook');
- unregister_hook('profile_tabs', 'addon/dav/dav.php', 'dav_profile_tabs_hook');
- unregister_hook('cron', 'addon/dav/dav.php', 'dav_cron');
+ Addon::unregisterHook('event_created', 'addon/dav/dav.php', 'dav_event_created_hook');
+ Addon::unregisterHook('event_updated', 'addon/dav/dav.php', 'dav_event_updated_hook');
+ Addon::unregisterHook('profile_tabs', 'addon/dav/dav.php', 'dav_profile_tabs_hook');
+ Addon::unregisterHook('cron', 'addon/dav/dav.php', 'dav_cron');
}
}
}
} catch (DAVVersionMismatchException $e) {
- $x = t("The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this.");
+ $x = L10n::t("The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this.");
}
return $x;
}
*/
function dav_profile_tabs_hook(&$a, &$b)
{
- $b["tabs"][] = array(
- "label" => t('Calendar'),
+ $b["tabs"][] = [
+ "label" => L10n::t('Calendar'),
"url" => $a->get_baseurl() . "/dav/wdcal/",
"sel" => "",
- "title" => t('Extended calendar with CalDAV-support'),
- );
+ "title" => L10n::t('Extended calendar with CalDAV-support'),
+ ];
}
$text_html = str_replace($find, $repl, "Hi %to%!<br>\n<br>\nThe event \"%event%\" is about to begin:<br>\n<a href='" . "%url%" . "'>%url%</a>");
$params = array(
'fromName' => FRIENDICA_PLATFORM,
- 'fromEmail' => t('noreply') . '@' . $a->get_hostname(),
- 'replyTo' => t('noreply') . '@' . $a->get_hostname(),
+ 'fromEmail' => L10n::t('noreply') . '@' . $a->get_hostname(),
+ 'replyTo' => L10n::t('noreply') . '@' . $a->get_hostname(),
'toEmail' => $user["email"],
- 'messageSubject' => t("Notification: " . $event[0]["Summary"]),
+ 'messageSubject' => L10n::t("Notification: " . $event[0]["Summary"]),
'htmlVersion' => $text_html,
'textVersion' => $text_text,
'additionalMailHeader' => "",
* @param App $a
* @param null|object $o
*/
-function dav_plugin_admin_post(&$a = null, &$o = null)
+function dav_addon_admin_post(&$a = null, &$o = null)
{
- check_form_security_token_redirectOnErr('/admin/plugins/dav', 'dav_admin_save');
+ check_form_security_token_redirectOnErr('/admin/addons/dav', 'dav_admin_save');
dav_include_files();
require_once(__DIR__ . "/database-init.inc.php");
if (isset($_REQUEST["install"])) {
$errs = dav_create_tables();
- if (count($errs) == 0) info(t('The database tables have been installed.') . EOL);
- else notice(t("An error occurred during the installation.") . EOL);
+ if (count($errs) == 0) info(L10n::t('The database tables have been installed.') . EOL);
+ else notice(L10n::t("An error occurred during the installation.") . EOL);
}
if (isset($_REQUEST["upgrade"])) {
$errs = dav_upgrade_tables();
if (count($errs) == 0) {
renderAllCalDavEntries();
- info(t('The database tables have been updated.') . EOL);
- } else notice(t("An error occurred during the update.") . EOL);
+ info(L10n::t('The database tables have been updated.') . EOL);
+ } else notice(L10n::t("An error occurred during the update.") . EOL);
}
}
* @param App $a
* @param string $o
*/
-function dav_plugin_admin(&$a, &$o)
+function dav_addon_admin(&$a, &$o)
{
dav_include_files();
require_once(__DIR__ . "/database-init.inc.php");
$dbstatus = dav_check_tables();
$o = '<input type="hidden" name="form_security_token" value="' . get_form_security_token("dav_admin_save") . '">';
- $o .= '<i>' . t("No system-wide settings yet.") . '</i><br><br>';
+ $o .= '<i>' . L10n::t("No system-wide settings yet.") . '</i><br><br>';
- $o .= '<h3>' . t('Database status') . '</h3>';
+ $o .= '<h3>' . L10n::t('Database status') . '</h3>';
switch ($dbstatus) {
case 0:
- $o .= t('Installed');
+ $o .= L10n::t('Installed');
break;
case 1:
case 2:
- $o .= "<strong>" . t('Upgrade needed') . "</strong><br>" . t("Please back up all calendar data (the tables beginning with dav_*) before proceeding. While all calendar events <i>should</i> be converted to the new database structure, it's always safe to have a backup. Below, you can have a look at the database-queries that will be made when pressing the 'update'-button.") . "<br><br><input type='submit' name='upgrade' value='" . t('Upgrade') . "'>";
+ $o .= "<strong>" . L10n::t('Upgrade needed') . "</strong><br>" . L10n::t("Please back up all calendar data (the tables beginning with dav_*) before proceeding. While all calendar events <i>should</i> be converted to the new database structure, it's always safe to have a backup. Below, you can have a look at the database-queries that will be made when pressing the 'update'-button.") . "<br><br><input type='submit' name='upgrade' value='" . L10n::t('Upgrade') . "'>";
break;
case -1:
- $o .= t('Not installed') . "<br><br><input type='submit' name='install' value='" . t('Install') . "'>";
+ $o .= L10n::t('Not installed') . "<br><br><input type='submit' name='install' value='" . L10n::t('Install') . "'>";
break;
case -2:
default:
- $o .= t('Unknown') . "<br><br>" . t("Something really went wrong. I cannot recover from this state automatically, sorry. Please go to the database backend, back up the data, and delete all tables beginning with 'dav_' manually. Afterwards, this installation routine should be able to reinitialize the tables automatically.");
+ $o .= L10n::t('Unknown') . "<br><br>" . L10n::t("Something really went wrong. I cannot recover from this state automatically, sorry. Please go to the database backend, back up the data, and delete all tables beginning with 'dav_' manually. Afterwards, this installation routine should be able to reinitialize the tables automatically.");
break;
}
$o .= "<br><br>";
- $o .= "<h3>" . t("Troubleshooting") . "</h3>";
- $o .= "<h4>" . t("Manual creation of the database tables:") . "</h4>";
- $o .= "<a href='#' onClick='\$(\"#sqlstatements\").show(); return false;'>" . t("Show SQL-statements") . "</a><blockquote style='display: none;' id='sqlstatements'><pre>";
+ $o .= "<h3>" . L10n::t("Troubleshooting") . "</h3>";
+ $o .= "<h4>" . L10n::t("Manual creation of the database tables:") . "</h4>";
+ $o .= "<a href='#' onClick='\$(\"#sqlstatements\").show(); return false;'>" . L10n::t("Show SQL-statements") . "</a><blockquote style='display: none;' id='sqlstatements'><pre>";
switch ($dbstatus) {
case 1: case 2:
$tables = dav_get_update_statements($dbstatus);
-/* German initialisation for the jQuery UI date picker plugin. */
+/* German initialisation for the jQuery UI date picker addon. */
/* Written by Milian Wolff (mail@milianw.de). */
jQuery(function($){
$.datepicker.regional['de'] = {
#: friendica/main.php:202
msgid ""
-"The current version of this plugin has not been set up correctly. Please "
+"The current version of this addon has not been set up correctly. Please "
"contact the system administrator of your installation of friendica to fix "
"this."
msgstr ""
$a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Syncronització (iPhone, Thunderbird Lightning, Android, ...)";\r
$a->strings["Synchronizing this calendar with the iPhone"] = "Sncronitzant aquest calendari amb el iPhone";\r
$a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Sincronitzant els teus contactes a Friendica amb el iPhone";\r
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
$a->strings["Calendar"] = "Calendari";\r
$a->strings["Extended calendar with CalDAV-support"] = "Calendari ampliat amb suport CalDAV";\r
$a->strings["noreply"] = "no contestar";\r
#: friendica/main.php:202
msgid ""
-"The current version of this plugin has not been set up correctly. Please "
+"The current version of this addon has not been set up correctly. Please "
"contact the system administrator of your installation of friendica to fix "
"this."
msgstr "Stávající verze tohoto rozšíření nebyla správně nastavena. Prosím, kontaktujte administrátora webu, ať to opraví."
$a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Synchronizace (iPhone, Thunderbird Lightning, Android, ...)";
$a->strings["Synchronizing this calendar with the iPhone"] = "Synchronizovat tento kalendář s iPhone";
$a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Synchronizovat Vaše Friendica kontakty s iPhone";
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "Stávající verze tohoto rozšíření nebyla správně nastavena. Prosím, kontaktujte administrátora webu, ať to opraví.";
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "Stávající verze tohoto rozšíření nebyla správně nastavena. Prosím, kontaktujte administrátora webu, ať to opraví.";
$a->strings["Calendar"] = "Kalendář";
$a->strings["Extended calendar with CalDAV-support"] = "Rozšířený kalendář s podporou CalDAV";
$a->strings["noreply"] = "bez odpovědi";
#: friendica/main.php:202
msgid ""
-"The current version of this plugin has not been set up correctly. Please "
+"The current version of this addon has not been set up correctly. Please "
"contact the system administrator of your installation of friendica to fix "
"this."
msgstr "Die aktuelle Version dieses Plugins wurde nicht korrekt eingestellt. Bitte kontaktiere den System-Administrator deiner Friendica Installation um den Fehler zu beheben."
$a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Synchronisation (iPhone, Thunderbird Lightning, Android, ...)";
$a->strings["Synchronizing this calendar with the iPhone"] = "Diesen Kalender mit dem iPhone synchronisieren";
$a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Friendica-Kontakte mit dem iPhone synchronisieren";
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "Die aktuelle Version dieses Plugins wurde nicht korrekt eingestellt. Bitte kontaktiere den System-Administrator deiner Friendica Installation um den Fehler zu beheben.";
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "Die aktuelle Version dieses Plugins wurde nicht korrekt eingestellt. Bitte kontaktiere den System-Administrator deiner Friendica Installation um den Fehler zu beheben.";
$a->strings["Calendar"] = "Kalender";
$a->strings["Extended calendar with CalDAV-support"] = "Erweiterter Kalender mit CalDAV Unterstützung.";
$a->strings["noreply"] = "noreply";
$a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Sinkronigo (iPhone, Thunderbird Lightning, Android, ...)";\r
$a->strings["Synchronizing this calendar with the iPhone"] = "Sinkronigi tiun kalendaron kun la iPhone";\r
$a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Sinkronigi viajn Friendica kontaktojn kun la iPhone";\r
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
$a->strings["Calendar"] = "Kalendaro";\r
$a->strings["Extended calendar with CalDAV-support"] = "Etendita kalendaro kun CalDAV subteno";\r
$a->strings["noreply"] = "nerespondi";\r
#: friendica/main.php:202
msgid ""
-"The current version of this plugin has not been set up correctly. Please "
+"The current version of this addon has not been set up correctly. Please "
"contact the system administrator of your installation of friendica to fix "
"this."
-msgstr "La versión actual de este plugin no se ha instalado correctamente. Por favor contacte con el administrador del sistema de su instalación de Friendica para resolver esto."
+msgstr "La versión actual de este addon no se ha instalado correctamente. Por favor contacte con el administrador del sistema de su instalación de Friendica para resolver esto."
#: friendica/main.php:239 common/wdcal_edit.inc.php:146
msgid "Calendar"
$a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Sincronización (iPhone, Thunderbird Lightning, Android, ...)";
$a->strings["Synchronizing this calendar with the iPhone"] = "Sincronizar este calendario con el iPhone";
$a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Sincronizar sus contactos de Friendica con el iPhone";
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "La versión actual de este plugin no se ha instalado correctamente. Por favor contacte con el administrador del sistema de su instalación de Friendica para resolver esto.";
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "La versión actual de este addon no se ha instalado correctamente. Por favor contacte con el administrador del sistema de su instalación de Friendica para resolver esto.";
$a->strings["Calendar"] = "Calendario";
$a->strings["Extended calendar with CalDAV-support"] = "Estendido el calendario con soporte CalDAV";
$a->strings["noreply"] = "no responder";
$a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Synchronisation (Iphone, Thunderbird Lightning, Android, ...)";\r
$a->strings["Synchronizing this calendar with the iPhone"] = "Synchronisation avec l'Iphone en cours";\r
$a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Synchronisation de vos contacts Friendica avec l'Iphone en cours";\r
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "La version actuelle de cette extension n'a pas été configurée correctement. Merci de contacter votre administrateur Friendica pour régler ce problème. ";\r
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "La version actuelle de cette extension n'a pas été configurée correctement. Merci de contacter votre administrateur Friendica pour régler ce problème. ";\r
$a->strings["Calendar"] = "Calendrier";\r
$a->strings["Extended calendar with CalDAV-support"] = "Calendrier étendu avec support CalDAV";\r
$a->strings["noreply"] = "noreply";\r
$a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "";\r
$a->strings["Synchronizing this calendar with the iPhone"] = "";\r
$a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "";\r
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
$a->strings["Calendar"] = "";\r
$a->strings["Extended calendar with CalDAV-support"] = "";\r
$a->strings["noreply"] = "ekki svara";\r
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014
+# fabrixxm <fabrix.xm@gmail.com>, 2014,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-12-14 11:10+0000\n"
+"PO-Revision-Date: 2018-03-19 13:21+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
#: friendica/main.php:202
msgid ""
-"The current version of this plugin has not been set up correctly. Please "
+"The current version of this addon has not been set up correctly. Please "
"contact the system administrator of your installation of friendica to fix "
"this."
-msgstr "La versione corrente di questo plugin non è stata configurata correttamente. Contatta l'amministratore."
+msgstr "La versione corrente di questo componente aggiuntivo non è stata configurata correttamente. Contatta l'amministratore."
#: friendica/main.php:239 common/wdcal_edit.inc.php:146
msgid "Calendar"
$a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Sincronizzazione (iPhone, Thunderbird Lightning, Android, ...)";
$a->strings["Synchronizing this calendar with the iPhone"] = "Sincronizzare questo calendario con l'iPhone";
$a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Sincronizzare i tuoi contatti di Friendica con l'iPhone";
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "La versione corrente di questo plugin non è stata configurata correttamente. Contatta l'amministratore.";
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "La versione corrente di questo componente aggiuntivo non è stata configurata correttamente. Contatta l'amministratore.";
$a->strings["Calendar"] = "Calendario";
$a->strings["Extended calendar with CalDAV-support"] = "Calendario esteso con supporto CalDAV";
$a->strings["noreply"] = "nonrispondere";
$a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "";\r
$a->strings["Synchronizing this calendar with the iPhone"] = "";\r
$a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "";\r
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
$a->strings["Calendar"] = "";\r
$a->strings["Extended calendar with CalDAV-support"] = "";\r
$a->strings["noreply"] = "ikke svar";\r
$a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Synchronizacja (iPhone, Thunderbird Lightning, Android, ...)";\r
$a->strings["Synchronizing this calendar with the iPhone"] = "Zsynchronizuj kalendarz z iPhone";\r
$a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Zsynchronizuj kontakty friendica z iPhone";\r
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
$a->strings["Calendar"] = "Kalendarz";\r
$a->strings["Extended calendar with CalDAV-support"] = "";\r
$a->strings["noreply"] = "brak odpowiedzi";\r
$a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Sincronização (iPhone, Thunderbird Lightning, Android, ...)";\r
$a->strings["Synchronizing this calendar with the iPhone"] = "Sincronização desta agenda com o iPhone";\r
$a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Sincronização dos seus contatos Friendica com o iPhone";\r
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
$a->strings["Calendar"] = "Agenda";\r
$a->strings["Extended calendar with CalDAV-support"] = "";\r
$a->strings["noreply"] = "naoresponda";\r
#: friendica/main.php:202
msgid ""
-"The current version of this plugin has not been set up correctly. Please "
+"The current version of this addon has not been set up correctly. Please "
"contact the system administrator of your installation of friendica to fix "
"this."
msgstr "Versiunea curentă a acestui modul nu a fost corect configurată. Vă rugăm să contactați administratorul de sistem al aplicației dvs. friendica, pentru a corecta această situație."
$a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Sincronizare (iPhone, Thunderbird Lightning, Android, ...)";
$a->strings["Synchronizing this calendar with the iPhone"] = "Sincronizați acest calendar cu iPhone";
$a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Sincronizați contactele Friendica cu iPhone";
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "Versiunea curentă a acestui modul nu a fost corect configurată. Vă rugăm să contactați administratorul de sistem al aplicației dvs. friendica, pentru a corecta această situație.";
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "Versiunea curentă a acestui modul nu a fost corect configurată. Vă rugăm să contactați administratorul de sistem al aplicației dvs. friendica, pentru a corecta această situație.";
$a->strings["Calendar"] = "Calendar";
$a->strings["Extended calendar with CalDAV-support"] = "Calendar extins cu suport-CalDAV";
$a->strings["noreply"] = "nu-răspunde";
$a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "";\r
$a->strings["Synchronizing this calendar with the iPhone"] = "";\r
$a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "";\r
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
$a->strings["Calendar"] = "";\r
$a->strings["Extended calendar with CalDAV-support"] = "";\r
$a->strings["noreply"] = "без ответа";\r
$a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "同步(iPhone,Thunderbird Lightning, 案桌,等)";\r
$a->strings["Synchronizing this calendar with the iPhone"] = "正在把这个日历跟iPhone同步";\r
$a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "正在把您的Friendica熟人跟iPhone同步";\r
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "现有的插件没安装好。请跟系统管理您的friendica安装联系为维修。";\r
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "现有的插件没安装好。请跟系统管理您的friendica安装联系为维修。";\r
$a->strings["Calendar"] = "日历";\r
$a->strings["Extended calendar with CalDAV-support"] = "增能日历跟CalDAV支持";\r
$a->strings["noreply"] = "noreply";\r
* Author: Michael Vogel <heluecht@pirati.ca>
*/
-require_once("addon/diaspora/Diaspora_Connection.php");
+require_once 'addon/diaspora/Diaspora_Connection.php';
+
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Database\DBM;
+use Friendica\Model\Queue;
function diaspora_install() {
- register_hook('post_local', 'addon/diaspora/diaspora.php', 'diaspora_post_local');
- register_hook('notifier_normal', 'addon/diaspora/diaspora.php', 'diaspora_send');
- register_hook('jot_networks', 'addon/diaspora/diaspora.php', 'diaspora_jot_nets');
- register_hook('connector_settings', 'addon/diaspora/diaspora.php', 'diaspora_settings');
- register_hook('connector_settings_post', 'addon/diaspora/diaspora.php', 'diaspora_settings_post');
- register_hook('queue_predeliver', 'addon/diaspora/diaspora.php', 'diaspora_queue_hook');
+ Addon::registerHook('post_local', 'addon/diaspora/diaspora.php', 'diaspora_post_local');
+ Addon::registerHook('notifier_normal', 'addon/diaspora/diaspora.php', 'diaspora_send');
+ Addon::registerHook('jot_networks', 'addon/diaspora/diaspora.php', 'diaspora_jot_nets');
+ Addon::registerHook('connector_settings', 'addon/diaspora/diaspora.php', 'diaspora_settings');
+ Addon::registerHook('connector_settings_post', 'addon/diaspora/diaspora.php', 'diaspora_settings_post');
+ Addon::registerHook('queue_predeliver', 'addon/diaspora/diaspora.php', 'diaspora_queue_hook');
}
function diaspora_uninstall() {
- unregister_hook('post_local', 'addon/diaspora/diaspora.php', 'diaspora_post_local');
- unregister_hook('notifier_normal', 'addon/diaspora/diaspora.php', 'diaspora_send');
- unregister_hook('jot_networks', 'addon/diaspora/diaspora.php', 'diaspora_jot_nets');
- unregister_hook('connector_settings', 'addon/diaspora/diaspora.php', 'diaspora_settings');
- unregister_hook('connector_settings_post', 'addon/diaspora/diaspora.php', 'diaspora_settings_post');
- unregister_hook('queue_predeliver', 'addon/diaspora/diaspora.php', 'diaspora_queue_hook');
+ Addon::unregisterHook('post_local', 'addon/diaspora/diaspora.php', 'diaspora_post_local');
+ Addon::unregisterHook('notifier_normal', 'addon/diaspora/diaspora.php', 'diaspora_send');
+ Addon::unregisterHook('jot_networks', 'addon/diaspora/diaspora.php', 'diaspora_jot_nets');
+ Addon::unregisterHook('connector_settings', 'addon/diaspora/diaspora.php', 'diaspora_settings');
+ Addon::unregisterHook('connector_settings_post', 'addon/diaspora/diaspora.php', 'diaspora_settings_post');
+ Addon::unregisterHook('queue_predeliver', 'addon/diaspora/diaspora.php', 'diaspora_queue_hook');
}
$diaspora_defpost = get_pconfig(local_user(),'diaspora','post_by_default');
$selected = ((intval($diaspora_defpost) == 1) ? ' checked="checked" ' : '');
$b .= '<div class="profile-jot-net"><input type="checkbox" name="diaspora_enable"' . $selected . ' value="1" /> '
- . t('Post to Diaspora') . '</div>';
+ . L10n::t('Post to Diaspora') . '</div>';
}
}
if(! count($qi))
return;
- require_once('include/queue_fn.php');
-
foreach($qi as $x) {
if($x['network'] !== NETWORK_DIASPORA2)
continue;
$conn->provider = $hostname;
$conn->postStatusMessage($post, $aspect);
- logger('diaspora_queue: send '.$userdata['uid'].' success', LOGGER_DEBUG);
+ logger('diaspora_queue: send '.$userdata['uid'].' success', LOGGER_DEBUG);
- $success = true;
+ $success = true;
- remove_queue_item($x['id']);
+ Queue::removeItem($x['id']);
} catch (Exception $e) {
logger("diaspora_queue: Send ".$userdata['uid']." failed: ".$e->getMessage(), LOGGER_DEBUG);
}
- } else
+ } else {
logger('diaspora_queue: send '.$userdata['uid'].' missing username or password', LOGGER_DEBUG);
+ }
if (!$success) {
logger('diaspora_queue: delayed');
- update_queue_time($x['id']);
+ Queue::updateTime($x['id']);
}
}
}
$status = "";
$r = q("SELECT `addr` FROM `contact` WHERE `self` AND `uid` = %d", intval(local_user()));
- if (dbm::is_result($r)) {
- $status = sprintf(t("Please remember: You can always be reached from Diaspora with your Friendica handle %s. "), $r[0]['addr']);
- $status .= t('This connector is only meant if you still want to use your old Diaspora account for some time. ');
- $status .= sprintf(t('However, it is preferred that you tell your Diaspora contacts the new handle %s instead.'), $r[0]['addr']);
+ if (DBM::is_result($r)) {
+ $status = L10n::t("Please remember: You can always be reached from Diaspora with your Friendica handle %s. ", $r[0]['addr']);
+ $status .= L10n::t('This connector is only meant if you still want to use your old Diaspora account for some time. ');
+ $status .= L10n::t('However, it is preferred that you tell your Diaspora contacts the new handle %s instead.', $r[0]['addr']);
}
$aspects = false;
$conn->logIn();
$aspects = $conn->getAspects();
if (!$aspects) {
- $status = t("Can't login to your Diaspora account. Please check handle (in the format user@domain.tld) and password.");
+ $status = L10n::t("Can't login to your Diaspora account. Please check handle (in the format user@domain.tld) and password.");
}
}
/* Add some HTML to the existing form */
$s .= '<span id="settings_diaspora_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_diaspora_expanded\'); openClose(\'settings_diaspora_inflated\');">';
- $s .= '<img class="connector'.$css.'" src="images/diaspora-logo.png" /><h3 class="connector">'. t('Diaspora Export').'</h3>';
+ $s .= '<img class="connector'.$css.'" src="images/diaspora-logo.png" /><h3 class="connector">'. L10n::t('Diaspora Export').'</h3>';
$s .= '</span>';
$s .= '<div id="settings_diaspora_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_diaspora_expanded\'); openClose(\'settings_diaspora_inflated\');">';
- $s .= '<img class="connector'.$css.'" src="images/diaspora-logo.png" /><h3 class="connector">'. t('Diaspora Export').'</h3>';
+ $s .= '<img class="connector'.$css.'" src="images/diaspora-logo.png" /><h3 class="connector">'. L10n::t('Diaspora Export').'</h3>';
$s .= '</span>';
if ($status) {
}
$s .= '<div id="diaspora-enable-wrapper">';
- $s .= '<label id="diaspora-enable-label" for="diaspora-checkbox">' . t('Enable Diaspora Post Plugin') . '</label>';
+ $s .= '<label id="diaspora-enable-label" for="diaspora-checkbox">' . L10n::t('Enable Diaspora Post Addon') . '</label>';
$s .= '<input id="diaspora-checkbox" type="checkbox" name="diaspora" value="1" ' . $checked . '/>';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="diaspora-username-wrapper">';
- $s .= '<label id="diaspora-username-label" for="diaspora-username">' . t('Diaspora handle') . '</label>';
+ $s .= '<label id="diaspora-username-label" for="diaspora-username">' . L10n::t('Diaspora handle') . '</label>';
$s .= '<input id="diaspora-username" type="text" name="handle" value="' . $handle . '" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="diaspora-password-wrapper">';
- $s .= '<label id="diaspora-password-label" for="diaspora-password">' . t('Diaspora password') . '</label>';
+ $s .= '<label id="diaspora-password-label" for="diaspora-password">' . L10n::t('Diaspora password') . '</label>';
$s .= '<input id="diaspora-password" type="password" name="password" value="' . $password . '" />';
$s .= '</div><div class="clear"></div>';
if ($aspects) {
$single_aspect = new stdClass();
$single_aspect->id = 'all_aspects';
- $single_aspect->name = t('All aspects');
+ $single_aspect->name = L10n::t('All aspects');
$aspects[] = $single_aspect;
$single_aspect = new stdClass();
$single_aspect->id = 'public';
- $single_aspect->name = t('Public');
+ $single_aspect->name = L10n::t('Public');
$aspects[] = $single_aspect;
- $s .= '<label id="diaspora-aspect-label" for="diaspora-aspect">' . t('Post to aspect:') . '</label>';
+ $s .= '<label id="diaspora-aspect-label" for="diaspora-aspect">' . L10n::t('Post to aspect:') . '</label>';
$s .= '<select name="aspect" id="diaspora-aspect">';
foreach($aspects as $single_aspect) {
if ($single_aspect->id == $aspect)
}
$s .= '<div id="diaspora-bydefault-wrapper">';
- $s .= '<label id="diaspora-bydefault-label" for="diaspora-bydefault">' . t('Post to Diaspora by default') . '</label>';
+ $s .= '<label id="diaspora-bydefault-label" for="diaspora-bydefault">' . L10n::t('Post to Diaspora by default') . '</label>';
$s .= '<input id="diaspora-bydefault" type="checkbox" name="diaspora_bydefault" value="1" ' . $def_checked . '/>';
$s .= '</div><div class="clear"></div>';
/* provide a submit button */
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="diaspora-submit" name="diaspora-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="diaspora-submit" name="diaspora-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
} while ($oldbody != $body);
// convert to markdown
- $body = bb2diaspora($body, false, true);
+ $body = bb2diaspora($body);
// Adding the title
if(strlen($title))
if (count($r))
$a->contact = $r[0]["id"];
- $s = serialize(array('url' => $url, 'item' => $b['id'], 'post' => $body));
- require_once('include/queue_fn.php');
- add_to_queue($a->contact,NETWORK_DIASPORA2,$s);
- notice(t('Diaspora post failed. Queued for retry.').EOL);
+ $s = serialize(['url' => $url, 'item' => $b['id'], 'post' => $body]);
+
+ Queue::add($a->contact, NETWORK_DIASPORA2, $s);
+ notice(L10n::t('Diaspora post failed. Queued for retry.').EOL);
}
}
}
msgstr ""
#: diaspora.php:163
-msgid "Enable Diaspora Post Plugin"
+msgid "Enable Diaspora Post Addon"
msgstr ""
#: diaspora.php:168
msgstr "Diaspora export"
#: diaspora.php:163
-msgid "Enable Diaspora Post Plugin"
-msgstr "Povolit Diaspora Plugin"
+msgid "Enable Diaspora Post Addon"
+msgstr "Povolit Diaspora Addon"
#: diaspora.php:168
msgid "Diaspora username"
$a->strings["Post to Diaspora"] = "Příspěvek na Diaspora";
$a->strings["Can't login to your Diaspora account. Please check username and password and ensure you used the complete address (including http...)"] = "Nelze se přihlásit na váš Diaspora účet. Prosím ověřte své uživatelské jméno a heslo a ujistěte se, že jste použili kompletní adresu (včetně http...)";
$a->strings["Diaspora Export"] = "Diaspora export";
-$a->strings["Enable Diaspora Post Plugin"] = "Povolit Diaspora Plugin";
+$a->strings["Enable Diaspora Post Addon"] = "Povolit Diaspora Addon";
$a->strings["Diaspora username"] = "Diaspora uživatelské jméno";
$a->strings["Diaspora password"] = "Diaspora heslo";
$a->strings["Diaspora site URL"] = "Adresa webu Diaspora";
msgstr "Diaspora Export"
#: diaspora.php:163
-msgid "Enable Diaspora Post Plugin"
+msgid "Enable Diaspora Post Addon"
msgstr "Veröffentlichungen bei Diaspora erlauben"
#: diaspora.php:168
$a->strings["Post to Diaspora"] = "Auf Diaspora veröffentlichen";
$a->strings["Can't login to your Diaspora account. Please check username and password and ensure you used the complete address (including http...)"] = "Anmeldung bei deinem Diaspora Account fehlgeschlagen. Bitte überprüfe Nutzername und Passwort und stelle sicher, dass die komplette Adresse (inklusive des htto...) verwendet wurde.";
$a->strings["Diaspora Export"] = "Diaspora Export";
-$a->strings["Enable Diaspora Post Plugin"] = "Veröffentlichungen bei Diaspora erlauben";
+$a->strings["Enable Diaspora Post Addon"] = "Veröffentlichungen bei Diaspora erlauben";
$a->strings["Diaspora username"] = "Diaspora Nutzername";
$a->strings["Diaspora password"] = "Diaspora Passwort";
$a->strings["Diaspora site URL"] = "URL der Diaspora Seite";
msgstr "Exportar a Diaspora*"
#: diaspora.php:163
-msgid "Enable Diaspora Post Plugin"
-msgstr "Habilitar publicar a traves de Diaspora* plugin."
+msgid "Enable Diaspora Post Addon"
+msgstr "Habilitar publicar a traves de Diaspora* addon."
#: diaspora.php:168
msgid "Diaspora username"
$a->strings["Post to Diaspora"] = "Publicar hacia Diaspora*";
$a->strings["Can't login to your Diaspora account. Please check username and password and ensure you used the complete address (including http...)"] = "No se puede ingresar a tu cuenta de Diaspora*. Por favor verificar nombre de usuario, contraseña y asegura de usar la dirección completa, incluyendo https.. .";
$a->strings["Diaspora Export"] = "Exportar a Diaspora*";
-$a->strings["Enable Diaspora Post Plugin"] = "Habilitar publicar a traves de Diaspora* plugin.";
+$a->strings["Enable Diaspora Post Addon"] = "Habilitar publicar a traves de Diaspora* addon.";
$a->strings["Diaspora username"] = "Nombre de usuario de Diaspora*.";
$a->strings["Diaspora password"] = "Contraseña Diaspora*";
$a->strings["Diaspora site URL"] = "URL sitio Diaspora*";
msgstr "Export Diaspora"
#: diaspora.php:163
-msgid "Enable Diaspora Post Plugin"
+msgid "Enable Diaspora Post Addon"
msgstr "Activer l’extension « Publier sur Diaspora »"
#: diaspora.php:168
$a->strings["Post to Diaspora"] = "Publier sur Diaspora";
$a->strings["Can't login to your Diaspora account. Please check username and password and ensure you used the complete address (including http...)"] = "Impossible de se connecter à votre compte Diaspora. Veuillez vérifier votre identifiant et votre mot de passe, et assurez-vous d’avoir indiqué l’adresse complète (y compris le « http:// » initial).";
$a->strings["Diaspora Export"] = "Export Diaspora";
-$a->strings["Enable Diaspora Post Plugin"] = "Activer l’extension « Publier sur Diaspora »";
+$a->strings["Enable Diaspora Post Addon"] = "Activer l’extension « Publier sur Diaspora »";
$a->strings["Diaspora username"] = "Identifiant Diaspora";
$a->strings["Diaspora password"] = "Mot de passe Diaspora";
$a->strings["Diaspora site URL"] = "Adresse du site Diaspora";
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014
+# fabrixxm <fabrix.xm@gmail.com>, 2014,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-06-22 13:18+0200\n"
-"PO-Revision-Date: 2014-09-10 11:57+0000\n"
+"PO-Revision-Date: 2018-03-19 13:21+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
msgstr "Esporta Diaspora"
#: diaspora.php:163
-msgid "Enable Diaspora Post Plugin"
-msgstr "Abilita il plugin di invio a Diaspora"
+msgid "Enable Diaspora Post Addon"
+msgstr "Abilita il componente aggiuntivo di invio a Diaspora"
#: diaspora.php:168
msgid "Diaspora username"
$a->strings["Post to Diaspora"] = "Invia a Diaspora";
$a->strings["Can't login to your Diaspora account. Please check username and password and ensure you used the complete address (including http...)"] = "Non riesco ad autenticarmi con il tuo account Diaspora. Controlla il nome utente e la password e assicurati di aver usato l'indirizzo completo (compreso \"http\" o \"https\")";
$a->strings["Diaspora Export"] = "Esporta Diaspora";
-$a->strings["Enable Diaspora Post Plugin"] = "Abilita il plugin di invio a Diaspora";
+$a->strings["Enable Diaspora Post Addon"] = "Abilita il componente aggiuntivo di invio a Diaspora";
$a->strings["Diaspora username"] = "Nome utente Diaspora";
$a->strings["Diaspora password"] = "Password Diaspora";
$a->strings["Diaspora site URL"] = "Indirizzo sito Diaspora";
msgstr ""
#: diaspora.php:163
-msgid "Enable Diaspora Post Plugin"
+msgid "Enable Diaspora Post Addon"
msgstr "Habilitar plug-in para publicar na Diaspora"
#: diaspora.php:168
msgstr "Exportare pe Diaspora "
#: diaspora.php:163
-msgid "Enable Diaspora Post Plugin"
+msgid "Enable Diaspora Post Addon"
msgstr "Activare Modul Postare pe Diaspora"
#: diaspora.php:168
$a->strings["Post to Diaspora"] = "Postați pe Diaspora";
$a->strings["Can't login to your Diaspora account. Please check username and password and ensure you used the complete address (including http...)"] = "Nu se poate face autentificarea pe contul dvs. Diaspora. Verificați numele de utilizator şi parola şi asigurați-vă că ați folosit adresa completă (inclusiv http ... )";
$a->strings["Diaspora Export"] = "Exportare pe Diaspora ";
-$a->strings["Enable Diaspora Post Plugin"] = "Activare Modul Postare pe Diaspora";
+$a->strings["Enable Diaspora Post Addon"] = "Activare Modul Postare pe Diaspora";
$a->strings["Diaspora username"] = "Utilizator Diaspora";
$a->strings["Diaspora password"] = "Parola Diaspora";
$a->strings["Diaspora site URL"] = "URL site Diaspora";
msgstr "Экспорт в Diaspora"
#: diaspora.php:163
-msgid "Enable Diaspora Post Plugin"
+msgid "Enable Diaspora Post Addon"
msgstr "Включить плагин отправки сообщений в Diaspora"
#: diaspora.php:168
$a->strings["Post to Diaspora"] = "Отправить в Diaspora";
$a->strings["Can't login to your Diaspora account. Please check username and password and ensure you used the complete address (including http...)"] = "Невозможно войти в вашу учетную запись Diaspora. Пожалуйста, проверьте имя пользователя, пароль и убедитесь, что вы ввели полный адрес пода (включая http/https)";
$a->strings["Diaspora Export"] = "Экспорт в Diaspora";
-$a->strings["Enable Diaspora Post Plugin"] = "Включить плагин отправки сообщений в Diaspora";
+$a->strings["Enable Diaspora Post Addon"] = "Включить плагин отправки сообщений в Diaspora";
$a->strings["Diaspora username"] = "Имя пользователя Diaspora";
$a->strings["Diaspora password"] = "Пароль Diaspora";
$a->strings["Diaspora site URL"] = "URL пода Diaspora";
msgstr "Diaspora 导出"
#: diaspora.php:163
-msgid "Enable Diaspora Post Plugin"
+msgid "Enable Diaspora Post Addon"
msgstr "启用 Diaspora 发文插件"
#: diaspora.php:168
$a->strings["Post to Diaspora"] = "发到 Diaspora";
$a->strings["Can't login to your Diaspora account. Please check username and password and ensure you used the complete address (including http...)"] = "无法登录到你的 Diaspora 账户。请检查用户名和密码并确保你用了完整的地址(包括http...)";
$a->strings["Diaspora Export"] = "Diaspora 导出";
-$a->strings["Enable Diaspora Post Plugin"] = "启用 Diaspora 发文插件";
+$a->strings["Enable Diaspora Post Addon"] = "启用 Diaspora 发文插件";
$a->strings["Diaspora username"] = "Diaspora 用户名";
$a->strings["Diaspora password"] = "Diaspora 密码";
$a->strings["Diaspora site URL"] = "Diaspora 站点 URL";
<?php
-
/**
* Name: Dreamwidth Post Connector
* Description: Post to dreamwidth
* Author: Cat Gray <https://free-haven.org/profile/catness>
*/
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Network;
+
function dwpost_install() {
- register_hook('post_local', 'addon/dwpost/dwpost.php', 'dwpost_post_local');
- register_hook('notifier_normal', 'addon/dwpost/dwpost.php', 'dwpost_send');
- register_hook('jot_networks', 'addon/dwpost/dwpost.php', 'dwpost_jot_nets');
- register_hook('connector_settings', 'addon/dwpost/dwpost.php', 'dwpost_settings');
- register_hook('connector_settings_post', 'addon/dwpost/dwpost.php', 'dwpost_settings_post');
+ Addon::registerHook('post_local', 'addon/dwpost/dwpost.php', 'dwpost_post_local');
+ Addon::registerHook('notifier_normal', 'addon/dwpost/dwpost.php', 'dwpost_send');
+ Addon::registerHook('jot_networks', 'addon/dwpost/dwpost.php', 'dwpost_jot_nets');
+ Addon::registerHook('connector_settings', 'addon/dwpost/dwpost.php', 'dwpost_settings');
+ Addon::registerHook('connector_settings_post', 'addon/dwpost/dwpost.php', 'dwpost_settings_post');
}
function dwpost_uninstall() {
- unregister_hook('post_local', 'addon/dwpost/dwpost.php', 'dwpost_post_local');
- unregister_hook('notifier_normal', 'addon/dwpost/dwpost.php', 'dwpost_send');
- unregister_hook('jot_networks', 'addon/dwpost/dwpost.php', 'dwpost_jot_nets');
- unregister_hook('connector_settings', 'addon/dwpost/dwpost.php', 'dwpost_settings');
- unregister_hook('connector_settings_post', 'addon/dwpost/dwpost.php', 'dwpost_settings_post');
+ Addon::unregisterHook('post_local', 'addon/dwpost/dwpost.php', 'dwpost_post_local');
+ Addon::unregisterHook('notifier_normal', 'addon/dwpost/dwpost.php', 'dwpost_send');
+ Addon::unregisterHook('jot_networks', 'addon/dwpost/dwpost.php', 'dwpost_jot_nets');
+ Addon::unregisterHook('connector_settings', 'addon/dwpost/dwpost.php', 'dwpost_settings');
+ Addon::unregisterHook('connector_settings_post', 'addon/dwpost/dwpost.php', 'dwpost_settings_post');
}
$dw_defpost = get_pconfig(local_user(),'dwpost','post_by_default');
$selected = ((intval($dw_defpost) == 1) ? ' checked="checked" ' : '');
$b .= '<div class="profile-jot-net"><input type="checkbox" name="dwpost_enable" ' . $selected . ' value="1" /> '
- . t('Post to Dreamwidth') . '</div>';
+ . L10n::t('Post to Dreamwidth') . '</div>';
}
}
/* Add some HTML to the existing form */
$s .= '<span id="settings_dwpost_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_dwpost_expanded\'); openClose(\'settings_dwpost_inflated\');">';
- $s .= '<img class="connector" src="images/dreamwidth.png" /><h3 class="connector">'. t("Dreamwidth Export").'</h3>';
+ $s .= '<img class="connector" src="images/dreamwidth.png" /><h3 class="connector">'. L10n::t("Dreamwidth Export").'</h3>';
$s .= '</span>';
$s .= '<div id="settings_dwpost_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_dwpost_expanded\'); openClose(\'settings_dwpost_inflated\');">';
- $s .= '<img class="connector" src="images/dreamwidth.png" /><h3 class="connector">'. t("Dreamwidth Export").'</h3>';
+ $s .= '<img class="connector" src="images/dreamwidth.png" /><h3 class="connector">'. L10n::t("Dreamwidth Export").'</h3>';
$s .= '</span>';
$s .= '<div id="dwpost-enable-wrapper">';
- $s .= '<label id="dwpost-enable-label" for="dwpost-checkbox">' . t('Enable dreamwidth Post Plugin') . '</label>';
+ $s .= '<label id="dwpost-enable-label" for="dwpost-checkbox">' . L10n::t('Enable dreamwidth Post Addon') . '</label>';
$s .= '<input id="dwpost-checkbox" type="checkbox" name="dwpost" value="1" ' . $checked . '/>';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="dwpost-username-wrapper">';
- $s .= '<label id="dwpost-username-label" for="dwpost-username">' . t('dreamwidth username') . '</label>';
+ $s .= '<label id="dwpost-username-label" for="dwpost-username">' . L10n::t('dreamwidth username') . '</label>';
$s .= '<input id="dwpost-username" type="text" name="dw_username" value="' . $dw_username . '" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="dwpost-password-wrapper">';
- $s .= '<label id="dwpost-password-label" for="dwpost-password">' . t('dreamwidth password') . '</label>';
+ $s .= '<label id="dwpost-password-label" for="dwpost-password">' . L10n::t('dreamwidth password') . '</label>';
$s .= '<input id="dwpost-password" type="password" name="dw_password" value="' . $dw_password . '" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="dwpost-bydefault-wrapper">';
- $s .= '<label id="dwpost-bydefault-label" for="dwpost-bydefault">' . t('Post to dreamwidth by default') . '</label>';
+ $s .= '<label id="dwpost-bydefault-label" for="dwpost-bydefault">' . L10n::t('Post to dreamwidth by default') . '</label>';
$s .= '<input id="dwpost-bydefault" type="checkbox" name="dw_bydefault" value="1" ' . $def_checked . '/>';
$s .= '</div><div class="clear"></div>';
/* provide a submit button */
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="dwpost-submit" name="dwpost-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="dwpost-submit" name="dwpost-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
$dw_blog = 'http://www.dreamwidth.org/interface/xmlrpc';
if($dw_username && $dw_password && $dw_blog) {
-
- require_once('include/bbcode.php');
- require_once('include/datetime.php');
-
$title = $b['title'];
- $post = bbcode($b['body']);
+ $post = BBCode::convert($b['body']);
$post = xmlify($post);
$tags = dwpost_get_tags($b['tag']);
- $date = datetime_convert('UTC',$tz,$b['created'],'Y-m-d H:i:s');
+ $date = DateTimeFormat::convert($b['created'], $tz);
$year = intval(substr($date,0,4));
$mon = intval(substr($date,5,2));
$day = intval(substr($date,8,2));
logger('dwpost: data: ' . $xml, LOGGER_DATA);
- if($dw_blog !== 'test')
- $x = post_url($dw_blog,$xml,array("Content-Type: text/xml"));
+ if($dw_blog !== 'test') {
+ $x = Network::post($dw_blog, $xml, ["Content-Type: text/xml"]);
+ }
logger('posted to dreamwidth: ' . ($x) ? $x : '', LOGGER_DEBUG);
-
}
}
msgstr ""
#: dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
+msgid "Enable dreamwidth Post Addon"
msgstr ""
#: dwpost.php:77
\r
$a->strings["Post to Dreamwidth"] = "Missatge a Dreamwidth";\r
$a->strings["Dreamwidth Post Settings"] = "Configuració d'enviaments a Dreamwidth";\r
-$a->strings["Enable dreamwidth Post Plugin"] = "Habilitat el plugin d'enviaments a Dreamwidth";\r
+$a->strings["Enable dreamwidth Post Addon"] = "Habilitat el addon d'enviaments a Dreamwidth";\r
$a->strings["dreamwidth username"] = "Nom d'usuari a Dreamwidth";\r
$a->strings["dreamwidth password"] = "Contrasenya a Dreamwidth";\r
$a->strings["Post to dreamwidth by default"] = "Enviar per defecte a Dreamwidth";\r
msgstr "Dreamwidth nastavení příspěvků"
#: dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
-msgstr "Povolit dreamwidth Plugin"
+msgid "Enable dreamwidth Post Addon"
+msgstr "Povolit dreamwidth Addon"
#: dwpost.php:77
msgid "dreamwidth username"
;
$a->strings["Post to Dreamwidth"] = "Poslat na Dreamwidth";
$a->strings["Dreamwidth Post Settings"] = "Dreamwidth nastavení příspěvků";
-$a->strings["Enable dreamwidth Post Plugin"] = "Povolit dreamwidth Plugin";
+$a->strings["Enable dreamwidth Post Addon"] = "Povolit dreamwidth Addon";
$a->strings["dreamwidth username"] = "dreamwidth uživatelské jméno";
$a->strings["dreamwidth password"] = "dreamwidth heslo";
$a->strings["Post to dreamwidth by default"] = "Defaultně umístit na dreamwidth";
msgstr "Dreamwidth Veröffentlichungs-Einstellungen"
#: dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
-msgstr "Dreamwidth Post Plugin aktivieren"
+msgid "Enable dreamwidth Post Addon"
+msgstr "Dreamwidth Post Addon aktivieren"
#: dwpost.php:77
msgid "dreamwidth username"
;
$a->strings["Post to Dreamwidth"] = "In Dreamwidth veröffentlichen";
$a->strings["Dreamwidth Post Settings"] = "Dreamwidth Veröffentlichungs-Einstellungen";
-$a->strings["Enable dreamwidth Post Plugin"] = "Dreamwidth Post Plugin aktivieren";
+$a->strings["Enable dreamwidth Post Addon"] = "Dreamwidth Post Addon aktivieren";
$a->strings["dreamwidth username"] = "Dreamwidth Benutzername";
$a->strings["dreamwidth password"] = "Dreamwidth Passwort";
$a->strings["Post to dreamwidth by default"] = "Standardmäßig bei Dreamwidth veröffentlichen";
\r
$a->strings["Post to Dreamwidth"] = "Afiŝi al Dreamwidth";\r
$a->strings["Dreamwidth Post Settings"] = "Agordoj por Afiŝoj al Dreamwidth";\r
-$a->strings["Enable dreamwidth Post Plugin"] = "Ŝalti la Dreamwidth Kromprogramon";\r
+$a->strings["Enable dreamwidth Post Addon"] = "Ŝalti la Dreamwidth Kromprogramon";\r
$a->strings["dreamwidth username"] = "Dreamwidth salutnomo";\r
$a->strings["dreamwidth password"] = "Dreamwidth pasvorto";\r
$a->strings["Post to dreamwidth by default"] = "Defaŭlte afiŝi al Dreamwidth";\r
msgstr "Ajustes de publicación de Dreamwidth"
#: dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
-msgstr "Activar el plugin de publicación dreamwidth"
+msgid "Enable dreamwidth Post Addon"
+msgstr "Activar el addon de publicación dreamwidth"
#: dwpost.php:77
msgid "dreamwidth username"
;
$a->strings["Post to Dreamwidth"] = "Publicar en Dreamwidth";
$a->strings["Dreamwidth Post Settings"] = "Ajustes de publicación de Dreamwidth";
-$a->strings["Enable dreamwidth Post Plugin"] = "Activar el plugin de publicación dreamwidth";
+$a->strings["Enable dreamwidth Post Addon"] = "Activar el addon de publicación dreamwidth";
$a->strings["dreamwidth username"] = "Nombre de usuario de dreamwidth";
$a->strings["dreamwidth password"] = "Contraseña de dreamwidth";
$a->strings["Post to dreamwidth by default"] = "Publicar en dreamwidth por defecto";
msgstr "Paramètres pour Dreamwidth"
#: dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
+msgid "Enable dreamwidth Post Addon"
msgstr ""
#: dwpost.php:77
;
$a->strings["Post to Dreamwidth"] = "Publier sur Dreamwidth";
$a->strings["Dreamwidth Post Settings"] = "Paramètres pour Dreamwidth";
-$a->strings["Enable dreamwidth Post Plugin"] = "";
+$a->strings["Enable dreamwidth Post Addon"] = "";
$a->strings["dreamwidth username"] = "Nom d'utilisateur Dreamwidth";
$a->strings["dreamwidth password"] = "Mot de passe dreamwidth";
$a->strings["Post to dreamwidth by default"] = "Poster sur Dreamwidth par défaut";
\r
$a->strings["Post to Dreamwidth"] = "";\r
$a->strings["Dreamwidth Post Settings"] = "";\r
-$a->strings["Enable dreamwidth Post Plugin"] = "";\r
+$a->strings["Enable dreamwidth Post Addon"] = "";\r
$a->strings["dreamwidth username"] = "";\r
$a->strings["dreamwidth password"] = "";\r
$a->strings["Post to dreamwidth by default"] = "";\r
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014
+# fabrixxm <fabrix.xm@gmail.com>, 2014,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2014-10-22 07:54+0000\n"
+"PO-Revision-Date: 2018-03-19 13:21+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
#: dwpost.php:39
msgid "Post to Dreamwidth"
-msgstr "Posta su Dreamwidth"
+msgstr "Invia a Dreamwidth"
#: dwpost.php:70
msgid "Dreamwidth Post Settings"
-msgstr "Impostazioni di invio a Dreamwidth"
+msgstr "Impostazioni Invio a Dreeamwidth"
#: dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
-msgstr "Abilita il plugin di invio a Dreamwidth"
+msgid "Enable dreamwidth Post Addon"
+msgstr "Abilita il componente aggiuntivo di invio a Dreamwidth"
#: dwpost.php:77
msgid "dreamwidth username"
#: dwpost.php:93
msgid "Submit"
-msgstr "Invia"
+msgstr "Salva"
return ($n != 1);;
}}
;
-$a->strings["Post to Dreamwidth"] = "Posta su Dreamwidth";
-$a->strings["Dreamwidth Post Settings"] = "Impostazioni di invio a Dreamwidth";
-$a->strings["Enable dreamwidth Post Plugin"] = "Abilita il plugin di invio a Dreamwidth";
+$a->strings["Post to Dreamwidth"] = "Invia a Dreamwidth";
+$a->strings["Dreamwidth Post Settings"] = "Impostazioni Invio a Dreeamwidth";
+$a->strings["Enable dreamwidth Post Addon"] = "Abilita il componente aggiuntivo di invio a Dreamwidth";
$a->strings["dreamwidth username"] = "Nome utente Dreamwidth";
$a->strings["dreamwidth password"] = "password Dreamwidth";
$a->strings["Post to dreamwidth by default"] = "Invia sempre a Dreamwidth";
-$a->strings["Submit"] = "Invia";
+$a->strings["Submit"] = "Salva";
\r
$a->strings["Post to Dreamwidth"] = "";\r
$a->strings["Dreamwidth Post Settings"] = "";\r
-$a->strings["Enable dreamwidth Post Plugin"] = "";\r
+$a->strings["Enable dreamwidth Post Addon"] = "";\r
$a->strings["dreamwidth username"] = "";\r
$a->strings["dreamwidth password"] = "";\r
$a->strings["Post to dreamwidth by default"] = "";\r
\r
$a->strings["Post to Dreamwidth"] = "Opublikuj na Dreamwidth";\r
$a->strings["Dreamwidth Post Settings"] = "";\r
-$a->strings["Enable dreamwidth Post Plugin"] = "";\r
+$a->strings["Enable dreamwidth Post Addon"] = "";\r
$a->strings["dreamwidth username"] = "";\r
$a->strings["dreamwidth password"] = "";\r
$a->strings["Post to dreamwidth by default"] = "";\r
msgstr "Configurações de publicação no Dreamwidth"
#: dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
+msgid "Enable dreamwidth Post Addon"
msgstr "Habilitar plug-in para publicar no Dreamwidth"
#: dwpost.php:77
\r
$a->strings["Post to Dreamwidth"] = "Publicar no Dreamwidth";\r
$a->strings["Dreamwidth Post Settings"] = "Configurações de publicação no Dreamwidth";\r
-$a->strings["Enable dreamwidth Post Plugin"] = "Habilitar o plugin de publicação no Dreamwidth";\r
+$a->strings["Enable dreamwidth Post Addon"] = "Habilitar o addon de publicação no Dreamwidth";\r
$a->strings["dreamwidth username"] = "Nome de usuário do Dreamwidth";\r
$a->strings["dreamwidth password"] = "Senha do Dreamwidth";\r
$a->strings["Post to dreamwidth by default"] = "Publicar no Dreamwidth por padrão";\r
msgstr "Configurări Postări Dreamwidth "
#: dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
+msgid "Enable dreamwidth Post Addon"
msgstr "Activare Modul Postare pe Dreamwidth"
#: dwpost.php:77
;
$a->strings["Post to Dreamwidth"] = "Postați pe Dreamwidth";
$a->strings["Dreamwidth Post Settings"] = "Configurări Postări Dreamwidth ";
-$a->strings["Enable dreamwidth Post Plugin"] = "Activare Modul Postare pe Dreamwidth";
+$a->strings["Enable dreamwidth Post Addon"] = "Activare Modul Postare pe Dreamwidth";
$a->strings["dreamwidth username"] = "Utilizator Dreamwidth";
$a->strings["dreamwidth password"] = "Parola Dreamwidth ";
$a->strings["Post to dreamwidth by default"] = "Postați implicit pe Dreamwidth";
msgstr "Настройки сообщений Dreamwidth"
#: dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
+msgid "Enable dreamwidth Post Addon"
msgstr "Включить плагин отправки сообщений в Dreamwidth"
#: dwpost.php:77
;
$a->strings["Post to Dreamwidth"] = "Отправить в Dreamwidth";
$a->strings["Dreamwidth Post Settings"] = "Настройки сообщений Dreamwidth";
-$a->strings["Enable dreamwidth Post Plugin"] = "Включить плагин отправки сообщений в Dreamwidth";
+$a->strings["Enable dreamwidth Post Addon"] = "Включить плагин отправки сообщений в Dreamwidth";
$a->strings["dreamwidth username"] = "Имя пользователя Dreamwidth";
$a->strings["dreamwidth password"] = "Пароль Dreamwidth";
$a->strings["Post to dreamwidth by default"] = "Отправлять сообщения в Dreamwidth по умолчанию";
\r
$a->strings["Post to Dreamwidth"] = "转播到Dreamwidth";\r
$a->strings["Dreamwidth Post Settings"] = "Dreamwidth转播设置";\r
-$a->strings["Enable dreamwidth Post Plugin"] = "使Dreamwidth转播插件可用";\r
+$a->strings["Enable dreamwidth Post Addon"] = "使Dreamwidth转播插件可用";\r
$a->strings["dreamwidth username"] = "Dreamwidth用户名";\r
$a->strings["dreamwidth password"] = "Dreamwidth密码";\r
$a->strings["Post to dreamwidth by default"] = "默认地转播到Dreamwidth";\r
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*/
+use Friendica\Core\Addon;
+use Friendica\Util\Network;
// IMPORTANT: SET THIS to your fortunate server
-define ('FORTUNATE_SERVER', 'hostname.com');
+define('FORTUNATE_SERVER', 'hostname.com');
-function fortunate_install() {
- register_hook('page_end', 'addon/fortunate/fortunate.php', 'fortunate_fetch');
- if(FORTUNATE_SERVER == 'hostname.com' && is_site_admin()) {
- notice('Fortunate plugin requires configuration. See README');
+function fortunate_install()
+{
+ Addon::registerHook('page_end', 'addon/fortunate/fortunate.php', 'fortunate_fetch');
+ if (FORTUNATE_SERVER == 'hostname.com' && is_site_admin()) {
+ notice('Fortunate addon requires configuration. See README');
}
}
-function fortunate_uninstall() {
- unregister_hook('page_end', 'addon/fortunate/fortunate.php', 'fortunate_fetch');
+function fortunate_uninstall()
+{
+ Addon::unregisterHook('page_end', 'addon/fortunate/fortunate.php', 'fortunate_fetch');
}
-function fortunate_fetch(&$a,&$b) {
-
+function fortunate_fetch(&$a, &$b)
+{
$a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'
. $a->get_baseurl() . '/addon/fortunate/fortunate.css' . '" media="all" />' . "\r\n";
- if(FORTUNATE_SERVER != 'hostname.com') {
- $s = fetch_url('http://' . FORTUNATE_SERVER . '/cookie.php?numlines=2&equal=1&rand=' . mt_rand());
+ if (FORTUNATE_SERVER != 'hostname.com') {
+ $s = Network::fetchUrl('http://' . FORTUNATE_SERVER . '/cookie.php?numlines=2&equal=1&rand=' . mt_rand());
$b .= '<div class="fortunate">' . $s . '</div>';
}
}
-
<?php
/**
-* Name: Forum Directory
-* Description: Add a directory of forums hosted on your server, with verbose descriptions.
-* Version: 1.0
-* Author: Thomas Willingham <https://beardyunixer.com/profile/beardyunixer>
-*/
-
-function forumdirectory_install() {
-register_hook('app_menu', 'addon/forumdirectory/forumdirectory.php', 'forumdirectory_app_menu');
+ * Name: Forum Directory
+ * Description: Add a directory of forums hosted on your server, with verbose descriptions.
+ * Version: 1.0
+ * Author: Thomas Willingham <https://beardyunixer.com/profile/beardyunixer>
+ */
+
+use Friendica\Content\Nav;
+use Friendica\Content\Widget;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Database\DBM;
+use Friendica\Model\Profile;
+use Friendica\Util\Temporal;
+
+require_once 'boot.php';
+require_once 'include/dba.php';
+require_once 'include/text.php';
+
+function forumdirectory_install()
+{
+ Addon::registerHook('app_menu', 'addon/forumdirectory/forumdirectory.php', 'forumdirectory_app_menu');
}
-function forumdirectory_uninstall() {
-unregister_hook('app_menu', 'addon/forumdirectory/forumdirectory.php', 'forumdirectory_app_menu');
+function forumdirectory_uninstall()
+{
+ Addon::unregisterHook('app_menu', 'addon/forumdirectory/forumdirectory.php', 'forumdirectory_app_menu');
}
-function forumdirectory_module() {
-return;
+function forumdirectory_module()
+{
+ return;
}
-function forumdirectory_app_menu($a,&$b) {
-$b['app_menu'][] = '<div class="app-title"><a href="forumdirectory">' . t('Forum Directory') . '</a></div>';
+function forumdirectory_app_menu($a, &$b)
+{
+ $b['app_menu'][] = '<div class="app-title"><a href="forumdirectory">' . L10n::t('Forum Directory') . '</a></div>';
}
-function forumdirectory_init(&$a) {
- $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'.$a->get_baseurl().'/addon/forumdirectory/forumdirectory.css" media="all" />';
+function forumdirectory_init(&$a)
+{
+ $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' . $a->get_baseurl() . '/addon/forumdirectory/forumdirectory.css" media="all" />';
$a->set_pager_itemspage(60);
- if(local_user()) {
- require_once('include/contact_widgets.php');
-
- $a->page['aside'] .= findpeople_widget();
-
- }
- else
+ if (local_user()) {
+ $a->page['aside'] .= Widget::findPeople();
+ } else {
unset($_SESSION['theme']);
-
-
+ }
}
-
-function forumdirectory_post(&$a) {
- if(x($_POST,'search'))
+function forumdirectory_post(&$a)
+{
+ if (x($_POST, 'search')) {
$a->data['search'] = $_POST['search'];
+ }
}
-
-
-function forumdirectory_content(&$a) {
-
- if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
- notice( t('Public access denied.') . EOL);
+function forumdirectory_content(&$a)
+{
+ if ((Config::get('system', 'block_public')) && (!local_user()) && (!remote_user())) {
+ notice(L10n::t('Public access denied.') . EOL);
return;
}
$o = '';
- nav_set_selected('directory');
+ Nav::setSelected('directory');
- if(x($a->data,'search'))
+ if (x($a->data, 'search')) {
$search = notags(trim($a->data['search']));
- else
- $search = ((x($_GET,'search')) ? notags(trim(rawurldecode($_GET['search']))) : '');
+ } else {
+ $search = ((x($_GET, 'search')) ? notags(trim(rawurldecode($_GET['search']))) : '');
+ }
$tpl = get_markup_template('directory_header.tpl');
$globaldir = '';
- $gdirpath = get_config('system','directory');
- if(strlen($gdirpath)) {
+ $gdirpath = Config::get('system', 'directory');
+ if (strlen($gdirpath)) {
$globaldir = '<ul><li><div id="global-directory-link"><a href="'
- . zrl($gdirpath,true) . '">' . t('Global Directory') . '</a></div></li></ul>';
+ . Profile::zrl($gdirpath, true) . '">' . L10n::t('Global Directory') . '</a></div></li></ul>';
}
$admin = '';
- $o .= replace_macros($tpl, array(
- '$search' => $search,
+ $o .= replace_macros($tpl, [
+ '$search' => $search,
'$globaldir' => $globaldir,
- '$desc' => t('Find on this site'),
- '$admin' => $admin,
- '$finding' => (strlen($search) ? '<h4>' . t('Finding: ') . "'" . $search . "'" . '</h4>' : ""),
- '$sitedir' => t('Site Directory'),
- '$submit' => t('Find')
- ));
-
- if($search)
- $search = dbesc($search);
- $sql_extra = ((strlen($search)) ? " AND MATCH (`profile`.`name`, `user`.`nickname`, `pdesc`, `locality`,`region`,`country-name`,`gender`,`marital`,`sexual`,`about`,`romance`,`work`,`education`,`pub_keywords`,`prv_keywords` ) AGAINST ('$search' IN BOOLEAN MODE) " : "");
-
- $publish = ((get_config('system','publish_all')) ? '' : " AND `publish` = 1 " );
+ '$desc' => L10n::t('Find on this site'),
+ '$admin' => $admin,
+ '$finding' => (strlen($search) ? '<h4>' . L10n::t('Finding: ') . "'" . $search . "'" . '</h4>' : ""),
+ '$sitedir' => L10n::t('Site Directory'),
+ '$submit' => L10n::t('Find')
+ ]);
+
+ $sql_extra = '';
+ if (strlen($search)) {
+ $sql_extra = " AND MATCH (`profile`.`name`, `user`.`nickname`, `pdesc`, `locality`,`region`,`country-name`,"
+ . "`gender`,`marital`,`sexual`,`about`,`romance`,`work`,`education`,`pub_keywords`,`prv_keywords` )"
+ . " AGAINST ('" . dbesc($search) . "' IN BOOLEAN MODE) ";
+ }
+ $publish = Config::get('system', 'publish_all') ? '' : " AND `publish` = 1 ";
- $r = q("SELECT COUNT(*) AS `total` FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 AND `page-flags` = 2 $sql_extra ");
- if(count($r))
+ $r = q("SELECT COUNT(*) AS `total` FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid`"
+ . " WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 AND `page-flags` = 2 $sql_extra ");
+ if (DBM::is_result($r)) {
$a->set_pager_total($r[0]['total']);
+ }
$order = " ORDER BY `name` ASC ";
-
- $r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`, `user`.`timezone` , `user`.`page-flags` FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 AND `page-flags` = 2 $sql_extra $order LIMIT %d , %d ",
+ $r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`, `user`.`timezone` , `user`.`page-flags`"
+ . " FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` WHERE `is-default` = 1 $publish"
+ . " AND `user`.`blocked` = 0 AND `page-flags` = 2 $sql_extra $order LIMIT %d , %d ",
intval($a->pager['start']),
intval($a->pager['itemspage'])
);
- if(count($r)) {
- if(in_array('small', $a->argv))
+ if (DBM::is_result($r)) {
+ if (in_array('small', $a->argv)) {
$photo = 'thumb';
- else
+ } else {
$photo = 'photo';
+ }
- foreach($r as $rr) {
-
-
+ foreach ($r as $rr) {
$profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
$pdesc = (($rr['pdesc']) ? $rr['pdesc'] . '<br />' : '');
$details = '';
- if(strlen($rr['locality']))
+ if (strlen($rr['locality'])) {
$details .= $rr['locality'];
- if(strlen($rr['region'])) {
- if(strlen($rr['locality']))
+ }
+
+ if (strlen($rr['region'])) {
+ if (strlen($rr['locality'])) {
$details .= ', ';
+ }
$details .= $rr['region'];
}
- if(strlen($rr['country-name'])) {
- if(strlen($details))
+ if (strlen($rr['country-name'])) {
+ if (strlen($details)) {
$details .= ', ';
+ }
$details .= $rr['country-name'];
}
- if(strlen($rr['dob'])) {
- if(($years = age($rr['dob'],$rr['timezone'],'')) != 0)
- $details .= '<br />' . t('Age: ') . $years ;
+
+ if (strlen($rr['dob']) && ($years = Temporal::getAgeByTimezone($rr['dob'], $rr['timezone'], '')) != 0) {
+ $details .= '<br />' . L10n::t('Age: ') . $years;
}
- if(strlen($rr['gender']))
- $details .= '<br />' . t('Gender: ') . $rr['gender'];
-
- if($rr['page-flags'] == PAGE_NORMAL)
- $page_type = "Personal Profile";
- if($rr['page-flags'] == PAGE_SOAPBOX)
- $page_type = "Fan Page";
- if($rr['page-flags'] == PAGE_COMMUNITY)
- $page_type = "Community Forum";
- if($rr['page-flags'] == PAGE_FREELOVE)
- $page_type = "Open Forum";
- if($rr['page-flags'] == PAGE_PRVGROUP)
- $page_type = "Private Group";
- $profile = $rr;
+ if (strlen($rr['gender'])) {
+ $details .= '<br />' . L10n::t('Gender: ') . $rr['gender'];
+ }
- if((x($profile,'address') == 1)
- || (x($profile,'locality') == 1)
- || (x($profile,'region') == 1)
- || (x($profile,'postal-code') == 1)
- || (x($profile,'country-name') == 1))
- $location = t('Location:');
+ switch ($rr['page-flags']) {
+ case PAGE_NORMAL : $page_type = "Personal Profile"; break;
+ case PAGE_SOAPBOX : $page_type = "Fan Page" ; break;
+ case PAGE_COMMUNITY: $page_type = "Community Forum" ; break;
+ case PAGE_FREELOVE : $page_type = "Open Forum" ; break;
+ case PAGE_PRVGROUP : $page_type = "Private Group" ; break;
+ }
- $gender = ((x($profile,'gender') == 1) ? t('Gender:') : False);
+ $profile = $rr;
- $marital = ((x($profile,'marital') == 1) ? t('Status:') : False);
+ $location = '';
+ if (x($profile, 'address') == 1
+ || x($profile, 'locality') == 1
+ || x($profile, 'region') == 1
+ || x($profile, 'postal-code') == 1
+ || x($profile, 'country-name') == 1
+ ) {
+ $location = L10n::t('Location:');
+ }
- $homepage = ((x($profile,'homepage') == 1) ? t('Homepage:') : False);
+ $gender = x($profile, 'gender') == 1 ? L10n::t('Gender:') : false;
+ $marital = x($profile, 'marital') == 1 ? L10n::t('Status:') : false;
+ $homepage = x($profile, 'homepage') == 1 ? L10n::t('Homepage:') : false;
+ $about = x($profile, 'about') == 1 ? L10n::t('About:') : false;
- $about = ((x($profile,'about') == 1) ? t('About:') : False);
-
-# $tpl = file_get_contents( dirname(__file__).'/forumdirectory_item.tpl');
- $tpl = get_markup_template( 'forumdirectory_item.tpl', 'addon/forumdirectory/' );
+ $tpl = get_markup_template('forumdirectory_item.tpl', 'addon/forumdirectory/');
- $entry = replace_macros($tpl,array(
- '$id' => $rr['id'],
+ $entry = replace_macros($tpl, [
+ '$id' => $rr['id'],
'$profile_link' => $profile_link,
- '$photo' => $a->get_cached_avatar_image($rr[$photo]),
- '$alt_text' => $rr['name'],
- '$name' => $rr['name'],
- '$details' => $pdesc . $details,
- '$page_type' => $page_type,
- '$profile' => $profile,
- '$location' => template_escape($location),
- '$gender' => $gender,
- '$pdesc' => $pdesc,
- '$marital' => $marital,
- '$homepage' => $homepage,
- '$about' => $about,
-
- ));
-
- $arr = array('contact' => $rr, 'entry' => $entry);
-
- unset($profile);
- unset($location);
+ '$photo' => $rr[$photo],
+ '$alt_text' => $rr['name'],
+ '$name' => $rr['name'],
+ '$details' => $pdesc . $details,
+ '$page_type' => $page_type,
+ '$profile' => $profile,
+ '$location' => $location,
+ '$gender' => $gender,
+ '$pdesc' => $pdesc,
+ '$marital' => $marital,
+ '$homepage' => $homepage,
+ '$about' => $about,
+ ]);
$o .= $entry;
-
}
$o .= "<div class=\"directory-end\" ></div>\r\n";
$o .= paginate($a);
-
+ } else {
+ info(L10n::t("No entries \x28some entries may be hidden\x29.") . EOL);
}
- else
- info( t("No entries \x28some entries may be hidden\x29.") . EOL);
return $o;
}
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2014-09-10 12:04+0000\n"
+"PO-Revision-Date: 2017-09-20 06:07+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
* Author: Commander Zot
*
*/
-
-
-function fromapp_install() {
-
- register_hook('post_local', 'addon/fromapp/fromapp.php', 'fromapp_post_hook');
- register_hook('plugin_settings', 'addon/fromapp/fromapp.php', 'fromapp_settings');
- register_hook('plugin_settings_post', 'addon/fromapp/fromapp.php', 'fromapp_settings_post');
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+
+function fromapp_install()
+{
+ Addon::registerHook('post_local', 'addon/fromapp/fromapp.php', 'fromapp_post_hook');
+ Addon::registerHook('addon_settings', 'addon/fromapp/fromapp.php', 'fromapp_settings');
+ Addon::registerHook('addon_settings_post', 'addon/fromapp/fromapp.php', 'fromapp_settings_post');
logger("installed fromapp");
}
-function fromapp_uninstall() {
-
- unregister_hook('post_local', 'addon/fromapp/fromapp.php', 'fromapp_post_hook');
- unregister_hook('plugin_settings', 'addon/fromapp/fromapp.php', 'fromapp_settings');
- unregister_hook('plugin_settings_post', 'addon/fromapp/fromapp.php', 'fromapp_settings_post');
-
-
+function fromapp_uninstall()
+{
+ Addon::unregisterHook('post_local', 'addon/fromapp/fromapp.php', 'fromapp_post_hook');
+ Addon::unregisterHook('addon_settings', 'addon/fromapp/fromapp.php', 'fromapp_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/fromapp/fromapp.php', 'fromapp_settings_post');
logger("removed fromapp");
}
-function fromapp_settings_post($a,$post) {
- if(! local_user() || (! x($_POST,'fromapp-submit')))
+function fromapp_settings_post($a, $post)
+{
+ if (!local_user() || (! x($_POST, 'fromapp-submit'))) {
return;
+ }
- set_pconfig(local_user(),'fromapp','app',$_POST['fromapp-input']);
- set_pconfig(local_user(),'fromapp','force',intval($_POST['fromapp-force']));
+ PConfig::set(local_user(), 'fromapp', 'app', $_POST['fromapp-input']);
+ PConfig::set(local_user(), 'fromapp', 'force', intval($_POST['fromapp-force']));
- info( t('Fromapp settings updated.') . EOL);
+ info(L10n::t('Fromapp settings updated.') . EOL);
}
-function fromapp_settings(&$a,&$s) {
-
- if(! local_user())
+function fromapp_settings(&$a, &$s)
+{
+ if (!local_user()) {
return;
+ }
/* Add our stylesheet to the page so we can make our settings look nice */
/* Get the current state of our config variable */
- $fromapp = get_pconfig(local_user(),'fromapp','app');
- if($fromapp === false)
- $fromapp = '';
+ $fromapp = PConfig::get(local_user(), 'fromapp', 'app', '');
- $force = intval(get_pconfig(local_user(),'fromapp','force'));
+ $force = intval(PConfig::get(local_user(), 'fromapp', 'force'));
$force_enabled = (($force) ? ' checked="checked" ' : '');
/* Add some HTML to the existing form */
$s .= '<span id="settings_fromapp_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_fromapp_expanded\'); openClose(\'settings_fromapp_inflated\');">';
- $s .= '<h3>' . t('FromApp Settings') . '</h3>';
+ $s .= '<h3>' . L10n::t('FromApp Settings') . '</h3>';
$s .= '</span>';
$s .= '<div id="settings_fromapp_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_fromapp_expanded\'); openClose(\'settings_fromapp_inflated\');">';
- $s .= '<h3>' . t('FromApp Settings') . '</h3>';
+ $s .= '<h3>' . L10n::t('FromApp Settings') . '</h3>';
$s .= '</span>';
$s .= '<div id="fromapp-wrapper">';
- $s .= '<label id="fromapp-label" for="fromapp-input">' . t('The application name you would like to show your posts originating from.') . '</label>';
+ $s .= '<label id="fromapp-label" for="fromapp-input">' . L10n::t('The application name you would like to show your posts originating from.') . '</label>';
$s .= '<input id="fromapp-input" type="text" name="fromapp-input" value="' . $fromapp . '" ' . '/>';
$s .= '<div class="clear"></div>';
- $s .= '<label id="fromapp-force-label" for="fromapp-force">' . t('Use this application name even if another application was used.') . '</label>';
+ $s .= '<label id="fromapp-force-label" for="fromapp-force">' . L10n::t('Use this application name even if another application was used.') . '</label>';
$s .= '<input id="fromapp-force" type="checkbox" name="fromapp-force" value="1" ' . $force_enabled . '/>';
$s .= '</div><div class="clear"></div>';
/* provide a submit button */
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="fromapp-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
-
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="fromapp-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
function fromapp_post_hook(&$a,&$item) {
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:11+0000\n"
+"PO-Revision-Date: 2017-09-20 06:07+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
define('FROMGPLUS_DEFAULT_POLL_INTERVAL', 30); // given in minutes
-require_once('mod/share.php');
-require_once('mod/parse_url.php');
-require_once('include/text.php');
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Object\Image;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Network;
+
+require_once 'mod/share.php';
+require_once 'mod/parse_url.php';
+require_once 'include/text.php';
function fromgplus_install() {
- register_hook('connector_settings', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings');
- register_hook('connector_settings_post', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings_post');
- register_hook('cron', 'addon/fromgplus/fromgplus.php', 'fromgplus_cron');
+ Addon::registerHook('connector_settings', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings');
+ Addon::registerHook('connector_settings_post', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings_post');
+ Addon::registerHook('cron', 'addon/fromgplus/fromgplus.php', 'fromgplus_cron');
}
function fromgplus_uninstall() {
- unregister_hook('connector_settings', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings');
- unregister_hook('connector_settings_post', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings_post');
- unregister_hook('cron', 'addon/fromgplus/fromgplus.php', 'fromgplus_cron');
+ Addon::unregisterHook('connector_settings', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings');
+ Addon::unregisterHook('connector_settings_post', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings_post');
+ Addon::unregisterHook('cron', 'addon/fromgplus/fromgplus.php', 'fromgplus_cron');
// Old hooks
- unregister_hook('plugin_settings', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings');
- unregister_hook('plugin_settings_post', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings_post');
+ Addon::unregisterHook('addon_settings', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings_post');
}
function fromgplus_addon_settings(&$a,&$s) {
$account = get_pconfig(local_user(),'fromgplus','account');
$s .= '<span id="settings_fromgplus_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_fromgplus_expanded\'); openClose(\'settings_fromgplus_inflated\');">';
- $s .= '<img class="connector" src="images/googleplus.png" /><h3 class="connector">'. t('Google+ Mirror').'</h3>';
+ $s .= '<img class="connector" src="images/googleplus.png" /><h3 class="connector">'. L10n::t('Google+ Mirror').'</h3>';
$s .= '</span>';
$s .= '<div id="settings_fromgplus_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_fromgplus_expanded\'); openClose(\'settings_fromgplus_inflated\');">';
- $s .= '<img class="connector" src="images/googleplus.png" /><h3 class="connector">'. t('Google+ Mirror').'</h3>';
+ $s .= '<img class="connector" src="images/googleplus.png" /><h3 class="connector">'. L10n::t('Google+ Mirror').'</h3>';
$s .= '</span>';
$s .= '<div id="fromgplus-wrapper">';
- $s .= '<label id="fromgplus-enable-label" for="fromgplus-enable">'.t('Enable Google+ Import').'</label>';
+ $s .= '<label id="fromgplus-enable-label" for="fromgplus-enable">'.L10n::t('Enable Google+ Import').'</label>';
$s .= '<input id="fromgplus-enable" type="checkbox" name="fromgplus-enable" value="1"'.$enable_checked.' />';
$s .= '<div class="clear"></div>';
- $s .= '<label id="fromgplus-label" for="fromgplus-account">'.t('Google Account ID').' </label>';
+ $s .= '<label id="fromgplus-label" for="fromgplus-account">'.L10n::t('Google Account ID').' </label>';
$s .= '<input id="fromgplus-account" type="text" name="fromgplus-account" value="'.$account.'" />';
$s .= '</div><div class="clear"></div>';
- $s .= '<label id="fromgplus-keywords-label" for="fromgplus-keywords">'.t('Add keywords to post').'</label>';
+ $s .= '<label id="fromgplus-keywords-label" for="fromgplus-keywords">'.L10n::t('Add keywords to post').'</label>';
$s .= '<input id="fromgplus-keywords" type="checkbox" name="fromgplus-keywords" value="1"'.$keywords_checked.' />';
$s .= '<div class="clear"></div>';
$s .= '<div class="settings-submit-wrapper" ><input type="submit" id="fromgplus-submit" name="fromgplus-submit"
-class="settings-submit" value="' . t('Save Settings') . '" /></div>';
+class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
$s .= '</div>';
return;
if (!$enable)
del_pconfig(local_user(),'fromgplus','lastdate');
- info( t('Google+ Import Settings saved.') . EOL);
+ info(L10n::t('Google+ Import Settings saved.') . EOL);
}
}
-function fromgplus_plugin_admin(&$a, &$o){
- $t = get_markup_template("admin.tpl", "addon/fromgplus/");
+function fromgplus_addon_admin(&$a, &$o)
+{
+ $t = get_markup_template("admin.tpl", "addon/fromgplus/");
- $o = replace_macros($t, array(
- '$submit' => t('Save Settings'),
- '$key' => array('key', t('Key'), trim(get_config('fromgplus', 'key')), t('')),
- ));
+ $o = replace_macros($t, [
+ '$submit' => L10n::t('Save Settings'),
+ '$key' => ['key', L10n::t('Key'), trim(Config::get('fromgplus', 'key')), L10n::t('')],
+ ]);
}
-function fromgplus_plugin_admin_post(&$a){
- $key = ((x($_POST,'key')) ? trim($_POST['key']) : '');
- set_config('fromgplus','key',$key);
- info( t('Settings updated.'). EOL );
+function fromgplus_addon_admin_post(&$a)
+{
+ $key = ((x($_POST, 'key')) ? trim($_POST['key']) : '');
+ Config::set('fromgplus', 'key', $key);
+ info(L10n::t('Settings updated.'). EOL);
}
function fromgplus_cron($a,$b) {
}
function fromgplus_handleattachments($a, $uid, $item, $displaytext, $shared) {
- require_once("include/Photo.php");
- require_once("include/items.php");
- require_once("include/network.php");
+ require_once 'include/items.php';
$post = "";
$quote = "";
switch($attachment->objectType) {
case "video":
$pagedata["type"] = "video";
- $pagedata["url"] = original_url($attachment->url);
+ $pagedata["url"] = Network::finalUrl($attachment->url);
$pagedata["title"] = fromgplus_html2bbcode($attachment->displayName);
break;
case "article":
$pagedata["type"] = "link";
- $pagedata["url"] = original_url($attachment->url);
+ $pagedata["url"] = Network::finalUrl($attachment->url);
$pagedata["title"] = fromgplus_html2bbcode($attachment->displayName);
$images = fromgplus_cleanupgoogleproxy($attachment->fullImage, $attachment->image);
break;
case "photo-album":
- $pagedata["url"] = original_url($attachment->url);
+ $pagedata["url"] = Network::finalUrl($attachment->url);
$pagedata["title"] = fromgplus_html2bbcode($attachment->displayName);
$post .= "\n\n[bookmark=".$pagedata["url"]."]".$pagedata["title"]."[/bookmark]\n";
case "album":
$pagedata["type"] = "link";
- $pagedata["url"] = original_url($attachment->url);
+ $pagedata["url"] = Network::finalUrl($attachment->url);
$pagedata["title"] = fromgplus_html2bbcode($attachment->displayName);
$thumb = $attachment->thumbnails[0];
break;
case "audio":
- $pagedata["url"] = original_url($attachment->url);
+ $pagedata["url"] = Network::finalUrl($attachment->url);
$pagedata["title"] = fromgplus_html2bbcode($attachment->displayName);
$post .= "\n\n[bookmark=".$pagedata["url"]."]".$pagedata["title"]."[/bookmark]\n";
break;
$account = get_pconfig($uid,'fromgplus','account');
$key = get_config('fromgplus','key');
- $result = fetch_url("https://www.googleapis.com/plus/v1/people/".$account."/activities/public?alt=json&pp=1&key=".$key."&maxResults=".$maxfetch);
+ $result = Network::fetchUrl("https://www.googleapis.com/plus/v1/people/".$account."/activities/public?alt=json&pp=1&key=".$key."&maxResults=".$maxfetch);
//$result = file_get_contents("google.txt");
//file_put_contents("google.txt", $result);
if (function_exists("share_header"))
$post .= share_header($item->object->actor->displayName, $item->object->actor->url,
$item->object->actor->image->url, "",
- datetime_convert('UTC','UTC',$item->object->published),$item->object->url);
+ DateTimeFormat::utc($item->object->published),$item->object->url);
else
$post .= "[share author='".str_replace("'", "'",$item->object->actor->displayName).
"' profile='".$item->object->actor->url.
"' avatar='".$item->object->actor->image->url.
- "' posted='".datetime_convert('UTC','UTC',$item->object->published).
+ "' posted='".DateTimeFormat::utc($item->object->published).
"' link='".$item->object->url."']";
$post .= fromgplus_html2bbcode($item->object->content);
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-12 16:52+0000\n"
-"PO-Revision-Date: 2017-01-18 10:38+0000\n"
+"PO-Revision-Date: 2017-09-20 06:07+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
* Version: 0.1
* Author: Michael Vogel <https://pirati.ca/profile/heluecht>
*/
-
-function geocoordinates_install() {
- register_hook('post_local', 'addon/geocoordinates/geocoordinates.php', 'geocoordinates_post_hook');
- register_hook('post_remote', 'addon/geocoordinates/geocoordinates.php', 'geocoordinates_post_hook');
+use Friendica\Core\Addon;
+use Friendica\Core\Cache;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Util\Network;
+
+function geocoordinates_install()
+{
+ Addon::registerHook('post_local', 'addon/geocoordinates/geocoordinates.php', 'geocoordinates_post_hook');
+ Addon::registerHook('post_remote', 'addon/geocoordinates/geocoordinates.php', 'geocoordinates_post_hook');
}
-function geocoordinates_uninstall() {
- unregister_hook('post_local', 'addon/geocoordinates/geocoordinates.php', 'geocoordinates_post_hook');
- unregister_hook('post_remote', 'addon/geocoordinates/geocoordinates.php', 'geocoordinates_post_hook');
+function geocoordinates_uninstall()
+{
+ Addon::unregisterHook('post_local', 'addon/geocoordinates/geocoordinates.php', 'geocoordinates_post_hook');
+ Addon::unregisterHook('post_remote', 'addon/geocoordinates/geocoordinates.php', 'geocoordinates_post_hook');
}
function geocoordinates_resolve_item(&$item) {
return;
}
- $s = fetch_url("https://api.opencagedata.com/geocode/v1/json?q=".$coords[0].",".$coords[1]."&key=".$key."&language=".$language);
+ $s = Network::fetchUrl("https://api.opencagedata.com/geocode/v1/json?q=".$coords[0].",".$coords[1]."&key=".$key."&language=".$language);
if (!$s) {
logger("API could not be queried", LOGGER_DEBUG);
geocoordinates_resolve_item($item);
}
-function geocoordinates_plugin_admin(&$a,&$o) {
+function geocoordinates_addon_admin(&$a, &$o)
+{
$t = get_markup_template("admin.tpl", "addon/geocoordinates/");
- $o = replace_macros($t, array(
- '$submit' => t('Save Settings'),
- '$api_key' => array('api_key', t('API Key'), get_config('geocoordinates', 'api_key' ), ''),
- '$language' => array('language', t('Language code (IETF format)'), get_config('geocoordinates', 'language' ), ''),
- ));
+ $o = replace_macros($t, [
+ '$submit' => L10n::t('Save Settings'),
+ '$api_key' => ['api_key', L10n::t('API Key'), Config::get('geocoordinates', 'api_key'), ''],
+ '$language' => ['language', L10n::t('Language code (IETF format)'), Config::get('geocoordinates', 'language'), ''],
+ ]);
}
-function geocoordinates_plugin_admin_post(&$a) {
- $api_key = ((x($_POST,'api_key')) ? notags(trim($_POST['api_key'])) : '');
- set_config('geocoordinates','api_key',$api_key);
+function geocoordinates_addon_admin_post(&$a)
+{
+ $api_key = ((x($_POST, 'api_key')) ? notags(trim($_POST['api_key'])) : '');
+ Config::set('geocoordinates', 'api_key', $api_key);
- $language = ((x($_POST,'language')) ? notags(trim($_POST['language'])) : '');
- set_config('geocoordinates','language',$language);
- info(t('Settings updated.'). EOL);
+ $language = ((x($_POST, 'language')) ? notags(trim($_POST['language'])) : '');
+ Config::set('geocoordinates', 'language', $language);
+ info(L10n::t('Settings updated.'). EOL);
}
* $a->config['geonames']['username'] = 'your_username';
* Also visit http://geonames.org/manageaccount and enable access to the free web services
*
- * When plugin is installed, the system calls the plugin
+ * When addon is installed, the system calls the addon
* name_install() function, located in 'addon/name/name.php',
* where 'name' is the name of the addon.
* If the addon is removed from the configuration list, the
* system will call the name_uninstall() function.
*
*/
-
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Util\Network;
+use Friendica\Util\XML;
function geonames_install() {
/**
*
- * Our plugin will attach in three places.
+ * Our addon will attach in three places.
* The first is just prior to storing a local post.
*
*/
- register_hook('post_local', 'addon/geonames/geonames.php', 'geonames_post_hook');
+ Addon::registerHook('post_local', 'addon/geonames/geonames.php', 'geonames_post_hook');
/**
*
- * Then we'll attach into the plugin settings page, and also the
+ * Then we'll attach into the addon settings page, and also the
* settings post hook so that we can create and update
* user preferences.
*
*/
- register_hook('plugin_settings', 'addon/geonames/geonames.php', 'geonames_plugin_admin');
- register_hook('plugin_settings_post', 'addon/geonames/geonames.php', 'geonames_plugin_admin_post');
+ Addon::registerHook('addon_settings', 'addon/geonames/geonames.php', 'geonames_addon_admin');
+ Addon::registerHook('addon_settings_post', 'addon/geonames/geonames.php', 'geonames_addon_admin_post');
logger("installed geonames");
}
*
*/
- unregister_hook('post_local', 'addon/geonames/geonames.php', 'geonames_post_hook');
- unregister_hook('plugin_settings', 'addon/geonames/geonames.php', 'geonames_plugin_admin');
- unregister_hook('plugin_settings_post', 'addon/geonames/geonames.php', 'geonames_plugin_admin_post');
+ Addon::unregisterHook('post_local', 'addon/geonames/geonames.php', 'geonames_post_hook');
+ Addon::unregisterHook('addon_settings', 'addon/geonames/geonames.php', 'geonames_addon_admin');
+ Addon::unregisterHook('addon_settings_post', 'addon/geonames/geonames.php', 'geonames_addon_admin_post');
logger("removed geonames");
* An item was posted on the local system.
* We are going to look for specific items:
* - A status post by a profile owner
- * - The profile owner must have allowed our plugin
+ * - The profile owner must have allowed our addon
*
*/
*
*/
- $s = fetch_url('http://api.geonames.org/findNearbyPlaceName?lat=' . $coords[0] . '&lng=' . $coords[1] . '&username=' . $geo_account);
+ $s = Network::fetchUrl('http://api.geonames.org/findNearbyPlaceName?lat=' . $coords[0] . '&lng=' . $coords[1] . '&username=' . $geo_account);
if(! $s)
return;
- $xml = parse_xml_string($s);
+ $xml = XML::parseString($s);
if($xml->geoname->name && $xml->geoname->countryName)
$item['location'] = $xml->geoname->name . ', ' . $xml->geoname->countryName;
*
*/
-function geonames_plugin_admin_post($a,$post) {
+function geonames_addon_admin_post($a,$post) {
if(! local_user() || (! x($_POST,'geonames-submit')))
return;
set_pconfig(local_user(),'geonames','enable',intval($_POST['geonames']));
- info( t('Geonames settings updated.') . EOL);
+ info(L10n::t('Geonames settings updated.') . EOL);
}
/**
*
- * Called from the Plugin Setting form.
+ * Called from the Addon Setting form.
* Add our own settings info to the page.
*
*/
-function geonames_plugin_admin(&$a,&$s) {
+function geonames_addon_admin(&$a,&$s) {
if(! local_user())
return;
/* Add some HTML to the existing form */
$s .= '<div class="settings-block">';
- $s .= '<h3>' . t('Geonames Settings') . '</h3>';
+ $s .= '<h3>' . L10n::t('Geonames Settings') . '</h3>';
$s .= '<div id="geonames-enable-wrapper">';
- $s .= '<label id="geonames-enable-label" for="geonames-checkbox">' . t('Enable Geonames Plugin') . '</label>';
+ $s .= '<label id="geonames-enable-label" for="geonames-checkbox">' . L10n::t('Enable Geonames Addon') . '</label>';
$s .= '<input id="geonames-checkbox" type="checkbox" name="geonames" value="1" ' . $checked . '/>';
$s .= '</div><div class="clear"></div>';
/* provide a submit button */
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="geonames-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="geonames-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
msgstr ""
#: geonames.php:181
-msgid "Enable Geonames Plugin"
+msgid "Enable Geonames Addon"
msgstr ""
#: geonames.php:187
\r
$a->strings["Geonames settings updated."] = "Actualitzada la configuració de Geonames.";\r
$a->strings["Geonames Settings"] = "Configuració de Geonames";\r
-$a->strings["Enable Geonames Plugin"] = "Habilitar Plugin de Geonames";\r
+$a->strings["Enable Geonames Addon"] = "Habilitar Addon de Geonames";\r
$a->strings["Submit"] = "Enviar";\r
msgstr "Nastavení Geonames"
#: geonames.php:181
-msgid "Enable Geonames Plugin"
+msgid "Enable Geonames Addon"
msgstr "Povolit Geonames rozšíření"
#: geonames.php:187
;
$a->strings["Geonames settings updated."] = "Geonames nastavení aktualizováno.";
$a->strings["Geonames Settings"] = "Nastavení Geonames";
-$a->strings["Enable Geonames Plugin"] = "Povolit Geonames rozšíření";
+$a->strings["Enable Geonames Addon"] = "Povolit Geonames rozšíření";
$a->strings["Submit"] = "Odeslat";
msgstr "Geonames Einstellungen"
#: geonames.php:181
-msgid "Enable Geonames Plugin"
-msgstr "Geonames Plugin aktivieren"
+msgid "Enable Geonames Addon"
+msgstr "Geonames Addon aktivieren"
#: geonames.php:187
msgid "Submit"
;
$a->strings["Geonames settings updated."] = "Geonames Einstellungen aktualisiert";
$a->strings["Geonames Settings"] = "Geonames Einstellungen";
-$a->strings["Enable Geonames Plugin"] = "Geonames Plugin aktivieren";
+$a->strings["Enable Geonames Addon"] = "Geonames Addon aktivieren";
$a->strings["Submit"] = "Senden";
\r
$a->strings["Geonames settings updated."] = "Ĝidatigis la Geonames agordojn.";\r
$a->strings["Geonames Settings"] = "Geonames Agordoj";\r
-$a->strings["Enable Geonames Plugin"] = "Ŝalti la Geonames Kromprogramon";\r
+$a->strings["Enable Geonames Addon"] = "Ŝalti la Geonames Kromprogramon";\r
$a->strings["Submit"] = "Sendi";\r
msgstr "Ajustes de Geonombres"
#: geonames.php:181
-msgid "Enable Geonames Plugin"
-msgstr "Habilitar Plugin de Geonombres"
+msgid "Enable Geonames Addon"
+msgstr "Habilitar Addon de Geonombres"
#: geonames.php:187
msgid "Submit"
;
$a->strings["Geonames settings updated."] = "Ajustes de geonombres actualizados.";
$a->strings["Geonames Settings"] = "Ajustes de Geonombres";
-$a->strings["Enable Geonames Plugin"] = "Habilitar Plugin de Geonombres";
+$a->strings["Enable Geonames Addon"] = "Habilitar Addon de Geonombres";
$a->strings["Submit"] = "Enviar";
\r
$a->strings["Geonames settings updated."] = "Réglages Geonames sauvés.";\r
$a->strings["Geonames Settings"] = "Réglages Geonames";\r
-$a->strings["Enable Geonames Plugin"] = "Activer Geonames";\r
+$a->strings["Enable Geonames Addon"] = "Activer Geonames";\r
$a->strings["Submit"] = "Envoyer";\r
\r
$a->strings["Geonames settings updated."] = "";\r
$a->strings["Geonames Settings"] = "";\r
-$a->strings["Enable Geonames Plugin"] = "";\r
+$a->strings["Enable Geonames Addon"] = "";\r
$a->strings["Submit"] = "Senda inn";\r
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:12+0000\n"
+"PO-Revision-Date: 2018-03-19 13:22+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
msgstr "Impostazioni Geonames"
#: geonames.php:181
-msgid "Enable Geonames Plugin"
-msgstr "Abilita plugin Geonames"
+msgid "Enable Geonames Addon"
+msgstr "Abilita componente aggiuntivo Geonames"
#: geonames.php:187
msgid "Submit"
;
$a->strings["Geonames settings updated."] = "Impostazioni di Geonames aggiornate.";
$a->strings["Geonames Settings"] = "Impostazioni Geonames";
-$a->strings["Enable Geonames Plugin"] = "Abilita plugin Geonames";
+$a->strings["Enable Geonames Addon"] = "Abilita componente aggiuntivo Geonames";
$a->strings["Submit"] = "Invia";
\r
$a->strings["Geonames settings updated."] = "";\r
$a->strings["Geonames Settings"] = "";\r
-$a->strings["Enable Geonames Plugin"] = "";\r
+$a->strings["Enable Geonames Addon"] = "";\r
$a->strings["Submit"] = "Lagre";\r
\r
$a->strings["Geonames settings updated."] = "";\r
$a->strings["Geonames Settings"] = "ustawienia Geonames";\r
-$a->strings["Enable Geonames Plugin"] = "";\r
+$a->strings["Enable Geonames Addon"] = "";\r
$a->strings["Submit"] = "Potwierdź";\r
\r
$a->strings["Geonames settings updated."] = "Configurações Geonames atualizadas.";\r
$a->strings["Geonames Settings"] = "Configurações Geonames";\r
-$a->strings["Enable Geonames Plugin"] = "Plugin Geonames Habilitado";\r
+$a->strings["Enable Geonames Addon"] = "Addon Geonames Habilitado";\r
$a->strings["Submit"] = "Enviar";\r
msgstr "Configurări Geonume"
#: geonames.php:181
-msgid "Enable Geonames Plugin"
+msgid "Enable Geonames Addon"
msgstr "Permite Modul Geonume"
#: geonames.php:187
;
$a->strings["Geonames settings updated."] = "Configurări Geonume actualizate.";
$a->strings["Geonames Settings"] = "Configurări Geonume";
-$a->strings["Enable Geonames Plugin"] = "Permite Modul Geonume";
+$a->strings["Enable Geonames Addon"] = "Permite Modul Geonume";
$a->strings["Submit"] = "Trimite";
msgstr "Настройки Geonames"
#: geonames.php:181
-msgid "Enable Geonames Plugin"
+msgid "Enable Geonames Addon"
msgstr "Включить плагин Geonames"
#: geonames.php:187
;
$a->strings["Geonames settings updated."] = "Настройки Geonames обновлены.";
$a->strings["Geonames Settings"] = "Настройки Geonames";
-$a->strings["Enable Geonames Plugin"] = "Включить плагин Geonames";
+$a->strings["Enable Geonames Addon"] = "Включить плагин Geonames";
$a->strings["Submit"] = "Добавить";
\r
$a->strings["Geonames settings updated."] = "Geonames设置更新了。";\r
$a->strings["Geonames Settings"] = "Geonames设置";\r
-$a->strings["Enable Geonames Plugin"] = "使Geonames插件能用";\r
+$a->strings["Enable Geonames Addon"] = "使Geonames插件能用";\r
$a->strings["Submit"] = "提交";\r
*
*
*/
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
function gnot_install() {
- register_hook('plugin_settings', 'addon/gnot/gnot.php', 'gnot_settings');
- register_hook('plugin_settings_post', 'addon/gnot/gnot.php', 'gnot_settings_post');
- register_hook('enotify_mail', 'addon/gnot/gnot.php', 'gnot_enotify_mail');
+ Addon::registerHook('addon_settings', 'addon/gnot/gnot.php', 'gnot_settings');
+ Addon::registerHook('addon_settings_post', 'addon/gnot/gnot.php', 'gnot_settings_post');
+ Addon::registerHook('enotify_mail', 'addon/gnot/gnot.php', 'gnot_enotify_mail');
logger("installed gnot");
}
function gnot_uninstall() {
- unregister_hook('plugin_settings', 'addon/gnot/gnot.php', 'gnot_settings');
- unregister_hook('plugin_settings_post', 'addon/gnot/gnot.php', 'gnot_settings_post');
- unregister_hook('enotify_mail', 'addon/gnot/gnot.php', 'gnot_enotify_mail');
+ Addon::unregisterHook('addon_settings', 'addon/gnot/gnot.php', 'gnot_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/gnot/gnot.php', 'gnot_settings_post');
+ Addon::unregisterHook('enotify_mail', 'addon/gnot/gnot.php', 'gnot_enotify_mail');
logger("removed gnot");
if(! local_user() || (! x($_POST,'gnot-submit')))
return;
- set_pconfig(local_user(),'gnot','enable',intval($_POST['gnot']));
- info( t('Gnot settings updated.') . EOL);
+ PConfig::set(local_user(),'gnot','enable',intval($_POST['gnot']));
+ info(L10n::t('Gnot settings updated.') . EOL);
}
/**
*
- * Called from the Plugin Setting form.
+ * Called from the Addon Setting form.
* Add our own settings info to the page.
*
*/
/* Add some HTML to the existing form */
$s .= '<div class="settings-block">';
- $s .= '<h3>' . t('Gnot Settings') . '</h3>';
+ $s .= '<h3>' . L10n::t('Gnot Settings') . '</h3>';
$s .= '<div id="gnot-wrapper">';
- $s .= '<div id="gnot-desc">' . t("Allows threading of email comment notifications on Gmail and anonymising the subject line.") . '</div>';
- $s .= '<label id="gnot-label" for="gnot">' . t('Enable this plugin/addon?') . '</label>';
+ $s .= '<div id="gnot-desc">' . L10n::t("Allows threading of email comment notifications on Gmail and anonymising the subject line.") . '</div>';
+ $s .= '<label id="gnot-label" for="gnot">' . L10n::t('Enable this addon?') . '</label>';
$s .= '<input id="gnot-input" type="checkbox" name="gnot" value="1"'. $gnot_checked . '/>';
$s .= '</div><div class="clear"></div>';
/* provide a submit button */
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="gnot-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="gnot-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
if((! $b['uid']) || (! intval(get_pconfig($b['uid'], 'gnot','enable'))))
return;
if($b['type'] == NOTIFY_COMMENT)
- $b['subject'] = sprintf( t('[Friendica:Notify] Comment to conversation #%d'), $b['parent']);
+ $b['subject'] = L10n::t('[Friendica:Notify] Comment to conversation #%d', $b['parent']);
}
-
msgstr ""
#: gnot.php:82
-msgid "Enable this plugin/addon?"
+msgid "Enable this addon?"
msgstr ""
#: gnot.php:88
$a->strings["Gnot settings updated."] = "Configuració de Gnot actualitzada";\r
$a->strings["Gnot Settings"] = "Configuració de Gnot";\r
$a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Permet crear fils de les notificacions de comentaris de correu electrònic a Gmail i anonimat de la línia d'assumpte.";\r
-$a->strings["Enable this plugin/addon?"] = "Activar aquest plugin/aplicació?";\r
+$a->strings["Enable this addon?"] = "Activar aquest addon/aplicació?";\r
$a->strings["Submit"] = "Enviar";\r
$a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica: Notifica] Conversació comentada #%d";\r
msgstr "Umožnit řetězení emailových komentářových notifikací na Gmailu a anonymizací řádky předmětu."
#: gnot.php:82
-msgid "Enable this plugin/addon?"
-msgstr "Povolit tento plugin/rozšíření?"
+msgid "Enable this addon?"
+msgstr "Povolit tento addon/rozšíření?"
#: gnot.php:88
msgid "Submit"
$a->strings["Gnot settings updated."] = "Nastavení Gnot aktualizováno.";
$a->strings["Gnot Settings"] = "Nastavení Gnot";
$a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Umožnit řetězení emailových komentářových notifikací na Gmailu a anonymizací řádky předmětu.";
-$a->strings["Enable this plugin/addon?"] = "Povolit tento plugin/rozšíření?";
+$a->strings["Enable this addon?"] = "Povolit tento addon/rozšíření?";
$a->strings["Submit"] = "Odeslat";
$a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica:Upozornění] Komentář ke konverzaci #%d";
msgstr "Erlaubt das Veröffentlichen von E-Mail Kommentar Benachrichtigungen bei Gmail mit anonymisiertem Betreff"
#: gnot.php:82
-msgid "Enable this plugin/addon?"
-msgstr "Dieses Plugin/Addon aktivieren?"
+msgid "Enable this addon?"
+msgstr "Dieses Addon aktivieren?"
#: gnot.php:88
msgid "Submit"
$a->strings["Gnot settings updated."] = "Gnot Einstellungen aktualisiert.";
$a->strings["Gnot Settings"] = "Gnot Einstellungen";
$a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Erlaubt das Veröffentlichen von E-Mail Kommentar Benachrichtigungen bei Gmail mit anonymisiertem Betreff";
-$a->strings["Enable this plugin/addon?"] = "Dieses Plugin/Addon aktivieren?";
+$a->strings["Enable this addon?"] = "Dieses Addon aktivieren?";
$a->strings["Submit"] = "Senden";
$a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica-Benachrichtigung] Kommentar zum Beitrag #%d";
$a->strings["Gnot settings updated."] = "Ĝisdatigis Gnot agordojn.";\r
$a->strings["Gnot Settings"] = "Agordoj por Gnot";\r
$a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Permesas la ĉenadon de retpoŝtaj atentigoj pri komentoj ĉe Gmail kan anonimigado de la temlinio.";\r
-$a->strings["Enable this plugin/addon?"] = "Ŝalti tiun kromprogramon?";\r
+$a->strings["Enable this addon?"] = "Ŝalti tiun kromprogramon?";\r
$a->strings["Submit"] = "Sendi";\r
$a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica:Atentigo] Komento pri konversacio #%d";\r
msgstr "Permite limpiar las notificaciones de comentario de email en Gmail y anonimizar la línea del tema."
#: gnot.php:82
-msgid "Enable this plugin/addon?"
-msgstr "¿Habilitar este plugin/addon?"
+msgid "Enable this addon?"
+msgstr "¿Habilitar este addon?"
#: gnot.php:88
msgid "Submit"
$a->strings["Gnot settings updated."] = "Ajustes de Gnot actualizados.";
$a->strings["Gnot Settings"] = "Ajustes de Gnot";
$a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Permite limpiar las notificaciones de comentario de email en Gmail y anonimizar la línea del tema.";
-$a->strings["Enable this plugin/addon?"] = "¿Habilitar este plugin/addon?";
+$a->strings["Enable this addon?"] = "¿Habilitar este addon?";
$a->strings["Submit"] = "Enviar";
$a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica:Notify] Comentar en conversación #%d";
$a->strings["Gnot settings updated."] = "Réglages Gnot sauvés.";\r
$a->strings["Gnot Settings"] = "Réglages Gnot";\r
$a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Autorise l'arborescence des notifications de commentaires sur GMail, et rend la ligne 'Sujet' anonyme.";\r
-$a->strings["Enable this plugin/addon?"] = "Activer cette extension?";\r
+$a->strings["Enable this addon?"] = "Activer cette extension?";\r
$a->strings["Submit"] = "Envoyer";\r
$a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica:Notification] Commentaire sur la conversation #%d";\r
$a->strings["Gnot settings updated."] = "";\r
$a->strings["Gnot Settings"] = "";\r
$a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "";\r
-$a->strings["Enable this plugin/addon?"] = "";\r
+$a->strings["Enable this addon?"] = "";\r
$a->strings["Submit"] = "Senda inn";\r
$a->strings["[Friendica:Notify] Comment to conversation #%d"] = "";\r
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:12+0000\n"
+"PO-Revision-Date: 2018-03-19 13:22+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
msgstr "Permetti di raggruppare le notifiche dei commenti in thread su Gmail e anonimizza l'oggetto"
#: gnot.php:82
-msgid "Enable this plugin/addon?"
-msgstr "Abilita questo plugin?"
+msgid "Enable this addon?"
+msgstr "Abilita questo componente aggiuntivo?"
#: gnot.php:88
msgid "Submit"
$a->strings["Gnot settings updated."] = "Impostazioni di \"Gnot\" aggiornate.";
$a->strings["Gnot Settings"] = "Impostazioni Gnot";
$a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Permetti di raggruppare le notifiche dei commenti in thread su Gmail e anonimizza l'oggetto";
-$a->strings["Enable this plugin/addon?"] = "Abilita questo plugin?";
+$a->strings["Enable this addon?"] = "Abilita questo componente aggiuntivo?";
$a->strings["Submit"] = "Invia";
$a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica:Notifica] Commento alla conversazione n° %d";
$a->strings["Gnot settings updated."] = "";\r
$a->strings["Gnot Settings"] = "";\r
$a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "";\r
-$a->strings["Enable this plugin/addon?"] = "";\r
+$a->strings["Enable this addon?"] = "";\r
$a->strings["Submit"] = "Lagre";\r
$a->strings["[Friendica:Notify] Comment to conversation #%d"] = "";\r
$a->strings["Gnot settings updated."] = "";\r
$a->strings["Gnot Settings"] = "";\r
$a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "";\r
-$a->strings["Enable this plugin/addon?"] = "Umożliwić tego plugina/wtyczkę?";\r
+$a->strings["Enable this addon?"] = "Umożliwić tego addona/wtyczkę?";\r
$a->strings["Submit"] = "Potwierdź";\r
$a->strings["[Friendica:Notify] Comment to conversation #%d"] = "";\r
$a->strings["Gnot settings updated."] = "As configurações do Gnot foram atualizadas.";\r
$a->strings["Gnot Settings"] = "Configurações do Gnot";\r
$a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Permite o encadeamento das notificações por e-mail de comentário no GMail, tornando a a linha de assunto anônima.";\r
-$a->strings["Enable this plugin/addon?"] = "Habilitar este plugin/complemento?";\r
+$a->strings["Enable this addon?"] = "Habilitar este addon/complemento?";\r
$a->strings["Submit"] = "Enviar";\r
$a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica:Notify] Comentário na conversa #%d";\r
msgstr "Permite înlănțuirea notificărilor prin email a comentariilor, în Gmail și anonimizarea subiectului."
#: gnot.php:82
-msgid "Enable this plugin/addon?"
+msgid "Enable this addon?"
msgstr "Activați acest modul/supliment?"
#: gnot.php:88
$a->strings["Gnot settings updated."] = "Configurările Gnot au fost actualizate.";
$a->strings["Gnot Settings"] = "Configurări Gnot";
$a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Permite înlănțuirea notificărilor prin email a comentariilor, în Gmail și anonimizarea subiectului.";
-$a->strings["Enable this plugin/addon?"] = "Activați acest modul/supliment?";
+$a->strings["Enable this addon?"] = "Activați acest modul/supliment?";
$a->strings["Submit"] = "Trimite";
$a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica:Notificare] Comentariu la conversația # %d";
msgstr "Разрешить нитевание уведомлений о комментариях на Gmail и анонимизировать поле \"Тема\"."
#: gnot.php:82
-msgid "Enable this plugin/addon?"
+msgid "Enable this addon?"
msgstr "Включить этот плагин/аддон?"
#: gnot.php:88
$a->strings["Gnot settings updated."] = "Настройки Gnot обновлены.";
$a->strings["Gnot Settings"] = "Настройки Gnot";
$a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Разрешить нитевание уведомлений о комментариях на Gmail и анонимизировать поле \"Тема\".";
-$a->strings["Enable this plugin/addon?"] = "Включить этот плагин/аддон?";
+$a->strings["Enable this addon?"] = "Включить этот плагин/аддон?";
$a->strings["Submit"] = "Добавить";
$a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica:Notify] Комментарий в теме #%d";
$a->strings["Gnot settings updated."] = "Gnot设置更新了。";\r
$a->strings["Gnot Settings"] = "Gnot设置";\r
$a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "允许邮件评论通知在Gmail和匿名话题行。";\r
-$a->strings["Enable this plugin/addon?"] = "使这个插件/加件可用?";\r
+$a->strings["Enable this addon?"] = "使这个插件/加件可用?";\r
$a->strings["Submit"] = "提交";\r
$a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica:Notify]评论在交流#%d";\r
* Author: Michael Vogel <https://pirati.ca/profile/heluecht>
*
*/
+use Friendica\Core\Addon;
+use Friendica\Core\Cache;
-require_once('include/cache.php');
-
-
-function googlemaps_install() {
- register_hook('render_location', 'addon/googlemaps/googlemaps.php', 'googlemaps_location');
+function googlemaps_install()
+{
+ Addon::registerHook('render_location', 'addon/googlemaps/googlemaps.php', 'googlemaps_location');
logger("installed googlemaps");
}
-function googlemaps_uninstall() {
- unregister_hook('render_location', 'addon/googlemaps/googlemaps.php', 'googlemaps_location');
+function googlemaps_uninstall()
+{
+ Addon::unregisterHook('render_location', 'addon/googlemaps/googlemaps.php', 'googlemaps_location');
logger("removed googlemaps");
}
-# Gravatar Plugin
+# Gravatar Addon
by [Klaus Weidenbach](http://friendica.dszdw.net/profile/klaus)
This addon allows you to look up an avatar image for new users and contacts at [Gravatar](http://www.gravatar.com). This will be used if there have not been found any other avatar images yet for example through OpenID.
<?php
/**
* Name: Gravatar Support
- * Description: If there is no avatar image for a new user or contact this plugin will look for one at Gravatar.
+ * Description: If there is no avatar image for a new user or contact this addon will look for one at Gravatar.
* Version: 1.1
* Author: Klaus Weidenbach <http://friendica.dszdw.net/profile/klaus>
*/
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
/**
- * Installs the plugin hook
+ * Installs the addon hook
*/
function gravatar_install() {
- register_hook('avatar_lookup', 'addon/gravatar/gravatar.php', 'gravatar_lookup');
+ Addon::registerHook('avatar_lookup', 'addon/gravatar/gravatar.php', 'gravatar_lookup');
logger("registered gravatar in avatar_lookup hook");
}
/**
- * Removes the plugin hook
+ * Removes the addon hook
*/
function gravatar_uninstall() {
- unregister_hook('avatar_lookup', 'addon/gravatar/gravatar.php', 'gravatar_lookup');
+ Addon::unregisterHook('avatar_lookup', 'addon/gravatar/gravatar.php', 'gravatar_lookup');
logger("unregistered gravatar in avatar_lookup hook");
}
/**
* Display admin settings for this addon
*/
-function gravatar_plugin_admin (&$a, &$o) {
+function gravatar_addon_admin (&$a, &$o) {
$t = get_markup_template( "admin.tpl", "addon/gravatar/" );
$default_avatar = get_config('gravatar', 'default_img');
$rating = 'g'; // suitable for display on all websites with any audience type
// Available options for the select boxes
- $default_avatars = array(
- 'mm' => t('generic profile image'),
- 'identicon' => t('random geometric pattern'),
- 'monsterid' => t('monster face'),
- 'wavatar' => t('computer generated face'),
- 'retro' => t('retro arcade style face'),
- );
- $ratings = array(
+ $default_avatars = [
+ 'mm' => L10n::t('generic profile image'),
+ 'identicon' => L10n::t('random geometric pattern'),
+ 'monsterid' => L10n::t('monster face'),
+ 'wavatar' => L10n::t('computer generated face'),
+ 'retro' => L10n::t('retro arcade style face'),
+ ];
+ $ratings = [
'g' => 'g',
'pg' => 'pg',
'r' => 'r',
dbesc('libravatar')
);
if (count($r)) {
- $o = '<h5>' .t('Information') .'</h5><p>' .t('Libravatar addon is installed, too. Please disable Libravatar addon or this Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if nothing was found at Libravatar.') .'</p><br><br>';
+ $o = '<h5>' .L10n::t('Information') .'</h5><p>' .L10n::t('Libravatar addon is installed, too. Please disable Libravatar addon or this Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if nothing was found at Libravatar.') .'</p><br><br>';
}
// output Gravatar settings
$o .= '<input type="hidden" name="form_security_token" value="' .get_form_security_token("gravatarsave") .'">';
- $o .= replace_macros( $t, array(
- '$submit' => t('Save Settings'),
- '$default_avatar' => array('avatar', t('Default avatar image'), $default_avatar, t('Select default avatar image if none was found at Gravatar. See README'), $default_avatars),
- '$rating' => array('rating', t('Rating of images'), $rating, t('Select the appropriate avatar rating for your site. See README'), $ratings),
- ));
+ $o .= replace_macros( $t, [
+ '$submit' => L10n::t('Save Settings'),
+ '$default_avatar' => ['avatar', L10n::t('Default avatar image'), $default_avatar, L10n::t('Select default avatar image if none was found at Gravatar. See README'), $default_avatars],
+ '$rating' => ['rating', L10n::t('Rating of images'), $rating, L10n::t('Select the appropriate avatar rating for your site. See README'), $ratings],
+ ]);
}
/**
* Save admin settings
*/
-function gravatar_plugin_admin_post (&$a) {
+function gravatar_addon_admin_post (&$a) {
check_form_security_token('gravatarsave');
$default_avatar = ((x($_POST, 'avatar')) ? notags(trim($_POST['avatar'])) : 'identicon');
$rating = ((x($_POST, 'rating')) ? notags(trim($_POST['rating'])) : 'g');
- set_config('gravatar', 'default_img', $default_avatar);
- set_config('gravatar', 'rating', $rating);
- info( t('Gravatar settings updated.') .EOL);
+ Config::set('gravatar', 'default_img', $default_avatar);
+ Config::set('gravatar', 'rating', $rating);
+ info(L10n::t('Gravatar settings updated.') .EOL);
}
-?>
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:12+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
* Description: Disable images in group edit menu
* Version: 1.0
* Author: Thomas Willingham <https://kakste.com/profile/beardyunixer>
- *
- *
*/
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
function group_text_install() {
- register_hook('plugin_settings', 'addon/group_text/group_text.php', 'group_text_settings');
- register_hook('plugin_settings_post', 'addon/group_text/group_text.php', 'group_text_settings_post');
+ Addon::registerHook('addon_settings', 'addon/group_text/group_text.php', 'group_text_settings');
+ Addon::registerHook('addon_settings_post', 'addon/group_text/group_text.php', 'group_text_settings_post');
logger("installed group_text");
}
function group_text_uninstall() {
- unregister_hook('plugin_settings', 'addon/group_text/group_text.php', 'group_text_settings');
- unregister_hook('plugin_settings_post', 'addon/group_text/group_text.php', 'group_text_settings_post');
+ Addon::unregisterHook('addon_settings', 'addon/group_text/group_text.php', 'group_text_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/group_text/group_text.php', 'group_text_settings_post');
logger("removed group_text");
return;
set_pconfig(local_user(),'system','groupedit_image_limit',intval($_POST['group_text']));
- info( t('Group Text settings updated.') . EOL);
+ info(L10n::t('Group Text settings updated.') . EOL);
}
/**
*
- * Called from the Plugin Setting form.
+ * Called from the Addon Setting form.
* Add our own settings info to the page.
*
*/
/* Add some HTML to the existing form */
$s .= '<div class="settings-block">';
- $s .= '<h3>' . t('Group Text') . '</h3>';
+ $s .= '<h3>' . L10n::t('Group Text') . '</h3>';
$s .= '<div id="group_text-enable-wrapper">';
- $s .= '<label id="group_text-enable-label" for="group_text-checkbox">' . t('Use a text only (non-image) group selector in the "group edit" menu') . '</label>';
+ $s .= '<label id="group_text-enable-label" for="group_text-checkbox">' . L10n::t('Use a text only (non-image) group selector in the "group edit" menu') . '</label>';
$s .= '<input id="group_text-checkbox" type="checkbox" name="group_text" value="1" ' . $checked . '/>';
$s .= '</div><div class="clear"></div>';
/* provide a submit button */
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="group_text-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="group_text-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:12+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
* Version: 0.1
* Author: Michael Vogel <https://pirati.ca/profile/heluecht>
*/
-
-require_once("mod/item.php");
-require_once("include/items.php");
-
-function ifttt_install() {
- register_hook('connector_settings', 'addon/ifttt/ifttt.php', 'ifttt_settings');
- register_hook('connector_settings_post','addon/ifttt/ifttt.php', 'ifttt_settings_post');
+require_once 'mod/item.php';
+require_once 'include/items.php';
+require_once 'include/text.php';
+
+use Friendica\App;
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Database\DBM;
+
+function ifttt_install()
+{
+ Addon::registerHook('connector_settings', 'addon/ifttt/ifttt.php', 'ifttt_settings');
+ Addon::registerHook('connector_settings_post', 'addon/ifttt/ifttt.php', 'ifttt_settings_post');
}
-function ifttt_uninstall() {
- unregister_hook('connector_settings', 'addon/ifttt/ifttt.php', 'ifttt_settings');
- unregister_hook('connector_settings_post', 'addon/ifttt/ifttt.php', 'ifttt_settings_post');
+function ifttt_uninstall()
+{
+ Addon::unregisterHook('connector_settings', 'addon/ifttt/ifttt.php', 'ifttt_settings');
+ Addon::unregisterHook('connector_settings_post', 'addon/ifttt/ifttt.php', 'ifttt_settings_post');
}
function ifttt_module() {
}
$s .= '<span id="settings_ifttt_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_ifttt_expanded\'); openClose(\'settings_ifttt_inflated\');">';
- $s .= '<img class="connector" src="addon/ifttt/ifttt.png" /><h3 class="connector">'. t('IFTTT Mirror').'</h3>';
- $s .= '</span>';
- $s .= '<div id="settings_ifttt_expanded" class="settings-block" style="display: none;">';
- $s .= '<span class="fakelink" onclick="openClose(\'settings_ifttt_expanded\'); openClose(\'settings_ifttt_inflated\');">';
- $s .= '<img class="connector" src="addon/ifttt/ifttt.png" /><h3 class="connector">'. t('IFTTT Mirror').'</h3>';
- $s .= '</span>';
-
- $s .= '<div id="ifttt-configuration-wrapper">';
- $s .= '<p>'.t("Create an account at <a href='http://www.ifttt.com'>IFTTT</a>. Create three Facebook recipes that are connected with <a href='https://ifttt.com/maker'>Maker</a> (In the form 'if Facebook then Maker') with the following parameters:").'</p>';
+ $s .= '<img class="connector" src="addon/ifttt/ifttt.png" /><h3 class="connector">' . L10n::t('IFTTT Mirror') . '</h3>';
+ $s .= '</span>';
+ $s .= '<div id="settings_ifttt_expanded" class="settings-block" style="display: none;">';
+ $s .= '<span class="fakelink" onclick="openClose(\'settings_ifttt_expanded\'); openClose(\'settings_ifttt_inflated\');">';
+ $s .= '<img class="connector" src="addon/ifttt/ifttt.png" /><h3 class="connector">' . L10n::t('IFTTT Mirror') . '</h3>';
+ $s .= '</span>';
+
+ $s .= '<div id="ifttt-configuration-wrapper">';
+ $s .= '<p>' . L10n::t('Create an account at <a href="http://www.ifttt.com">IFTTT</a>. Create three Facebook recipes that are connected with <a href="https://ifttt.com/maker">Maker</a> (In the form "if Facebook then Maker") with the following parameters:') . '</p>';
$s .= '<h4>URL</h4>';
$s .= '<p>' . $a->get_baseurl() . '/ifttt/' . $a->user['nickname'] . '</p>';
$s .= '<h4>Method</h4>';
$s .= '<p>POST</p>';
$s .= '<h4>Content Type</h4>';
$s .= '<p>application/x-www-form-urlencoded</p>';
- $s .= '<h4>'.t("Body for 'new status message'").'</h4>';
- $s .= '<p><code>'.htmlentities('key='.$key.'&type=status&msg=<<<{{Message}}>>>&date=<<<{{UpdatedAt}}>>>&url=<<<{{PageUrl}}>>>').'</code></p>';
- $s .= '<h4>'.t("Body for 'new photo upload'").'</h4>';
- $s .= '<p><code>'.htmlentities('key='.$key.'&type=photo&link=<<<{{Link}}>>>&image=<<<{{ImageSource}}>>>&msg=<<<{{Caption}}>>>&date=<<<{{CreatedAt}}>>>&url=<<<{{PageUrl}}>>>').'</code></p>';
- $s .= '<h4>'.t("Body for 'new link post'").'</h4>';
- $s .= '<p><code>'.htmlentities('key='.$key.'&type=link&link=<<<{{Link}}>>>&title=<<<{{Title}}>>>&msg=<<<{{Message}}>>>&description=<<<{{Description}}>>>&date=<<<{{CreatedAt}}>>>&url=<<<{{PageUrl}}>>>').'</code></p>';
- $s .= '</div><div class="clear"></div>';
-
- $s .= '<div id="ifttt-rekey-wrapper">';
- $s .= '<label id="ifttt-rekey-label" for="ifttt-checkbox">' . t('Generate new key') . '</label>';
- $s .= '<input id="ifttt-checkbox" type="checkbox" name="ifttt-rekey" value="1" />';
- $s .= '</div><div class="clear"></div>';
-
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="ifttt-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
- $s .= '</div>';
-
+ $s .= '<h4>' . L10n::t('Body for "new status message"') . '</h4>';
+ $s .= '<p><code>' . htmlentities('key=' . $key . '&type=status&msg=<<<{{Message}}>>>&date=<<<{{UpdatedAt}}>>>&url=<<<{{PageUrl}}>>>') . '</code></p>';
+ $s .= '<h4>' . L10n::t('Body for "new photo upload"') . '</h4>';
+ $s .= '<p><code>' . htmlentities('key=' . $key . '&type=photo&link=<<<{{Link}}>>>&image=<<<{{ImageSource}}>>>&msg=<<<{{Caption}}>>>&date=<<<{{CreatedAt}}>>>&url=<<<{{PageUrl}}>>>') . '</code></p>';
+ $s .= '<h4>' . L10n::t('Body for "new link post"') . '</h4>';
+ $s .= '<p><code>' . htmlentities('key=' . $key . '&type=link&link=<<<{{Link}}>>>&title=<<<{{Title}}>>>&msg=<<<{{Message}}>>>&description=<<<{{Description}}>>>&date=<<<{{CreatedAt}}>>>&url=<<<{{PageUrl}}>>>') . '</code></p>';
+ $s .= '</div><div class="clear"></div>';
+
+ $s .= '<div id="ifttt-rekey-wrapper">';
+ $s .= '<label id="ifttt-rekey-label" for="ifttt-checkbox">' . L10n::t('Generate new key') . '</label>';
+ $s .= '<input id="ifttt-checkbox" type="checkbox" name="ifttt-rekey" value="1" />';
+ $s .= '</div><div class="clear"></div>';
+
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="ifttt-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
+ $s .= '</div>';
}
function ifttt_settings_post(&$a,&$b) {
<?php
-
/**
* Name: Insanejournal Post Connector
* Description: Post to Insanejournal
* Author: Cat Gray <https://free-haven.org/profile/catness>
*/
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Network;
+
function ijpost_install() {
- register_hook('post_local', 'addon/ijpost/ijpost.php', 'ijpost_post_local');
- register_hook('notifier_normal', 'addon/ijpost/ijpost.php', 'ijpost_send');
- register_hook('jot_networks', 'addon/ijpost/ijpost.php', 'ijpost_jot_nets');
- register_hook('connector_settings', 'addon/ijpost/ijpost.php', 'ijpost_settings');
- register_hook('connector_settings_post', 'addon/ijpost/ijpost.php', 'ijpost_settings_post');
+ Addon::registerHook('post_local', 'addon/ijpost/ijpost.php', 'ijpost_post_local');
+ Addon::registerHook('notifier_normal', 'addon/ijpost/ijpost.php', 'ijpost_send');
+ Addon::registerHook('jot_networks', 'addon/ijpost/ijpost.php', 'ijpost_jot_nets');
+ Addon::registerHook('connector_settings', 'addon/ijpost/ijpost.php', 'ijpost_settings');
+ Addon::registerHook('connector_settings_post', 'addon/ijpost/ijpost.php', 'ijpost_settings_post');
}
function ijpost_uninstall() {
- unregister_hook('post_local', 'addon/ijpost/ijpost.php', 'ijpost_post_local');
- unregister_hook('notifier_normal', 'addon/ijpost/ijpost.php', 'ijpost_send');
- unregister_hook('jot_networks', 'addon/ijpost/ijpost.php', 'ijpost_jot_nets');
- unregister_hook('connector_settings', 'addon/ijpost/ijpost.php', 'ijpost_settings');
- unregister_hook('connector_settings_post', 'addon/ijpost/ijpost.php', 'ijpost_settings_post');
+ Addon::unregisterHook('post_local', 'addon/ijpost/ijpost.php', 'ijpost_post_local');
+ Addon::unregisterHook('notifier_normal', 'addon/ijpost/ijpost.php', 'ijpost_send');
+ Addon::unregisterHook('jot_networks', 'addon/ijpost/ijpost.php', 'ijpost_jot_nets');
+ Addon::unregisterHook('connector_settings', 'addon/ijpost/ijpost.php', 'ijpost_settings');
+ Addon::unregisterHook('connector_settings_post', 'addon/ijpost/ijpost.php', 'ijpost_settings_post');
}
$ij_defpost = get_pconfig(local_user(),'ijpost','post_by_default');
$selected = ((intval($ij_defpost) == 1) ? ' checked="checked" ' : '');
$b .= '<div class="profile-jot-net"><input type="checkbox" name="ijpost_enable" ' . $selected . ' value="1" /> '
- . t('Post to Insanejournal') . '</div>';
+ . L10n::t('Post to Insanejournal') . '</div>';
}
}
/* Add some HTML to the existing form */
$s .= '<span id="settings_ijpost_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_ijpost_expanded\'); openClose(\'settings_ijpost_inflated\');">';
- $s .= '<img class="connector" src="images/insanejournal.gif" /><h3 class="connector">'. t("InsaneJournal Export").'</h3>';
+ $s .= '<img class="connector" src="images/insanejournal.gif" /><h3 class="connector">'. L10n::t("InsaneJournal Export").'</h3>';
$s .= '</span>';
$s .= '<div id="settings_ijpost_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_ijpost_expanded\'); openClose(\'settings_ijpost_inflated\');">';
- $s .= '<img class="connector" src="images/insanejournal.gif" /><h3 class="connector">'. t("InsaneJournal Export").'</h3>';
+ $s .= '<img class="connector" src="images/insanejournal.gif" /><h3 class="connector">'. L10n::t("InsaneJournal Export").'</h3>';
$s .= '</span>';
$s .= '<div id="ijpost-enable-wrapper">';
- $s .= '<label id="ijpost-enable-label" for="ijpost-checkbox">' . t('Enable InsaneJournal Post Plugin') . '</label>';
+ $s .= '<label id="ijpost-enable-label" for="ijpost-checkbox">' . L10n::t('Enable InsaneJournal Post Addon') . '</label>';
$s .= '<input id="ijpost-checkbox" type="checkbox" name="ijpost" value="1" ' . $checked . '/>';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="ijpost-username-wrapper">';
- $s .= '<label id="ijpost-username-label" for="ijpost-username">' . t('InsaneJournal username') . '</label>';
+ $s .= '<label id="ijpost-username-label" for="ijpost-username">' . L10n::t('InsaneJournal username') . '</label>';
$s .= '<input id="ijpost-username" type="text" name="ij_username" value="' . $ij_username . '" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="ijpost-password-wrapper">';
- $s .= '<label id="ijpost-password-label" for="ijpost-password">' . t('InsaneJournal password') . '</label>';
+ $s .= '<label id="ijpost-password-label" for="ijpost-password">' . L10n::t('InsaneJournal password') . '</label>';
$s .= '<input id="ijpost-password" type="password" name="ij_password" value="' . $ij_password . '" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="ijpost-bydefault-wrapper">';
- $s .= '<label id="ijpost-bydefault-label" for="ijpost-bydefault">' . t('Post to InsaneJournal by default') . '</label>';
+ $s .= '<label id="ijpost-bydefault-label" for="ijpost-bydefault">' . L10n::t('Post to InsaneJournal by default') . '</label>';
$s .= '<input id="ijpost-bydefault" type="checkbox" name="ij_bydefault" value="1" ' . $def_checked . '/>';
$s .= '</div><div class="clear"></div>';
/* provide a submit button */
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="ijpost-submit" name="ijpost-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="ijpost-submit" name="ijpost-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
$ij_blog = 'http://www.insanejournal.com/interface/xmlrpc';
if($ij_username && $ij_password && $ij_blog) {
-
- require_once('include/bbcode.php');
- require_once('include/datetime.php');
-
$title = $b['title'];
- $post = bbcode($b['body']);
+ $post = BBCode::convert($b['body']);
$post = xmlify($post);
$tags = ijpost_get_tags($b['tag']);
- $date = datetime_convert('UTC',$tz,$b['created'],'Y-m-d H:i:s');
+ $date = DateTimeFormat::convert($b['created'], $tz);
$year = intval(substr($date,0,4));
$mon = intval(substr($date,5,2));
$day = intval(substr($date,8,2));
logger('ijpost: data: ' . $xml, LOGGER_DATA);
- if($ij_blog !== 'test')
- $x = post_url($ij_blog,$xml,array("Content-Type: text/xml"));
+ if($ij_blog !== 'test') {
+ $x = Network::post($ij_blog, $xml, ["Content-Type: text/xml"]);
+ }
logger('posted to insanejournal: ' . ($x) ? $x : '', LOGGER_DEBUG);
}
msgstr ""
#: ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
+msgid "Enable InsaneJournal Post Addon"
msgstr ""
#: ijpost.php:77
\r
$a->strings["Post to Insanejournal"] = "Enviament a Insanejournal";\r
$a->strings["InsaneJournal Post Settings"] = "Ajustos d'Enviament a Insanejournal";\r
-$a->strings["Enable InsaneJournal Post Plugin"] = "Habilita el Plugin d'Enviaments a Insanejournal";\r
+$a->strings["Enable InsaneJournal Post Addon"] = "Habilita el Addon d'Enviaments a Insanejournal";\r
$a->strings["InsaneJournal username"] = "Nom d'usuari de Insanejournal";\r
$a->strings["InsaneJournal password"] = "Contrasenya de Insanejournal";\r
$a->strings["Post to InsaneJournal by default"] = "Enviar per defecte a Insanejournal";\r
msgstr "Nastavení příspěvků pro InsaneJournal"
#: ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
-msgstr "Povolit Insanejournal plugin"
+msgid "Enable InsaneJournal Post Addon"
+msgstr "Povolit Insanejournal addon"
#: ijpost.php:77
msgid "InsaneJournal username"
;
$a->strings["Post to Insanejournal"] = "Odeslat na Insanejournal";
$a->strings["InsaneJournal Post Settings"] = "Nastavení příspěvků pro InsaneJournal";
-$a->strings["Enable InsaneJournal Post Plugin"] = "Povolit Insanejournal plugin";
+$a->strings["Enable InsaneJournal Post Addon"] = "Povolit Insanejournal addon";
$a->strings["InsaneJournal username"] = "Insanejournal uživatelské jméno";
$a->strings["InsaneJournal password"] = "Insanejournal heslo";
$a->strings["Post to InsaneJournal by default"] = "Defaultně zasílat příspěvky na InsaneJournal";
msgstr "InsaneJournal Beitrags-Einstellungen"
#: ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
-msgstr "InsaneJournal Plugin aktivieren"
+msgid "Enable InsaneJournal Post Addon"
+msgstr "InsaneJournal Addon aktivieren"
#: ijpost.php:77
msgid "InsaneJournal username"
;
$a->strings["Post to Insanejournal"] = "Auf InsaneJournal posten.";
$a->strings["InsaneJournal Post Settings"] = "InsaneJournal Beitrags-Einstellungen";
-$a->strings["Enable InsaneJournal Post Plugin"] = "InsaneJournal Plugin aktivieren";
+$a->strings["Enable InsaneJournal Post Addon"] = "InsaneJournal Addon aktivieren";
$a->strings["InsaneJournal username"] = "InsaneJournal Benutzername";
$a->strings["InsaneJournal password"] = "InsaneJournal Passwort";
$a->strings["Post to InsaneJournal by default"] = "Standardmäßig auf InsaneJournal posten.";
\r
$a->strings["Post to Insanejournal"] = "Afiŝi al Insanejournal";\r
$a->strings["InsaneJournal Post Settings"] = "Agordoj pri Insaenejournal Afiŝoj";\r
-$a->strings["Enable InsaneJournal Post Plugin"] = "Ŝalti la InsaneJournal afiŝo kromprogramon.";\r
+$a->strings["Enable InsaneJournal Post Addon"] = "Ŝalti la InsaneJournal afiŝo kromprogramon.";\r
$a->strings["InsaneJournal username"] = "Salutnomo ĉe InsaneJournal";\r
$a->strings["InsaneJournal password"] = "Pasvorto ĉe InsaneJournal";\r
$a->strings["Post to InsaneJournal by default"] = "Defaŭlte afiŝi ĉe InsaneJournal";\r
msgstr "Ajustes de Entrada de InsaneJournal"
#: ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
-msgstr "Habilitar el Plugin de Entrada InsaneJournal"
+msgid "Enable InsaneJournal Post Addon"
+msgstr "Habilitar el Addon de Entrada InsaneJournal"
#: ijpost.php:77
msgid "InsaneJournal username"
;
$a->strings["Post to Insanejournal"] = "Publicar en Insanejournal";
$a->strings["InsaneJournal Post Settings"] = "Ajustes de Entrada de InsaneJournal";
-$a->strings["Enable InsaneJournal Post Plugin"] = "Habilitar el Plugin de Entrada InsaneJournal";
+$a->strings["Enable InsaneJournal Post Addon"] = "Habilitar el Addon de Entrada InsaneJournal";
$a->strings["InsaneJournal username"] = "Nombre de usuario InsaneJournal";
$a->strings["InsaneJournal password"] = "Contraseña de InsaneJournal";
$a->strings["Post to InsaneJournal by default"] = "Publicar en InsaneJournal por defecto";
\r
$a->strings["Post to Insanejournal"] = "Publier vers InsaneJournal";\r
$a->strings["InsaneJournal Post Settings"] = "Réglages InsaneJournal";\r
-$a->strings["Enable InsaneJournal Post Plugin"] = "Activer le connecteur InsaneJournal";\r
+$a->strings["Enable InsaneJournal Post Addon"] = "Activer le connecteur InsaneJournal";\r
$a->strings["InsaneJournal username"] = "Utilisateur InsaneJournal";\r
$a->strings["InsaneJournal password"] = "Mot de passe InsaneJournal";\r
$a->strings["Post to InsaneJournal by default"] = "Publier sur InsaneJournal par défaut";\r
\r
$a->strings["Post to Insanejournal"] = "";\r
$a->strings["InsaneJournal Post Settings"] = "";\r
-$a->strings["Enable InsaneJournal Post Plugin"] = "";\r
+$a->strings["Enable InsaneJournal Post Addon"] = "";\r
$a->strings["InsaneJournal username"] = "";\r
$a->strings["InsaneJournal password"] = "";\r
$a->strings["Post to InsaneJournal by default"] = "";\r
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:15+0000\n"
+"PO-Revision-Date: 2018-03-19 13:22+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
msgstr "Impostazioni post InsaneJournal"
#: ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
-msgstr "Abilita il plugin di invio a InsaneJournal"
+msgid "Enable InsaneJournal Post Addon"
+msgstr "Abilita il componente aggiuntivo di invio a InsaneJournal"
#: ijpost.php:77
msgid "InsaneJournal username"
;
$a->strings["Post to Insanejournal"] = "Invia a InsaneJournal";
$a->strings["InsaneJournal Post Settings"] = "Impostazioni post InsaneJournal";
-$a->strings["Enable InsaneJournal Post Plugin"] = "Abilita il plugin di invio a InsaneJournal";
+$a->strings["Enable InsaneJournal Post Addon"] = "Abilita il componente aggiuntivo di invio a InsaneJournal";
$a->strings["InsaneJournal username"] = "Nome utente InsaneJournal";
$a->strings["InsaneJournal password"] = "Password InsaneJournal";
$a->strings["Post to InsaneJournal by default"] = "Invia sempre a InsaneJournal";
\r
$a->strings["Post to Insanejournal"] = "";\r
$a->strings["InsaneJournal Post Settings"] = "";\r
-$a->strings["Enable InsaneJournal Post Plugin"] = "";\r
+$a->strings["Enable InsaneJournal Post Addon"] = "";\r
$a->strings["InsaneJournal username"] = "";\r
$a->strings["InsaneJournal password"] = "";\r
$a->strings["Post to InsaneJournal by default"] = "";\r
\r
$a->strings["Post to Insanejournal"] = "Opublikuj na Insanejournal";\r
$a->strings["InsaneJournal Post Settings"] = "";\r
-$a->strings["Enable InsaneJournal Post Plugin"] = "";\r
+$a->strings["Enable InsaneJournal Post Addon"] = "";\r
$a->strings["InsaneJournal username"] = "";\r
$a->strings["InsaneJournal password"] = "";\r
$a->strings["Post to InsaneJournal by default"] = "";\r
msgstr "Configurações de publicação no InsaneJournal"
#: ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
+msgid "Enable InsaneJournal Post Addon"
msgstr "Habilitar plug-in para publicar no InsaneJournal"
#: ijpost.php:77
;
$a->strings["Post to Insanejournal"] = "Publicar no Insanejournal";
$a->strings["InsaneJournal Post Settings"] = "Configurações de publicação no InsaneJournal";
-$a->strings["Enable InsaneJournal Post Plugin"] = "Habilitar plug-in para publicar no InsaneJournal";
+$a->strings["Enable InsaneJournal Post Addon"] = "Habilitar plug-in para publicar no InsaneJournal";
$a->strings["InsaneJournal username"] = "Nome de usuário no InsaneJournal";
$a->strings["InsaneJournal password"] = "Senha do InsaneJournal";
$a->strings["Post to InsaneJournal by default"] = "Publicar no InsaneJournal por padrão";
msgstr "Configurări Postări Insaneournal"
#: ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
+msgid "Enable InsaneJournal Post Addon"
msgstr "Activare Modul Postare InsaneJournal"
#: ijpost.php:77
;
$a->strings["Post to Insanejournal"] = "Postare pe Insanejournal";
$a->strings["InsaneJournal Post Settings"] = "Configurări Postări Insaneournal";
-$a->strings["Enable InsaneJournal Post Plugin"] = "Activare Modul Postare InsaneJournal";
+$a->strings["Enable InsaneJournal Post Addon"] = "Activare Modul Postare InsaneJournal";
$a->strings["InsaneJournal username"] = "Utilizator InsaneJournal ";
$a->strings["InsaneJournal password"] = "Parolă InsaneJournal ";
$a->strings["Post to InsaneJournal by default"] = "Postați implicit pe InsaneJournal ";
\r
$a->strings["Post to Insanejournal"] = "";\r
$a->strings["InsaneJournal Post Settings"] = "";\r
-$a->strings["Enable InsaneJournal Post Plugin"] = "Включить InsaneJournal плагин сообщений";\r
+$a->strings["Enable InsaneJournal Post Addon"] = "Включить InsaneJournal плагин сообщений";\r
$a->strings["InsaneJournal username"] = "";\r
$a->strings["InsaneJournal password"] = "";\r
$a->strings["Post to InsaneJournal by default"] = "";\r
\r
$a->strings["Post to Insanejournal"] = "转播到Insanejournal";\r
$a->strings["InsaneJournal Post Settings"] = "Insanejournal转播设置";\r
-$a->strings["Enable InsaneJournal Post Plugin"] = "使InsaneJournal转播插件可用";\r
+$a->strings["Enable InsaneJournal Post Addon"] = "使InsaneJournal转播插件可用";\r
$a->strings["InsaneJournal username"] = "InsaneJournal用户名";\r
$a->strings["InsaneJournal password"] = "InsaneJournal密码";\r
$a->strings["Post to InsaneJournal by default"] = "默认地转播到InsaneJournal";\r
-Impressum Plugin for Friendica
+Impressum Addon for Friendica
==============================
* Author: Tobias Diekershoff
About
-----
-This plugin adds an Impressum (contact) block to the /friendica page with
+This addon adds an Impressum (contact) block to the /friendica page with
informations about the page operator/owner and how to contact you in case of
any questions.
Configuration
-------------
-Simply fill in the fields in the impressium settings page in the plugins
+Simply fill in the fields in the impressium settings page in the addons
area of your admin panel. For email adresses the "@" symbol will be obfuscated
in the source of the page to make in harder for harvesting tools.
<?php
/**
* Name: Impressum
- * Description: Plugin to add contact information to the about page (/friendica)
+ * Description: Addon to add contact information to the about page (/friendica)
* Version: 1.3
* Author: Tobias Diekershoff <https://f.diekershoff.de/profile/tobias>
* License: 3-clause BSD license
*/
-require_once('include/bbcode.php');
-require_once('mod/proxy.php');
+require_once 'mod/proxy.php';
+
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
function impressum_install() {
- register_hook('about_hook', 'addon/impressum/impressum.php', 'impressum_show');
- register_hook('page_end', 'addon/impressum/impressum.php', 'impressum_footer');
- logger("installed impressum plugin");
+ Addon::registerHook('about_hook', 'addon/impressum/impressum.php', 'impressum_show');
+ Addon::registerHook('page_end', 'addon/impressum/impressum.php', 'impressum_footer');
+ logger("installed impressum Addon");
}
function impressum_uninstall() {
- unregister_hook('about_hook', 'addon/impressum/impressum.php', 'impressum_show');
- unregister_hook('page_end', 'addon/impressum/impressum.php', 'impressum_footer');
- logger("uninstalled impressum plugin");
+ Addon::unregisterHook('about_hook', 'addon/impressum/impressum.php', 'impressum_show');
+ Addon::unregisterHook('page_end', 'addon/impressum/impressum.php', 'impressum_footer');
+ logger("uninstalled impressum Addon");
}
function impressum_module() {
return $s;
}
function impressum_footer($a, &$b) {
- $text = proxy_parse_html(bbcode(get_config('impressum','footer_text'), true));
+ $text = proxy_parse_html(BBCode::convert(Config::get('impressum','footer_text')));
if (! $text == '') {
$a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'.$a->get_baseurl().'/addon/impressum/impressum.css" media="all" />';
$b .= '<div class="clear"></div>';
}
}
function impressum_show($a,&$b) {
- $b .= '<h3>'.t('Impressum').'</h3>';
- $owner = get_config('impressum', 'owner');
- $owner_profile = get_config('impressum','ownerprofile');
- $postal = proxy_parse_html(bbcode(get_config('impressum', 'postal'), true));
- $notes = proxy_parse_html(bbcode(get_config('impressum', 'notes'), true));
- $email = obfuscate_email( get_config('impressum','email') );
+ $b .= '<h3>'.L10n::t('Impressum').'</h3>';
+ $owner = Config::get('impressum', 'owner');
+ $owner_profile = Config::get('impressum','ownerprofile');
+ $postal = proxy_parse_html(BBCode::convert(Config::get('impressum', 'postal')));
+ $notes = proxy_parse_html(BBCode::convert(Config::get('impressum', 'notes')));
+ $email = obfuscate_email( Config::get('impressum','email') );
if (strlen($owner)) {
if (strlen($owner_profile)) {
$tmp = '<a href="'.$owner_profile.'">'.$owner.'</a>';
$tmp = $owner;
}
if (strlen($email)) {
- $b .= '<p><strong>'.t('Site Owner').'</strong>: '. $tmp .'<br /><strong>'.t('Email Address').'</strong>: '.$email.'</p>';
+ $b .= '<p><strong>'.L10n::t('Site Owner').'</strong>: '. $tmp .'<br /><strong>'.L10n::t('Email Address').'</strong>: '.$email.'</p>';
} else {
- $b .= '<p><strong>'.t('Site Owner').'</strong>: '. $tmp .'</p>';
+ $b .= '<p><strong>'.L10n::t('Site Owner').'</strong>: '. $tmp .'</p>';
}
if (strlen($postal)) {
- $b .= '<p><strong>'.t('Postal Address').'</strong><br />'. $postal .'</p>';
+ $b .= '<p><strong>'.L10n::t('Postal Address').'</strong><br />'. $postal .'</p>';
}
if (strlen($notes)) {
$b .= '<p>'.$notes.'</p>';
}
} else {
- $b .= '<p>'.t('The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon.').'</p>';
+ $b .= '<p>'.L10n::t('The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon.').'</p>';
}
}
-function impressum_plugin_admin_post (&$a) {
+function impressum_addon_admin_post (&$a) {
$owner = ((x($_POST, 'owner')) ? notags(trim($_POST['owner'])) : '');
$ownerprofile = ((x($_POST, 'ownerprofile')) ? notags(trim($_POST['ownerprofile'])) : '');
$postal = ((x($_POST, 'postal')) ? (trim($_POST['postal'])) : '');
$notes = ((x($_POST, 'notes')) ? (trim($_POST['notes'])) : '');
$email = ((x($_POST, 'email')) ? notags(trim($_POST['email'])) : '');
$footer_text = ((x($_POST, 'footer_text')) ? (trim($_POST['footer_text'])) : '');
- set_config('impressum','owner',strip_tags($owner));
- set_config('impressum','ownerprofile',strip_tags($ownerprofile));
- set_config('impressum','postal',strip_tags($postal));
- set_config('impressum','email',strip_tags($email));
- set_config('impressum','notes',strip_tags($notes));
- set_config('impressum','footer_text',strip_tags($footer_text));
- info( t('Settings updated.'). EOL );
+ Config::set('impressum','owner',strip_tags($owner));
+ Config::set('impressum','ownerprofile',strip_tags($ownerprofile));
+ Config::set('impressum','postal',strip_tags($postal));
+ Config::set('impressum','email',strip_tags($email));
+ Config::set('impressum','notes',strip_tags($notes));
+ Config::set('impressum','footer_text',strip_tags($footer_text));
+ info(L10n::t('Settings updated.'). EOL );
}
-function impressum_plugin_admin (&$a, &$o) {
+function impressum_addon_admin (&$a, &$o) {
$t = get_markup_template( "admin.tpl", "addon/impressum/" );
- $o = replace_macros($t, array(
- '$submit' => t('Save Settings'),
- '$owner' => array('owner', t('Site Owner'), get_config('impressum','owner'), t('The page operators name.')),
- '$ownerprofile' => array('ownerprofile', t('Site Owners Profile'), get_config('impressum','ownerprofile'), t('Profile address of the operator.')),
- '$postal' => array('postal', t('Postal Address'), get_config('impressum','postal'), t('How to contact the operator via snail mail. You can use BBCode here.')),
- '$notes' => array('notes', t('Notes'), get_config('impressum','notes'), t('Additional notes that are displayed beneath the contact information. You can use BBCode here.')),
- '$email' => array('email', t('Email Address'), get_config('impressum','email'), t('How to contact the operator via email. (will be displayed obfuscated)')),
- '$footer_text' => array('footer_text', t('Footer note'), get_config('impressum','footer_text'), t('Text for the footer. You can use BBCode here.')),
- ));
+ $o = replace_macros($t, [
+ '$submit' => L10n::t('Save Settings'),
+ '$owner' => ['owner', L10n::t('Site Owner'), Config::get('impressum','owner'), L10n::t('The page operators name.')],
+ '$ownerprofile' => ['ownerprofile', L10n::t('Site Owners Profile'), Config::get('impressum','ownerprofile'), L10n::t('Profile address of the operator.')],
+ '$postal' => ['postal', L10n::t('Postal Address'), Config::get('impressum','postal'), L10n::t('How to contact the operator via snail mail. You can use BBCode here.')],
+ '$notes' => ['notes', L10n::t('Notes'), Config::get('impressum','notes'), L10n::t('Additional notes that are displayed beneath the contact information. You can use BBCode here.')],
+ '$email' => ['email', L10n::t('Email Address'), Config::get('impressum','email'), L10n::t('How to contact the operator via email. (will be displayed obfuscated)')],
+ '$footer_text' => ['footer_text', L10n::t('Footer note'), Config::get('impressum','footer_text'), L10n::t('Text for the footer. You can use BBCode here.')],
+ ]);
}
"The impressum addon needs to be configured!<br />Please add at least the "
"<tt>owner</tt> variable to your config file. For other variables please "
"refer to the README file of the addon."
-msgstr "Das Impressums-Plugin muss noch konfiguriert werden.<br />Bitte gebe mindestens den <tt>Betreiber</tt> in der Konfiguration an. Alle weiteren Parameter werden in der README-Datei des Addons erläutert."
+msgstr "Das Impressums-Addon muss noch konfiguriert werden.<br />Bitte gebe mindestens den <tt>Betreiber</tt> in der Konfiguration an. Alle weiteren Parameter werden in der README-Datei des Addons erläutert."
#: impressum.php:78
msgid "Settings updated."
$a->strings["Site Owner"] = "Betreiber der Seite";
$a->strings["Email Address"] = "Email Adresse";
$a->strings["Postal Address"] = "Postalische Anschrift";
-$a->strings["The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon."] = "Das Impressums-Plugin muss noch konfiguriert werden.<br />Bitte gebe mindestens den <tt>Betreiber</tt> in der Konfiguration an. Alle weiteren Parameter werden in der README-Datei des Addons erläutert.";
+$a->strings["The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon."] = "Das Impressums-Addon muss noch konfiguriert werden.<br />Bitte gebe mindestens den <tt>Betreiber</tt> in der Konfiguration an. Alle weiteren Parameter werden in der README-Datei des Addons erläutert.";
$a->strings["Settings updated."] = "Einstellungen aktualisiert.";
$a->strings["Submit"] = "Senden";
$a->strings["The page operators name."] = "Name des Server-Administrators";
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:15+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
* Version: 1.0
* Author: Thomas Willingham <https://kakste.com/profile/beardyunixer>
*/
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
-function infiniteimprobabilitydrive_install() {
-register_hook('app_menu', 'addon/infiniteimprobabilitydrive/infiniteimprobabilitydrive.php', 'infiniteimprobabilitydrive_app_menu');
+function infiniteimprobabilitydrive_install()
+{
+ Addon::registerHook('app_menu', 'addon/infiniteimprobabilitydrive/infiniteimprobabilitydrive.php', 'infiniteimprobabilitydrive_app_menu');
}
-function infiniteimprobabilitydrive_uninstall() {
-unregister_hook('app_menu', 'addon/infiniteimprobabilitydrive/infiniteimprobabilitydrive.php', 'infiniteimprobabilitydrive_app_menu');
-
+function infiniteimprobabilitydrive_uninstall()
+{
+ Addon::unregisterHook('app_menu', 'addon/infiniteimprobabilitydrive/infiniteimprobabilitydrive.php', 'infiniteimprobabilitydrive_app_menu');
}
-function infiniteimprobabilitydrive_app_menu($a,&$b) {
-$b['app_menu'][] = '<div class="app-title"><a href="infiniteimprobabilitydrive">' . t('Infinite Improbability Drive') . '</a></div>';
+function infiniteimprobabilitydrive_app_menu($a, &$b)
+{
+ $b['app_menu'][] = '<div class="app-title"><a href="infiniteimprobabilitydrive">' . L10n::t('Infinite Improbability Drive') . '</a></div>';
}
-function infiniteimprobabilitydrive_module() {
-return;
+function infiniteimprobabilitydrive_module()
+{
+ return;
}
-function infiniteimprobabilitydrive_content(&$a) {
-$baseurl = $a->get_baseurl() . '/addon/infiniteimprobabilitydrive';
-$o = '';
-
-$a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'.$a->get_baseurl().'/addon/infiniteimprobabilitydrive/infiniteimprobabilitydrive.css"/>';
+function infiniteimprobabilitydrive_content(&$a)
+{
+ $baseurl = $a->get_baseurl() . '/addon/infiniteimprobabilitydrive';
+ $o = '';
+ $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'.$a->get_baseurl().'/addon/infiniteimprobabilitydrive/infiniteimprobabilitydrive.css"/>';
-$baseurl = $a->get_baseurl();
+ $baseurl = $a->get_baseurl();
- $o .= <<< EOT
+ $o .= <<< EOT
<br><br>
<p>Try another destination with the <a href="$baseurl/infiniteimprobabilitydrive">Infinite Improbability Drive</a>
<iframe src ="$baseurl/randprof" height="1200" width="1024">
-
-
EOT;
-return $o;
-
-}
\ No newline at end of file
+ return $o;
+}
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-22 13:18+0200\n"
-"PO-Revision-Date: 2014-09-10 12:23+0000\n"
+"POT-Creation-Date: 2013-02-27 05:01-0500\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
<?php
/**
-* Name: IRC Chat Plugin
+* Name: IRC Chat Addon
* Description: add an Internet Relay Chat chatroom on freenode
* Version: 1.1
* Author: tony baldwin <https://free-haven.org/profile/tony>
* Author: Tobias Diekershoff <https://f.diekershoff.de/u/tobias>
*/
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
function irc_install() {
- register_hook('app_menu', 'addon/irc/irc.php', 'irc_app_menu');
- register_hook('plugin_settings', 'addon/irc/irc.php', 'irc_addon_settings');
- register_hook('plugin_settings_post', 'addon/irc/irc.php', 'irc_addon_settings_post');
+ Addon::registerHook('app_menu', 'addon/irc/irc.php', 'irc_app_menu');
+ Addon::registerHook('addon_settings', 'addon/irc/irc.php', 'irc_addon_settings');
+ Addon::registerHook('addon_settings_post', 'addon/irc/irc.php', 'irc_addon_settings_post');
}
function irc_uninstall() {
- unregister_hook('app_menu', 'addon/irc/irc.php', 'irc_app_menu');
- unregister_hook('plugin_settings', 'addon/irc/irc.php', 'irc_addon_settings');
+ Addon::unregisterHook('app_menu', 'addon/irc/irc.php', 'irc_app_menu');
+ Addon::unregisterHook('addon_settings', 'addon/irc/irc.php', 'irc_addon_settings');
}
$autochans = get_pconfig( local_user(), 'irc','autochans'); /* auto connect chans */
$t = get_markup_template( "settings.tpl", "addon/irc/" );
- $s .= replace_macros($t, array(
- '$header' => t('IRC Settings'),
- '$info' => t('Here you can change the system wide settings for the channels to automatically join and access via the side bar. Note the changes you do here, only effect the channel selection if you are logged in.'),
- '$submit' => t('Save Settings'),
- '$autochans' => array( 'autochans', t('Channel(s) to auto connect (comma separated)'), $autochans, t('List of channels that shall automatically connected to when the app is launched.')),
- '$sitechats' => array( 'sitechats', t('Popular Channels (comma separated)'), $sitechats, t('List of popular channels, will be displayed at the side and hotlinked for easy joining.') )
- ));
+ $s .= replace_macros($t, [
+ '$header' => L10n::t('IRC Settings'),
+ '$info' => L10n::t('Here you can change the system wide settings for the channels to automatically join and access via the side bar. Note the changes you do here, only effect the channel selection if you are logged in.'),
+ '$submit' => L10n::t('Save Settings'),
+ '$autochans' => [ 'autochans', L10n::t('Channel(s) to auto connect (comma separated)'), $autochans, L10n::t('List of channels that shall automatically connected to when the app is launched.')],
+ '$sitechats' => [ 'sitechats', L10n::t('Popular Channels (comma separated)'), $sitechats, L10n::t('List of popular channels, will be displayed at the side and hotlinked for easy joining.') ]
+ ]);
return;
set_pconfig( local_user(), 'irc','autochans',trim($_POST['autochans']));
set_pconfig( local_user(), 'irc','sitechats',trim($_POST['sitechats']));
/* upid pop-up thing */
- info( t('IRC settings saved.') . EOL);
+ info(L10n::t('IRC settings saved.') . EOL);
}
}
function irc_app_menu($a,&$b) {
- $b['app_menu'][] = '<div class="app-title"><a href="irc">' . t('IRC Chatroom') . '</a></div>';
+ $b['app_menu'][] = '<div class="app-title"><a href="irc">' . L10n::t('IRC Chatroom') . '</a></div>';
}
$chats = array('friendica','chat','chatback','hottub','ircbar','dateroom','debian');
- $a->page['aside'] .= '<div class="widget"><h3>' . t('Popular Channels') . '</h3><ul>';
+ $a->page['aside'] .= '<div class="widget"><h3>' . L10n::t('Popular Channels') . '</h3><ul>';
foreach($chats as $chat) {
$a->page['aside'] .= '<li><a href="' . $a->get_baseurl() . '/irc?channels=' . $chat . '" >' . '#' . $chat . '</a></li>';
}
}
-function irc_plugin_admin_post (&$a) {
+function irc_addon_admin_post (&$a) {
if(! is_site_admin())
return;
set_config('irc','autochans',trim($_POST['autochans']));
set_config('irc','sitechats',trim($_POST['sitechats']));
/* stupid pop-up thing */
- info( t('IRC settings saved.') . EOL);
+ info(L10n::t('IRC settings saved.') . EOL);
}
}
-function irc_plugin_admin (&$a, &$o) {
- $sitechats = get_config('irc','sitechats'); /* popular channels */
- $autochans = get_config('irc','autochans'); /* auto connect chans */
+function irc_addon_admin (&$a, &$o) {
+ $sitechats = Config::get('irc','sitechats'); /* popular channels */
+ $autochans = Config::get('irc','autochans'); /* auto connect chans */
$t = get_markup_template( "admin.tpl", "addon/irc/" );
- $o = replace_macros($t, array(
- '$submit' => t('Save Settings'),
- '$autochans' => array( 'autochans', t('Channel(s) to auto connect (comma separated)'), $autochans, t('List of channels that shall automatically connected to when the app is launched.')),
- '$sitechats' => array( 'sitechats', t('Popular Channels (comma separated)'), $sitechats, t('List of popular channels, will be displayed at the side and hotlinked for easy joining.') )
- ));
+ $o = replace_macros($t, [
+ '$submit' => L10n::t('Save Settings'),
+ '$autochans' => [ 'autochans', L10n::t('Channel(s) to auto connect (comma separated)'), $autochans, L10n::t('List of channels that shall automatically connected to when the app is launched.')],
+ '$sitechats' => [ 'sitechats', L10n::t('Popular Channels (comma separated)'), $sitechats, L10n::t('List of popular channels, will be displayed at the side and hotlinked for easy joining.') ]
+ ]);
}
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-07-08 13:17+0200\n"
-"PO-Revision-Date: 2015-08-31 10:17+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
-Jappix Mini Plugin
+Jappix Mini Addon
==================
This quick-and-dirty addon allows you to add a Jabber-based, Facebook-like chat
to Friendica. It uses Jappix Mini.
-It is necessary to use a BOSH host - so to use this plugin, each users need to
+It is necessary to use a BOSH host - so to use this addon, each users need to
know the address of a BOSH host that works with his account. The BOSH server of
the Jappix project (https://bind.jappix.com/) is not locked to a specific XMPP
provider, but keep in mind that only personal usage is approved according to
dataForm(server, 'command', '', '', 'adhoc');
}
-// Plugin launcher
+// Addon launcher
function launchAdHoc() {
// Click event
$('#adhoc .bottom .finish').click(closeAdHoc);
}
}
-// Plugin launcher
+// Addon launcher
function launchAnonymous() {
logThis('Anonymous mode detected, connecting...', 3);
anonymousLogin(HOST_ANONYMOUS);
}
-// Launch this plugin!
+// Launch this addon!
$(document).ready(launchAnonymous);
getListArchives(xid, date);
}
-// Plugin launcher
+// Addon launcher
function launchArchives() {
// Current date
var current_date = explodeThis('T', getXMPPTime(), 0);
getStorage(NS_ROSTERNOTES);
}
-// Plugin launcher
+// Addon launcher
function launchConnection() {
// Logouts when Jappix is closed
$(window).bind('beforeunload', terminate);
}
}
-// Launch this plugin!
+// Launch this addon!
$(document).ready(launchConnection);
return false;
}
-// Plugin launcher
+// Addon launcher
function launchDirectory() {
// Click event
$('#directory .bottom .finish').click(closeDirectory);
$('#discovery .wait, #discovery .disco-category').hide();
}
-// Plugin launcher
+// Addon launcher
function launchDiscovery() {
// Click event
$('#discovery .bottom .finish').click(closeDiscovery);
$('#favorites .fedit-head-select').html(favorites_popup);
}
-// Plugin launcher
+// Addon launcher
function launchFavorites() {
var path = '#favorites .';
return false;
}
-// Plugin launcher
+// Addon launcher
function launchHome() {
// Define the vars
var home = '#home ';
logThis('Welcome to Jappix! Happy coding in developer mode!');
}
-// Launch this plugin!
+// Launch this addon!
$(document).ready(launchHome);
$('#inbox .wait').hide();
}
-// Plugin launcher
+// Addon launcher
function launchInbox() {
// Define the pats
var inbox = '#inbox .';
return string;
}
-// Plugin launcher
+// Addon launcher
function launchIntegratebox() {
// Click event
$('#integratebox .bottom .finish.close').click(closeIntegrateBox);
}
-// Plugin keyup event
+// Addon keyup event
$(document).keyup(function(e) {
// Previous item?
if((exists('#integratebox .bottom .finish.previous:not(.disabled)')) && (e.keyCode == 37)) {
});
}
-// Plugin launcher
+// Addon launcher
function launchInterface() {
// Focus on the first visible input
$(window).focus(inputFocus);
}
-// Launch this plugin!
+// Launch this addon!
$(document).ready(launchInterface);
});
},
- // Based off of the plugin by Clint Helfers, with permission.
+ // Based off of the addon by Clint Helfers, with permission.
// http://blindsignals.com/index.php/2009/07/jquery-delay/
delay: function( time, type ) {
time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
});
- // plugin code
+ // addon code
$.fn.placeholder = function(opts) {
opts = $.extend({},$.placeholder.settings, opts);
return false;
}
-// Plugin launcher
+// Addon launcher
function launchMe() {
// Click events
$('#me .content a.go').click(function() {
getMicroblog(xid, hash);
}
-// Plugin launcher
+// Addon launcher
function launchMicroblog() {
// Keyboard event
$('#channel .top input[name=microblog_body]').keyup(function(e) {
jQuery('#jappix_mini div.jm_roster div.jm_buddies').css('max-height', height);
}
-// Plugin launcher
+// Addon launcher
function launchMini(autoconnect, show_pane, domain, user, password) {
// Save infos to reconnect
MINI_DOMAIN = domain;
return closeMucAdmin();
}
-// Plugin launcher
+// Addon launcher
function launchMucAdmin() {
// Click events
$('#mucadmin .bottom .finish').click(function() {
return false;
}
-// Plugin launcher
+// Addon launcher
function launchMusic() {
// When music search string submitted
$('.music-content input').keyup(function(e) {
$('.notifications-content .tools-content-subitem').css('max-height', max_height);
}
-// Plugin launcher
+// Addon launcher
function launchNotifications() {
// Adapt the notifications height
adaptNotifications();
$('#integratemedias').attr('checked', true);
}
-// Plugin launcher
+// Addon launcher
function launchOptions() {
// Click events
$('#options .tab a').click(function() {
displayPEP(xid, 'geoloc');
}
-// Plugin launcher
+// Addon launcher
function launchPEP() {
// Apply empty values to the PEP database
setDB('mood-value', 1, '');
return $('#presence-status').val();
}
-// Plugin launcher
+// Addon launcher
function launchPresence() {
// Click event for user presence show
$('#my-infos .f-presence a.picker').click(function() {
$('#privacy .privacy-' + rank + ' input, #privacy .privacy-' + rank + ' select').removeAttr('disabled');
}
-// Plugin launcher
+// Addon launcher
function launchPrivacy() {
// Click events
$('#privacy .bottom .finish').click(closePrivacy);
// Define a global var for buddy list all buddies displayed
var BLIST_ALL = false;
-// Plugin launcher
+// Addon launcher
function launchRoster() {
// Filtering tool
var iFilter = $('#buddy-list .filter input');
closeRosterX();
}
-// Plugin launcher
+// Addon launcher
function launchRosterX() {
// Click events
$('#rosterx .bottom .finish').click(function() {
// Creates the talkpage events
function eventsTalkPage() {
- // Launch all associated plugins
+ // Launch all associated addons
launchMicroblog();
launchRoster();
launchPresence();
presenceFunnel(xid, hash);
}
-// Plugin launcher
+// Addon launcher
function launchUserInfos() {
// Click events
$('#userinfos .tab a').click(function() {
return false;
}
-// Plugin launcher
+// Addon launcher
function launchVCard() {
// Focus on the first input
$(document).oneTime(10, function() {
return false;
}
-// Plugin launcher
+// Addon launcher
function launchWelcome() {
// Click events
$('#welcome .tab a').click(function() {
msgid "The folder is writable, you can continue!"
msgstr ""
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
msgstr ""
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgid "The folder is writable, you can continue!"
msgstr "В тази папка/директория може да се записва, можете да продължите!"
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
msgstr "Jappix ви позволява да управлявате и менажирате вашата конфигурация, да инсталирате нови разширения (плъгини) или да потърсите за обновления на програмата (ъпдейти). Затова трябва да създадете администраторска потребителска сметка (акаунт), за да можете да имате достъп до мениджъра с настройките на Jappix."
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgid "The folder is writable, you can continue!"
msgstr "Do adresáře je povolen zápis, můžete pokračovat!"
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
-msgstr "Jappix vám úmožňuje spravovat vaší konfiguraci, instalovat pluginy nebo vyhledávat aktualizace. Proto je nutné si vytvořit účet administrátora ke vstupu do Správy Jappix."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix vám úmožňuje spravovat vaší konfiguraci, instalovat addony nebo vyhledávat aktualizace. Proto je nutné si vytvořit účet administrátora ke vstupu do Správy Jappix."
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgstr "Když je Jappix nainstalován, stačí kliknout na odkaz Správce na výchozí stránce pro vstup do Správy. "
msgid "The folder is writable, you can continue!"
msgstr "Der Ordner ist schreibbar, du kannst weitermachen!"
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
-msgstr "Jappix bietet dir die Möglichkeit, deine Konfiguration einzustellen, neue Plugins zu installieren oder nach Updates zu suchen. Deshalb musst Du ein Admin-Account anlegen um auf die Verwaltung zugreifen zu können."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix bietet dir die Möglichkeit, deine Konfiguration einzustellen, neue Addons zu installieren oder nach Updates zu suchen. Deshalb musst Du ein Admin-Account anlegen um auf die Verwaltung zugreifen zu können."
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgstr "Wenn Jappix installiert ist, klicke einfach auf den Manager-Link auf der Homepage um darauf zuzugreifen."
msgid "The folder is writable, you can continue!"
msgstr ""
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
msgstr ""
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgid "The folder is writable, you can continue!"
msgstr "La dosierujo estas skribebla, vi povas daŭri!"
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
msgstr "Jappix ebligas vin administri vian konfiguron, instali novajn kromaĵojn aŭ serĉi ĝisdatigojn. Tio estas kial vi devas krei administrantan konton por aliri la manaĝeron."
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgid "The folder is writable, you can continue!"
msgstr "La carpeta es escribible, ¡puedes continuar!"
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
-msgstr "Jappix te ofrece la posibilidad de gestionar tu configuración, instalar nuevos plugins y buscar actualizaciones. Por eso tienes que crear una cuenta de administración para acceder al gerente."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix te ofrece la posibilidad de gestionar tu configuración, instalar nuevos addons y buscar actualizaciones. Por eso tienes que crear una cuenta de administración para acceder al gerente."
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgstr "Cuando Jappix esté instalado, basta con hacer clic en el enlace de gerente en la página principal para acceder."
msgid "The folder is writable, you can continue!"
msgstr "Kataloogil on kirjutusõigused, Te võite jätkata!"
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
-msgstr "Jappix pakub võimalust hallata oma konfiguratsiooni, installida uusi pluginaid või otsida uuendusi. Sellepärast peate te tegema administraatori konto, et haldus lehele ligi pääseda."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix pakub võimalust hallata oma konfiguratsiooni, installida uusi addonaid või otsida uuendusi. Sellepärast peate te tegema administraatori konto, et haldus lehele ligi pääseda."
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgstr "Kui Jappix on paigaldatud siis lihtsalt vajutage Haldaja lingile avalehel, et sellele ligi pääseda."
msgid "The folder is writable, you can continue!"
msgstr "پوشه قابل ویرایش است. میتوانید ادامه دهید!"
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
msgstr ""
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgid "The folder is writable, you can continue!"
msgstr "Le dossier peut être écrit, vous pouvez continuer !"
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
msgstr "Jappix vous offre la possibilité de gérer votre configuration, installer des nouveaux modules et rechercher des mises à jour. C'est pourquoi vous devez créer un compte administrateur pour accéder au gestionnaire."
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgid "The folder is writable, you can continue!"
msgstr "A mappa írható, már folytathatod!"
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
msgstr "Jappix felajánlja a lehetőséget, hogy menedzseld a konfigurációd, telepíts új kiegészítőket, vagy keress frissítéseket. Ezért kell létrehoznod egy adminisztrátori fiókot, hogy hozzáférj ezekhez a beállításokhoz."
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgid "The folder is writable, you can continue!"
msgstr "Folder dapat ditulis, anda dapat melanjutkan!"
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
-msgstr "Jappix menawarkan kemungkinan untuk mengelola konfigurasi anda, menginstal plugin baru atau mencari update. Itulah mengapa anda harus membuat account administrator untuk mengakses manajer."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix menawarkan kemungkinan untuk mengelola konfigurasi anda, menginstal addon baru atau mencari update. Itulah mengapa anda harus membuat account administrator untuk mengakses manajer."
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgstr "Ketika Jappix akan diinstal, cukup klik pada link manajer di halaman rumah untuk mengaksesnya."
msgid "The folder is writable, you can continue!"
msgstr "La directory è scrivibile, puoi continuare!"
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
-msgstr "Jappix ti offre la possibilità controllare la configurazione di Jappix, installare nuove plugins e cercare aggiornamenti. Ecco perchè devi creare un account amministrativo per accedere all'Amministrazione."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix ti offre la possibilità controllare la configurazione di Jappix, installare nuove addons e cercare aggiornamenti. Ecco perchè devi creare un account amministrativo per accedere all'Amministrazione."
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgstr "Quando Jappix sarà installato, semplicemente clicca sul link “Amministrazione” nella home page per accedervi."
msgid "The folder is writable, you can continue!"
msgstr "フォルダは書き込み可能です。続けてください。"
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
msgstr "Jappixは、設定ファイル、新しいプラグイン、アップデートを提供できます。管理者権限でのアクセスが必要です。"
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgid "The folder is writable, you can continue!"
msgstr ""
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
msgstr ""
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgid "The folder is writable, you can continue!"
msgstr ""
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
msgstr ""
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgid "The folder is writable, you can continue!"
msgstr "Można zapisywać w folderze, możesz kontynuować!"
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
-msgstr "Jappix oferuje Ci możliwość zarządzania konfiguracją, instalacji nowych pluginów lub sprawdzania aktualizacji. To właśnie dlatego musisz stworzyć konto administratora."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix oferuje Ci możliwość zarządzania konfiguracją, instalacji nowych addonów lub sprawdzania aktualizacji. To właśnie dlatego musisz stworzyć konto administratora."
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgstr "Kiedy Jappix będzie już zainstalowany, kliknij w link Menedżer na stronie głównej."
msgid "The folder is writable, you can continue!"
msgstr "Esta pasta possui permissão de escrita, pode continuar!"
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
-msgstr "Jappix oferece a você a possibilidade de gerenciar suas configurações, instalar novos plugins ou procurar por atulizações. Por isso você deve criar um usuário de administração para acessar o gerenciador."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix oferece a você a possibilidade de gerenciar suas configurações, instalar novos addons ou procurar por atulizações. Por isso você deve criar um usuário de administração para acessar o gerenciador."
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgstr "Quando o Jappix for instalado, clique no link do gerenciador, em sua página inicial, para acessá-lo."
msgid "The folder is writable, you can continue!"
msgstr "Папка доступна для записи, можно продолжать!"
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
msgstr "Jabbix позволяет вам управлять конфигурацией, устанавливать новые плагины или проверять обновления. Для доступа к панели управления требуется создать учетную запись администратора."
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgid "The folder is writable, you can continue!"
msgstr "Do zložky je možné zapisovať, môžete pokračovať!"
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
-msgstr "Jappix vám ponúka možnosť spravovať vaše konfiguráciu, inštalovať nové pluginy alebo vyhľadať aktualizácie. Preto si musíte vytvoriť administračný účet pre prístup k Správcovi."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix vám ponúka možnosť spravovať vaše konfiguráciu, inštalovať nové addony alebo vyhľadať aktualizácie. Preto si musíte vytvoriť administračný účet pre prístup k Správcovi."
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgstr "Po nainštalovaní Jappix, stačí kliknúť na odkaz Správca na domovskej stránke pre prístup."
msgid "The folder is writable, you can continue!"
msgstr "Mappen är skrivbar -- du kan nu fortsätta!"
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
msgstr ""
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgid "The folder is writable, you can continue!"
msgstr ""
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
msgstr ""
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
msgid "The folder is writable, you can continue!"
msgstr "資料夾可寫入,你可以繼續!"
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
msgstr ""
msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
else if($step == 3) { ?>
<h3 class="account install-images"><?php _e("Administrator account"); ?></h3>
- <p><?php _e("Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."); ?></p>
+ <p><?php _e("Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."); ?></p>
<p><?php _e("When Jappix will be installed, just click on the manager link on the home page to access it."); ?></p>
Response:
json({"status":"ok", "encrypted_address":"%s"})
-*/
+use Friendica\App;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Model\User;
+use Friendica\Util\Network;
-function jappixmini_install() {
-register_hook('plugin_settings', 'addon/jappixmini/jappixmini.php', 'jappixmini_settings');
-register_hook('plugin_settings_post', 'addon/jappixmini/jappixmini.php', 'jappixmini_settings_post');
+function jappixmini_install()
+{
+ Addon::registerHook('addon_settings', 'addon/jappixmini/jappixmini.php', 'jappixmini_settings');
+ Addon::registerHook('addon_settings_post', 'addon/jappixmini/jappixmini.php', 'jappixmini_settings_post');
-register_hook('page_end', 'addon/jappixmini/jappixmini.php', 'jappixmini_script');
-register_hook('authenticate', 'addon/jappixmini/jappixmini.php', 'jappixmini_login');
+ Addon::registerHook('page_end', 'addon/jappixmini/jappixmini.php', 'jappixmini_script');
+ Addon::registerHook('authenticate', 'addon/jappixmini/jappixmini.php', 'jappixmini_login');
-register_hook('cron', 'addon/jappixmini/jappixmini.php', 'jappixmini_cron');
+ Addon::registerHook('cron', 'addon/jappixmini/jappixmini.php', 'jappixmini_cron');
-// Jappix source download as required by AGPL
-register_hook('about_hook', 'addon/jappixmini/jappixmini.php', 'jappixmini_download_source');
+ // Jappix source download as required by AGPL
+ Addon::registerHook('about_hook', 'addon/jappixmini/jappixmini.php', 'jappixmini_download_source');
// set standard configuration
$info_text = get_config("jappixmini", "infotext");
if ($addon_version==="") set_config("jappixmini", "version", "1");
}
+function jappixmini_uninstall()
+{
+ Addon::unregisterHook('addon_settings', 'addon/jappixmini/jappixmini.php', 'jappixmini_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/jappixmini/jappixmini.php', 'jappixmini_settings_post');
-function jappixmini_uninstall() {
-unregister_hook('plugin_settings', 'addon/jappixmini/jappixmini.php', 'jappixmini_settings');
-unregister_hook('plugin_settings_post', 'addon/jappixmini/jappixmini.php', 'jappixmini_settings_post');
-
-unregister_hook('page_end', 'addon/jappixmini/jappixmini.php', 'jappixmini_script');
-unregister_hook('authenticate', 'addon/jappixmini/jappixmini.php', 'jappixmini_login');
+ Addon::unregisterHook('page_end', 'addon/jappixmini/jappixmini.php', 'jappixmini_script');
+ Addon::unregisterHook('authenticate', 'addon/jappixmini/jappixmini.php', 'jappixmini_login');
-unregister_hook('cron', 'addon/jappixmini/jappixmini.php', 'jappixmini_cron');
+ Addon::unregisterHook('cron', 'addon/jappixmini/jappixmini.php', 'jappixmini_cron');
-unregister_hook('about_hook', 'addon/jappixmini/jappixmini.php', 'jappixmini_download_source');
+ Addon::unregisterHook('about_hook', 'addon/jappixmini/jappixmini.php', 'jappixmini_download_source');
}
-function jappixmini_plugin_admin(&$a, &$o) {
+function jappixmini_addon_admin(App $a, &$o)
+{
// display instructions and warnings on addon settings page for admin
if (!file_exists("addon/jappixmini.tgz")) {
$o .= '<input type="submit" name="jappixmini-admin-settings" value="OK" />';
}
-function jappixmini_plugin_admin_post(&$a) {
+function jappixmini_addon_admin_post(App $a)
+{
// set info text
$submit = $_REQUEST['jappixmini-admin-settings'];
if ($submit) {
} catch (Exception $e) {
}
- // do not return an address if user deactivated plugin
- $activated = get_pconfig($uid, 'jappixmini', 'activate');
- if (!$activated) killme();
+ // do not return an address if user deactivated addon
+ $activated = PConfig::get($uid, 'jappixmini', 'activate');
+ if (!$activated) {
+ killme();
+ }
// return the requested Jabber address
try {
}
}
-function jappixmini_settings(&$a, &$s) {
- // addon settings for a user
+function jappixmini_settings(App $a, &$s)
+{
+ // addon settings for a user
+ $activate = PConfig::get(local_user(), 'jappixmini', 'activate');
+ $activate = intval($activate) ? ' checked="checked"' : '';
+ $dontinsertchat = PConfig::get(local_user(), 'jappixmini', 'dontinsertchat');
+ $insertchat = !(intval($dontinsertchat) ? ' checked="checked"' : '');
- $activate = get_pconfig(local_user(),'jappixmini','activate');
- $activate = intval($activate) ? ' checked="checked"' : '';
- $dontinsertchat = get_pconfig(local_user(),'jappixmini','dontinsertchat');
- $insertchat = !(intval($dontinsertchat) ? ' checked="checked"' : '');
+ $defaultbosh = Config::get("jappixmini", "bosh_address");
- $defaultbosh = get_config("jappixmini", "bosh_address");
-
- if ($defaultbosh != "")
- set_pconfig(local_user(),'jappixmini','bosh', $defaultbosh);
+ if ($defaultbosh != "") {
+ PConfig::set(local_user(), 'jappixmini', 'bosh', $defaultbosh);
+ }
- $username = get_pconfig(local_user(),'jappixmini','username');
- $username = htmlentities($username);
- $server = get_pconfig(local_user(),'jappixmini','server');
- $server = htmlentities($server);
- $bosh = get_pconfig(local_user(),'jappixmini','bosh');
- $bosh = htmlentities($bosh);
- $password = get_pconfig(local_user(),'jappixmini','password');
- $autosubscribe = get_pconfig(local_user(),'jappixmini','autosubscribe');
- $autosubscribe = intval($autosubscribe) ? ' checked="checked"' : '';
- $autoapprove = get_pconfig(local_user(),'jappixmini','autoapprove');
- $autoapprove = intval($autoapprove) ? ' checked="checked"' : '';
- $encrypt = intval(get_pconfig(local_user(),'jappixmini','encrypt'));
- $encrypt_checked = $encrypt ? ' checked="checked"' : '';
- $encrypt_disabled = $encrypt ? '' : ' disabled="disabled"';
+ $username = PConfig::get(local_user(), 'jappixmini', 'username');
+ $username = htmlentities($username);
+ $server = PConfig::get(local_user(), 'jappixmini', 'server');
+ $server = htmlentities($server);
+ $bosh = PConfig::get(local_user(), 'jappixmini', 'bosh');
+ $bosh = htmlentities($bosh);
+ $password = PConfig::get(local_user(), 'jappixmini', 'password');
+ $autosubscribe = PConfig::get(local_user(), 'jappixmini', 'autosubscribe');
+ $autosubscribe = intval($autosubscribe) ? ' checked="checked"' : '';
+ $autoapprove = PConfig::get(local_user(), 'jappixmini', 'autoapprove');
+ $autoapprove = intval($autoapprove) ? ' checked="checked"' : '';
+ $encrypt = intval(PConfig::get(local_user(), 'jappixmini', 'encrypt'));
+ $encrypt_checked = $encrypt ? ' checked="checked"' : '';
+ $encrypt_disabled = $encrypt ? '' : ' disabled="disabled"';
+
+ if ($server == "") {
+ $server = Config::get("jappixmini", "default_server");
+ }
- if ($server == "")
- $server = get_config("jappixmini", "default_server");
+ if (($username == "") && Config::get("jappixmini", "default_user")) {
+ $username = $a->user["nickname"];
+ }
- if (($username == "") && get_config("jappixmini", "default_user"))
- $username = $a->user["nickname"];
+ $info_text = Config::get("jappixmini", "infotext");
+ $info_text = htmlentities($info_text);
+ $info_text = str_replace("\n", "<br />", $info_text);
- $info_text = get_config("jappixmini", "infotext");
- $info_text = htmlentities($info_text);
- $info_text = str_replace("\n", "<br />", $info_text);
+ // count contacts
+ $r = q("SELECT COUNT(1) as `cnt` FROM `pconfig` WHERE `uid`=%d AND `cat`='jappixmini' AND `k` LIKE 'id:%%'", local_user());
+ if (count($r)) {
+ $contact_cnt = $r[0]["cnt"];
+ } else {
+ $contact_cnt = 0;
+ }
- // count contacts
- $r = q("SELECT COUNT(1) as `cnt` FROM `pconfig` WHERE `uid`=%d AND `cat`='jappixmini' AND `k` LIKE 'id:%%'", local_user());
- if (count($r)) $contact_cnt = $r[0]["cnt"];
- else $contact_cnt = 0;
+ // count jabber addresses
+ $r = q("SELECT COUNT(1) as `cnt` FROM `pconfig` WHERE `uid`=%d AND `cat`='jappixmini' AND `k` LIKE 'id:%%' AND `v` LIKE '%%@%%'", local_user());
+ if (count($r)) {
+ $address_cnt = $r[0]["cnt"];
+ } else {
+ $address_cnt = 0;
+ }
- // count jabber addresses
- $r = q("SELECT COUNT(1) as `cnt` FROM `pconfig` WHERE `uid`=%d AND `cat`='jappixmini' AND `k` LIKE 'id:%%' AND `v` LIKE '%%@%%'", local_user());
- if (count($r)) $address_cnt = $r[0]["cnt"];
- else $address_cnt = 0;
+ if (!$activate) {
+ // load scripts if not yet activated so that password can be saved
+ $a->page['htmlhead'] .= '<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/jappixmini/jappix/php/get.php?t=js&g=mini.xml"></script>' . "\r\n";
+ $a->page['htmlhead'] .= '<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/jappixmini/jappix/php/get.php?t=js&f=presence.js~caps.js~name.js~roster.js"></script>' . "\r\n";
- if (!$activate) {
- // load scripts if not yet activated so that password can be saved
- $a->page['htmlhead'] .= '<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/jappixmini/jappix/php/get.php?t=js&g=mini.xml"></script>'."\r\n";
- $a->page['htmlhead'] .= '<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/jappixmini/jappix/php/get.php?t=js&f=presence.js~caps.js~name.js~roster.js"></script>'."\r\n";
+ $a->page['htmlhead'] .= '<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/jappixmini/lib.js"></script>' . "\r\n";
+ }
- $a->page['htmlhead'] .= '<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/jappixmini/lib.js"></script>'."\r\n";
- }
+ $s .= '<span id="settings_jappixmini_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_jappixmini_expanded\'); openClose(\'settings_jappixmini_inflated\');">';
+ $s .= '<h3>' . L10n::t('Jappix Mini') . '</h3>';
+ $s .= '</span>';
+ $s .= '<div id="settings_jappixmini_expanded" class="settings-block" style="display: none;">';
+ $s .= '<span class="fakelink" onclick="openClose(\'settings_jappixmini_expanded\'); openClose(\'settings_jappixmini_inflated\');">';
+ $s .= '<h3>' . L10n::t('Jappix Mini') . '</h3>';
+ $s .= '</span>';
- $s .= '<span id="settings_jappixmini_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_jappixmini_expanded\'); openClose(\'settings_jappixmini_inflated\');">';
- $s .= '<h3>'.t('Jappix Mini').'</h3>';
- $s .= '</span>';
- $s .= '<div id="settings_jappixmini_expanded" class="settings-block" style="display: none;">';
- $s .= '<span class="fakelink" onclick="openClose(\'settings_jappixmini_expanded\'); openClose(\'settings_jappixmini_inflated\');">';
- $s .= '<h3>'.t('Jappix Mini').'</h3>';
- $s .= '</span>';
-
- $s .= '<label for="jappixmini-activate">'.t('Activate addon').'</label>';
- $s .= ' <input id="jappixmini-activate" type="checkbox" name="jappixmini-activate" value="1"'.$activate.' />';
- $s .= '<br />';
- $s .= '<label for"jappixmini-dont-insertchat">'.t('Do <em>not</em> insert the Jappixmini Chat-Widget into the webinterface').'</label>';
- $s .= '<input id="jappixmini-dont-insertchat" type="checkbox" name="jappixmini-dont-insertchat" value="1"'.$insertchat.' />';
- $s .= '<br />';
- $s .= '<label for="jappixmini-username">'.t('Jabber username').'</label>';
- $s .= ' <input id="jappixmini-username" type="text" name="jappixmini-username" value="'.$username.'" />';
- $s .= '<br />';
- $s .= '<label for="jappixmini-server">'.t('Jabber server').'</label>';
- $s .= ' <input id="jappixmini-server" type="text" name="jappixmini-server" value="'.$server.'" />';
- $s .= '<br />';
-
- if ($defaultbosh == "") {
- $s .= '<label for="jappixmini-bosh">'.t('Jabber BOSH host').'</label>';
- $s .= ' <input id="jappixmini-bosh" type="text" name="jappixmini-bosh" value="'.$bosh.'" />';
+ $s .= '<label for="jappixmini-activate">' . L10n::t('Activate addon') . '</label>';
+ $s .= ' <input id="jappixmini-activate" type="checkbox" name="jappixmini-activate" value="1"' . $activate . ' />';
+ $s .= '<br />';
+ $s .= '<label for"jappixmini-dont-insertchat">' . L10n::t('Do <em>not</em> insert the Jappixmini Chat-Widget into the webinterface') . '</label>';
+ $s .= '<input id="jappixmini-dont-insertchat" type="checkbox" name="jappixmini-dont-insertchat" value="1"' . $insertchat . ' />';
+ $s .= '<br />';
+ $s .= '<label for="jappixmini-username">' . L10n::t('Jabber username') . '</label>';
+ $s .= ' <input id="jappixmini-username" type="text" name="jappixmini-username" value="' . $username . '" />';
+ $s .= '<br />';
+ $s .= '<label for="jappixmini-server">' . L10n::t('Jabber server') . '</label>';
+ $s .= ' <input id="jappixmini-server" type="text" name="jappixmini-server" value="' . $server . '" />';
$s .= '<br />';
- }
+ if ($defaultbosh == "") {
+ $s .= '<label for="jappixmini-bosh">' . L10n::t('Jabber BOSH host') . '</label>';
+ $s .= ' <input id="jappixmini-bosh" type="text" name="jappixmini-bosh" value="' . $bosh . '" />';
+ $s .= '<br />';
+ }
- $s .= '<label for="jappixmini-password">'.t('Jabber password').'</label>';
- $s .= ' <input type="hidden" id="jappixmini-password" name="jappixmini-encrypted-password" value="'.$password.'" />';
- $s .= ' <input id="jappixmini-clear-password" type="password" value="" onchange="jappixmini_set_password();" />';
- $s .= '<br />';
- $onchange = "document.getElementById('jappixmini-friendica-password').disabled = !this.checked;jappixmini_set_password();";
- $s .= '<label for="jappixmini-encrypt">'.t('Encrypt Jabber password with Friendica password (recommended)').'</label>';
- $s .= ' <input id="jappixmini-encrypt" type="checkbox" name="jappixmini-encrypt" onchange="'.$onchange.'" value="1"'.$encrypt_checked.' />';
- $s .= '<br />';
- $s .= '<label for="jappixmini-friendica-password">'.t('Friendica password').'</label>';
- $s .= ' <input id="jappixmini-friendica-password" name="jappixmini-friendica-password" type="password" onchange="jappixmini_set_password();" value=""'.$encrypt_disabled.' />';
- $s .= '<br />';
- $s .= '<label for="jappixmini-autoapprove">'.t('Approve subscription requests from Friendica contacts automatically').'</label>';
- $s .= ' <input id="jappixmini-autoapprove" type="checkbox" name="jappixmini-autoapprove" value="1"'.$autoapprove.' />';
- $s .= '<br />';
- $s .= '<label for="jappixmini-autosubscribe">'.t('Subscribe to Friendica contacts automatically').'</label>';
- $s .= ' <input id="jappixmini-autosubscribe" type="checkbox" name="jappixmini-autosubscribe" value="1"'.$autosubscribe.' />';
- $s .= '<br />';
- $s .= '<label for="jappixmini-purge">'.t('Purge internal list of jabber addresses of contacts').'</label>';
- $s .= ' <input id="jappixmini-purge" type="checkbox" name="jappixmini-purge" value="1" />';
- $s .= '<br />';
- if ($info_text) $s .= '<br />Configuration help:<p style="margin-left:2em;">'.$info_text.'</p>';
- $s .= '<br />Status:<p style="margin-left:2em;">Addon knows '.$address_cnt.' Jabber addresses of '.$contact_cnt.' Friendica contacts (takes some time, usually 10 minutes, to update).</p>';
- $s .= '<input type="submit" name="jappixmini-submit" value="' . t('Save Settings') . '" />';
- $s .= ' <input type="button" value="'.t('Add contact').'" onclick="jappixmini_addon_subscribe();" />';
-
- $s .= '</div>';
+ $s .= '<label for="jappixmini-password">' . L10n::t('Jabber password') . '</label>';
+ $s .= ' <input type="hidden" id="jappixmini-password" name="jappixmini-encrypted-password" value="' . $password . '" />';
+ $s .= ' <input id="jappixmini-clear-password" type="password" value="" onchange="jappixmini_set_password();" />';
+ $s .= '<br />';
+ $onchange = "document.getElementById('jappixmini-friendica-password').disabled = !this.checked;jappixmini_set_password();";
+ $s .= '<label for="jappixmini-encrypt">' . L10n::t('Encrypt Jabber password with Friendica password (recommended)') . '</label>';
+ $s .= ' <input id="jappixmini-encrypt" type="checkbox" name="jappixmini-encrypt" onchange="' . $onchange . '" value="1"' . $encrypt_checked . ' />';
+ $s .= '<br />';
+ $s .= '<label for="jappixmini-friendica-password">' . L10n::t('Friendica password') . '</label>';
+ $s .= ' <input id="jappixmini-friendica-password" name="jappixmini-friendica-password" type="password" onchange="jappixmini_set_password();" value=""' . $encrypt_disabled . ' />';
+ $s .= '<br />';
+ $s .= '<label for="jappixmini-autoapprove">' . L10n::t('Approve subscription requests from Friendica contacts automatically') . '</label>';
+ $s .= ' <input id="jappixmini-autoapprove" type="checkbox" name="jappixmini-autoapprove" value="1"' . $autoapprove . ' />';
+ $s .= '<br />';
+ $s .= '<label for="jappixmini-autosubscribe">' . L10n::t('Subscribe to Friendica contacts automatically') . '</label>';
+ $s .= ' <input id="jappixmini-autosubscribe" type="checkbox" name="jappixmini-autosubscribe" value="1"' . $autosubscribe . ' />';
+ $s .= '<br />';
+ $s .= '<label for="jappixmini-purge">' . L10n::t('Purge internal list of jabber addresses of contacts') . '</label>';
+ $s .= ' <input id="jappixmini-purge" type="checkbox" name="jappixmini-purge" value="1" />';
+ $s .= '<br />';
+ if ($info_text) {
+ $s .= '<br />Configuration help:<p style="margin-left:2em;">' . $info_text . '</p>';
+ }
+ $s .= '<br />Status:<p style="margin-left:2em;">Addon knows ' . $address_cnt . ' Jabber addresses of ' . $contact_cnt . ' Friendica contacts (takes some time, usually 10 minutes, to update).</p>';
+ $s .= '<input type="submit" name="jappixmini-submit" value="' . L10n::t('Save Settings') . '" />';
+ $s .= ' <input type="button" value="' . L10n::t('Add contact') . '" onclick="jappixmini_addon_subscribe();" />';
- $a->page['htmlhead'] .= "<script type=\"text/javascript\">
+ $s .= '</div>';
+
+ $a->page['htmlhead'] .= "<script type=\"text/javascript\">
function jappixmini_set_password() {
encrypt = document.getElementById('jappixmini-encrypt').checked;
password = document.getElementById('jappixmini-password');
try {
// send request
- $answer_json = fetch_url($url);
+ $answer_json = Network::fetchUrl($url);
// parse answer
$answer = json_decode($answer_json);
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:18+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
[donation_link]: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=3PMY37SL9L888&lc=US&item_name=JavaScript%20file%20uploader¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted
-This plugin uses XHR for uploading multiple files with progress-bar in FF3.6+, Safari4+,
+This addon uses XHR for uploading multiple files with progress-bar in FF3.6+, Safari4+,
Chrome and falls back to hidden iframe based upload in other browsers,
providing good user experience everywhere.
* tested in IE7,8; Firefox 3,3.6,4; Safari4,5; Chrome; Opera10.60;
### License ###
-This plugin is open sourced under <a href="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPL 2</a> or later.
+This addon is open sourced under <a href="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPL 2</a> or later.
If this license doesn't suit you mail me at andrew (at) valums.com.
-Please [donate][donation_link] if you are willing to support the further development of file upload plugin.
+Please [donate][donation_link] if you are willing to support the further development of file upload addon.
### Known Issues ###
-Plugin breaks back button functionality in Opera.
+Addon breaks back button functionality in Opera.
### Getting started ###
The fileuploader.js contains two classes that are meant to be used directly.
<?php
-
/**
* Name: JS Uploader
* Description: JavaScript photo/image uploader. Uses Valum 'qq' Uploader.
* Module Author: Chris Case
*
*/
-
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
function js_upload_install() {
- register_hook('photo_upload_form', 'addon/js_upload/js_upload.php', 'js_upload_form');
- register_hook('photo_post_init', 'addon/js_upload/js_upload.php', 'js_upload_post_init');
- register_hook('photo_post_file', 'addon/js_upload/js_upload.php', 'js_upload_post_file');
- register_hook('photo_post_end', 'addon/js_upload/js_upload.php', 'js_upload_post_end');
+ Addon::registerHook('photo_upload_form', 'addon/js_upload/js_upload.php', 'js_upload_form');
+ Addon::registerHook('photo_post_init', 'addon/js_upload/js_upload.php', 'js_upload_post_init');
+ Addon::registerHook('photo_post_file', 'addon/js_upload/js_upload.php', 'js_upload_post_file');
+ Addon::registerHook('photo_post_end', 'addon/js_upload/js_upload.php', 'js_upload_post_end');
}
function js_upload_uninstall() {
- unregister_hook('photo_upload_form', 'addon/js_upload/js_upload.php', 'js_upload_form');
- unregister_hook('photo_post_init', 'addon/js_upload/js_upload.php', 'js_upload_post_init');
- unregister_hook('photo_post_file', 'addon/js_upload/js_upload.php', 'js_upload_post_file');
- unregister_hook('photo_post_end', 'addon/js_upload/js_upload.php', 'js_upload_post_end');
+ Addon::unregisterHook('photo_upload_form', 'addon/js_upload/js_upload.php', 'js_upload_form');
+ Addon::unregisterHook('photo_post_init', 'addon/js_upload/js_upload.php', 'js_upload_post_init');
+ Addon::unregisterHook('photo_post_file', 'addon/js_upload/js_upload.php', 'js_upload_post_file');
+ Addon::unregisterHook('photo_post_end', 'addon/js_upload/js_upload.php', 'js_upload_post_end');
}
$b['addon_text'] .= '<link href="' . $a->get_baseurl() . '/addon/js_upload/file-uploader/client/fileuploader.css" rel="stylesheet" type="text/css">';
$b['addon_text'] .= '<script src="' . $a->get_baseurl() . '/addon/js_upload/file-uploader/client/fileuploader.js" type="text/javascript"></script>';
-
- $upload_msg = t('Upload a file');
- $drop_msg = t('Drop files here to upload');
- $cancel = t('Cancel');
- $failed = t('Failed');
+
+ $upload_msg = L10n::t('Upload a file');
+ $drop_msg = L10n::t('Drop files here to upload');
+ $cancel = L10n::t('Cancel');
+ $failed = L10n::t('Failed');
$maximagesize = intval(get_config('system','maximagesize'));
function handleUpload(){
if (!$this->file){
- return array('error' => t('No files were uploaded.'));
+ return ['error' => L10n::t('No files were uploaded.')];
}
$size = $this->file->getSize();
if ($size == 0) {
- return array('error' => t('Uploaded file is empty'));
+ return ['error' => L10n::t('Uploaded file is empty')];
}
// if ($size > $this->sizeLimit) {
-// return array('error' => t('Uploaded file is too large'));
+// return array('error' => L10n::t('Uploaded file is too large'));
// }
$maximagesize = get_config('system','maximagesize');
if(($maximagesize) && ($size > $maximagesize)) {
- return array('error' => t('Image exceeds size limit of ') . $maximagesize );
+ return ['error' => L10n::t('Image exceeds size limit of ') . $maximagesize ];
}
if($this->allowedExtensions && !in_array(strtolower($ext), $this->allowedExtensions)){
$these = implode(', ', $this->allowedExtensions);
- return array('error' => t('File has an invalid extension, it should be one of ') . $these . '.');
+ return ['error' => L10n::t('File has an invalid extension, it should be one of ') . $these . '.'];
}
if ($this->file->save()){
'filename' => $filename . '.' . $ext
);
} else {
- return array(
- 'error'=> t('Upload was cancelled, or server error encountered'),
- 'path' => $this->file->getPath(),
+ return [
+ 'error'=> L10n::t('Upload was cancelled, or server error encountered'),
+ 'path' => $this->file->getPath(),
'filename' => $filename . '.' . $ext
);
}
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2014-09-10 12:26+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
*
*"My body was my sacrifice... for my magic. This damage is permanent." - Raistlin Majere
*/
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
function krynn_install() {
/**
- *
- * Our demo plugin will attach in three places.
+ *
+ * Our demo addon will attach in three places.
* The first is just prior to storing a local post.
*
*/
- register_hook('post_local', 'addon/krynn/krynn.php', 'krynn_post_hook');
+ Addon::registerHook('post_local', 'addon/krynn/krynn.php', 'krynn_post_hook');
/**
*
- * Then we'll attach into the plugin settings page, and also the
+ * Then we'll attach into the addon settings page, and also the
* settings post hook so that we can create and update
* user preferences.
*
*/
- register_hook('plugin_settings', 'addon/krynn/krynn.php', 'krynn_settings');
- register_hook('plugin_settings_post', 'addon/krynn/krynn.php', 'krynn_settings_post');
+ Addon::registerHook('addon_settings', 'addon/krynn/krynn.php', 'krynn_settings');
+ Addon::registerHook('addon_settings_post', 'addon/krynn/krynn.php', 'krynn_settings_post');
logger("installed krynn");
}
*
*/
- unregister_hook('post_local', 'addon/krynn/krynn.php', 'krynn_post_hook');
- unregister_hook('plugin_settings', 'addon/krynn/krynn.php', 'krynn_settings');
- unregister_hook('plugin_settings_post', 'addon/krynn/krynn.php', 'krynn_settings_post');
+ Addon::unregisterHook('post_local', 'addon/krynn/krynn.php', 'krynn_post_hook');
+ Addon::unregisterHook('addon_settings', 'addon/krynn/krynn.php', 'krynn_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/krynn/krynn.php', 'krynn_settings_post');
logger("removed krynn");
* An item was posted on the local system.
* We are going to look for specific items:
* - A status post by a profile owner
- * - The profile owner must have allowed our plugin
+ * - The profile owner must have allowed our addon
*
*/
/**
*
- * Called from the Plugin Setting form.
+ * Called from the addon Setting form.
* Add our own settings info to the page.
*
*/
/* Add some HTML to the existing form */
$s .= '<span id="settings_krynn_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_krynn_expanded\'); openClose(\'settings_krynn_inflated\');">';
- $s .= '<h3>' . t('Krynn') . '</h3>';
+ $s .= '<h3>' . L10n::t('Krynn') . '</h3>';
$s .= '</span>';
$s .= '<div id="settings_krynn_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_krynn_expanded\'); openClose(\'settings_krynn_inflated\');">';
- $s .= '<h3>' . t('Krynn') . '</h3>';
+ $s .= '<h3>' . L10n::t('Krynn') . '</h3>';
$s .= '</span>';
$s .= '<div class="settings-block">';
- $s .= '<h3>' . t('Krynn Settings') . '</h3>';
+ $s .= '<h3>' . L10n::t('Krynn Settings') . '</h3>';
$s .= '<div id="krynn-enable-wrapper">';
- $s .= '<label id="krynn-enable-label" for="krynn-checkbox">' . t('Enable Krynn Plugin') . '</label>';
+ $s .= '<label id="krynn-enable-label" for="krynn-checkbox">' . L10n::t('Enable Krynn Addon') . '</label>';
$s .= '<input id="krynn-checkbox" type="checkbox" name="krynn" value="1" ' . $checked . '/>';
$s .= '</div><div class="clear"></div></div>';
/* provide a submit button */
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="krynn-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="krynn-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
msgstr ""
#: krynn.php:152
-msgid "Enable Krynn Plugin"
+msgid "Enable Krynn Addon"
msgstr ""
#: krynn.php:158
<?php\r
\r
$a->strings["Krynn Settings"] = "Ajustos de Krynn";\r
-$a->strings["Enable Krynn Plugin"] = "Activa Plugin de Krynn";\r
+$a->strings["Enable Krynn Addon"] = "Activa Addon de Krynn";\r
$a->strings["Submit"] = "Enviar";\r
msgstr "Krynn Nastavení"
#: krynn.php:152
-msgid "Enable Krynn Plugin"
-msgstr "Povolit Krynn plugin"
+msgid "Enable Krynn Addon"
+msgstr "Povolit Krynn addon"
#: krynn.php:158
msgid "Submit"
}}
;
$a->strings["Krynn Settings"] = "Krynn Nastavení";
-$a->strings["Enable Krynn Plugin"] = "Povolit Krynn plugin";
+$a->strings["Enable Krynn Addon"] = "Povolit Krynn addon";
$a->strings["Submit"] = "Odeslat";
msgstr "Planeten Einstellungen"
#: Krynn.php:152
-msgid "Enable Krynn Plugin"
-msgstr "Planeten-Plugin aktivieren"
+msgid "Enable Krynn Addon"
+msgstr "Planeten-Addon aktivieren"
#: Krynn.php:158
msgid "Submit"
}}
;
$a->strings["Krynn Settings"] = "Krynn Einstellungen";
-$a->strings["Enable Krynn Plugin"] = "Krynn-Plugin aktivieren";
+$a->strings["Enable Krynn Addon"] = "Krynn-Addon aktivieren";
$a->strings["Submit"] = "Senden";
<?php\r
\r
$a->strings["Krynn Settings"] = "Agordo pri Krynn";\r
-$a->strings["Enable Krynn Plugin"] = "Ŝalti la Krynn kromprogamon";\r
+$a->strings["Enable Krynn Addon"] = "Ŝalti la Krynn kromprogamon";\r
$a->strings["Submit"] = "Sendi";\r
msgstr "Ajustes de Krynn"
#: krynn.php:152
-msgid "Enable Krynn Plugin"
-msgstr "Habilitar Plugin de Krynn"
+msgid "Enable Krynn Addon"
+msgstr "Habilitar Addon de Krynn"
#: krynn.php:158
msgid "Submit"
}}
;
$a->strings["Krynn Settings"] = "Ajustes de Krynn";
-$a->strings["Enable Krynn Plugin"] = "Habilitar Plugin de Krynn";
+$a->strings["Enable Krynn Addon"] = "Habilitar Addon de Krynn";
$a->strings["Submit"] = "Enviar";
<?php\r
\r
$a->strings["Krynn Settings"] = "Réglages des Krynn";\r
-$a->strings["Enable Krynn Plugin"] = "Activer Krynn";\r
+$a->strings["Enable Krynn Addon"] = "Activer Krynn";\r
$a->strings["Submit"] = "Envoyer";\r
<?php\r
\r
$a->strings["Krynn Settings"] = "";\r
-$a->strings["Enable Krynn Plugin"] = "";\r
+$a->strings["Enable Krynn Addon"] = "";\r
$a->strings["Submit"] = "Senda inn";\r
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2015
+# fabrixxm <fabrix.xm@gmail.com>, 2015,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 11:55+0000\n"
+"PO-Revision-Date: 2018-03-19 13:22+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
msgstr "Impostazioni Krynn"
#: krynn.php:152
-msgid "Enable Krynn Plugin"
-msgstr "Abilita plugin Krynn"
+msgid "Enable Krynn Addon"
+msgstr "Abilita componente aggiuntivo Krynn"
#: krynn.php:158
msgid "Submit"
}}
;
$a->strings["Krynn Settings"] = "Impostazioni Krynn";
-$a->strings["Enable Krynn Plugin"] = "Abilita plugin Krynn";
+$a->strings["Enable Krynn Addon"] = "Abilita componente aggiuntivo Krynn";
$a->strings["Submit"] = "Invia";
<?php\r
\r
$a->strings["Krynn Settings"] = "";\r
-$a->strings["Enable Krynn Plugin"] = "";\r
+$a->strings["Enable Krynn Addon"] = "";\r
$a->strings["Submit"] = "Lagre";\r
<?php\r
\r
$a->strings["Krynn Settings"] = "";\r
-$a->strings["Enable Krynn Plugin"] = "";\r
+$a->strings["Enable Krynn Addon"] = "";\r
$a->strings["Submit"] = "Potwierdź";\r
<?php\r
\r
$a->strings["Krynn Settings"] = "Configuração dos Krynn";\r
-$a->strings["Enable Krynn Plugin"] = "Habilita configuração dos Krynn";\r
+$a->strings["Enable Krynn Addon"] = "Habilita configuração dos Krynn";\r
$a->strings["Submit"] = "Enviar";\r
msgstr "Configurări Krynn"
#: krynn.php:152
-msgid "Enable Krynn Plugin"
+msgid "Enable Krynn Addon"
msgstr "Activare Modul Krynn"
#: krynn.php:158
}}
;
$a->strings["Krynn Settings"] = "Configurări Krynn";
-$a->strings["Enable Krynn Plugin"] = "Activare Modul Krynn";
+$a->strings["Enable Krynn Addon"] = "Activare Modul Krynn";
$a->strings["Submit"] = "Trimite";
<?php\r
\r
$a->strings["Krynn Settings"] = "";\r
-$a->strings["Enable Krynn Plugin"] = "";\r
+$a->strings["Enable Krynn Addon"] = "";\r
$a->strings["Submit"] = "Подтвердить";\r
<?php\r
\r
$a->strings["Krynn Settings"] = "行星设置";\r
-$a->strings["Enable Krynn Plugin"] = "使行星插件可用";\r
+$a->strings["Enable Krynn Addon"] = "使行星插件可用";\r
$a->strings["Submit"] = "提交";\r
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-22 15:18+0200\n"
-"PO-Revision-Date: 2015-12-14 10:47+0000\n"
+"PO-Revision-Date: 2017-09-22 12:16+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
--- /dev/null
+# ADDON langfilter
+# Copyright (C)
+# This file is distributed under the same license as the Friendica langfilter addon package.
+#
+#
+# Translators:
+# Karel Vandecandelaere <karel@dasrakel.eu>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: friendica\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-09-22 15:18+0200\n"
+"PO-Revision-Date: 2018-03-20 13:46+0000\n"
+"Last-Translator: Karel Vandecandelaere <karel@dasrakel.eu>\n"
+"Language-Team: Dutch (http://www.transifex.com/Friendica/friendica/language/nl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: langfilter.php:44
+msgid "Language Filter"
+msgstr "Taalfilter"
+
+#: langfilter.php:45
+msgid ""
+"This addon tries to identify the language of a postings. If it does not "
+"match any language spoken by you (see below) the posting will be collapsed. "
+"Remember detecting the language is not perfect, especially with short "
+"postings."
+msgstr "Deze addon probeert de taal van berichten automatisch te bepalen. Als het niet overeenkomt met een taal die jij spreekt (zie verder) zal het bericht worden verborgen. Onthoudt hierbij wel dat taaldetectie niet perfect is, vooral bij korte berichten."
+
+#: langfilter.php:46
+msgid "Use the language filter"
+msgstr "Gebruik de taalfilter"
+
+#: langfilter.php:47
+msgid "I speak"
+msgstr "Ik spreek"
+
+#: langfilter.php:47
+msgid ""
+"List of abbreviations (iso2 codes) for languages you speak, comma separated."
+" For example \"de,it\"."
+msgstr "Lijst van afkortingen (ISO2 codes) voor talen die jij spreekt, door komma's gescheiden. Bijvoorbeeld \"de,it\"."
+
+#: langfilter.php:48
+msgid "Minimum confidence in language detection"
+msgstr ""
+
+#: langfilter.php:48
+msgid ""
+"Minimum confidence in language detection being correct, from 0 to 100. Posts"
+" will not be filtered when the confidence of language detection is below "
+"this percent value."
+msgstr ""
+
+#: langfilter.php:49
+msgid "Save Settings"
+msgstr "Instellingen opslaan"
+
+#: langfilter.php:73
+msgid "Language Filter Settings saved."
+msgstr "Taalfilter-instellingen bijgewerkt."
+
+#: langfilter.php:123
+#, php-format
+msgid "unspoken language %s - Click to open/close"
+msgstr "niet gesproken taal %s - Klik om open/dicht te klappen"
--- /dev/null
+<?php
+
+if(! function_exists("string_plural_select_nl")) {
+function string_plural_select_nl($n){
+ return ($n != 1);;
+}}
+;
+$a->strings["Language Filter"] = "Taalfilter";
+$a->strings["This addon tries to identify the language of a postings. If it does not match any language spoken by you (see below) the posting will be collapsed. Remember detecting the language is not perfect, especially with short postings."] = "Deze addon probeert de taal van berichten automatisch te bepalen. Als het niet overeenkomt met een taal die jij spreekt (zie verder) zal het bericht worden verborgen. Onthoudt hierbij wel dat taaldetectie niet perfect is, vooral bij korte berichten.";
+$a->strings["Use the language filter"] = "Gebruik de taalfilter";
+$a->strings["I speak"] = "Ik spreek";
+$a->strings["List of abbreviations (iso2 codes) for languages you speak, comma separated. For example \"de,it\"."] = "Lijst van afkortingen (ISO2 codes) voor talen die jij spreekt, door komma's gescheiden. Bijvoorbeeld \"de,it\".";
+$a->strings["Minimum confidence in language detection"] = "";
+$a->strings["Minimum confidence in language detection being correct, from 0 to 100. Posts will not be filtered when the confidence of language detection is below this percent value."] = "";
+$a->strings["Save Settings"] = "Instellingen opslaan";
+$a->strings["Language Filter Settings saved."] = "Taalfilter-instellingen bijgewerkt.";
+$a->strings["unspoken language %s - Click to open/close"] = "niet gesproken taal %s - Klik om open/dicht te klappen";
--- /dev/null
+# ADDON langfilter
+# Copyright (C)
+# This file is distributed under the same license as the Friendica langfilter addon package.
+#
+#
+# Translators:
+# 朱陈锬 <tangenters@outlook.com>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: friendica\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-09-22 15:18+0200\n"
+"PO-Revision-Date: 2018-02-28 11:28+0000\n"
+"Last-Translator: 朱陈锬 <tangenters@outlook.com>\n"
+"Language-Team: Chinese (China) (http://www.transifex.com/Friendica/friendica/language/zh_CN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh_CN\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: langfilter.php:44
+msgid "Language Filter"
+msgstr ""
+
+#: langfilter.php:45
+msgid ""
+"This addon tries to identify the language of a postings. If it does not "
+"match any language spoken by you (see below) the posting will be collapsed. "
+"Remember detecting the language is not perfect, especially with short "
+"postings."
+msgstr ""
+
+#: langfilter.php:46
+msgid "Use the language filter"
+msgstr ""
+
+#: langfilter.php:47
+msgid "I speak"
+msgstr ""
+
+#: langfilter.php:47
+msgid ""
+"List of abbreviations (iso2 codes) for languages you speak, comma separated."
+" For example \"de,it\"."
+msgstr ""
+
+#: langfilter.php:48
+msgid "Minimum confidence in language detection"
+msgstr ""
+
+#: langfilter.php:48
+msgid ""
+"Minimum confidence in language detection being correct, from 0 to 100. Posts"
+" will not be filtered when the confidence of language detection is below "
+"this percent value."
+msgstr ""
+
+#: langfilter.php:49
+msgid "Save Settings"
+msgstr "保存设置"
+
+#: langfilter.php:73
+msgid "Language Filter Settings saved."
+msgstr ""
+
+#: langfilter.php:123
+#, php-format
+msgid "unspoken language %s - Click to open/close"
+msgstr ""
--- /dev/null
+<?php
+
+if(! function_exists("string_plural_select_zh_cn")) {
+function string_plural_select_zh_cn($n){
+ return 0;;
+}}
+;
+$a->strings["Language Filter"] = "";
+$a->strings["This addon tries to identify the language of a postings. If it does not match any language spoken by you (see below) the posting will be collapsed. Remember detecting the language is not perfect, especially with short postings."] = "";
+$a->strings["Use the language filter"] = "";
+$a->strings["I speak"] = "";
+$a->strings["List of abbreviations (iso2 codes) for languages you speak, comma separated. For example \"de,it\"."] = "";
+$a->strings["Minimum confidence in language detection"] = "";
+$a->strings["Minimum confidence in language detection being correct, from 0 to 100. Posts will not be filtered when the confidence of language detection is below this percent value."] = "";
+$a->strings["Save Settings"] = "保存设置";
+$a->strings["Language Filter Settings saved."] = "";
+$a->strings["unspoken language %s - Click to open/close"] = "";
* License: MIT
*/
-require_once('library/langdet/Text/LanguageDetect.php');
+use Friendica\App;
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
/* Define the hooks we want to use
* that is, we have settings, we need to save the settings and we want
* to modify the content of a posting when friendica prepares it.
*/
-function langfilter_install() {
- register_hook('prepare_body', 'addon/langfilter/langfilter.php', 'langfilter_prepare_body', 10);
- register_hook('plugin_settings', 'addon/langfilter/langfilter.php', 'langfilter_addon_settings');
- register_hook('plugin_settings_post', 'addon/langfilter/langfilter.php', 'langfilter_addon_settings_post');
+
+function langfilter_install()
+{
+ Addon::registerHook('prepare_body', 'addon/langfilter/langfilter.php', 'langfilter_prepare_body', 10);
+ Addon::registerHook('addon_settings', 'addon/langfilter/langfilter.php', 'langfilter_addon_settings');
+ Addon::registerHook('addon_settings_post', 'addon/langfilter/langfilter.php', 'langfilter_addon_settings_post');
}
-function langfilter_uninstall() {
- unregister_hook('prepare_body', 'addon/langfilter/langfilter.php', 'langfilter_prepare_body');
- unregister_hook('plugin_settings', 'addon/langfilter/langfilter.php', 'langfilter_addon_settings');
- unregister_hook('plugin_settings_post', 'addon/langfilter/langfilter.php', 'langfilter_addon_settings_post');
+
+function langfilter_uninstall()
+{
+ Addon::unregisterHook('prepare_body', 'addon/langfilter/langfilter.php', 'langfilter_prepare_body');
+ Addon::unregisterHook('addon_settings', 'addon/langfilter/langfilter.php', 'langfilter_addon_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/langfilter/langfilter.php', 'langfilter_addon_settings_post');
}
/* The settings
if(! $languages)
$languages = 'en,de,fr,it,es';
- $t = get_markup_template("settings.tpl", "addon/langfilter/" );
- $s .= replace_macros ($t, array(
- '$title' => t("Language Filter"),
- '$intro' => t ('This addon tries to identify the language of a postings. If it does not match any language spoken by you (see below) the posting will be collapsed. Remember detecting the language is not perfect, especially with short postings.'),
- '$enabled' => array('langfilter_enable', t('Use the language filter'), $enable_checked, ''),
- '$languages' => array('langfilter_languages', t('I speak'), $languages, t('List of abbreviations (iso2 codes) for languages you speak, comma separated. For example "de,it".') ),
- '$minconfidence' => array('langfilter_minconfidence', t('Minimum confidence in language detection'), $minconfidence, t('Minimum confidence in language detection being correct, from 0 to 100. Posts will not be filtered when the confidence of language detection is below this percent value.') ),
- '$minlength' => array('langfilter_minlength', t('Minimum length of message body'), $minlength, t('Minimum length of message body for language filter to be used. Posts shorter than this number of characters will not be filtered.') ),
- '$submit' => t('Save Settings'),
- ));
+ $t = get_markup_template("settings.tpl", "addon/langfilter/");
+ $s .= replace_macros($t, [
+ '$title' => L10n::t("Language Filter"),
+ '$intro' => L10n::t('This addon tries to identify the language of a postings. If it does not match any language spoken by you (see below) the posting will be collapsed. Remember detecting the language is not perfect, especially with short postings.'),
+ '$enabled' => ['langfilter_enable', L10n::t('Use the language filter'), $enable_checked, ''],
+ '$languages' => ['langfilter_languages', L10n::t('I speak'), $languages, L10n::t('List of abbreviations (iso2 codes) for languages you speak, comma separated. For example "de,it".')],
+ '$minconfidence' => ['langfilter_minconfidence', L10n::t('Minimum confidence in language detection'), $minconfidence, L10n::t('Minimum confidence in language detection being correct, from 0 to 100. Posts will not be filtered when the confidence of language detection is below this percent value.')],
+ '$minlength' => ['langfilter_minlength', L10n::t('Minimum length of message body'), $minlength, L10n::t('Minimum length of message body for language filter to be used. Posts shorter than this number of characters will not be filtered.')],
+ '$submit' => L10n::t('Save Settings'),
+ ]);
return;
}
if(! local_user())
return;
- if($_POST['langfilter-settings-submit']) {
- set_pconfig(local_user(),'langfilter','languages',trim($_POST['langfilter_languages']));
- $enable = ((x($_POST,'langfilter_enable')) ? intval($_POST['langfilter_enable']) : 0);
- $disable = 1-$enable;
- set_pconfig(local_user(),'langfilter','disable', $disable);
- $minconfidence = 0+$_POST['langfilter_minconfidence'];
- if ( ! $minconfidence ) $minconfidence = 0;
- else if ( $minconfidence < 0 ) $minconfidence = 0;
- else if ( $minconfidence > 100 ) $minconfidence = 100;
- set_pconfig(local_user(),'langfilter','minconfidence', $minconfidence/100.0);
-
- $minlength = 0+$_POST['langfilter_minlength'];
- if ( ! $minlength ) $minlength = 32;
- else if ( $minlength < 0 ) $minlength = 32;
- set_pconfig(local_user(),'langfilter','minlength', $minlength);
-
- info( t('Language Filter Settings saved.') . EOL);
+ if ($_POST['langfilter-settings-submit']) {
+ PConfig::set(local_user(), 'langfilter', 'languages', trim($_POST['langfilter_languages']));
+ $enable = ((x($_POST, 'langfilter_enable')) ? intval($_POST['langfilter_enable']) : 0);
+ $disable = 1 - $enable;
+ PConfig::set(local_user(), 'langfilter', 'disable', $disable);
+ $minconfidence = 0 + $_POST['langfilter_minconfidence'];
+ if (!$minconfidence) {
+ $minconfidence = 0;
+ } elseif ($minconfidence < 0) {
+ $minconfidence = 0;
+ } elseif ($minconfidence > 100) {
+ $minconfidence = 100;
+ }
+ PConfig::set(local_user(), 'langfilter', 'minconfidence', $minconfidence / 100.0);
+
+ $minlength = 0 + $_POST['langfilter_minlength'];
+ if (!$minlength) {
+ $minlength = 32;
+ } elseif ($minlengt8h < 0) {
+ $minlength = 32;
+ }
+ PConfig::set(local_user(), 'langfilter', 'minlength', $minlength);
+
+ info(L10n::t('Language Filter Settings saved.') . EOL);
}
}
/* Actually filter postings by their language
if ( ! $iso2 ) return;
$spoken = in_array($iso2, $spoken_languages);
- if( ! $spoken ) {
- $rnd = random_string(8);
- $b['html'] = '<div id="langfilter-wrap-' . $rnd . '" class="fakelink" onclick=openClose(\'langfilter-' . $rnd . '\'); >' . sprintf( t('unspoken language %s - Click to open/close'),$lang ) . '</div><div id="langfilter-' . $rnd . '" style="display: none; " >' . $b['html'] . '</div>';
- }
+ if (!$spoken) {
+ $rnd = random_string(8);
+ $b['html'] = '<div id="langfilter-wrap-' . $rnd . '" class="fakelink" onclick=openClose(\'langfilter-' . $rnd . '\'); >' . L10n::t('unspoken language %s - Click to open/close', $lang) . '</div><div id="langfilter-' . $rnd . '" style="display: none; " >' . $b['html'] . '</div>';
+ }
}
?>
*
* ...etc.
*/
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Model\User;
-require_once('include/user.php');
-
-
-function ldapauth_install() {
- register_hook('authenticate', 'addon/ldapauth/ldapauth.php', 'ldapauth_hook_authenticate');
+function ldapauth_install()
+{
+ Addon::registerHook('authenticate', 'addon/ldapauth/ldapauth.php', 'ldapauth_hook_authenticate');
}
-
-function ldapauth_uninstall() {
- unregister_hook('authenticate', 'addon/ldapauth/ldapauth.php', 'ldapauth_hook_authenticate');
+function ldapauth_uninstall()
+{
+ Addon::unregisterHook('authenticate', 'addon/ldapauth/ldapauth.php', 'ldapauth_hook_authenticate');
}
* Version: 0.1
* Author: Michael Vogel <https://pirati.ca/profile/heluecht>
*/
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Util\Network;
function leistungsschutzrecht_install() {
- register_hook('cron', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_cron');
- register_hook('getsiteinfo', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_getsiteinfo');
- register_hook('page_info_data', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_getsiteinfo');
+ Addon::registerHook('cron', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_cron');
+ Addon::registerHook('getsiteinfo', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_getsiteinfo');
+ Addon::registerHook('page_info_data', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_getsiteinfo');
}
function leistungsschutzrecht_uninstall() {
- unregister_hook('cron', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_cron');
- unregister_hook('getsiteinfo', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_getsiteinfo');
- unregister_hook('page_info_data', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_getsiteinfo');
+ Addon::unregisterHook('cron', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_cron');
+ Addon::unregisterHook('getsiteinfo', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_getsiteinfo');
+ Addon::unregisterHook('page_info_data', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_getsiteinfo');
}
function leistungsschutzrecht_getsiteinfo($a, &$siteinfo) {
return $text;
}
-function leistungsschutzrecht_fetchsites() {
- require_once("include/network.php");
-
+function leistungsschutzrecht_fetchsites()
+{
// This list works - but question is how current it is
$url = "http://leistungsschutzrecht-stoppen.d-64.org/blacklist.txt";
- $sitelist = fetch_url($url);
+ $sitelist = Network::fetchUrl($url);
$siteurls = explode(',', $sitelist);
$whitelist = array('tagesschau.de', 'heute.de', 'wdr.de');
- $sites = array();
- foreach ($siteurls AS $site) {
+ $sites = [];
+ foreach ($siteurls as $site) {
if (!in_array($site, $whitelist)) {
$sites[$site] = $site;
}
$url = "http://www.vg-media.de/lizenzen/digitale-verlegerische-angebote/wahrnehmungsberechtigte-digitale-verlegerische-angebote.html";
- $site = fetch_url($url);
+ $site = Network::fetchUrl($url);
$doc = new DOMDocument();
@$doc->loadHTML($site);
msgstr ""
#: libertree.php:69
-msgid "Enable Libertree Post Plugin"
+msgid "Enable Libertree Post Addon"
msgstr ""
#: libertree.php:74
\r
$a->strings["Post to libertree"] = "Enviament a libertree";\r
$a->strings["libertree Post Settings"] = "Ajustos d'enviaments a libertree";\r
-$a->strings["Enable Libertree Post Plugin"] = "Activa el plugin d'enviaments a libertree";\r
+$a->strings["Enable Libertree Post Addon"] = "Activa el addon d'enviaments a libertree";\r
$a->strings["Libertree API token"] = "Libertree API token";\r
$a->strings["Libertree site URL"] = "lloc URL libertree";\r
$a->strings["Post to Libertree by default"] = "Enviar a libertree per defecte";\r
msgstr "libertree nastavení příspěvků"
#: libertree.php:69
-msgid "Enable Libertree Post Plugin"
+msgid "Enable Libertree Post Addon"
msgstr "Povolit Libertree Post rozšíření"
#: libertree.php:74
;
$a->strings["Post to libertree"] = "Poslat na libertree";
$a->strings["libertree Post Settings"] = "libertree nastavení příspěvků";
-$a->strings["Enable Libertree Post Plugin"] = "Povolit Libertree Post rozšíření";
+$a->strings["Enable Libertree Post Addon"] = "Povolit Libertree Post rozšíření";
$a->strings["Libertree API token"] = "Libertree API token";
$a->strings["Libertree site URL"] = "URL adresa Libertree ";
$a->strings["Post to Libertree by default"] = "Defaultně poslat na Libertree";
msgstr "libertree Post Einstellungen"
#: libertree.php:69
-msgid "Enable Libertree Post Plugin"
-msgstr "Libertree Post Plugin aktivieren"
+msgid "Enable Libertree Post Addon"
+msgstr "Libertree Post Addon aktivieren"
#: libertree.php:74
msgid "Libertree API token"
;
$a->strings["Post to libertree"] = "bei libertree veröffentlichen";
$a->strings["libertree Post Settings"] = "libertree Post Einstellungen";
-$a->strings["Enable Libertree Post Plugin"] = "Libertree Post Plugin aktivieren";
+$a->strings["Enable Libertree Post Addon"] = "Libertree Post Addon aktivieren";
$a->strings["Libertree API token"] = "Libertree API Token";
$a->strings["Libertree site URL"] = "Libertree URL";
$a->strings["Post to Libertree by default"] = "Standardmäßig bei libertree veröffentlichen";
\r
$a->strings["Post to libertree"] = "Afiŝi al libertree";\r
$a->strings["libertree Post Settings"] = "Agordoj por Afiŝoj ĉe libertree";\r
-$a->strings["Enable Libertree Post Plugin"] = "Aktivigi Kromprogramon por Afiŝoj ĉe libertree";\r
+$a->strings["Enable Libertree Post Addon"] = "Aktivigi Kromprogramon por Afiŝoj ĉe libertree";\r
$a->strings["Libertree API token"] = "Libertree API ĵetono";\r
$a->strings["Libertree site URL"] = "URL adreso de libertree retejo:";\r
$a->strings["Post to Libertree by default"] = "Defaŭlte afiŝi ĉe Libertree";\r
msgstr "Ajustes de Publicación de Libertree"
#: libertree.php:69
-msgid "Enable Libertree Post Plugin"
-msgstr "Habilitar Plugin de publicación de Libertree"
+msgid "Enable Libertree Post Addon"
+msgstr "Habilitar Addon de publicación de Libertree"
#: libertree.php:74
msgid "Libertree API token"
;
$a->strings["Post to libertree"] = "Publicar en Libertree";
$a->strings["libertree Post Settings"] = "Ajustes de Publicación de Libertree";
-$a->strings["Enable Libertree Post Plugin"] = "Habilitar Plugin de publicación de Libertree";
+$a->strings["Enable Libertree Post Addon"] = "Habilitar Addon de publicación de Libertree";
$a->strings["Libertree API token"] = "Símbolo de API de Libertree";
$a->strings["Libertree site URL"] = "URL de la página de Libertree";
$a->strings["Post to Libertree by default"] = "Publicar en Libertree por defecto";
msgstr "Réglages des messages sur libertree"
#: libertree.php:69
-msgid "Enable Libertree Post Plugin"
-msgstr "Activer le plugin de publication sur libertree"
+msgid "Enable Libertree Post Addon"
+msgstr "Activer leaddonde publication sur libertree"
#: libertree.php:74
msgid "Libertree API token"
;
$a->strings["Post to libertree"] = "Publier sur libertree";
$a->strings["libertree Post Settings"] = "Réglages des messages sur libertree";
-$a->strings["Enable Libertree Post Plugin"] = "Activer le plugin de publication sur libertree";
+$a->strings["Enable Libertree Post Addon"] = "Activer le addon de publication sur libertree";
$a->strings["Libertree API token"] = "Clé de l'API libertree";
$a->strings["Libertree site URL"] = "URL du site libertree";
$a->strings["Post to Libertree by default"] = "Publier sur libertree par défaut";
\r
$a->strings["Post to libertree"] = "";\r
$a->strings["libertree Post Settings"] = "";\r
-$a->strings["Enable Libertree Post Plugin"] = "";\r
+$a->strings["Enable Libertree Post Addon"] = "";\r
$a->strings["Libertree API token"] = "";\r
$a->strings["Libertree site URL"] = "";\r
$a->strings["Post to Libertree by default"] = "";\r
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:18+0000\n"
+"PO-Revision-Date: 2018-03-19 13:22+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
msgstr "Impostazioni di invio a Libertree"
#: libertree.php:69
-msgid "Enable Libertree Post Plugin"
-msgstr "Abilita il plugin di invio a Libertree"
+msgid "Enable Libertree Post Addon"
+msgstr "Abilita il componente aggiuntivo di invio a Libertree"
#: libertree.php:74
msgid "Libertree API token"
;
$a->strings["Post to libertree"] = "Invia a Libertree";
$a->strings["libertree Post Settings"] = "Impostazioni di invio a Libertree";
-$a->strings["Enable Libertree Post Plugin"] = "Abilita il plugin di invio a Libertree";
+$a->strings["Enable Libertree Post Addon"] = "Abilita il componente aggiuntivo di invio a Libertree";
$a->strings["Libertree API token"] = "Token API Libertree";
$a->strings["Libertree site URL"] = "Indirizzo sito Libertree";
$a->strings["Post to Libertree by default"] = "Invia sempre a Libertree";
\r
$a->strings["Post to libertree"] = "";\r
$a->strings["libertree Post Settings"] = "";\r
-$a->strings["Enable Libertree Post Plugin"] = "";\r
+$a->strings["Enable Libertree Post Addon"] = "";\r
$a->strings["Libertree API token"] = "";\r
$a->strings["Libertree site URL"] = "";\r
$a->strings["Post to Libertree by default"] = "";\r
\r
$a->strings["Post to libertree"] = "";\r
$a->strings["libertree Post Settings"] = "";\r
-$a->strings["Enable Libertree Post Plugin"] = "";\r
+$a->strings["Enable Libertree Post Addon"] = "";\r
$a->strings["Libertree API token"] = "";\r
$a->strings["Libertree site URL"] = "";\r
$a->strings["Post to Libertree by default"] = "";\r
msgstr "Configurações de publicação do Libertree"
#: libertree.php:69
-msgid "Enable Libertree Post Plugin"
+msgid "Enable Libertree Post Addon"
msgstr "Habilitar plug-in para publicar no Libertree"
#: libertree.php:74
;
$a->strings["Post to libertree"] = "Publicar no Libertree";
$a->strings["libertree Post Settings"] = "Configurações de publicação do Libertree";
-$a->strings["Enable Libertree Post Plugin"] = "Habilitar plug-in para publicar no Libertree";
+$a->strings["Enable Libertree Post Addon"] = "Habilitar plug-in para publicar no Libertree";
$a->strings["Libertree API token"] = "";
$a->strings["Libertree site URL"] = "";
$a->strings["Post to Libertree by default"] = "Publicar no Libertree por padrão";
msgstr "Configurări Postări libertree "
#: libertree.php:69
-msgid "Enable Libertree Post Plugin"
+msgid "Enable Libertree Post Addon"
msgstr "Activare Modul Postare Libertree"
#: libertree.php:74
;
$a->strings["Post to libertree"] = "Postați pe libertree";
$a->strings["libertree Post Settings"] = "Configurări Postări libertree ";
-$a->strings["Enable Libertree Post Plugin"] = "Activare Modul Postare Libertree";
+$a->strings["Enable Libertree Post Addon"] = "Activare Modul Postare Libertree";
$a->strings["Libertree API token"] = "Token API Libertree";
$a->strings["Libertree site URL"] = "URL site Libertree";
$a->strings["Post to Libertree by default"] = "Postați implicit pe Libertree";
\r
$a->strings["Post to libertree"] = "";\r
$a->strings["libertree Post Settings"] = "";\r
-$a->strings["Enable Libertree Post Plugin"] = "";\r
+$a->strings["Enable Libertree Post Addon"] = "";\r
$a->strings["Libertree API token"] = "";\r
$a->strings["Libertree site URL"] = "";\r
$a->strings["Post to Libertree by default"] = "";\r
\r
$a->strings["Post to libertree"] = "转播到libertree";\r
$a->strings["libertree Post Settings"] = "libertree转播设置";\r
-$a->strings["Enable Libertree Post Plugin"] = "使Libertree转播插件可用";\r
+$a->strings["Enable Libertree Post Addon"] = "使Libertree转播插件可用";\r
$a->strings["Libertree API token"] = "Libertree API令牌";\r
$a->strings["Libertree site URL"] = "Libertree网站URL";\r
$a->strings["Post to Libertree by default"] = "默认地转播到Libertree";\r
<?php
-
/**
* Name: Libertree Post Connector
* Description: Post to libertree accounts
* Version: 1.0
* Author: Tony Baldwin <https://free-haven.org/u/tony>
*/
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Util\Network;
function libertree_install() {
- register_hook('post_local', 'addon/libertree/libertree.php', 'libertree_post_local');
- register_hook('notifier_normal', 'addon/libertree/libertree.php', 'libertree_send');
- register_hook('jot_networks', 'addon/libertree/libertree.php', 'libertree_jot_nets');
- register_hook('connector_settings', 'addon/libertree/libertree.php', 'libertree_settings');
- register_hook('connector_settings_post', 'addon/libertree/libertree.php', 'libertree_settings_post');
+ Addon::registerHook('post_local', 'addon/libertree/libertree.php', 'libertree_post_local');
+ Addon::registerHook('notifier_normal', 'addon/libertree/libertree.php', 'libertree_send');
+ Addon::registerHook('jot_networks', 'addon/libertree/libertree.php', 'libertree_jot_nets');
+ Addon::registerHook('connector_settings', 'addon/libertree/libertree.php', 'libertree_settings');
+ Addon::registerHook('connector_settings_post', 'addon/libertree/libertree.php', 'libertree_settings_post');
}
function libertree_uninstall() {
- unregister_hook('post_local', 'addon/libertree/libertree.php', 'libertree_post_local');
- unregister_hook('notifier_normal', 'addon/libertree/libertree.php', 'libertree_send');
- unregister_hook('jot_networks', 'addon/libertree/libertree.php', 'libertree_jot_nets');
- unregister_hook('connector_settings', 'addon/libertree/libertree.php', 'libertree_settings');
- unregister_hook('connector_settings_post', 'addon/libertree/libertree.php', 'libertree_settings_post');
+ Addon::unregisterHook('post_local', 'addon/libertree/libertree.php', 'libertree_post_local');
+ Addon::unregisterHook('notifier_normal', 'addon/libertree/libertree.php', 'libertree_send');
+ Addon::unregisterHook('jot_networks', 'addon/libertree/libertree.php', 'libertree_jot_nets');
+ Addon::unregisterHook('connector_settings', 'addon/libertree/libertree.php', 'libertree_settings');
+ Addon::unregisterHook('connector_settings_post', 'addon/libertree/libertree.php', 'libertree_settings_post');
}
$ltree_defpost = get_pconfig(local_user(),'libertree','post_by_default');
$selected = ((intval($ltree_defpost) == 1) ? ' checked="checked" ' : '');
$b .= '<div class="profile-jot-net"><input type="checkbox" name="libertree_enable"' . $selected . ' value="1" /> '
- . t('Post to libertree') . '</div>';
+ . L10n::t('Post to libertree') . '</div>';
}
}
/* Add some HTML to the existing form */
$s .= '<span id="settings_libertree_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_libertree_expanded\'); openClose(\'settings_libertree_inflated\');">';
- $s .= '<img class="connector'.$css.'" src="images/libertree.png" /><h3 class="connector">'. t('libertree Export').'</h3>';
+ $s .= '<img class="connector'.$css.'" src="images/libertree.png" /><h3 class="connector">'. L10n::t('libertree Export').'</h3>';
$s .= '</span>';
$s .= '<div id="settings_libertree_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_libertree_expanded\'); openClose(\'settings_libertree_inflated\');">';
- $s .= '<img class="connector'.$css.'" src="images/libertree.png" /><h3 class="connector">'. t('libertree Export').'</h3>';
+ $s .= '<img class="connector'.$css.'" src="images/libertree.png" /><h3 class="connector">'. L10n::t('libertree Export').'</h3>';
$s .= '</span>';
$s .= '<div id="libertree-enable-wrapper">';
- $s .= '<label id="libertree-enable-label" for="libertree-checkbox">' . t('Enable Libertree Post Plugin') . '</label>';
+ $s .= '<label id="libertree-enable-label" for="libertree-checkbox">' . L10n::t('Enable Libertree Post Addon') . '</label>';
$s .= '<input id="libertree-checkbox" type="checkbox" name="libertree" value="1" ' . $checked . '/>';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="libertree-api_token-wrapper">';
- $s .= '<label id="libertree-api_token-label" for="libertree-api_token">' . t('Libertree API token') . '</label>';
+ $s .= '<label id="libertree-api_token-label" for="libertree-api_token">' . L10n::t('Libertree API token') . '</label>';
$s .= '<input id="libertree-api_token" type="text" name="libertree_api_token" value="' . $ltree_api_token . '" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="libertree-url-wrapper">';
- $s .= '<label id="libertree-url-label" for="libertree-url">' . t('Libertree site URL') . '</label>';
+ $s .= '<label id="libertree-url-label" for="libertree-url">' . L10n::t('Libertree site URL') . '</label>';
$s .= '<input id="libertree-url" type="text" name="libertree_url" value="' . $ltree_url . '" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="libertree-bydefault-wrapper">';
- $s .= '<label id="libertree-bydefault-label" for="libertree-bydefault">' . t('Post to Libertree by default') . '</label>';
+ $s .= '<label id="libertree-bydefault-label" for="libertree-bydefault">' . L10n::t('Post to Libertree by default') . '</label>';
$s .= '<input id="libertree-bydefault" type="checkbox" name="libertree_bydefault" value="1" ' . $def_checked . '/>';
$s .= '</div><div class="clear"></div>';
/* provide a submit button */
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="libertree-submit" name="libertree-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="libertree-submit" name="libertree-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
} while ($oldbody != $body);
// convert to markdown
- $body = bb2diaspora($body, false, false);
+ $body = bb2diaspora($body, false);
// Adding the title
if(strlen($title))
// 'token' => $ltree_api_token
);
- $result = post_url($ltree_blog,$params);
+ $result = Network::post($ltree_blog, $params);
logger('libertree: ' . $result);
-
}
}
-
-# Libravatar Plugin
+# Libravatar Addon
by [Klaus Weidenbach](http://friendica.dszdw.net/profile/klaus)
This addon allows you to look up an avatar image for new users and contacts at [Libravatar](http://www.libravatar.com). It will be used if there have not been found any other avatar images yet for example through OpenID.
Libravatar is a free and open replacement for Gravatar. It is a service where people can store an avatar image for their email-addresses. These avatar images can get looked up for example in comment functions, profile pages, etc. on other sites. There exists a central installation at [www.libravatar.com](http://www.libravatar.com), but you can also host it on your own server. If no avatar was found Libravatar will look up at Gravatar as a fallback.
There is no rating available, as it is on Gravatar, so all avatar lookups are g-rated. (Suitable for all audiences.)
-PHP >= 5.3 is required for this plugin!
+PHP >= 5.3 is required for this addon!
You can not use the Libravatar and Gravatar addon at the same time. You need to choose one. If you need other ratings than g you better stay with Gravatar, otherwise it is safe to use Libravatar, because it will fall back to Gravatar if nothing was found at Libravatar.
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:19+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
<?php
/**
* Name: Libravatar Support
- * Description: If there is no avatar image for a new user or contact this plugin will look for one at Libravatar. Please disable Gravatar addon if you use this one. (requires PHP >= 5.3)
+ * Description: If there is no avatar image for a new user or contact this addon will look for one at Libravatar. Please disable Gravatar addon if you use this one. (requires PHP >= 5.3)
* Version: 1.1
* Author: Klaus Weidenbach <http://friendica.dszdw.net/profile/klaus>
*/
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
/**
- * Installs the plugin hook
+ * Installs the addon hook
*/
-function libravatar_install() {
+function libravatar_install()
+{
if (! version_compare(PHP_VERSION, '5.3.0', '>=')) {
- info(t('Could NOT install Libravatar successfully.<br>It requires PHP >= 5.3') .EOL);
+ info(L10n::t('Could NOT install Libravatar successfully.<br>It requires PHP >= 5.3') .EOL);
// avoid registering the hook
return false;
}
- register_hook('avatar_lookup', 'addon/libravatar/libravatar.php', 'libravatar_lookup');
+ Addon::registerHook('avatar_lookup', 'addon/libravatar/libravatar.php', 'libravatar_lookup');
logger("registered libravatar in avatar_lookup hook");
}
/**
- * Removes the plugin hook
+ * Removes the addon hook
*/
-function libravatar_uninstall() {
- unregister_hook('avatar_lookup', 'addon/libravatar/libravatar.php', 'libravatar_lookup');
-
+function libravatar_uninstall()
+{
+ Addon::unregisterHook('avatar_lookup', 'addon/libravatar/libravatar.php', 'libravatar_lookup');
logger("unregistered libravatar in avatar_lookup hook");
}
* @param $a array
* @param &$b array
*/
-function libravatar_lookup($a, &$b) {
- $default_avatar = get_config('libravatar', 'default_img');
+function libravatar_lookup($a, &$b)
+{
+ $default_avatar = Config::get('libravatar', 'default_img');
if (! $default_avatar) {
// if not set, look up if there was one from the gravatar addon
$default_avatar = get_config('gravatar', 'default_img');
// setting default avatar if nothing configured
- if (! $default_avatar)
+ if (!$default_avatar) {
$default_avatar = 'identicon'; // default image will be a random pattern
+ }
}
require_once 'Services/Libravatar.php';
/**
* Display admin settings for this addon
*/
-function libravatar_plugin_admin (&$a, &$o) {
- $t = get_markup_template( "admin.tpl", "addon/libravatar" );
+function libravatar_addon_admin(&$a, &$o)
+{
+ $t = get_markup_template("admin.tpl", "addon/libravatar");
$default_avatar = get_config('libravatar', 'default_img');
// set default values for first configuration
- if(! $default_avatar)
+ if (!$default_avatar) {
$default_avatar = 'identicon'; // pseudo-random geometric pattern based on email hash
+ }
// Available options for the select boxes
- $default_avatars = array(
- 'mm' => t('generic profile image'),
- 'identicon' => t('random geometric pattern'),
- 'monsterid' => t('monster face'),
- 'wavatar' => t('computer generated face'),
- 'retro' => t('retro arcade style face'),
- );
+ $default_avatars = [
+ 'mm' => L10n::t('generic profile image'),
+ 'identicon' => L10n::t('random geometric pattern'),
+ 'monsterid' => L10n::t('monster face'),
+ 'wavatar' => L10n::t('computer generated face'),
+ 'retro' => L10n::t('retro arcade style face'),
+ ];
// Show warning if PHP version is too old
if (! version_compare(PHP_VERSION, '5.3.0', '>=')) {
- $o = '<h5>' .t('Warning') .'</h5><p>';
- $o .= sprintf(t('Your PHP version %s is lower than the required PHP >= 5.3.'), PHP_VERSION);
- $o .= '<br>' .t('This addon is not functional on your server.') .'<p><br>';
+ $o = '<h5>' .L10n::t('Warning') .'</h5><p>';
+ $o .= L10n::t('Your PHP version %s is lower than the required PHP >= 5.3.', PHP_VERSION);
+ $o .= '<br>' .L10n::t('This addon is not functional on your server.') .'<p><br>';
return;
}
dbesc('gravatar')
);
if (count($r)) {
- $o = '<h5>' .t('Information') .'</h5><p>' .t('Gravatar addon is installed. Please disable the Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if nothing was found at Libravatar.') .'</p><br><br>';
+ $o = '<h5>' .L10n::t('Information') .'</h5><p>' .L10n::t('Gravatar addon is installed. Please disable the Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if nothing was found at Libravatar.') .'</p><br><br>';
}
// output Libravatar settings
$o .= '<input type="hidden" name="form_security_token" value="' .get_form_security_token("libravatarsave") .'">';
- $o .= replace_macros( $t, array(
- '$submit' => t('Save Settings'),
- '$default_avatar' => array('avatar', t('Default avatar image'), $default_avatar, t('Select default avatar image if none was found. See README'), $default_avatars),
- ));
+ $o .= replace_macros( $t, [
+ '$submit' => L10n::t('Save Settings'),
+ '$default_avatar' => ['avatar', L10n::t('Default avatar image'), $default_avatar, L10n::t('Select default avatar image if none was found. See README'), $default_avatars],
+ ]);
}
/**
* Save admin settings
*/
-function libravatar_plugin_admin_post (&$a) {
+function libravatar_addon_admin_post(&$a)
+{
check_form_security_token('libravatarrsave');
$default_avatar = ((x($_POST, 'avatar')) ? notags(trim($_POST['avatar'])) : 'identicon');
- set_config('libravatar', 'default_img', $default_avatar);
- info(t('Libravatar settings updated.') .EOL);
+ Config::set('libravatar', 'default_img', $default_avatar);
+ info(L10n::t('Libravatar settings updated.') .EOL);
}
-?>
msgstr ""
#: ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
+msgid "Enable LiveJournal Post Addon"
msgstr ""
#: ljpost.php:77
\r
$a->strings["Post to LiveJournal"] = "Missatge a Livejournal";\r
$a->strings["LiveJournal Post Settings"] = "Configuració d'enviaments a Livejournal";\r
-$a->strings["Enable LiveJournal Post Plugin"] = "Habilitat el plugin d'enviaments a Livejournal";\r
+$a->strings["Enable LiveJournal Post Addon"] = "Habilitat el addon d'enviaments a Livejournal";\r
$a->strings["LiveJournal username"] = "Nom d'usuari a Livejournal";\r
$a->strings["LiveJournal password"] = "Contrasenya a Livejournal";\r
$a->strings["Post to LiveJournal by default"] = "Enviar per defecte a Livejournal";\r
msgstr "Nastavení LiveJournal Post"
#: ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
-msgstr "Povolit LiveJournal Post plugin"
+msgid "Enable LiveJournal Post Addon"
+msgstr "Povolit LiveJournal Post addon"
#: ljpost.php:77
msgid "LiveJournal username"
;
$a->strings["Post to LiveJournal"] = "Poslat na LiveJournal";
$a->strings["LiveJournal Post Settings"] = "Nastavení LiveJournal Post";
-$a->strings["Enable LiveJournal Post Plugin"] = "Povolit LiveJournal Post plugin";
+$a->strings["Enable LiveJournal Post Addon"] = "Povolit LiveJournal Post addon";
$a->strings["LiveJournal username"] = "LiveJournal uživatelské jméno";
$a->strings["LiveJournal password"] = "LiveJournal heslo";
$a->strings["Post to LiveJournal by default"] = "Defaultně umístit na LiveJournal";
msgstr "LiveJournal Veröffentlichungs-Einstellungen"
#: ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
-msgstr "LiveJournal Post Plugin aktivieren"
+msgid "Enable LiveJournal Post Addon"
+msgstr "LiveJournal Post Addon aktivieren"
#: ljpost.php:77
msgid "LiveJournal username"
;
$a->strings["Post to LiveJournal"] = "In LiveJournal veröffentlichen.";
$a->strings["LiveJournal Post Settings"] = "LiveJournal Veröffentlichungs-Einstellungen";
-$a->strings["Enable LiveJournal Post Plugin"] = "LiveJournal Post Plugin aktivieren";
+$a->strings["Enable LiveJournal Post Addon"] = "LiveJournal Post Addon aktivieren";
$a->strings["LiveJournal username"] = "LiveJournal Benutzername";
$a->strings["LiveJournal password"] = "LiveJournal Passwort";
$a->strings["Post to LiveJournal by default"] = "Standardmäßig bei LiveJournal veröffentlichen";
\r
$a->strings["Post to LiveJournal"] = "Afiŝi ĉe LiveJournal";\r
$a->strings["LiveJournal Post Settings"] = "Agordoj pri afiŝoj ĉe LiveJournal";\r
-$a->strings["Enable LiveJournal Post Plugin"] = "Ŝalti la LiveJournal-afiŝo kromprogramon.";\r
+$a->strings["Enable LiveJournal Post Addon"] = "Ŝalti la LiveJournal-afiŝo kromprogramon.";\r
$a->strings["LiveJournal username"] = "LiveJournal Salutnomo";\r
$a->strings["LiveJournal password"] = "LiveJournal pasvorto";\r
$a->strings["Post to LiveJournal by default"] = "Defaŭlte afiŝi al LiveJournal";\r
msgstr "Ajustes de publicación de LiveJournal"
#: ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
-msgstr "Habilitar Plugin de publicción de LiveJournal"
+msgid "Enable LiveJournal Post Addon"
+msgstr "Habilitar Addon de publicción de LiveJournal"
#: ljpost.php:77
msgid "LiveJournal username"
;
$a->strings["Post to LiveJournal"] = "Publicar en LiveJournal";
$a->strings["LiveJournal Post Settings"] = "Ajustes de publicación de LiveJournal";
-$a->strings["Enable LiveJournal Post Plugin"] = "Habilitar Plugin de publicción de LiveJournal";
+$a->strings["Enable LiveJournal Post Addon"] = "Habilitar Addon de publicción de LiveJournal";
$a->strings["LiveJournal username"] = "Nombre de usuario de LiveJournal";
$a->strings["LiveJournal password"] = "Contraseña de LiveJournal";
$a->strings["Post to LiveJournal by default"] = "Publicar en LiveJournal por defecto";
\r
$a->strings["Post to LiveJournal"] = "Poster vers LiveJournal";\r
$a->strings["LiveJournal Post Settings"] = "Réglages LiveJournal";\r
-$a->strings["Enable LiveJournal Post Plugin"] = "Activer \"Poster vers LiveJournal\"";\r
+$a->strings["Enable LiveJournal Post Addon"] = "Activer \"Poster vers LiveJournal\"";\r
$a->strings["LiveJournal username"] = "Nom d'utilisateur LiveJournal";\r
$a->strings["LiveJournal password"] = "Mot de passe";\r
$a->strings["Post to LiveJournal by default"] = "Poster vers LiveJournal par défaut";\r
\r
$a->strings["Post to LiveJournal"] = "";\r
$a->strings["LiveJournal Post Settings"] = "";\r
-$a->strings["Enable LiveJournal Post Plugin"] = "";\r
+$a->strings["Enable LiveJournal Post Addon"] = "";\r
$a->strings["LiveJournal username"] = "";\r
$a->strings["LiveJournal password"] = "";\r
$a->strings["Post to LiveJournal by default"] = "";\r
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:19+0000\n"
+"PO-Revision-Date: 2018-03-19 13:23+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
msgstr "Impostazioni invio a LiveJournal"
#: ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
-msgstr "Abilita il plugin di invio a LiveJournal"
+msgid "Enable LiveJournal Post Addon"
+msgstr "Abilita il componente aggiuntivo di invio a LiveJournal"
#: ljpost.php:77
msgid "LiveJournal username"
;
$a->strings["Post to LiveJournal"] = "Invia a LiveJournal";
$a->strings["LiveJournal Post Settings"] = "Impostazioni invio a LiveJournal";
-$a->strings["Enable LiveJournal Post Plugin"] = "Abilita il plugin di invio a LiveJournal";
+$a->strings["Enable LiveJournal Post Addon"] = "Abilita il componente aggiuntivo di invio a LiveJournal";
$a->strings["LiveJournal username"] = "Nome utente LiveJournal";
$a->strings["LiveJournal password"] = "Password LiveJournal";
$a->strings["Post to LiveJournal by default"] = "Invia sempre a LiveJournal";
\r
$a->strings["Post to LiveJournal"] = "";\r
$a->strings["LiveJournal Post Settings"] = "";\r
-$a->strings["Enable LiveJournal Post Plugin"] = "";\r
+$a->strings["Enable LiveJournal Post Addon"] = "";\r
$a->strings["LiveJournal username"] = "";\r
$a->strings["LiveJournal password"] = "";\r
$a->strings["Post to LiveJournal by default"] = "";\r
\r
$a->strings["Post to LiveJournal"] = "Post do LiveJournal";\r
$a->strings["LiveJournal Post Settings"] = "Ustawienia postów do LiveJournal";\r
-$a->strings["Enable LiveJournal Post Plugin"] = "";\r
+$a->strings["Enable LiveJournal Post Addon"] = "";\r
$a->strings["LiveJournal username"] = "Nazwa użytkownika do LiveJournal";\r
$a->strings["LiveJournal password"] = "Hasło do LiveJournal";\r
$a->strings["Post to LiveJournal by default"] = "automatycznie publikuj na LiveJournal";\r
msgstr "Configurações de publicação no LiveJournal"
#: ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
+msgid "Enable LiveJournal Post Addon"
msgstr "Habilitar plug-in para publicar no LiveJournal"
#: ljpost.php:77
;
$a->strings["Post to LiveJournal"] = "Publicar no LiveJournal";
$a->strings["LiveJournal Post Settings"] = "Configurações de publicação no LiveJournal";
-$a->strings["Enable LiveJournal Post Plugin"] = "Habilitar plug-in para publicar no LiveJournal";
+$a->strings["Enable LiveJournal Post Addon"] = "Habilitar plug-in para publicar no LiveJournal";
$a->strings["LiveJournal username"] = "Nome de usuário no LiveJournal";
$a->strings["LiveJournal password"] = "Senha do LiveJournal";
$a->strings["Post to LiveJournal by default"] = "Publicar no LiveJournal por padrão";
msgstr "Configurări Postări LiveJournal"
#: ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
+msgid "Enable LiveJournal Post Addon"
msgstr "Activare Modul Postare LiveJournal"
#: ljpost.php:77
;
$a->strings["Post to LiveJournal"] = "Postați pe LiveJournal";
$a->strings["LiveJournal Post Settings"] = "Configurări Postări LiveJournal";
-$a->strings["Enable LiveJournal Post Plugin"] = "Activare Modul Postare LiveJournal";
+$a->strings["Enable LiveJournal Post Addon"] = "Activare Modul Postare LiveJournal";
$a->strings["LiveJournal username"] = "Utilizator LiveJournal";
$a->strings["LiveJournal password"] = "Parolă LiveJournal ";
$a->strings["Post to LiveJournal by default"] = "Postați implicit pe LiveJournal";
\r
$a->strings["Post to LiveJournal"] = "";\r
$a->strings["LiveJournal Post Settings"] = "";\r
-$a->strings["Enable LiveJournal Post Plugin"] = "Включить LiveJournal плагин сообщений";\r
+$a->strings["Enable LiveJournal Post Addon"] = "Включить LiveJournal плагин сообщений";\r
$a->strings["LiveJournal username"] = "";\r
$a->strings["LiveJournal password"] = "";\r
$a->strings["Post to LiveJournal by default"] = "";\r
\r
$a->strings["Post to LiveJournal"] = "转播到LiveJournal";\r
$a->strings["LiveJournal Post Settings"] = "LiveJournal转播设置";\r
-$a->strings["Enable LiveJournal Post Plugin"] = "使Livejournal转播插件可用";\r
+$a->strings["Enable LiveJournal Post Addon"] = "使Livejournal转播插件可用";\r
$a->strings["LiveJournal username"] = "LiveJournal用户名";\r
$a->strings["LiveJournal password"] = "LiveJournal密码";\r
$a->strings["Post to LiveJournal by default"] = "默认地转播到LiveJournal";\r
<?php
-
/**
* Name: LiveJournal Post Connector
* Description: Post to LiveJournal
* Author: Cat Gray <https://free-haven.org/profile/catness>
*/
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Network;
+
function ljpost_install() {
- register_hook('post_local', 'addon/ljpost/ljpost.php', 'ljpost_post_local');
- register_hook('notifier_normal', 'addon/ljpost/ljpost.php', 'ljpost_send');
- register_hook('jot_networks', 'addon/ljpost/ljpost.php', 'ljpost_jot_nets');
- register_hook('connector_settings', 'addon/ljpost/ljpost.php', 'ljpost_settings');
- register_hook('connector_settings_post', 'addon/ljpost/ljpost.php', 'ljpost_settings_post');
+ Addon::registerHook('post_local', 'addon/ljpost/ljpost.php', 'ljpost_post_local');
+ Addon::registerHook('notifier_normal', 'addon/ljpost/ljpost.php', 'ljpost_send');
+ Addon::registerHook('jot_networks', 'addon/ljpost/ljpost.php', 'ljpost_jot_nets');
+ Addon::registerHook('connector_settings', 'addon/ljpost/ljpost.php', 'ljpost_settings');
+ Addon::registerHook('connector_settings_post', 'addon/ljpost/ljpost.php', 'ljpost_settings_post');
}
function ljpost_uninstall() {
- unregister_hook('post_local', 'addon/ljpost/ljpost.php', 'ljpost_post_local');
- unregister_hook('notifier_normal', 'addon/ljpost/ljpost.php', 'ljpost_send');
- unregister_hook('jot_networks', 'addon/ljpost/ljpost.php', 'ljpost_jot_nets');
- unregister_hook('connector_settings', 'addon/ljpost/ljpost.php', 'ljpost_settings');
- unregister_hook('connector_settings_post', 'addon/ljpost/ljpost.php', 'ljpost_settings_post');
+ Addon::unregisterHook('post_local', 'addon/ljpost/ljpost.php', 'ljpost_post_local');
+ Addon::unregisterHook('notifier_normal', 'addon/ljpost/ljpost.php', 'ljpost_send');
+ Addon::unregisterHook('jot_networks', 'addon/ljpost/ljpost.php', 'ljpost_jot_nets');
+ Addon::unregisterHook('connector_settings', 'addon/ljpost/ljpost.php', 'ljpost_settings');
+ Addon::unregisterHook('connector_settings_post', 'addon/ljpost/ljpost.php', 'ljpost_settings_post');
}
$lj_defpost = get_pconfig(local_user(),'ljpost','post_by_default');
$selected = ((intval($lj_defpost) == 1) ? ' checked="checked" ' : '');
$b .= '<div class="profile-jot-net"><input type="checkbox" name="ljpost_enable" ' . $selected . ' value="1" /> '
- . t('Post to LiveJournal') . '</div>';
+ . L10n::t('Post to LiveJournal') . '</div>';
}
}
/* Add some HTML to the existing form */
$s .= '<div class="settings-block">';
- $s .= '<h3>' . t('LiveJournal Post Settings') . '</h3>';
+ $s .= '<h3>' . L10n::t('LiveJournal Post Settings') . '</h3>';
$s .= '<div id="ljpost-enable-wrapper">';
- $s .= '<label id="ljpost-enable-label" for="ljpost-checkbox">' . t('Enable LiveJournal Post Plugin') . '</label>';
+ $s .= '<label id="ljpost-enable-label" for="ljpost-checkbox">' . L10n::t('Enable LiveJournal Post Addon') . '</label>';
$s .= '<input id="ljpost-checkbox" type="checkbox" name="ljpost" value="1" ' . $checked . '/>';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="ljpost-username-wrapper">';
- $s .= '<label id="ljpost-username-label" for="ljpost-username">' . t('LiveJournal username') . '</label>';
+ $s .= '<label id="ljpost-username-label" for="ljpost-username">' . L10n::t('LiveJournal username') . '</label>';
$s .= '<input id="ljpost-username" type="text" name="lj_username" value="' . $lj_username . '" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="ljpost-password-wrapper">';
- $s .= '<label id="ljpost-password-label" for="ljpost-password">' . t('LiveJournal password') . '</label>';
+ $s .= '<label id="ljpost-password-label" for="ljpost-password">' . L10n::t('LiveJournal password') . '</label>';
$s .= '<input id="ljpost-password" type="password" name="lj_password" value="' . $lj_password . '" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="ljpost-bydefault-wrapper">';
- $s .= '<label id="ljpost-bydefault-label" for="ljpost-bydefault">' . t('Post to LiveJournal by default') . '</label>';
+ $s .= '<label id="ljpost-bydefault-label" for="ljpost-bydefault">' . L10n::t('Post to LiveJournal by default') . '</label>';
$s .= '<input id="ljpost-bydefault" type="checkbox" name="lj_bydefault" value="1" ' . $def_checked . '/>';
$s .= '</div><div class="clear"></div>';
/* provide a submit button */
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="ljpost-submit" name="ljpost-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="ljpost-submit" name="ljpost-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
$lj_blog = xmlify('http://www.livejournal.com/interface/xmlrpc');
if($lj_username && $lj_password && $lj_blog) {
-
- require_once('include/bbcode.php');
- require_once('include/datetime.php');
-
$title = xmlify($b['title']);
- $post = bbcode($b['body']);
+ $post = BBCode::convert($b['body']);
$post = xmlify($post);
$tags = ljpost_get_tags($b['tag']);
- $date = datetime_convert('UTC',$tz,$b['created'],'Y-m-d H:i:s');
+ $date = DateTimeFormat::convert($b['created'], $tz);
$year = intval(substr($date,0,4));
$mon = intval(substr($date,5,2));
$day = intval(substr($date,8,2));
logger('ljpost: data: ' . $xml, LOGGER_DATA);
- if($lj_blog !== 'test')
- $x = post_url($lj_blog,$xml,array("Content-Type: text/xml"));
+ if ($lj_blog !== 'test') {
+ $x = Network::post($lj_blog, $xml, ["Content-Type: text/xml"]);
+ }
logger('posted to livejournal: ' . ($x) ? $x : '', LOGGER_DEBUG);
-
}
}
* Version: 1.0\r
* Author: Holger Froese\r
*/\r
-\r
+use Friendica\Core\Addon;\r
\r
function mahjongg_install() {\r
- register_hook('app_menu', 'addon/mahjongg/mahjongg.php', 'mahjongg_app_menu');\r
+ Addon::registerHook('app_menu', 'addon/mahjongg/mahjongg.php', 'mahjongg_app_menu');\r
}\r
\r
function mahjongg_uninstall() {\r
- unregister_hook('app_menu', 'addon/mahjongg/mahjongg.php', 'mahjongg_app_menu');\r
+ Addon::unregisterHook('app_menu', 'addon/mahjongg/mahjongg.php', 'mahjongg_app_menu');\r
\r
}\r
\r
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 14:45+0200\n"
+"POT-Creation-Date: 2018-03-11 19:13+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: mailstream.php:55
+#: mailstream.php:77
msgid "From Address"
msgstr ""
-#: mailstream.php:57
+#: mailstream.php:79
msgid "Email address that stream items will appear to be from."
msgstr ""
-#: mailstream.php:60 mailstream.php:282
+#: mailstream.php:82 mailstream.php:380
msgid "Save Settings"
msgstr ""
-#: mailstream.php:165
+#: mailstream.php:223
msgid "Re:"
msgstr ""
-#: mailstream.php:173
+#: mailstream.php:231
msgid "Friendica post"
msgstr ""
-#: mailstream.php:176
+#: mailstream.php:234
msgid "Diaspora post"
msgstr ""
-#: mailstream.php:183
+#: mailstream.php:244
msgid "Feed item"
msgstr ""
-#: mailstream.php:186
+#: mailstream.php:247
msgid "Email"
msgstr ""
-#: mailstream.php:188
+#: mailstream.php:249
msgid "Friendica Item"
msgstr ""
-#: mailstream.php:229
+#: mailstream.php:293
msgid "Upstream"
msgstr ""
-#: mailstream.php:230
+#: mailstream.php:294
msgid "Local"
msgstr ""
-#: mailstream.php:274
+#: mailstream.php:362
+msgid "Enabled"
+msgstr ""
+
+#: mailstream.php:366
msgid "Email Address"
msgstr ""
-#: mailstream.php:276
+#: mailstream.php:368
msgid "Leave blank to use your account email address"
msgstr ""
-#: mailstream.php:279
-msgid "Enabled"
+#: mailstream.php:371
+msgid "Exclude Likes"
+msgstr ""
+
+#: mailstream.php:373
+msgid "Check this to omit mailing \"Like\" notifications"
+msgstr ""
+
+#: mailstream.php:376
+msgid "Attach Images"
+msgstr ""
+
+#: mailstream.php:378
+msgid ""
+"Download images in posts and attach them to the email. Useful for reading "
+"email while offline."
msgstr ""
-#: mailstream.php:281
+#: mailstream.php:379
msgid "Mail Stream Settings"
msgstr ""
#
#
# Translators:
-# Abrax <webmaster@a-zwenkau.de>, 2014
+# Andreas H., 2014
+# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 14:45+0200\n"
-"PO-Revision-Date: 2014-10-14 09:25+0000\n"
-"Last-Translator: Abrax <webmaster@a-zwenkau.de>\n"
-"Language-Team: German (http://www.transifex.com/projects/p/friendica/language/de/)\n"
+"POT-Creation-Date: 2018-03-11 19:13+0100\n"
+"PO-Revision-Date: 2018-03-16 07:45+0000\n"
+"Last-Translator: Tobias Diekershoff <tobias.diekershoff@gmx.net>\n"
+"Language-Team: German (http://www.transifex.com/Friendica/friendica/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: mailstream.php:55
+#: mailstream.php:77
msgid "From Address"
msgstr "Absender"
-#: mailstream.php:57
+#: mailstream.php:79
msgid "Email address that stream items will appear to be from."
msgstr "E-Mail-Adresse, die in hochgeladenen Artikeln erscheint."
-#: mailstream.php:60 mailstream.php:282
+#: mailstream.php:82 mailstream.php:380
msgid "Save Settings"
msgstr "Einstellungen speichern"
-#: mailstream.php:165
+#: mailstream.php:223
msgid "Re:"
msgstr "Re:"
-#: mailstream.php:173
+#: mailstream.php:231
msgid "Friendica post"
msgstr "Friendica Veröffentlichung"
-#: mailstream.php:176
+#: mailstream.php:234
msgid "Diaspora post"
msgstr "Diaspora Veröffentlichung"
-#: mailstream.php:183
+#: mailstream.php:244
msgid "Feed item"
msgstr "Artikel-Feed"
-#: mailstream.php:186
+#: mailstream.php:247
msgid "Email"
msgstr "E-Mail"
-#: mailstream.php:188
+#: mailstream.php:249
msgid "Friendica Item"
msgstr "Friendica Artikel"
-#: mailstream.php:229
+#: mailstream.php:293
msgid "Upstream"
msgstr "Upstream"
-#: mailstream.php:230
+#: mailstream.php:294
msgid "Local"
msgstr "Lokal"
-#: mailstream.php:274
+#: mailstream.php:362
+msgid "Enabled"
+msgstr "eingeschaltet"
+
+#: mailstream.php:366
msgid "Email Address"
msgstr "E-Mail-Adresse"
-#: mailstream.php:276
+#: mailstream.php:368
msgid "Leave blank to use your account email address"
msgstr "Leer lassen für Deine Konto-E-Mail-Addresse"
-#: mailstream.php:279
-msgid "Enabled"
-msgstr "eingeschaltet"
+#: mailstream.php:371
+msgid "Exclude Likes"
+msgstr "Likes ignorieren"
+
+#: mailstream.php:373
+msgid "Check this to omit mailing \"Like\" notifications"
+msgstr "Diese Option verhindert das versenden von \"Like\"-Benachrichtigungen per E-Mail."
+
+#: mailstream.php:376
+msgid "Attach Images"
+msgstr "Bolder anhängen"
+
+#: mailstream.php:378
+msgid ""
+"Download images in posts and attach them to the email. Useful for reading "
+"email while offline."
+msgstr "Sollen Bilder die im Beitrag eingebettet sind als Dateianhang in den E-Mails mit verschickt werden?"
-#: mailstream.php:281
+#: mailstream.php:379
msgid "Mail Stream Settings"
msgstr "Mail-Nachrichten Einstellungen"
$a->strings["Friendica Item"] = "Friendica Artikel";
$a->strings["Upstream"] = "Upstream";
$a->strings["Local"] = "Lokal";
+$a->strings["Enabled"] = "eingeschaltet";
$a->strings["Email Address"] = "E-Mail-Adresse";
$a->strings["Leave blank to use your account email address"] = "Leer lassen für Deine Konto-E-Mail-Addresse";
-$a->strings["Enabled"] = "eingeschaltet";
+$a->strings["Exclude Likes"] = "Likes ignorieren";
+$a->strings["Check this to omit mailing \"Like\" notifications"] = "Diese Option verhindert das versenden von \"Like\"-Benachrichtigungen per E-Mail.";
+$a->strings["Attach Images"] = "Bolder anhängen";
+$a->strings["Download images in posts and attach them to the email. Useful for reading email while offline."] = "Sollen Bilder die im Beitrag eingebettet sind als Dateianhang in den E-Mails mit verschickt werden?";
$a->strings["Mail Stream Settings"] = "Mail-Nachrichten Einstellungen";
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014
+# fabrixxm <fabrix.xm@gmail.com>, 2014,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 14:45+0200\n"
-"PO-Revision-Date: 2014-09-10 13:02+0000\n"
+"POT-Creation-Date: 2018-03-11 19:13+0100\n"
+"PO-Revision-Date: 2018-03-19 13:12+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: mailstream.php:55
+#: mailstream.php:77
msgid "From Address"
msgstr "Indirizzo di invio"
-#: mailstream.php:57
+#: mailstream.php:79
msgid "Email address that stream items will appear to be from."
msgstr "Indirizzo email da cui i messaggi appariranno inviati"
-#: mailstream.php:60 mailstream.php:282
+#: mailstream.php:82 mailstream.php:380
msgid "Save Settings"
msgstr "Salva Impostazioni"
-#: mailstream.php:165
+#: mailstream.php:223
msgid "Re:"
msgstr "R:"
-#: mailstream.php:173
+#: mailstream.php:231
msgid "Friendica post"
msgstr "Messaggio Friendica"
-#: mailstream.php:176
+#: mailstream.php:234
msgid "Diaspora post"
msgstr "Messaggio Diaspora"
-#: mailstream.php:183
+#: mailstream.php:244
msgid "Feed item"
msgstr "Elemento da feed"
-#: mailstream.php:186
+#: mailstream.php:247
msgid "Email"
msgstr "Email"
-#: mailstream.php:188
+#: mailstream.php:249
msgid "Friendica Item"
msgstr "Elemento da Friendica"
-#: mailstream.php:229
+#: mailstream.php:293
msgid "Upstream"
msgstr "Upstream"
-#: mailstream.php:230
+#: mailstream.php:294
msgid "Local"
msgstr "Locale"
-#: mailstream.php:274
+#: mailstream.php:362
+msgid "Enabled"
+msgstr "Abilitato"
+
+#: mailstream.php:366
msgid "Email Address"
msgstr "Indirizzo Email"
-#: mailstream.php:276
+#: mailstream.php:368
msgid "Leave blank to use your account email address"
msgstr "Lascia in bianco per usare l'indirizzo email del tuo account"
-#: mailstream.php:279
-msgid "Enabled"
-msgstr "Abilitato"
+#: mailstream.php:371
+msgid "Exclude Likes"
+msgstr "Escludi \"Mi Piace\""
+
+#: mailstream.php:373
+msgid "Check this to omit mailing \"Like\" notifications"
+msgstr "Seleziona per evitare di inviare notifiche per \"Mi Piace\""
+
+#: mailstream.php:376
+msgid "Attach Images"
+msgstr "Allega Immagini"
+
+#: mailstream.php:378
+msgid ""
+"Download images in posts and attach them to the email. Useful for reading "
+"email while offline."
+msgstr "Scarica le immagini nei messaggi e le allega alle email. Utile per leggere le email mentre si è offline."
-#: mailstream.php:281
+#: mailstream.php:379
msgid "Mail Stream Settings"
msgstr "Impostazioni Mail Stream"
$a->strings["Friendica Item"] = "Elemento da Friendica";
$a->strings["Upstream"] = "Upstream";
$a->strings["Local"] = "Locale";
+$a->strings["Enabled"] = "Abilitato";
$a->strings["Email Address"] = "Indirizzo Email";
$a->strings["Leave blank to use your account email address"] = "Lascia in bianco per usare l'indirizzo email del tuo account";
-$a->strings["Enabled"] = "Abilitato";
+$a->strings["Exclude Likes"] = "Escludi \"Mi Piace\"";
+$a->strings["Check this to omit mailing \"Like\" notifications"] = "Seleziona per evitare di inviare notifiche per \"Mi Piace\"";
+$a->strings["Attach Images"] = "Allega Immagini";
+$a->strings["Download images in posts and attach them to the email. Useful for reading email while offline."] = "Scarica le immagini nei messaggi e le allega alle email. Utile per leggere le email mentre si è offline.";
$a->strings["Mail Stream Settings"] = "Impostazioni Mail Stream";
* Author: Matthew Exon <http://mat.exon.name>
*/
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Database\DBM;
+use Friendica\Util\Network;
+
function mailstream_install() {
- register_hook('plugin_settings', 'addon/mailstream/mailstream.php', 'mailstream_plugin_settings');
- register_hook('plugin_settings_post', 'addon/mailstream/mailstream.php', 'mailstream_plugin_settings_post');
- register_hook('post_local_end', 'addon/mailstream/mailstream.php', 'mailstream_post_hook');
- register_hook('post_remote_end', 'addon/mailstream/mailstream.php', 'mailstream_post_hook');
- register_hook('cron', 'addon/mailstream/mailstream.php', 'mailstream_cron');
+ Addon::registerHook('addon_settings', 'addon/mailstream/mailstream.php', 'mailstream_addon_settings');
+ Addon::registerHook('addon_settings_post', 'addon/mailstream/mailstream.php', 'mailstream_addon_settings_post');
+ Addon::registerHook('post_local_end', 'addon/mailstream/mailstream.php', 'mailstream_post_hook');
+ Addon::registerHook('post_remote_end', 'addon/mailstream/mailstream.php', 'mailstream_post_hook');
+ Addon::registerHook('cron', 'addon/mailstream/mailstream.php', 'mailstream_cron');
if (get_config('mailstream', 'dbversion') == '0.1') {
q('ALTER TABLE `mailstream_item` DROP INDEX `uid`');
}
function mailstream_uninstall() {
- unregister_hook('plugin_settings', 'addon/mailstream/mailstream.php', 'mailstream_plugin_settings');
- unregister_hook('plugin_settings_post', 'addon/mailstream/mailstream.php', 'mailstream_plugin_settings_post');
- unregister_hook('post_local', 'addon/mailstream/mailstream.php', 'mailstream_post_local_hook');
- unregister_hook('post_remote', 'addon/mailstream/mailstream.php', 'mailstream_post_remote_hook');
- unregister_hook('post_local_end', 'addon/mailstream/mailstream.php', 'mailstream_post_local_hook');
- unregister_hook('post_remote_end', 'addon/mailstream/mailstream.php', 'mailstream_post_remote_hook');
- unregister_hook('post_local_end', 'addon/mailstream/mailstream.php', 'mailstream_post_hook');
- unregister_hook('post_remote_end', 'addon/mailstream/mailstream.php', 'mailstream_post_hook');
- unregister_hook('cron', 'addon/mailstream/mailstream.php', 'mailstream_cron');
- unregister_hook('incoming_mail', 'addon/mailstream/mailstream.php', 'mailstream_incoming_mail');
+ Addon::unregisterHook('addon_settings', 'addon/mailstream/mailstream.php', 'mailstream_addon_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/mailstream/mailstream.php', 'mailstream_addon_settings_post');
+ Addon::unregisterHook('post_local', 'addon/mailstream/mailstream.php', 'mailstream_post_local_hook');
+ Addon::unregisterHook('post_remote', 'addon/mailstream/mailstream.php', 'mailstream_post_remote_hook');
+ Addon::unregisterHook('post_local_end', 'addon/mailstream/mailstream.php', 'mailstream_post_local_hook');
+ Addon::unregisterHook('post_remote_end', 'addon/mailstream/mailstream.php', 'mailstream_post_remote_hook');
+ Addon::unregisterHook('post_local_end', 'addon/mailstream/mailstream.php', 'mailstream_post_hook');
+ Addon::unregisterHook('post_remote_end', 'addon/mailstream/mailstream.php', 'mailstream_post_hook');
+ Addon::unregisterHook('cron', 'addon/mailstream/mailstream.php', 'mailstream_cron');
+ Addon::unregisterHook('incoming_mail', 'addon/mailstream/mailstream.php', 'mailstream_incoming_mail');
}
function mailstream_module() {}
-function mailstream_plugin_admin(&$a,&$o) {
- $frommail = get_config('mailstream', 'frommail');
+function mailstream_addon_admin(&$a,&$o) {
+ $frommail = Config::get('mailstream', 'frommail');
$template = get_markup_template('admin.tpl', 'addon/mailstream/');
- $config = array('frommail',
- t('From Address'),
+ $config = ['frommail',
+ L10n::t('From Address'),
$frommail,
- t('Email address that stream items will appear to be from.'));
- $o .= replace_macros($template, array(
+ L10n::t('Email address that stream items will appear to be from.')];
+ $o .= replace_macros($template, [
'$frommail' => $config,
- '$submit' => t('Save Settings')));
+ '$submit' => L10n::t('Save Settings')]);
}
-function mailstream_plugin_admin_post ($a) {
+function mailstream_addon_admin_post ($a) {
if (x($_POST, 'frommail')) {
set_config('mailstream', 'frommail', $_POST['frommail']);
}
foreach (array_merge($matches1[3], $matches2[1]) as $url) {
$redirects;
$cookiejar = tempnam(get_temppath(), 'cookiejar-mailstream-');
- $attachments[$url] = array(
- 'data' => fetch_url($url, true, $redirects, 0, Null, $cookiejar),
+ $attachments[$url] = [
+ 'data' => Network::fetchUrl($url, true, $redirects, 0, null, $cookiejar),
'guid' => hash("crc32", $url),
'filename' => basename($url),
'type' => $a->get_curl_content_type());
}
function mailstream_decode_subject($subject) {
- $html = bbcode($subject);
+ $html = BBCode::convert($subject);
if (!$html) {
return $subject;
}
break;
}
if ($r[0]['title']) {
- return t('Re:') . ' ' . mailstream_decode_subject($r[0]['title']);
+ return L10n::t('Re:') . ' ' . mailstream_decode_subject($r[0]['title']);
}
$parent = $r[0]['thr-parent'];
}
intval($item['contact-id']), intval($item['uid']));
$contact = $r[0];
if ($contact['network'] === 'dfrn') {
- return t("Friendica post");
+ return L10n::t("Friendica post");
}
if ($contact['network'] === 'dspr') {
- return t("Diaspora post");
+ return L10n::t("Diaspora post");
}
if ($contact['network'] === 'face') {
$text = mailstream_decode_subject($item['body']);
return preg_replace('/\\s+/', ' ', $subject);
}
if ($contact['network'] === 'feed') {
- return t("Feed item");
+ return L10n::t("Feed item");
}
if ($contact['network'] === 'mail') {
- return t("Email");
+ return L10n::t("Email");
}
- return t("Friendica Item");
+ return L10n::t("Friendica Item");
}
function mailstream_send($a, $message_id, $item, $user) {
return;
}
require_once(dirname(__file__).'/phpmailer/class.phpmailer.php');
- require_once('include/bbcode.php');
- $attachments = array();
+
+ $attachments = [];
mailstream_do_images($a, $item, $attachments);
$frommail = get_config('mailstream', 'frommail');
if ($frommail == "") {
}
$mail = new PHPmailer;
try {
- $mail->XMailer = 'Friendica Mailstream Plugin';
+ $mail->XMailer = 'Friendica Mailstream Addon';
$mail->SetFrom($frommail, mailstream_sender($item));
$mail->AddAddress($address, $user['username']);
$mail->MessageID = $message_id;
$mail->IsHTML(true);
$mail->CharSet = 'utf-8';
$template = get_markup_template('mail.tpl', 'addon/mailstream/');
- $item['body'] = bbcode($item['body']);
+ $item['body'] = BBCode::convert($item['body']);
$item['url'] = $a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $item['id'];
- $mail->Body = replace_macros($template, array(
- '$upstream' => t('Upstream'),
- '$local' => t('Local'),
- '$item' => $item));
+ $mail->Body = replace_macros($template, [
+ '$upstream' => L10n::t('Upstream'),
+ '$local' => L10n::t('Local'),
+ '$item' => $item]);
mailstream_html_wrap($mail->Body);
if (!$mail->Send()) {
throw new Exception($mail->ErrorInfo);
mailstream_tidy();
}
-function mailstream_plugin_settings(&$a,&$s) {
- $enabled = get_pconfig(local_user(), 'mailstream', 'enabled');
- $address = get_pconfig(local_user(), 'mailstream', 'address');
- $nolikes = get_pconfig(local_user(), 'mailstream', 'nolikes');
- $attachimg= get_pconfig(local_user(), 'mailstream', 'attachimg');
+function mailstream_addon_settings(&$a,&$s) {
+ $enabled = PConfig::get(local_user(), 'mailstream', 'enabled');
+ $address = PConfig::get(local_user(), 'mailstream', 'address');
+ $nolikes = PConfig::get(local_user(), 'mailstream', 'nolikes');
+ $attachimg= PConfig::get(local_user(), 'mailstream', 'attachimg');
$template = get_markup_template('settings.tpl', 'addon/mailstream/');
$s .= replace_macros($template, array(
'$enabled' => array(
'mailstream_enabled',
- t('Enabled'),
- $enabled),
- '$address' => array(
+ L10n::t('Enabled'),
+ $enabled],
+ '$address' => [
'mailstream_address',
- t('Email Address'),
+ L10n::t('Email Address'),
$address,
- t("Leave blank to use your account email address")),
- '$nolikes' => array(
+ L10n::t("Leave blank to use your account email address")],
+ '$nolikes' => [
'mailstream_nolikes',
- t('Exclude Likes'),
+ L10n::t('Exclude Likes'),
$nolikes,
- t("Check this to omit mailing \"Like\" notifications")),
- '$attachimg' => array(
+ L10n::t("Check this to omit mailing \"Like\" notifications")],
+ '$attachimg' => [
'mailstream_attachimg',
- t('Attach Images'),
+ L10n::t('Attach Images'),
$attachimg,
- t("Download images in posts and attach them to the email. Useful for reading email while offline.")),
- '$title' => t('Mail Stream Settings'),
- '$submit' => t('Save Settings')));
+ L10n::t("Download images in posts and attach them to the email. Useful for reading email while offline.")],
+ '$title' => L10n::t('Mail Stream Settings'),
+ '$submit' => L10n::t('Save Settings')]);
}
-function mailstream_plugin_settings_post($a,$post) {
+function mailstream_addon_settings_post($a,$post) {
if ($_POST['mailstream_address'] != "") {
set_pconfig(local_user(), 'mailstream', 'address', $_POST['mailstream_address']);
}
public $UseSendmailOptions = true;
/**
- * Path to PHPMailer plugins.
+ * Path to PHPMailer addons.
* Useful if the SMTP class is not in the PHP include path.
* @var string
* @deprecated Should not be needed now there is an autoloader.
-<div class="settings-block">
- <h3>{{$title}}</h3>
+<span id="settings_mailstream_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose('settings_mailstream_expanded'); openClose('settings_mailstream_inflated');">
+ <h3>{{$title}}</h3>
+</span>
+<div id="settings_mailstream_expanded" class="settings-block" style="display: none;">
+ <span class="fakelink" onclick="openClose('settings_mailstream_expanded'); openClose('settings_mailstream_inflated');">
+ <h3>{{$title}}</h3>
+ </span>
{{include file="field_checkbox.tpl" field=$enabled}}
{{include file="field_input.tpl" field=$address}}
{{include file="field_checkbox.tpl" field=$nolikes}}
"The MathJax addon renders mathematical formulae written using the LaTeX "
"syntax surrounded by the usual $$ or an eqnarray block in the postings of "
"your wall,network tab and private mail."
-msgstr "Il plugin \"MatJax\" renderizza formule matematiche scritta usando la sintassi LaTeX circondate dalle usuali $$ o un blocco eqnarray nei messaggi della tua bacheca, pagina Rete e messaggi privati."
+msgstr "Iladdon\"MatJax\" renderizza formule matematiche scritta usando la sintassi LaTeX circondate dalle usuali $$ o un blocco eqnarray nei messaggi della tua bacheca, pagina Rete e messaggi privati."
#: mathjax.php:38
msgid "Use the MathJax renderer"
}}
;
$a->strings["Settings"] = "Impostazioni";
-$a->strings["The MathJax addon renders mathematical formulae written using the LaTeX syntax surrounded by the usual $$ or an eqnarray block in the postings of your wall,network tab and private mail."] = "Il plugin \"MatJax\" renderizza formule matematiche scritta usando la sintassi LaTeX circondate dalle usuali $$ o un blocco eqnarray nei messaggi della tua bacheca, pagina Rete e messaggi privati.";
+$a->strings["The MathJax addon renders mathematical formulae written using the LaTeX syntax surrounded by the usual $$ or an eqnarray block in the postings of your wall,network tab and private mail."] = "Iladdon\"MatJax\" renderizza formule matematiche scritta usando la sintassi LaTeX circondate dalle usuali $$ o un blocco eqnarray nei messaggi della tua bacheca, pagina Rete e messaggi privati.";
$a->strings["Use the MathJax renderer"] = "Usa il render MathJax";
$a->strings["Submit"] = "Invia";
$a->strings["Settings updated."] = "Impostazioni aggiornate.";
--- /dev/null
+# ADDON mathjax
+# Copyright (C)
+# This file is distributed under the same license as the Friendica mathjax addon package.
+#
+#
+# Translators:
+# 朱陈锬 <tangenters@outlook.com>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: friendica\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-02-27 05:01-0500\n"
+"PO-Revision-Date: 2018-03-01 09:50+0000\n"
+"Last-Translator: 朱陈锬 <tangenters@outlook.com>\n"
+"Language-Team: Chinese (China) (http://www.transifex.com/Friendica/friendica/language/zh_CN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh_CN\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: mathjax.php:36
+msgid "Settings"
+msgstr "设置"
+
+#: mathjax.php:37
+msgid ""
+"The MathJax addon renders mathematical formulae written using the LaTeX "
+"syntax surrounded by the usual $$ or an eqnarray block in the postings of "
+"your wall,network tab and private mail."
+msgstr ""
+
+#: mathjax.php:38
+msgid "Use the MathJax renderer"
+msgstr "使用 MathJax 渲染"
+
+#: mathjax.php:42
+msgid "Submit"
+msgstr "提交"
+
+#: mathjax.php:66
+msgid "Settings updated."
+msgstr "设置已更新"
+
+#: mathjax.php:75
+msgid "MathJax Base URL"
+msgstr ""
+
+#: mathjax.php:75
+msgid ""
+"The URL for the javascript file that should be included to use MathJax. Can "
+"be either the MathJax CDN or another installation of MathJax."
+msgstr ""
-<?php\r
-\r
-$a->strings["Settings"] = "配置";\r
-$a->strings["The MathJax addon renders mathematical formulae written using the LaTeX syntax surrounded by the usual $$ or an eqnarray block in the postings of your wall,network tab and private mail."] = "MathJax插件表示用LaTeX句法的数学公式,围绕$";\r
-$a->strings["Use the MathJax renderer"] = "用MathJax表示器";\r
-$a->strings["Submit"] = "提交";\r
-$a->strings["Settings updated."] = "设置跟新了";\r
-$a->strings["MathJax Base URL"] = "MathJax基础URL";\r
-$a->strings["The URL for the javascript file that should be included to use MathJax. Can be either the MathJax CDN or another installation of MathJax."] = "URL JavaScript文件应该包括为用MathJax。可以MathJax CDN或者别的MathJax安装。";\r
+<?php
+
+if(! function_exists("string_plural_select_zh_cn")) {
+function string_plural_select_zh_cn($n){
+ return 0;;
+}}
+;
+$a->strings["Settings"] = "设置";
+$a->strings["The MathJax addon renders mathematical formulae written using the LaTeX syntax surrounded by the usual $$ or an eqnarray block in the postings of your wall,network tab and private mail."] = "";
+$a->strings["Use the MathJax renderer"] = "使用 MathJax 渲染";
+$a->strings["Submit"] = "提交";
+$a->strings["Settings updated."] = "设置已更新";
+$a->strings["MathJax Base URL"] = "";
+$a->strings["The URL for the javascript file that should be included to use MathJax. Can be either the MathJax CDN or another installation of MathJax."] = "";
<?php
-
/**
* Name: MathJax
* Description: Addon for Friendika to include MathJax (LaTeX math syntax)
* Author: Tobias Diekershoff <https://f.diekershoff.de/profile/tobias>
* License: 3-clause BSD license
*/
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
function mathjax_install() {
- register_hook('page_header', 'addon/mathjax/mathjax.php', 'mathjax_page_header');
- register_hook('plugin_settings', 'addon/mathjax/mathjax.php', 'mathjax_settings');
- register_hook('plugin_settings_post', 'addon/mathjax/mathjax.php', 'mathjax_settings_post');
- logger('installed js_math plugin');
+ Addon::registerHook('page_header', 'addon/mathjax/mathjax.php', 'mathjax_page_header');
+ Addon::registerHook('addon_settings', 'addon/mathjax/mathjax.php', 'mathjax_settings');
+ Addon::registerHook('addon_settings_post', 'addon/mathjax/mathjax.php', 'mathjax_settings_post');
+ logger('installed js_math addon');
}
function mathjax_uninstall() {
- unregister_hook('page_header', 'addon/mathjax/mathjax.php', 'mathjax_page_header');
- unregister_hook('plugin_settings', 'addon/mathjax/mathjax.php', 'mathjax_settings');
- unregister_hook('plugin_settings_post', 'addon/mathjax/mathjax.php', 'mathjax_settings_post');
+ Addon::unregisterHook('page_header', 'addon/mathjax/mathjax.php', 'mathjax_page_header');
+ Addon::unregisterHook('addon_settings', 'addon/mathjax/mathjax.php', 'mathjax_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/mathjax/mathjax.php', 'mathjax_settings_post');
}
function mathjax_settings_post ($a, $post) {
if (! local_user())
$use = get_pconfig(local_user(),'mathjax','use');
$usetext = (($use) ? ' checked="checked" ' : '');
$s .= '<span id="settings_mathjax_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_mathjax_expanded\'); openClose(\'settings_mathjax_inflated\');">';
- $s .= '<h3>MathJax '.t('Settings').'</h3>';
+ $s .= '<h3>MathJax '.L10n::t('Settings').'</h3>';
$s .= '</span>';
$s .= '<div id="settings_mathjax_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_mathjax_expanded\'); openClose(\'settings_mathjax_inflated\');">';
- $s .= '<h3>MathJax '.t('Settings').'</h3>';
+ $s .= '<h3>MathJax '.L10n::t('Settings').'</h3>';
$s .= '</span>';
- $s .= '<p>'.t('The MathJax addon renders mathematical formulae written using the LaTeX syntax surrounded by the usual $$ or an eqnarray block in the postings of your wall,network tab and private mail.').'</p>';
- $s .= '<label id="mathjax_label" for="mathjax_use">'.t('Use the MathJax renderer').'</label>';
+ $s .= '<p>'.L10n::t('The MathJax addon renders mathematical formulae written using the LaTeX syntax surrounded by the usual $$ or an eqnarray block in the postings of your wall,network tab and private mail.').'</p>';
+ $s .= '<label id="mathjax_label" for="mathjax_use">'.L10n::t('Use the MathJax renderer').'</label>';
$s .= '<input id="mathjax_use" type="checkbox" name="mathjax_use" value="1"'. $usetext .' />';
$s .= '<div class="clear"></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="mathjax-submit" name="mathjax-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="mathjax-submit" name="mathjax-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
$s .= '</div>';
}
/* we need to add one JavaScript include command to the html output
}
}
}
-function mathjax_plugin_admin_post (&$a) {
+function mathjax_addon_admin_post (&$a) {
$baseurl = ((x($_POST, 'baseurl')) ? trim($_POST['baseurl']) : 'http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML');
- set_config('mathjax','baseurl',$baseurl);
- info( t('Settings updated.'). EOL);
+ Config::set('mathjax','baseurl',$baseurl);
+ info(L10n::t('Settings updated.'). EOL);
}
-function mathjax_plugin_admin (&$a, &$o) {
+function mathjax_addon_admin (&$a, &$o) {
$t = get_markup_template( "admin.tpl", "addon/mathjax/" );
if (get_config('mathjax','baseurl','') == '') {
set_config('mathjax','baseurl','http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML');
}
- $o = replace_macros( $t, array(
- '$submit' => t('Save Settings'),
- '$baseurl' => array('baseurl', t('MathJax Base URL'), get_config('mathjax','baseurl' ), t('The URL for the javascript file that should be included to use MathJax. Can be either the MathJax CDN or another installation of MathJax.')),
- ));
+ $o = replace_macros( $t, [
+ '$submit' => L10n::t('Save Settings'),
+ '$baseurl' => ['baseurl', L10n::t('MathJax Base URL'), Config::get('mathjax','baseurl' ), L10n::t('The URL for the javascript file that should be included to use MathJax. Can be either the MathJax CDN or another installation of MathJax.')],
+ ]);
}
<?php
-
/**
* Name: MemberSince
* Description: Display membership date in profile
- * Version: 1.0
+ * Version: 1.1
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
- *
+ * Status: Unsupported
*/
-require_once('include/datetime.php');
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Util\DateTimeFormat;
+
+function membersince_install()
+{
+ Addon::registerHook('profile_advanced', 'addon/membersince/membersince.php', 'membersince_display');
+}
+
+function membersince_uninstall()
+{
+ Addon::unregisterHook('profile_advanced', 'addon/membersince/membersince.php', 'membersince_display');
+}
+
+function membersince_display(&$a, &$b)
+{
+ if (current_theme() == 'frio') {
+ // Works in Frio.
+ $doc = new DOMDocument();
+ $doc->loadHTML(mb_convert_encoding($b, 'HTML-ENTITIES', 'UTF-8'));
+
+ $elm = $doc->getElementById('aprofile-fullname');
+
+ $div = $doc->createElement('div');
+ $div->setAttribute('id','aprofile-membersince');
+ $div->setAttribute('class','col-lg-12 col-md-12 col-sm-12 col-xs-12 aprofile');
+
+ // The seperator line.
+ $hr = $doc->createElement('hr','');
+ $hr->setAttribute('class','profile-separator');
+
+ // The label div.
+ $label = $doc->createElement('div', L10n::t('Member since:'));
+ $label->setAttribute('class', 'col-lg-4 col-md-4 col-sm-4 col-xs-12 profile-label-name text-muted');
-function membersince_install(){ register_hook('profile_advanced','addon/membersince/membersince.php','membersince_display'); }
+ // The div for the register date of the profile owner.
+ $entry = $doc->createElement('div', DateTimeFormat::local($a->profile['register_date']));
+ $entry->setAttribute('class', 'col-lg-8 col-md-8 col-sm-8 col-xs-12 profile-entry');
-function membersince_uninstall(){ unregister_hook('profile_advanced','addon/membersince/membersince.php','membersince_display'); }
+ $div->appendChild($hr);
+ $div->appendChild($label);
+ $div->appendChild($entry);
+ $elm->parentNode->insertBefore($div, $elm->nextSibling);
-function membersince_display(&$a,&$b) {
-$b = preg_replace('/<\/dl>/',"</dl>\n\n\n<dl id=\"aprofile-membersince\" class=\"aprofile\">\n<dt>" . t('Member since:') . "</dt>\n<dd>" . datetime_convert('UTC',date_default_timezone_get(),$a->profile['register_date']) . "</dd>\n</dl>" ,$b, 1);
-//$b = str_replace('</div>' . "\n" . '<div id="advanced-profile-name-end"></div>',sprintf( t(' - Member since: %s') . EOL, datetime_convert('UTC',date_default_timezone_get(),$a->profile['register_date'])) . '</div>' . "\n" . '<div id="advanced-profile-name-end"></div>',$b);
-}
\ No newline at end of file
+ $b = $doc->saveHTML();
+ } else {
+ // Works in Vier.
+ $b = preg_replace('/<\/dl>/', "</dl>\n\n\n<dl id=\"aprofile-membersince\" class=\"aprofile\">\n<dt>" . L10n::t('Member since:') . "</dt>\n<dd>" . DateTimeFormat::local($a->profile['register_date']) . "</dd>\n</dl>", $b, 1);
+ }
+}
* - who takes no responsibility for any additional content which may appear herein
*
*/
-
+use Friendica\Core\Addon;
function morechoice_install() {
- register_hook('gender_selector', 'addon/morechoice/morechoice.php', 'morechoice_gender_selector');
- register_hook('sexpref_selector', 'addon/morechoice/morechoice.php', 'morechoice_sexpref_selector');
- register_hook('marital_selector', 'addon/morechoice/morechoice.php', 'morechoice_marital_selector');
+ Addon::registerHook('gender_selector', 'addon/morechoice/morechoice.php', 'morechoice_gender_selector');
+ Addon::registerHook('sexpref_selector', 'addon/morechoice/morechoice.php', 'morechoice_sexpref_selector');
+ Addon::registerHook('marital_selector', 'addon/morechoice/morechoice.php', 'morechoice_marital_selector');
}
function morechoice_uninstall() {
- unregister_hook('gender_selector', 'addon/morechoice/morechoice.php', 'morechoice_gender_selector');
- unregister_hook('sexpref_selector', 'addon/morechoice/morechoice.php', 'morechoice_sexpref_selector');
- unregister_hook('marital_selector', 'addon/morechoice/morechoice.php', 'morechoice_marital_selector');
+ Addon::unregisterHook('gender_selector', 'addon/morechoice/morechoice.php', 'morechoice_gender_selector');
+ Addon::unregisterHook('sexpref_selector', 'addon/morechoice/morechoice.php', 'morechoice_sexpref_selector');
+ Addon::unregisterHook('marital_selector', 'addon/morechoice/morechoice.php', 'morechoice_marital_selector');
// We need to leave this here for a while, because we now have a situation where people can end up with an orphaned hook.
- unregister_hook('poke_verbs', 'addon/morechoice/morechoice.php', 'morechoice_poke_verbs');
+ Addon::unregisterHook('poke_verbs', 'addon/morechoice/morechoice.php', 'morechoice_poke_verbs');
}
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:20+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
* Author: Thomas Willingham <https://kakste.com/profile/beardyunixer>
*
*/
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
-function morepokes_install() {
- register_hook('poke_verbs', 'addon/morepokes/morepokes.php', 'morepokes_poke_verbs');
+function morepokes_install()
+{
+ Addon::registerHook('poke_verbs', 'addon/morepokes/morepokes.php', 'morepokes_poke_verbs');
}
-function morepokes_uninstall() {
- unregister_hook('poke_verbs', 'addon/morepokes/morepokes.php', 'morepokes_poke_verbs');
+function morepokes_uninstall()
+{
+ Addon::unregisterHook('poke_verbs', 'addon/morepokes/morepokes.php', 'morepokes_poke_verbs');
}
-function morepokes_poke_verbs($a,&$b) {
- $b['bitchslap'] = array('bitchslapped', t('bitchslap'), t('bitchslapped'));
- $b['shag'] = array('shag', t('shag'), t('shagged'));
- $b['somethingobscenelybiological'] = array('something obscenely biological', t('do something obscenely biological to'), t('did something obscenely biological to'));
- $b['newpokefeature'] = array('pointed out the poke feature to', t('point out the poke feature to'), t('pointed out the poke feature to'));
- $b['declareundyinglove'] = array('declared undying love for', t('declare undying love for'), t('declared undying love for'));
- $b['patent'] = array('patented', t('patent'), t('patented'));
- $b['strokebeard'] = array('stroked their beard at', t('stroke beard'), t('stroked their beard at'));
- $b['bemoan'] = array('bemoaned the declining standards of modern secondary and tertiary education to', t('bemoan the declining standards of modern secondary and tertiary education to'), t('bemoans the declining standards of modern secondary and tertiary education to'));
- $b['hugs'] = array('hugged', t('hug'), t('hugged'));
- $b['kiss'] = array('kissed', t('kiss'), t('kissed'));
- $b['raiseeyebrows'] = array('raised their eyebrows at', t('raise eyebrows at'), t('raised their eyebrows at'));
- $b['insult'] = array('insulted', t('insult'), t('insulted'));
- $b['praise'] = array('praised', t('praise'), t('praised'));
- $b['bedubiousof'] = array('was dubious of', t('be dubious of'), t('was dubious of'));
- $b['eat'] = array('ate', t('eat'), t('ate'));
- $b['giggleandfawn'] = array('giggled and fawned at', t('giggle and fawn at'), t('giggled and fawned at'));
- $b['doubt'] = array('doubted', t('doubt'), t('doubted'));
- $b['glare'] = array('glared at', t('glare'), t('glared at'));
-;}
+function morepokes_poke_verbs($a, &$b)
+{
+ $b['bitchslap'] = ['bitchslapped', L10n::t('bitchslap'), L10n::t('bitchslapped')];
+ $b['shag'] = ['shag', L10n::t('shag'), L10n::t('shagged')];
+ $b['somethingobscenelybiological'] = ['something obscenely biological', L10n::t('do something obscenely biological to'), L10n::t('did something obscenely biological to')];
+ $b['newpokefeature'] = ['pointed out the poke feature to', L10n::t('point out the poke feature to'), L10n::t('pointed out the poke feature to')];
+ $b['declareundyinglove'] = ['declared undying love for', L10n::t('declare undying love for'), L10n::t('declared undying love for')];
+ $b['patent'] = ['patented', L10n::t('patent'), L10n::t('patented')];
+ $b['strokebeard'] = ['stroked their beard at', L10n::t('stroke beard'), L10n::t('stroked their beard at')];
+ $b['bemoan'] = ['bemoaned the declining standards of modern secondary and tertiary education to', L10n::t('bemoan the declining standards of modern secondary and tertiary education to'), L10n::t('bemoans the declining standards of modern secondary and tertiary education to')];
+ $b['hugs'] = ['hugged', L10n::t('hug'), L10n::t('hugged')];
+ $b['kiss'] = ['kissed', L10n::t('kiss'), L10n::t('kissed')];
+ $b['raiseeyebrows'] = ['raised their eyebrows at', L10n::t('raise eyebrows at'), L10n::t('raised their eyebrows at')];
+ $b['insult'] = ['insulted', L10n::t('insult'), L10n::t('insulted')];
+ $b['praise'] = ['praised', L10n::t('praise'), L10n::t('praised')];
+ $b['bedubiousof'] = ['was dubious of', L10n::t('be dubious of'), L10n::t('was dubious of')];
+ $b['eat'] = ['ate', L10n::t('eat'), L10n::t('ate')];
+ $b['giggleandfawn'] = ['giggled and fawned at', L10n::t('giggle and fawn at'), L10n::t('giggled and fawned at')];
+ $b['doubt'] = ['doubted', L10n::t('doubt'), L10n::t('doubted')];
+ $b['glare'] = ['glared at', L10n::t('glare'), L10n::t('glared at')];
+}
<?php
-
/**
*
* Name: NameThingy
* Description: The Ultimate Random Name Generator
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
+ * Status: Unsupported
*/
-
+use Friendica\Core\Addon;
function namethingy_install() {
- register_hook('app_menu', 'addon/namethingy/namethingy.php', 'namethingy_app_menu');
+ Addon::registerHook('app_menu', 'addon/namethingy/namethingy.php', 'namethingy_app_menu');
}
function namethingy_uninstall() {
- unregister_hook('app_menu', 'addon/namethingy/namethingy.php', 'namethingy_app_menu');
+ Addon::unregisterHook('app_menu', 'addon/namethingy/namethingy.php', 'namethingy_app_menu');
}
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-06-01 14:12+0200\n"
-"PO-Revision-Date: 2014-09-10 14:12+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
<?php
-
/***
* Name: New Member Widget
* Description: Adds a widget for new members into the sidebar of the network page. The widget will be displayed for the 1st 14days of a account existance and contains a link to the new member page and a free-form text the admin can define.
* Author: Tobias Diekershoff <https://f.diekershoff.de/profile/tobias>
***/
-require_once('include/bbcode.php');
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
function newmemberwidget_install () {
- register_hook( 'network_mod_init', 'addon/newmemberwidget/newmemberwidget.php', 'newmemberwidget_network_mod_init');
+ Addon::registerHook( 'network_mod_init', 'addon/newmemberwidget/newmemberwidget.php', 'newmemberwidget_network_mod_init');
logger('newmemberwidget installed');
}
function newmemberwidget_uninstall () {
- unregister_hook( 'network_mod_init', 'addon/newmemberwidget/newmemberwidget.php', 'newmemberwidget_network_mod_init');
+ Addon::unregisterHook( 'network_mod_init', 'addon/newmemberwidget/newmemberwidget.php', 'newmemberwidget_network_mod_init');
}
function newmemberwidget_network_mod_init ( $a, $b) {
if (x($_SESSION['new_member'])) {
$t = '<div id="newmember_widget" class="widget">'.EOL;
- $t .= '<h3>'.t('New Member').'</h3>'.EOL;
- $t .= '<a href="newmember" id="newmemberwidget-tips">' . t('Tips for New Members') . '</a><br />'.EOL;
- if (get_config('newmemberwidget','linkglobalsupport')==1)
- $t .= '<a href="https://forum.friendi.ca/profile/helpers" target="_new">'.t('Global Support Forum').'</a><br />'.EOL;
- if (get_config('newmemberwidget','linklocalsupport')==1)
- $t .= '<a href="'.$a->get_baseurl().'/profile/'.get_config('newmemberwidget','localsupport').'" target="_new">'.t('Local Support Forum').'</a><br />'.EOL;
- $ft = get_config('newmemberwidget','freetext');
+ $t .= '<h3>'.L10n::t('New Member').'</h3>'.EOL;
+ $t .= '<a href="newmember" id="newmemberwidget-tips">' . L10n::t('Tips for New Members') . '</a><br />'.EOL;
+ if (Config::get('newmemberwidget','linkglobalsupport')==1)
+ $t .= '<a href="https://forum.friendi.ca/profile/helpers" target="_new">'.L10n::t('Global Support Forum').'</a><br />'.EOL;
+ if (Config::get('newmemberwidget','linklocalsupport')==1)
+ $t .= '<a href="'.$a->get_baseurl().'/profile/'.Config::get('newmemberwidget','localsupport').'" target="_new">'.L10n::t('Local Support Forum').'</a><br />'.EOL;
+ $ft = Config::get('newmemberwidget','freetext');
if (!trim($ft)=="")
- $t .= '<p>'.bbcode(trim($ft)).'</p>';
+ $t .= '<p>'.BBCode::convert(trim($ft)).'</p>';
$t .= '</div><div class="clear"></div>';
$a->page['aside'] = $t . $a->page['aside'];
}
}
-function newmemberwidget_plugin_admin_post( &$a ) {
- $ft = ((x($_POST, 'freetext')) ? trim($_POST['freetext']) : "");
- $lsn = ((x($_POST, 'localsupportname')) ? notags(trim($_POST['localsupportname'])) : "");
- $gs = intval($_POST['linkglobalsupport']);
- $ls = intval($_POST['linklocalsupport']);
- set_config ( 'newmemberwidget', 'freetext', trim($ft));
- set_config ( 'newmemberwidget', 'linkglobalsupport', $gs);
- set_config ( 'newmemberwidget', 'linklocalsupport', $ls);
- set_config ( 'newmemberwidget', 'localsupport', trim($lsn));
+function newmemberwidget_addon_admin_post(&$a)
+{
+ $ft = ((x($_POST, 'freetext')) ? trim($_POST['freetext']) : "");
+ $lsn = ((x($_POST, 'localsupportname')) ? notags(trim($_POST['localsupportname'])) : "");
+ $gs = intval($_POST['linkglobalsupport']);
+ $ls = intval($_POST['linklocalsupport']);
+ Config::set('newmemberwidget', 'freetext', trim($ft));
+ Config::set('newmemberwidget', 'linkglobalsupport', $gs);
+ Config::set('newmemberwidget', 'linklocalsupport', $ls);
+ Config::set('newmemberwidget', 'localsupport', trim($lsn));
}
-function newmemberwidget_plugin_admin(&$a, &$o){
- $t = get_markup_template('admin.tpl','addon/newmemberwidget');
- $o = replace_macros($t, array(
- '$submit' => t('Save Settings'),
- '$freetext' => array( "freetext", t("Message"), get_config( "newmemberwidget", "freetext" ), t("Your message for new members. You can use bbcode here.")),
- '$linkglobalsupport' => array( "linkglobalsupport", t('Add a link to global support forum'), get_config( 'newmemberwidget', 'linkglobalsupport'), t('Should a link to the global support forum be displayed?')." (<a href='https://forum.friendi.ca/profile/helpers'>@helpers</a>)"),
- '$linklocalsupport' => array( "linklocalsupport", t('Add a link to the local support forum'), get_config( 'newmemberwidget', 'linklocalsupport'), t('If you have a local support forum and want to have a link displayed in the widget, check this box.')),
- '$localsupportname' => array( "localsupportname", t('Name of the local support group'), get_config( 'newmemberwidget', 'localsupport'), t('If you checked the above, specify the <em>nickname</em> of the local support group here (i.e. helpers)')),
- ));
+function newmemberwidget_addon_admin(&$a, &$o)
+{
+ $t = get_markup_template('admin.tpl', 'addon/newmemberwidget');
+ $o = replace_macros($t, [
+ '$submit' => L10n::t('Save Settings'),
+ '$freetext' => [ "freetext", L10n::t("Message"), Config::get("newmemberwidget", "freetext"), L10n::t("Your message for new members. You can use bbcode here.")],
+ '$linkglobalsupport' => [ "linkglobalsupport", L10n::t('Add a link to global support forum'), Config::get('newmemberwidget', 'linkglobalsupport'), L10n::t('Should a link to the global support forum be displayed?')." (<a href='https://forum.friendi.ca/profile/helpers'>@helpers</a>)"],
+ '$linklocalsupport' => [ "linklocalsupport", L10n::t('Add a link to the local support forum'), Config::get('newmemberwidget', 'linklocalsupport'), L10n::t('If you have a local support forum and want to have a link displayed in the widget, check this box.')],
+ '$localsupportname' => [ "localsupportname", L10n::t('Name of the local support group'), Config::get('newmemberwidget', 'localsupport'), L10n::t('If you checked the above, specify the <em>nickname</em> of the local support group here (i.e. helpers)')],
+ ]);
}
-
<?php
-
/**
*
* Name: Notifyall
* Author: Rabuzarus <https://friendica.kommune4.de/profile/rabuzarus> (Port to Friendica)
*/
-require_once('include/Emailer.php');
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\L10n;
+use Friendica\Util\Emailer;
function notifyall_install() {
logger("installed notifyall");
function notifyall_module() {}
-function notifyall_plugin_admin(&$a, &$o) {
-
- $o = '<div></div> <a href="' . z_root() . '/notifyall">' . t('Send email to all members') . '</a></br/>';
+function notifyall_addon_admin(&$a, &$o) {
+ $o = '<div></div> <a href="' . z_root() . '/notifyall">' . L10n::t('Send email to all members') . '</a></br/>';
}
$sitename = $a->config['sitename'];
if (!x($a->config['admin_name']))
- $sender_name = sprintf(t('%s Administrator'), $sitename);
+ $sender_name = L10n::t('%s Administrator', $sitename);
else
- $sender_name = sprintf(t('%1$s, %2$s Administrator'), $a->config['admin_name'], $sitename);
-
+ $sender_name = L10n::t('%1$s, %2$s Administrator', $a->config['admin_name'], $sitename);
+
if (! x($a->config['sender_email']))
$sender_email = 'noreply@' . $a->get_hostname();
else
$subject = $_REQUEST['subject'];
- $textversion = strip_tags(html_entity_decode(bbcode(stripslashes(str_replace(array("\\r", "\\n"),array( "", "\n"), $text))),ENT_QUOTES,'UTF-8'));
+ $textversion = strip_tags(html_entity_decode(BBCode::convert(stripslashes(str_replace(["\\r", "\\n"], ["", "\n"], $text))), ENT_QUOTES, 'UTF-8'));
+
+ $htmlversion = BBCode::convert(stripslashes(str_replace(["\\r", "\\n"], ["", "<br />\n"], $text)));
$htmlversion = bbcode(stripslashes(str_replace(array("\\r","\\n"), array("","<br />\n"),$text)));
// if this is a test, send it only to the admin(s)
// admin_email might be a comma separated list, but we need "a@b','c@d','e@f
- if ( intval($_REQUEST['test'])) {
+ if (intval($_REQUEST['test'])) {
$email = $a->config['admin_email'];
$email = "'" . str_replace(array(" ",","), array("","','"), $email) . "'";
}
$recips = q("SELECT DISTINCT `email` FROM `user` WHERE `verified` AND NOT `account_removed` AND NOT `account_expired` $sql_extra");
- if(! $recips) {
- notice( t('No recipients found.') . EOL);
+ if (! $recips) {
+ notice(L10n::t('No recipients found.') . EOL);
return;
}
- foreach($recips as $recip) {
-
-
- Emailer::send(array(
+ foreach ($recips as $recip) {
+ Emailer::send([
'fromName' => $sender_name,
'fromEmail' => $sender_email,
'replyTo' => $sender_email,
));
}
- notice( t('Emails sent'));
+ notice(L10n::t('Emails sent'));
goaway('admin');
}
-function notifyall_content(&$a) {
- if(! is_site_admin())
+function notifyall_content(&$a)
+{
+ if (! is_site_admin()) {
return;
+ }
- $title = t('Send email to all members of this Friendica instance.');
+ $title = L10n::t('Send email to all members of this Friendica instance.');
- $o = replace_macros(get_markup_template('notifyall_form.tpl','addon/notifyall/'),array(
+ $o = replace_macros(get_markup_template('notifyall_form.tpl', 'addon/notifyall/'), [
'$title' => $title,
'$text' => htmlspecialchars($_REQUEST['text']),
- '$subject' => array('subject',t('Message subject'),$_REQUEST['subject'],''),
- '$test' => array('test',t('Test mode (only send to administrator)'), 0,''),
- '$submit' => t('Submit')
- ));
+ '$subject' => ['subject',L10n::t('Message subject'),$_REQUEST['subject'],''],
+ '$test' => ['test',L10n::t('Test mode (only send to administrator)'), 0,''],
+ '$submit' => L10n::t('Submit')
+ ]);
return $o;
-
}
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:21+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
* Description: Disable "Archives" widget on profile page
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
- *
*
*/
-
-
-function notimeline_install() {
-
- register_hook('plugin_settings', 'addon/notimeline/notimeline.php', 'notimeline_settings');
- register_hook('plugin_settings_post', 'addon/notimeline/notimeline.php', 'notimeline_settings_post');
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+
+function notimeline_install()
+{
+ Addon::registerHook('addon_settings', 'addon/notimeline/notimeline.php', 'notimeline_settings');
+ Addon::registerHook('addon_settings_post', 'addon/notimeline/notimeline.php', 'notimeline_settings_post');
}
-
-function notimeline_uninstall() {
- unregister_hook('plugin_settings', 'addon/notimeline/notimeline.php', 'notimeline_settings');
- unregister_hook('plugin_settings_post', 'addon/notimeline/notimeline.php', 'notimeline_settings_post');
-
+function notimeline_uninstall()
+{
+ Addon::unregisterHook('addon_settings', 'addon/notimeline/notimeline.php', 'notimeline_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/notimeline/notimeline.php', 'notimeline_settings_post');
}
-
-function notimeline_settings_post($a,$post) {
- if(! local_user() || (! x($_POST,'notimeline-submit')))
+function notimeline_settings_post($a, $post)
+{
+ if (!local_user() || (!x($_POST, 'notimeline-submit'))) {
return;
+ }
- set_pconfig(local_user(),'system','no_wall_archive_widget',intval($_POST['notimeline']));
- info( t('No Timeline settings updated.') . EOL);
+ PConfig::set(local_user(), 'system', 'no_wall_archive_widget', intval($_POST['notimeline']));
+ info(L10n::t('No Timeline settings updated.') . EOL);
}
function notimeline_settings(&$a,&$s) {
/* Add some HTML to the existing form */
$s .= '<div class="settings-block">';
- $s .= '<h3>' . t('No Timeline Settings') . '</h3>';
+ $s .= '<h3>' . L10n::t('No Timeline Settings') . '</h3>';
$s .= '<div id="notimeline-wrapper">';
- $s .= '<label id="notimeline-label" for="notimeline-checkbox">' . t('Disable Archive selector on profile wall') . '</label>';
+ $s .= '<label id="notimeline-label" for="notimeline-checkbox">' . L10n::t('Disable Archive selector on profile wall') . '</label>';
$s .= '<input id="notimeline-checkbox" type="checkbox" name="notimeline" value="1" ' . $notimeline_checked . '/>';
$s .= '</div><div class="clear"></div>';
/* provide a submit button */
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="notimeline-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
-
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="notimeline-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
(case insensitive) and if found replaces the content
with a "click to open/close" link, default is closed.
+If you click on the 'Not safe for work' addon under
+/settings/addon a text field appears, where you can
+extend the list of search terms. The terms must be
+seperated by commas.
+
+It is also possible to enter profile URLs as values.
+This is quite useful for the case, that you perhaps
+don't want to see postings by person_A, but person_B
+is one of your contacts and person_B used to reshare
+postings by person_A.
+
+You can also make use of regular expressions.
+They also have to be seperated by commas and the
+regex itself has to be enclosed with slashes:
+
+ ... nsfw, /<REGEX>/, politics,...
+
+---------------
+A few examples:
+---------------
+
+1)
+Let's say you don't want to see postings which contain
+the term 'fake news'
+
+The term could appear in several ways:
+
+fakenews, fake news, fake_news, fake-news, f@ke news,
+f4ke news, f4k3 n3ws, and so on and so on and so on.
+
+You could write every possible version of it as single
+item into your NSFW-filter list, but this can also be
+done with a single regex, which matches all of them:
+
+ /f[@4a]k[3e][-_ ]n[3e]w[sz]/
+
+
+2)
+Another use case could be, that you are simply not
+interested in postings about christmas.
+
+ /christmas(?:[-_ ]?(?:tree|time|eve|pudding))?/
+
+
+ATTENTION:
+
+It is absolutely important, that you use grouping
+parentheses instead of capturing parentheses!!
+
+Grouping parentheses are:
+
+ (?: )
+
+If you use capturing parentheses, which are
+
+ ( )
+
+it will produce errors and the regex won't work and
+at least your targets will not get collapsed.
+
+
+
+3)
+Another possibility is the usage of a so called
+'lookbehind' construct. I'll give an example followed
+by a descripton:
+
+ /(?<!the )\badvent\b/
+
+The \b is a word boundary, what matches the beginning
+and the end of a word. The simple pattern of 'advent'
+would match advent iteself, but also adventure.
+This can be prevented by
+
+ /\badvent\b/
+
+The first part of the regex above
+
+ (?<!the )
+
+is a negative lookbehind. It makes \badvent\b only
+match, if there is no 'the ' before \badvent\b or in
+words:
+
+It looks for 'advent', but doesn't match 'the advent'.
+
+
+For more informations take a look at the PCRE regex
+dialect.
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-27 05:01-0500\n"
+"POT-Creation-Date: 2018-03-15 17:54+0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: nsfw.php:78
-msgid "Not Safe For Work (General Purpose Content Filter) settings"
+#: nsfw.php:77 nsfw.php:81
+msgid "Content Filter (NSFW and more)"
msgstr ""
-#: nsfw.php:80
+#: nsfw.php:85
msgid ""
-"This plugin looks in posts for the words/text you specify below, and "
-"collapses any content containing those keywords so it is not displayed at "
-"inappropriate times, such as sexual innuendo that may be improper in a work "
-"setting. It is polite and recommended to tag any content containing nudity "
-"with #NSFW. This filter can also match any other word/text you specify, and "
-"can thereby be used as a general purpose content filter."
+"This addon searches for specified words/text in posts and collapses them. It "
+"can be used to filter content tagged with for instance #NSFW that may be "
+"deemed inappropriate at certain times or places, such as being at work. It "
+"is also useful for hiding irrelevant or annoying content from direct view."
msgstr ""
-#: nsfw.php:81
+#: nsfw.php:86
msgid "Enable Content filter"
msgstr ""
-#: nsfw.php:84
+#: nsfw.php:89
msgid "Comma separated list of keywords to hide"
msgstr ""
-#: nsfw.php:88
-msgid "Submit"
+#: nsfw.php:93
+msgid "Save Settings"
msgstr ""
-#: nsfw.php:89
+#: nsfw.php:94
msgid "Use /expression/ to provide regular expressions"
msgstr ""
-#: nsfw.php:105
+#: nsfw.php:109
msgid "NSFW Settings saved."
msgstr ""
-#: nsfw.php:157
+#: nsfw.php:167
#, php-format
msgid "%s - Click to open/close"
msgstr ""
<?php\r
\r
$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "Ajustos, Not Safe For Work (Filtre de Contingut de Propòsit General)";\r
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Aquest plugin es veu en enviaments amb les paraules/text que s'especifiquen a continuació , i amagarà qualsevol contingut que contingui les paraules clau de manera que no apareguin en moments inapropiats, com ara insinuacions sexuals que poden ser inadequades en un entorn de treball. És de bona educació i es recomana etiquetar qualsevol contingut que contingui nus amb #NSFW. Aquest filtre també es pot fer coincidir amb qualsevol paraula/text que especifiqueu, i per tant pot ser utilitzat com un filtre general de contingut.";\r
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Aquest addon es veu en enviaments amb les paraules/text que s'especifiquen a continuació , i amagarà qualsevol contingut que contingui les paraules clau de manera que no apareguin en moments inapropiats, com ara insinuacions sexuals que poden ser inadequades en un entorn de treball. És de bona educació i es recomana etiquetar qualsevol contingut que contingui nus amb #NSFW. Aquest filtre també es pot fer coincidir amb qualsevol paraula/text que especifiqueu, i per tant pot ser utilitzat com un filtre general de contingut.";\r
$a->strings["Enable Content filter"] = "Activat el filtre de Contingut";\r
$a->strings["Comma separated list of keywords to hide"] = "Llista separada per comes de paraules clau per ocultar";\r
$a->strings["Submit"] = "Enviar";\r
#: nsfw.php:80
msgid ""
-"This plugin looks in posts for the words/text you specify below, and "
+"This addon looks in posts for the words/text you specify below, and "
"collapses any content containing those keywords so it is not displayed at "
"inappropriate times, such as sexual innuendo that may be improper in a work "
"setting. It is polite and recommended to tag any content containing nudity "
"with #NSFW. This filter can also match any other word/text you specify, and"
" can thereby be used as a general purpose content filter."
-msgstr "Tento plugin hledá v příspěvcích slova zadáná níže a skryje jakýkoliv obsah, který tyto slova obsahuje v prostředích, kde to není vhodné. Je slušné a doporučené jakékoliv příspěvky s mahotou označit s #NSFW. Tento filtr může také vyhledávat jakékoliv Vámi specifikované slovní spojení, takže může být využit jako obecný kontextový filtr."
+msgstr "Tento addon hledá v příspěvcích slova zadáná níže a skryje jakýkoliv obsah, který tyto slova obsahuje v prostředích, kde to není vhodné. Je slušné a doporučené jakékoliv příspěvky s mahotou označit s #NSFW. Tento filtr může také vyhledávat jakékoliv Vámi specifikované slovní spojení, takže může být využit jako obecný kontextový filtr."
#: nsfw.php:81
msgid "Enable Content filter"
}}
;
$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "Not Safe For Work (General Purpose Content Filter) nastavení";
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Tento plugin hledá v příspěvcích slova zadáná níže a skryje jakýkoliv obsah, který tyto slova obsahuje v prostředích, kde to není vhodné. Je slušné a doporučené jakékoliv příspěvky s mahotou označit s #NSFW. Tento filtr může také vyhledávat jakékoliv Vámi specifikované slovní spojení, takže může být využit jako obecný kontextový filtr.";
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Tento addon hledá v příspěvcích slova zadáná níže a skryje jakýkoliv obsah, který tyto slova obsahuje v prostředích, kde to není vhodné. Je slušné a doporučené jakékoliv příspěvky s mahotou označit s #NSFW. Tento filtr může také vyhledávat jakékoliv Vámi specifikované slovní spojení, takže může být využit jako obecný kontextový filtr.";
$a->strings["Enable Content filter"] = "Povolit Kontextový filtr";
$a->strings["Comma separated list of keywords to hide"] = "Čárkou oddělený seznam klíčových slov ke skrytí";
$a->strings["Submit"] = "Odeslat";
#
#
# Translators:
-# Abrax <webmaster@a-zwenkau.de>, 2014
-# bavatar <tobias.diekershoff@gmx.net>, 2014
+# Andreas H., 2014
+# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2014
+# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2014-10-15 12:32+0000\n"
-"Last-Translator: Abrax <webmaster@a-zwenkau.de>\n"
-"Language-Team: German (http://www.transifex.com/projects/p/friendica/language/de/)\n"
+"POT-Creation-Date: 2018-03-15 17:54+0700\n"
+"PO-Revision-Date: 2018-03-16 19:59+0000\n"
+"Last-Translator: Tobias Diekershoff <tobias.diekershoff@gmx.net>\n"
+"Language-Team: German (http://www.transifex.com/Friendica/friendica/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: nsfw.php:78
-msgid "Not Safe For Work (General Purpose Content Filter) settings"
-msgstr "Not Safe for Work (Filter für ungewollte Inhalte) Einstellungen:"
+#: nsfw.php:77 nsfw.php:81
+msgid "Content Filter (NSFW and more)"
+msgstr "Inhaltsfilter (NSFW und mehr)"
-#: nsfw.php:80
+#: nsfw.php:85
msgid ""
-"This plugin looks in posts for the words/text you specify below, and "
-"collapses any content containing those keywords so it is not displayed at "
-"inappropriate times, such as sexual innuendo that may be improper in a work "
-"setting. It is polite and recommended to tag any content containing nudity "
-"with #NSFW. This filter can also match any other word/text you specify, and"
-" can thereby be used as a general purpose content filter."
-msgstr "Dieses Plugin sucht in Beiträgen nach Wörtern oder Textbauteilen die du weiter unten eingibst, findet es diese Bausteine, dann wird der entsprechende Beitrag zusammengefaltet dargestellt. Auf diese Weise wird verhindert, dass Inhalte, wie z.B. sexuelle Anspielungen, in unpassenden Momenten angezeigt werden. Du solltest den #NSFW Tag für Beiträge verwenden von denen du ausgehen kannst, dass andere sie anstößig finden könnten. Su kannst beliebige Wörter in der Filterliste angeben und ihn so als allgemeinen Filter verwenden."
-
-#: nsfw.php:81
+"This addon searches for specified words/text in posts and collapses them. It"
+" can be used to filter content tagged with for instance #NSFW that may be "
+"deemed inappropriate at certain times or places, such as being at work. It "
+"is also useful for hiding irrelevant or annoying content from direct view."
+msgstr "Dieses Addon sucht nach von dir definierten Wörtern bzw. Texten in Beiträgen und kollabiert diese wenn die Wörter gefunden werden. Damit können z.B. Inhalte gefiltert werden, die mit #NSFW (nicht für die Arbeit geeignet) gekennzeichnet sind. Außerdem ist es nützlich um irrelevante oder lästige Inhalte zu verbergen."
+
+#: nsfw.php:86
msgid "Enable Content filter"
msgstr "Aktiviere den Inhaltsfilter"
-#: nsfw.php:84
+#: nsfw.php:89
msgid "Comma separated list of keywords to hide"
msgstr "Durch Kommata getrennte Liste von Schlüsselwörtern die verborgen werden sollen"
-#: nsfw.php:88
-msgid "Submit"
-msgstr "Senden"
+#: nsfw.php:93
+msgid "Save Settings"
+msgstr "Einstellungen speichern"
-#: nsfw.php:89
+#: nsfw.php:94
msgid "Use /expression/ to provide regular expressions"
msgstr "Verwende /expression/ um Reguläre Ausdrücke zu verwenden"
-#: nsfw.php:105
+#: nsfw.php:109
msgid "NSFW Settings saved."
msgstr "NSFW-Einstellungen gespeichert"
-#: nsfw.php:157
+#: nsfw.php:167
#, php-format
msgid "%s - Click to open/close"
msgstr "%s – Zum Öffnen/Schließen klicken"
return ($n != 1);;
}}
;
-$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "Not Safe for Work (Filter für ungewollte Inhalte) Einstellungen:";
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Dieses Plugin sucht in Beiträgen nach Wörtern oder Textbauteilen die du weiter unten eingibst, findet es diese Bausteine, dann wird der entsprechende Beitrag zusammengefaltet dargestellt. Auf diese Weise wird verhindert, dass Inhalte, wie z.B. sexuelle Anspielungen, in unpassenden Momenten angezeigt werden. Du solltest den #NSFW Tag für Beiträge verwenden von denen du ausgehen kannst, dass andere sie anstößig finden könnten. Su kannst beliebige Wörter in der Filterliste angeben und ihn so als allgemeinen Filter verwenden.";
+$a->strings["Content Filter (NSFW and more)"] = "Inhaltsfilter (NSFW und mehr)";
+$a->strings["This addon searches for specified words/text in posts and collapses them. It can be used to filter content tagged with for instance #NSFW that may be deemed inappropriate at certain times or places, such as being at work. It is also useful for hiding irrelevant or annoying content from direct view."] = "Dieses Addon sucht nach von dir definierten Wörtern bzw. Texten in Beiträgen und kollabiert diese wenn die Wörter gefunden werden. Damit können z.B. Inhalte gefiltert werden, die mit #NSFW (nicht für die Arbeit geeignet) gekennzeichnet sind. Außerdem ist es nützlich um irrelevante oder lästige Inhalte zu verbergen.";
$a->strings["Enable Content filter"] = "Aktiviere den Inhaltsfilter";
$a->strings["Comma separated list of keywords to hide"] = "Durch Kommata getrennte Liste von Schlüsselwörtern die verborgen werden sollen";
-$a->strings["Submit"] = "Senden";
+$a->strings["Save Settings"] = "Einstellungen speichern";
$a->strings["Use /expression/ to provide regular expressions"] = "Verwende /expression/ um Reguläre Ausdrücke zu verwenden";
$a->strings["NSFW Settings saved."] = "NSFW-Einstellungen gespeichert";
$a->strings["%s - Click to open/close"] = "%s – Zum Öffnen/Schließen klicken";
--- /dev/null
+# ADDON nsfw
+# Copyright (C)
+# This file is distributed under the same license as the Friendica nsfw addon package.
+#
+#
+# Translators:
+# Andy H3 <andy@hubup.pro>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: friendica\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-03-15 17:54+0700\n"
+"PO-Revision-Date: 2018-03-16 16:07+0000\n"
+"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
+"Language-Team: English (United Kingdom) (http://www.transifex.com/Friendica/friendica/language/en_GB/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en_GB\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: nsfw.php:77 nsfw.php:81
+msgid "Content Filter (NSFW and more)"
+msgstr ""
+
+#: nsfw.php:85
+msgid ""
+"This addon searches for specified words/text in posts and collapses them. It"
+" can be used to filter content tagged with for instance #NSFW that may be "
+"deemed inappropriate at certain times or places, such as being at work. It "
+"is also useful for hiding irrelevant or annoying content from direct view."
+msgstr ""
+
+#: nsfw.php:86
+msgid "Enable Content filter"
+msgstr "Enable content filter"
+
+#: nsfw.php:89
+msgid "Comma separated list of keywords to hide"
+msgstr "Comma separated list of keywords"
+
+#: nsfw.php:93
+msgid "Save Settings"
+msgstr ""
+
+#: nsfw.php:94
+msgid "Use /expression/ to provide regular expressions"
+msgstr "Use /expression/ for regular expressions."
+
+#: nsfw.php:109
+msgid "NSFW Settings saved."
+msgstr "NSFW settings saved."
+
+#: nsfw.php:167
+#, php-format
+msgid "%s - Click to open/close"
+msgstr "%s - Reveal/hide"
--- /dev/null
+<?php
+
+if(! function_exists("string_plural_select_en_gb")) {
+function string_plural_select_en_gb($n){
+ return ($n != 1);;
+}}
+;
+$a->strings["Content Filter (NSFW and more)"] = "";
+$a->strings["This addon searches for specified words/text in posts and collapses them. It can be used to filter content tagged with for instance #NSFW that may be deemed inappropriate at certain times or places, such as being at work. It is also useful for hiding irrelevant or annoying content from direct view."] = "";
+$a->strings["Enable Content filter"] = "Enable content filter";
+$a->strings["Comma separated list of keywords to hide"] = "Comma separated list of keywords";
+$a->strings["Save Settings"] = "";
+$a->strings["Use /expression/ to provide regular expressions"] = "Use /expression/ for regular expressions.";
+$a->strings["NSFW Settings saved."] = "NSFW settings saved.";
+$a->strings["%s - Click to open/close"] = "%s - Reveal/hide";
--- /dev/null
+# ADDON nsfw
+# Copyright (C)
+# This file is distributed under the same license as the Friendica nsfw addon package.
+#
+#
+# Translators:
+# Andy H3 <andy@hubup.pro>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: friendica\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-03-15 17:54+0700\n"
+"PO-Revision-Date: 2018-03-16 16:07+0000\n"
+"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
+"Language-Team: English (United States) (http://www.transifex.com/Friendica/friendica/language/en_US/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en_US\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: nsfw.php:77 nsfw.php:81
+msgid "Content Filter (NSFW and more)"
+msgstr ""
+
+#: nsfw.php:85
+msgid ""
+"This addon searches for specified words/text in posts and collapses them. It"
+" can be used to filter content tagged with for instance #NSFW that may be "
+"deemed inappropriate at certain times or places, such as being at work. It "
+"is also useful for hiding irrelevant or annoying content from direct view."
+msgstr ""
+
+#: nsfw.php:86
+msgid "Enable Content filter"
+msgstr "Enable content filter"
+
+#: nsfw.php:89
+msgid "Comma separated list of keywords to hide"
+msgstr "Comma separated list of keywords"
+
+#: nsfw.php:93
+msgid "Save Settings"
+msgstr ""
+
+#: nsfw.php:94
+msgid "Use /expression/ to provide regular expressions"
+msgstr "Use /expression/ for regular expressions."
+
+#: nsfw.php:109
+msgid "NSFW Settings saved."
+msgstr "NSFW settings saved."
+
+#: nsfw.php:167
+#, php-format
+msgid "%s - Click to open/close"
+msgstr "%s - Reveal/hide"
--- /dev/null
+<?php
+
+if(! function_exists("string_plural_select_en_us")) {
+function string_plural_select_en_us($n){
+ return ($n != 1);;
+}}
+;
+$a->strings["Content Filter (NSFW and more)"] = "";
+$a->strings["This addon searches for specified words/text in posts and collapses them. It can be used to filter content tagged with for instance #NSFW that may be deemed inappropriate at certain times or places, such as being at work. It is also useful for hiding irrelevant or annoying content from direct view."] = "";
+$a->strings["Enable Content filter"] = "Enable content filter";
+$a->strings["Comma separated list of keywords to hide"] = "Comma separated list of keywords";
+$a->strings["Save Settings"] = "";
+$a->strings["Use /expression/ to provide regular expressions"] = "Use /expression/ for regular expressions.";
+$a->strings["NSFW Settings saved."] = "NSFW settings saved.";
+$a->strings["%s - Click to open/close"] = "%s - Reveal/hide";
<?php\r
\r
$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "Not Safe For Work (ĝenerala filtrilo por enhavoj) agordoj";\r
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Tiu kromprogramo serĉas la malsupre agordatajn vortojn en afiŝoj kaj malvidebligis ilin se ili enhavas iun vorton. Tiel, afiŝoj ne montriĝis kiuj enhavas maladekvatan enhavon, ekzemple seksumaj aferoj, kiuj ne estas adekvata, ekzemple en la laborejo. En la reto, oni kutime markas tiajn afiŝojn #NSFW - Not Safe For Work - ne adekvata por la laborejo. La filtrilo ankaŭ serĉas ĉiujn vortojn kiujn vi agordas kaj tial funkcias kiel ĝenerala filtrilo.";\r
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Tiu kromprogramo serĉas la malsupre agordatajn vortojn en afiŝoj kaj malvidebligis ilin se ili enhavas iun vorton. Tiel, afiŝoj ne montriĝis kiuj enhavas maladekvatan enhavon, ekzemple seksumaj aferoj, kiuj ne estas adekvata, ekzemple en la laborejo. En la reto, oni kutime markas tiajn afiŝojn #NSFW - Not Safe For Work - ne adekvata por la laborejo. La filtrilo ankaŭ serĉas ĉiujn vortojn kiujn vi agordas kaj tial funkcias kiel ĝenerala filtrilo.";\r
$a->strings["Enable Content filter"] = "Ŝalti la filtrilo por la enhavo";\r
$a->strings["Comma separated list of keywords to hide"] = "Perkome disigita listo da kaŝontaj ŝlosilvortoj";\r
$a->strings["Submit"] = "Sendi";\r
#: nsfw.php:80
msgid ""
-"This plugin looks in posts for the words/text you specify below, and "
+"This addon looks in posts for the words/text you specify below, and "
"collapses any content containing those keywords so it is not displayed at "
"inappropriate times, such as sexual innuendo that may be improper in a work "
"setting. It is polite and recommended to tag any content containing nudity "
"with #NSFW. This filter can also match any other word/text you specify, and"
" can thereby be used as a general purpose content filter."
-msgstr "Este plugin se fija por el contenido del texto y colapsa todo tema o respuesta que contiene las palabras establecidas. Como tales pueden ser contenido sexual o de otra índole que no conviene desplegar en el trabajo o ambientes correspondientes. Es de buena educación y recomendado de identificar todo tipo de contenido explicito con #NSFW. Este filtro además puede ser usado con cualquier palabra a especificar y por lo tanto ser usado como un filtro generico de contenido."
+msgstr "Este addon se fija por el contenido del texto y colapsa todo tema o respuesta que contiene las palabras establecidas. Como tales pueden ser contenido sexual o de otra índole que no conviene desplegar en el trabajo o ambientes correspondientes. Es de buena educación y recomendado de identificar todo tipo de contenido explicito con #NSFW. Este filtro además puede ser usado con cualquier palabra a especificar y por lo tanto ser usado como un filtro generico de contenido."
#: nsfw.php:81
msgid "Enable Content filter"
}}
;
$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "Configuración \"No apto para trabajar\" (Filtro genérico de contenido)";
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Este plugin se fija por el contenido del texto y colapsa todo tema o respuesta que contiene las palabras establecidas. Como tales pueden ser contenido sexual o de otra índole que no conviene desplegar en el trabajo o ambientes correspondientes. Es de buena educación y recomendado de identificar todo tipo de contenido explicito con #NSFW. Este filtro además puede ser usado con cualquier palabra a especificar y por lo tanto ser usado como un filtro generico de contenido.";
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Este addon se fija por el contenido del texto y colapsa todo tema o respuesta que contiene las palabras establecidas. Como tales pueden ser contenido sexual o de otra índole que no conviene desplegar en el trabajo o ambientes correspondientes. Es de buena educación y recomendado de identificar todo tipo de contenido explicito con #NSFW. Este filtro además puede ser usado con cualquier palabra a especificar y por lo tanto ser usado como un filtro generico de contenido.";
$a->strings["Enable Content filter"] = "Habilitar filtro de contenido";
$a->strings["Comma separated list of keywords to hide"] = "Lista de palabras claves separadas por coma para colapsar el contenido correspondiente.";
$a->strings["Submit"] = "Enviar";
<?php\r
\r
$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "Réglages de \"NSFW\" (filtrage de contenu)";\r
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Cette extension va parcourir les publications à la recherche des mots (ou phrases) que vous spécifierez ci-dessous, et repliera automatiquement tout contenu qui les contiendrait, afin de ne pas risquer de les afficher à un moment inopportun. Comme par exemple des messages à caractère sexuel dans un contexte professionnel. Il est globalement considéré comme correct et poli de \"tagguer\" toute publication contenant de la nudité avec #NSFW (Not Safe For Work - pas pour le boulot). Ce filtre peut également fonctionner pour tout autre texte que vous spécifierez, et pourra ainsi être utilisé comme filtre de contenu générique.";\r
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Cette extension va parcourir les publications à la recherche des mots (ou phrases) que vous spécifierez ci-dessous, et repliera automatiquement tout contenu qui les contiendrait, afin de ne pas risquer de les afficher à un moment inopportun. Comme par exemple des messages à caractère sexuel dans un contexte professionnel. Il est globalement considéré comme correct et poli de \"tagguer\" toute publication contenant de la nudité avec #NSFW (Not Safe For Work - pas pour le boulot). Ce filtre peut également fonctionner pour tout autre texte que vous spécifierez, et pourra ainsi être utilisé comme filtre de contenu générique.";\r
$a->strings["Enable Content filter"] = "Activer le filtrage de contenu";\r
$a->strings["Comma separated list of keywords to hide"] = "Liste de mots-clés - séparés par des virgules - à cacher";\r
$a->strings["Submit"] = "Envoyer";\r
<?php\r
\r
$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "";\r
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";\r
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";\r
$a->strings["Enable Content filter"] = "";\r
$a->strings["Comma separated list of keywords to hide"] = "";\r
$a->strings["Submit"] = "Senda inn";\r
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:21+0000\n"
+"POT-Creation-Date: 2018-03-15 17:54+0700\n"
+"PO-Revision-Date: 2018-03-19 13:18+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: nsfw.php:78
-msgid "Not Safe For Work (General Purpose Content Filter) settings"
-msgstr "Impostazioni per NSWF (Filtro Contenuti Generico)"
+#: nsfw.php:77 nsfw.php:81
+msgid "Content Filter (NSFW and more)"
+msgstr "Filtro Contenuto (NSFW e altro)"
-#: nsfw.php:80
+#: nsfw.php:85
msgid ""
-"This plugin looks in posts for the words/text you specify below, and "
-"collapses any content containing those keywords so it is not displayed at "
-"inappropriate times, such as sexual innuendo that may be improper in a work "
-"setting. It is polite and recommended to tag any content containing nudity "
-"with #NSFW. This filter can also match any other word/text you specify, and"
-" can thereby be used as a general purpose content filter."
-msgstr "Questo plugin cerca nei messagi le parole/testo che inserisci qui sotto, e collassa i messaggi che li contengono, per non mostrare contenuto inappropriato nel momento sbagliato, come contenuto a sfondo sessuale che può essere inappropriato in un ambiente di lavoro. E' educato (e consigliato) taggare i messaggi che contengono nudità con #NSFW (Not Safe For Work: Non Sicuro Per il Lavoro). Questo filtro può cercare anche qualsiasi parola che inserisci, quindi può essere usato come filtro di contenuti generico."
-
-#: nsfw.php:81
+"This addon searches for specified words/text in posts and collapses them. It"
+" can be used to filter content tagged with for instance #NSFW that may be "
+"deemed inappropriate at certain times or places, such as being at work. It "
+"is also useful for hiding irrelevant or annoying content from direct view."
+msgstr "Questo componente aggiuntivo cerca per le parole specificate nei messaggi e li collassa. Può essere usato per filtrare contenuto taggato, per esempio, #NSFW (non sicuro per il lavoro), che puo' risultare inappropriato in certi orari o in certi luoghi, come appunto al lavoro. È anche utile per nascondere contenuto irrilevante o fastidioso."
+
+#: nsfw.php:86
msgid "Enable Content filter"
msgstr "Abilita il Filtro Contenuti"
-#: nsfw.php:84
+#: nsfw.php:89
msgid "Comma separated list of keywords to hide"
msgstr "Elenco separato da virgole di parole da nascondere"
-#: nsfw.php:88
-msgid "Submit"
-msgstr "Invia"
+#: nsfw.php:93
+msgid "Save Settings"
+msgstr "Salva Impostazioni"
-#: nsfw.php:89
+#: nsfw.php:94
msgid "Use /expression/ to provide regular expressions"
msgstr "Utilizza /espressione/ per inserire espressioni regolari"
-#: nsfw.php:105
+#: nsfw.php:109
msgid "NSFW Settings saved."
msgstr "Impostazioni NSFW salvate."
-#: nsfw.php:157
+#: nsfw.php:167
#, php-format
msgid "%s - Click to open/close"
msgstr "%s - Clicca per aprire / chiudere"
return ($n != 1);;
}}
;
-$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "Impostazioni per NSWF (Filtro Contenuti Generico)";
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Questo plugin cerca nei messagi le parole/testo che inserisci qui sotto, e collassa i messaggi che li contengono, per non mostrare contenuto inappropriato nel momento sbagliato, come contenuto a sfondo sessuale che può essere inappropriato in un ambiente di lavoro. E' educato (e consigliato) taggare i messaggi che contengono nudità con #NSFW (Not Safe For Work: Non Sicuro Per il Lavoro). Questo filtro può cercare anche qualsiasi parola che inserisci, quindi può essere usato come filtro di contenuti generico.";
+$a->strings["Content Filter (NSFW and more)"] = "Filtro Contenuto (NSFW e altro)";
+$a->strings["This addon searches for specified words/text in posts and collapses them. It can be used to filter content tagged with for instance #NSFW that may be deemed inappropriate at certain times or places, such as being at work. It is also useful for hiding irrelevant or annoying content from direct view."] = "Questo componente aggiuntivo cerca per le parole specificate nei messaggi e li collassa. Può essere usato per filtrare contenuto taggato, per esempio, #NSFW (non sicuro per il lavoro), che puo' risultare inappropriato in certi orari o in certi luoghi, come appunto al lavoro. È anche utile per nascondere contenuto irrilevante o fastidioso.";
$a->strings["Enable Content filter"] = "Abilita il Filtro Contenuti";
$a->strings["Comma separated list of keywords to hide"] = "Elenco separato da virgole di parole da nascondere";
-$a->strings["Submit"] = "Invia";
+$a->strings["Save Settings"] = "Salva Impostazioni";
$a->strings["Use /expression/ to provide regular expressions"] = "Utilizza /espressione/ per inserire espressioni regolari";
$a->strings["NSFW Settings saved."] = "Impostazioni NSFW salvate.";
$a->strings["%s - Click to open/close"] = "%s - Clicca per aprire / chiudere";
<?php\r
\r
$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "";\r
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";\r
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";\r
$a->strings["Enable Content filter"] = "";\r
$a->strings["Comma separated list of keywords to hide"] = "";\r
$a->strings["Submit"] = "Lagre";\r
<?php\r
\r
$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "";\r
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";\r
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";\r
$a->strings["Enable Content filter"] = "";\r
$a->strings["Comma separated list of keywords to hide"] = "";\r
$a->strings["Submit"] = "Potwierdź";\r
#: nsfw.php:80
msgid ""
-"This plugin looks in posts for the words/text you specify below, and "
+"This addon looks in posts for the words/text you specify below, and "
"collapses any content containing those keywords so it is not displayed at "
"inappropriate times, such as sexual innuendo that may be improper in a work "
"setting. It is polite and recommended to tag any content containing nudity "
}}
;
$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "";
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";
$a->strings["Enable Content filter"] = "Habilitar filtro de conteúdo";
$a->strings["Comma separated list of keywords to hide"] = "";
$a->strings["Submit"] = "Enviar";
#: nsfw.php:80
msgid ""
-"This plugin looks in posts for the words/text you specify below, and "
+"This addon looks in posts for the words/text you specify below, and "
"collapses any content containing those keywords so it is not displayed at "
"inappropriate times, such as sexual innuendo that may be improper in a work "
"setting. It is polite and recommended to tag any content containing nudity "
}}
;
$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "Nesigur Pentru Lucru (Filtrare de Conținut pentru Uz General )";
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Acest modul verifică în postări, cuvintele/textele pe care le specificați mai jos, și cenzurează orice conținut cu aceste cuvinte cheie, astfel încât să nu se afișeze în momentele necorespunzătoare, precum aluziile sexuale ce pot fi necorespunzătoare într-un mediu de lucru. Este politicos și recomandat să etichetați orice conținut cu nuditate, folosind eticheta #NSFW. Acest filtru poate de asemenea, potrivi orice alt cuvânt/text specificat, şi poate fi folosit astfel și ca filtru de conținut cu scop general.";
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Acest modul verifică în postări, cuvintele/textele pe care le specificați mai jos, și cenzurează orice conținut cu aceste cuvinte cheie, astfel încât să nu se afișeze în momentele necorespunzătoare, precum aluziile sexuale ce pot fi necorespunzătoare într-un mediu de lucru. Este politicos și recomandat să etichetați orice conținut cu nuditate, folosind eticheta #NSFW. Acest filtru poate de asemenea, potrivi orice alt cuvânt/text specificat, şi poate fi folosit astfel și ca filtru de conținut cu scop general.";
$a->strings["Enable Content filter"] = "Activare filtru de Conținut";
$a->strings["Comma separated list of keywords to hide"] = "Lista cu separator prin virgulă a cuvintelor cheie, ce vor declanșa ascunderea";
$a->strings["Submit"] = "Trimite";
<?php\r
\r
$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "";\r
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";\r
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";\r
$a->strings["Enable Content filter"] = "Включить фильтр содержимого";\r
$a->strings["Comma separated list of keywords to hide"] = "ключевые слова, которые скрыть (список через запятую)";\r
$a->strings["Submit"] = "Подтвердить";\r
<?php\r
\r
$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "工作不安全(通用内容过滤)设置";\r
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "这个插件找您下面输入的词在所有的文章里,和把包括那些词的内容隐藏,省得不妥当的时候表示,比如性的影射在办公室里。是礼貌和建议的把什么包括裸体的内容跟#NSFW标签。这个过滤也会符合设么别的您输入的词,从而能当通用内容过滤有用的。";\r
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "这个插件找您下面输入的词在所有的文章里,和把包括那些词的内容隐藏,省得不妥当的时候表示,比如性的影射在办公室里。是礼貌和建议的把什么包括裸体的内容跟#NSFW标签。这个过滤也会符合设么别的您输入的词,从而能当通用内容过滤有用的。";\r
$a->strings["Enable Content filter"] = "使内容过滤可用";\r
$a->strings["Comma separated list of keywords to hide"] = "逗号分隔单词要隐藏";\r
$a->strings["Submit"] = "提交";\r
<?php
-
-
/**
* Name: NSFW
* Description: Collapse posts with inappropriate content
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*
*/
-
-function nsfw_install() {
- register_hook('prepare_body', 'addon/nsfw/nsfw.php', 'nsfw_prepare_body', 10);
- register_hook('plugin_settings', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings');
- register_hook('plugin_settings_post', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings_post');
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+
+function nsfw_install()
+{
+ Addon::registerHook('prepare_body', 'addon/nsfw/nsfw.php', 'nsfw_prepare_body', 10);
+ Addon::registerHook('addon_settings', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings');
+ Addon::registerHook('addon_settings_post', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings_post');
}
-function nsfw_uninstall() {
- unregister_hook('prepare_body', 'addon/nsfw/nsfw.php', 'nsfw_prepare_body');
- unregister_hook('plugin_settings', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings');
- unregister_hook('plugin_settings_post', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings_post');
-
+function nsfw_uninstall()
+{
+ Addon::unregisterHook('prepare_body', 'addon/nsfw/nsfw.php', 'nsfw_prepare_body');
+ Addon::unregisterHook('addon_settings', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings_post');
}
// This function isn't perfect and isn't trying to preserve the html structure - it's just a
// quick and dirty filter to pull out embedded photo blobs because 'nsfw' seems to come up
// inside them quite often. We don't need anything fancy, just pull out the data blob so we can
-// check against the rest of the body.
-
-function nsfw_extract_photos($body) {
+// check against the rest of the body.
+function nsfw_extract_photos($body)
+{
$new_body = '';
-
- $img_start = strpos($body,'src="data:');
- $img_end = (($img_start !== false) ? strpos(substr($body,$img_start),'>') : false);
+
+ $img_start = strpos($body, 'src="data:');
+ $img_end = (($img_start !== false) ? strpos(substr($body, $img_start), '>') : false);
$cnt = 0;
while($img_end !== false) {
$img_end += $img_start;
- $new_body = $new_body . substr($body,0,$img_start);
-
+ $new_body = $new_body . substr($body, 0, $img_start);
+
$cnt ++;
- $body = substr($body,0,$img_end);
+ $body = substr($body, 0, $img_end);
- $img_start = strpos($body,'src="data:');
- $img_end = (($img_start !== false) ? strpos(substr($body,$img_start),'>') : false);
+ $img_start = strpos($body, 'src="data:');
+ $img_end = (($img_start !== false) ? strpos(substr($body, $img_start), '>') : false);
}
- if(! $cnt)
+ if (!$cnt) {
return $body;
-
+ }
return $new_body;
}
-
-
-
-function nsfw_addon_settings(&$a,&$s) {
-
-
- if(! local_user())
+function nsfw_addon_settings(&$a, &$s)
+{
+ if (!local_user()) {
return;
+ }
- /* Add our stylesheet to the page so we can make our settings look nice */
+ /* Add our stylesheet to the page so we can make our settings look nice */
- $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' . $a->get_baseurl() . '/addon/nsfw/nsfw.css' . '" media="all" />' . "\r\n";
+ $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' . $a->get_baseurl() . '/addon/nsfw/nsfw.css' . '" media="all" />' . "\r\n";
- $enable_checked = (intval(get_pconfig(local_user(),'nsfw','disable')) ? '' : ' checked="checked" ');
- $words = get_pconfig(local_user(),'nsfw','words');
- if(! $words)
+ $enable_checked = (intval(PConfig::get(local_user(), 'nsfw', 'disable')) ? '' : ' checked="checked" ');
+ $words = PConfig::get(local_user(), 'nsfw', 'words');
+ if (!$words) {
$words = 'nsfw,';
+ }
- $s .= '<span id="settings_nsfw_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_nsfw_expanded\'); openClose(\'settings_nsfw_inflated\');">';
- $s .= '<h3>' . t('Not Safe For Work (General Purpose Content Filter)') . '</h3>';
- $s .= '</span>';
- $s .= '<div id="settings_nsfw_expanded" class="settings-block" style="display: none;">';
- $s .= '<span class="fakelink" onclick="openClose(\'settings_nsfw_expanded\'); openClose(\'settings_nsfw_inflated\');">';
- $s .= '<h3>' . t('Not Safe For Work (General Purpose Content Filter)') . '</h3>';
- $s .= '</span>';
-
- $s .= '<div id="nsfw-wrapper">';
- $s .= '<p>' . t ('This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter.') . '</p>';
- $s .= '<label id="nsfw-enable-label" for="nsfw-enable">' . t('Enable Content filter') . ' </label>';
- $s .= '<input id="nsfw-enable" type="checkbox" name="nsfw-enable" value="1"' . $enable_checked . ' />';
+ $s .= '<span id="settings_nsfw_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_nsfw_expanded\'); openClose(\'settings_nsfw_inflated\');">';
+ $s .= '<h3>' . L10n::t('Content Filter (NSFW and more)') . '</h3>';
+ $s .= '</span>';
+ $s .= '<div id="settings_nsfw_expanded" class="settings-block" style="display: none;">';
+ $s .= '<span class="fakelink" onclick="openClose(\'settings_nsfw_expanded\'); openClose(\'settings_nsfw_inflated\');">';
+ $s .= '<h3>' . L10n::t('Content Filter (NSFW and more)') . '</h3>';
+ $s .= '</span>';
+
+ $s .= '<div id="nsfw-wrapper">';
+ $s .= '<p>' . L10n::t('This addon searches for specified words/text in posts and collapses them. It can be used to filter content tagged with for instance #NSFW that may be deemed inappropriate at certain times or places, such as being at work. It is also useful for hiding irrelevant or annoying content from direct view.') . '</p>';
+ $s .= '<label id="nsfw-enable-label" for="nsfw-enable">' . L10n::t('Enable Content filter') . ' </label>';
+ $s .= '<input id="nsfw-enable" type="checkbox" name="nsfw-enable" value="1"' . $enable_checked . ' />';
$s .= '<div class="clear"></div>';
- $s .= '<label id="nsfw-label" for="nsfw-words">' . t('Comma separated list of keywords to hide') . ' </label>';
- $s .= '<textarea id="nsfw-words" type="text" name="nsfw-words">' . $words .'</textarea>';
- $s .= '</div><div class="clear"></div>';
-
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="nsfw-submit" name="nsfw-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
- $s .= '<div class="nsfw-desc">' . t('Use /expression/ to provide regular expressions') . '</div></div>';
+ $s .= '<label id="nsfw-label" for="nsfw-words">' . L10n::t('Comma separated list of keywords to hide') . ' </label>';
+ $s .= '<textarea id="nsfw-words" type="text" name="nsfw-words">' . $words .'</textarea>';
+ $s .= '</div><div class="clear"></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="nsfw-submit" name="nsfw-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
+ $s .= '<div class="nsfw-desc">' . L10n::t('Use /expression/ to provide regular expressions') . '</div></div>';
return;
-
}
-function nsfw_addon_settings_post(&$a,&$b) {
-
- if(! local_user())
+function nsfw_addon_settings_post(&$a, &$b)
+{
+ if (!local_user()) {
return;
+ }
- if($_POST['nsfw-submit']) {
- set_pconfig(local_user(),'nsfw','words',trim($_POST['nsfw-words']));
- $enable = ((x($_POST,'nsfw-enable')) ? intval($_POST['nsfw-enable']) : 0);
+ if ($_POST['nsfw-submit']) {
+ PConfig::set(local_user(), 'nsfw', 'words', trim($_POST['nsfw-words']));
+ $enable = (x($_POST,'nsfw-enable') ? intval($_POST['nsfw-enable']) : 0);
$disable = 1-$enable;
- set_pconfig(local_user(),'nsfw','disable', $disable);
- info( t('NSFW Settings saved.') . EOL);
+ PConfig::set(local_user(), 'nsfw', 'disable', $disable);
+ info(L10n::t('NSFW Settings saved.') . EOL);
}
}
-function nsfw_prepare_body(&$a,&$b) {
-
+function nsfw_prepare_body(&$a, &$b)
+{
+ // Don't do the check when there is a content warning
+ if (!empty($b['item']['content-warning'])) {
+ return;
+ }
$words = null;
- if(get_pconfig(local_user(),'nsfw','disable'))
+ if (PConfig::get(local_user(), 'nsfw', 'disable')) {
return;
-
- if(local_user()) {
- $words = get_pconfig(local_user(),'nsfw','words');
}
- if($words) {
- $arr = explode(',',$words);
+
+ if (local_user()) {
+ $words = PConfig::get(local_user(), 'nsfw', 'words');
}
- else {
- $arr = array('nsfw');
+ if ($words) {
+ $arr = explode(',', $words);
+ } else {
+ $arr = ['nsfw'];
}
$found = false;
- if(count($arr)) {
-
+ if (count($arr)) {
$body = $b['item']['title'] . "\n" . nsfw_extract_photos($b['html']);
- foreach($arr as $word) {
+ foreach ($arr as $word) {
$word = trim($word);
- if(! strlen($word)) {
+ if (!strlen($word)) {
continue;
}
- if(strpos($word,'/') === 0) {
- if(preg_match($word,$body)) {
+ if (strpos($word,'/') === 0) {
+ if (preg_match($word, $body)) {
$found = true;
break;
}
- }
- else {
- if(stristr($body,$word)) {
+ } else {
+ if (stristr($body, $word)) {
$found = true;
break;
}
- if(is_array($b['item']['tags']) && count($b['item']['tags'])) {
- foreach($b['item']['tags'] as $t) {
- if(stristr($t, '>' . $word . '<' )) {
+ if (is_array($b['item']['tags']) && count($b['item']['tags'])) {
+ foreach ($b['item']['tags'] as $t) {
+ if (stristr($t, '>' . $word . '<')) {
$found = true;
break;
}
}
}
}
- if($found) {
+
+ if ($found) {
$rnd = random_string(8);
- $b['html'] = '<div id="nsfw-wrap-' . $rnd . '" class="fakelink" onclick=openClose(\'nsfw-' . $rnd . '\'); >' . sprintf( t('%s - Click to open/close'),$word ) . '</div><div id="nsfw-' . $rnd . '" style="display: none; " >' . $b['html'] . '</div>';
+ $b['html'] = '<div id="nsfw-wrap-' . $rnd . '" class="fakelink" onclick=openClose(\'nsfw-' . $rnd . '\'); >' . L10n::t('%s - Click to open/close', $word) . '</div><div id="nsfw-' . $rnd . '" style="display: none; " >' . $b['html'] . '</div>';
}
}
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:21+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
* Description: Change number of contacts shown of profile sidebar
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
- *
- *
*/
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
function numfriends_install() {
- register_hook('plugin_settings', 'addon/numfriends/numfriends.php', 'numfriends_settings');
- register_hook('plugin_settings_post', 'addon/numfriends/numfriends.php', 'numfriends_settings_post');
+ Addon::registerHook('addon_settings', 'addon/numfriends/numfriends.php', 'numfriends_settings');
+ Addon::registerHook('addon_settings_post', 'addon/numfriends/numfriends.php', 'numfriends_settings_post');
logger("installed numfriends");
}
function numfriends_uninstall() {
- unregister_hook('plugin_settings', 'addon/numfriends/numfriends.php', 'numfriends_settings');
- unregister_hook('plugin_settings_post', 'addon/numfriends/numfriends.php', 'numfriends_settings_post');
+ Addon::unregisterHook('addon_settings', 'addon/numfriends/numfriends.php', 'numfriends_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/numfriends/numfriends.php', 'numfriends_settings_post');
logger("removed numfriends");
}
-
-
/**
*
* Callback from the settings post function.
* and if so set our configuration setting for this person.
*
*/
-
function numfriends_settings_post($a,$post) {
if(! local_user() || (! x($_POST,'numfriends-submit')))
return;
- set_pconfig(local_user(),'system','display_friend_count',intval($_POST['numfriends']));
- info( t('Numfriends settings updated.') . EOL);
+ PConfig::set(local_user(),'system','display_friend_count',intval($_POST['numfriends']));
+ info( L10n::t('Numfriends settings updated.') . EOL);
}
/**
*
- * Called from the Plugin Setting form.
+ * Called from the Addon Setting form.
* Add our own settings info to the page.
*
*/
-
-
-
-function numfriends_settings(&$a,&$s) {
-
- if(! local_user())
+function numfriends_settings(&$a, &$s)
+{
+ if (! local_user()) {
return;
/* Add our stylesheet to the page so we can make our settings look nice */
/* Add some HTML to the existing form */
$s .= '<div class="settings-block">';
- $s .= '<h3>' . t('Numfriends Settings') . '</h3>';
+ $s .= '<h3>' . L10n::t('Numfriends Settings') . '</h3>';
$s .= '<div id="numfriends-wrapper">';
- $s .= '<label id="numfriends-label" for="numfriends">' . t('How many contacts to display on profile sidebar') . '</label>';
+ $s .= '<label id="numfriends-label" for="numfriends">' . L10n::t('How many contacts to display on profile sidebar') . '</label>';
$s .= '<input id="numfriends-input" type="text" name="numfriends" value="' . intval($numfriends) . '" ' . '/>';
$s .= '</div><div class="clear"></div>';
/* provide a submit button */
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="numfriends-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
-
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="numfriends-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
- ____ OpenStreetMap Plugin ____
+ ____ OpenStreetMap Addon ____
by Mike Macgirvin
Klaus Weidenbach
___ Requirements ___
-To use this plugin you need a tile Server that provides the maps.
+To use this addon you need a tile Server that provides the maps.
OpenStreetMap data is free for everyone to use. Their tile servers are not.
Please take a look at their "Tile Usage Policy":
http://wiki.openstreetmap.org/wiki/Tile_usage_policy
If you for any reason prefer to use a configuration file instead
of the admin panels, please refer to the Alternative Configuration below.
-Activate the plugin from your admin panel.
+Activate the addon from your admin panel.
-You can now add a Tile Server and default zoom level in the plugin settings
+You can now add a Tile Server and default zoom level in the addon settings
page of your admin panel.
The Time Server URL points to the tile server you want to use. Use the full URL,
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:21+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
* Author: Klaus Weidenbach
*
*/
-
-require_once('include/cache.php');
-
-
-function openstreetmap_install() {
- register_hook('render_location', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_location');
- register_hook('generate_map', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_generate_map');
- register_hook('generate_named_map', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_generate_named_map');
- register_hook('page_header', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_alterheader');
+use Friendica\Core\Addon;
+use Friendica\Core\Cache;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\System;
+use Friendica\Util\Network;
+
+const OSM_TMS = 'http://www.openstreetmap.org';
+const OSM_NOM = 'http://nominatim.openstreetmap.org/search.php';
+const OSM_ZOOM = 16;
+const OSM_MARKER = 0;
+
+function openstreetmap_install()
+{
+ Addon::registerHook('render_location', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_location');
+ Addon::registerHook('generate_map', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_generate_map');
+ Addon::registerHook('generate_named_map', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_generate_named_map');
+ Addon::registerHook('Map::getCoordinates', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_get_coordinates');
+ Addon::registerHook('page_header', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_alterheader');
logger("installed openstreetmap");
}
-function openstreetmap_uninstall() {
- unregister_hook('render_location', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_location');
- unregister_hook('generate_map', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_generate_map');
- unregister_hook('generate_named_map', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_generate_named_map');
- unregister_hook('page_header', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_alterheader');
+function openstreetmap_uninstall()
+{
+ Addon::unregisterHook('render_location', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_location');
+ Addon::unregisterHook('generate_map', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_generate_map');
+ Addon::unregisterHook('generate_named_map', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_generate_named_map');
+ Addon::unregisterHook('Map::getCoordinates', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_get_coordinates');
+ Addon::unregisterHook('page_header', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_alterheader');
logger("removed openstreetmap");
}
* @param mixed $a
* @param array& $item
*/
-function openstreetmap_location($a, &$item) {
-
- if(! (strlen($item['location']) || strlen($item['coord'])))
+function openstreetmap_location($a, &$item)
+{
+ if (!(strlen($item['location']) || strlen($item['coord']))) {
return;
/*
* ?mlat=lat&mlon=lon for markers.
*/
- $tmsserver = get_config('openstreetmap', 'tmsserver');
- if(! $tmsserver)
- $tmsserver = 'http://www.openstreetmap.org';
+ $tmsserver = Config::get('openstreetmap', 'tmsserver', OSM_TMS);
+ $nomserver = Config::get('openstreetmap', 'nomserver', OSM_NOM);
+ $zoom = Config::get('openstreetmap', 'zoom', OSM_ZOOM);
+ $marker = Config::get('openstreetmap', 'marker', OSM_MARKER);
- $nomserver = get_config('openstreetmap', 'nomserver');
- if(! $nomserver)
- $nomserver = 'http://nominatim.openstreetmap.org/search.php';
-
- $zoom = get_config('openstreetmap', 'zoom');
- if(! $zoom)
- $zoom = 16;
-
- $marker = get_config('openstreetmap', 'marker');
- if(! $marker)
- $marker = 0;
+ // This is needed since we stored an empty string in the config in previous versions
+ if (empty($nomserver)) {
+ $nomserver = OSM_NOM;
+ }
if ($item['coord'] != "") {
$coords = explode(' ', $item['coord']);
- if(count($coords) > 1) {
+ if (count($coords) > 1) {
$lat = urlencode(round($coords[0], 5));
$lon = urlencode(round($coords[1], 5));
$target = $tmsserver;
- if($marker > 0)
- $target .= '?mlat='.$lat.'&mlon='.$lon;
+ if ($marker > 0) {
+ $target .= '?mlat=' . $lat . '&mlon=' . $lon;
+ }
$target .= '#map='.intval($zoom).'/'.$lat.'/'.$lon;
}
}
$item['html'] = '<a target="map" title="'.$title.'" href= "'.$target.'">'.$title.'</a>';
}
+function openstreetmap_get_coordinates($a, &$b)
+{
+ $nomserver = Config::get('openstreetmap', 'nomserver', OSM_NOM);
-function openstreetmap_generate_named_map(&$a,&$b) {
-
+ // This is needed since we stored an empty string in the config in previous versions
+ if (empty($nomserver)) {
+ $nomserver = OSM_NOM;
+ }
- $nomserver = get_config('openstreetmap', 'nomserver');
- if(! $nomserver)
- $nomserver = 'http://nominatim.openstreetmap.org/search.php';
$args = '?q=' . urlencode($b['location']) . '&format=json';
- $x = z_fetch_url($nomserver . $args);
- if($x['success']) {
- $j = json_decode($x['body'],true);
+ $cachekey = "openstreetmap:" . $b['location'];
+ $j = Cache::get($cachekey);
- if($j && is_array($j) && $j[0]['lat'] && $j[0]['lon']) {
- $arr = array('lat' => $j[0]['lat'],'lon' => $j[0]['lon'],'location' => $b['location'], 'html' => '');
- openstreetmap_generate_map($a,$arr);
- $b['html'] = $arr['html'];
+ if (is_null($j)) {
+ $x = Network::curl($nomserver . $args);
+ if ($x['success']) {
+ $j = json_decode($x['body'], true);
+ Cache::set($cachekey, $j, CACHE_MONTH);
}
}
+
+ if (!empty($j[0]['lat']) && !empty($j[0]['lon'])) {
+ $b['lat'] = $j[0]['lat'];
+ $b['lon'] = $j[0]['lon'];
+ }
}
-function openstreetmap_generate_map(&$a,&$b) {
+function openstreetmap_generate_named_map(&$a, &$b)
+{
+ openstreetmap_get_coordinates($a, $b);
- $tmsserver = get_config('openstreetmap', 'tmsserver');
- if(! $tmsserver)
- $tmsserver = 'http://www.openstreetmap.org';
- if(strpos(z_root(),'https:') !== false)
- $tmsserver = str_replace('http:','https:',$tmsserver);
+ if (!empty($b['lat']) && !empty($b['lon'])) {
+ openstreetmap_generate_map($a, $b);
+ }
+}
+function openstreetmap_generate_map(&$a, &$b)
+{
+ $tmsserver = Config::get('openstreetmap', 'tmsserver', OSM_TMS);
- $zoom = get_config('openstreetmap', 'zoom');
- if(! $zoom)
- $zoom = 16;
+ if (strpos(z_root(), 'https:') !== false) {
+ $tmsserver = str_replace('http:','https:',$tmsserver);
+ }
- $marker = get_config('openstreetmap', 'marker');
- if(! $marker)
- $marker = 0;
+ $zoom = Config::get('openstreetmap', 'zoom', OSM_ZOOM);
+ $marker = Config::get('openstreetmap', 'marker', OSM_MARKER);
$lat = $b['lat']; // round($b['lat'], 5);
$lon = $b['lon']; // round($b['lon'], 5);
logger('lat: ' . $lat, LOGGER_DATA);
logger('lon: ' . $lon, LOGGER_DATA);
+ $cardlink = '<a href="' . $tmsserver;
- $b['html'] = '<iframe style="width:100%; height:300px; border:1px solid #ccc" src="' . $tmsserver . '/export/embed.html?bbox=' . ($lon - 0.01) . '%2C' . ($lat - 0.01) . '%2C' . ($lon + 0.01) . '%2C' . ($lat + 0.01) ;
+ if ($marker > 0) {
+ $cardlink .= '?mlat=' . $lat . '&mlon=' . $lon;
+ }
- $b['html'] .= '&layer=mapnik&marker=' . $lat . '%2C' . $lon . '" style="border: 1px solid black"></iframe><br/><small><a href="' . $tmsserver . '/?mlat=' . $lat . '&mlon=' . $lon . '#map=16/' . $lat . '/' . $lon . '">' . (($b['location']) ? escape_tags($b['location']) : t('View Larger')) . '</a></small>';
+ $cardlink .= '#map=' . $zoom . '/' . $lat . '/' . $lon . '">' . ($b['location'] ? escape_tags($b['location']) : L10n::t('View Larger')) . '</a>';
+ if (empty($b['mode'])) {
+ $b['html'] = '<iframe style="width:100%; height:300px; border:1px solid #ccc" src="' . $tmsserver .
+ '/export/embed.html?bbox=' . ($lon - 0.01) . '%2C' . ($lat - 0.01) . '%2C' . ($lon + 0.01) . '%2C' . ($lat + 0.01) .
+ '&layer=mapnik&marker=' . $lat . '%2C' . $lon . '" style="border: 1px solid black"></iframe>' .
+ '<br/><small>' . $cardlink . '</small>';
+ } else {
+ $b['html'] .= '<br/>' . $cardlink;
+ }
logger('generate_map: ' . $b['html'], LOGGER_DATA);
-
}
-function openstreetmap_plugin_admin(&$a, &$o) {
+function openstreetmap_addon_admin(&$a, &$o)
+{
$t = get_markup_template("admin.tpl", "addon/openstreetmap/");
- $tmsserver = get_config('openstreetmap', 'tmsserver');
- if(! $tmsserver)
- $tmsserver = 'http://www.openstreetmap.org';
- $nomserver = get_config('openstreetmap', 'nomserver');
- if(! $nomserver)
- $nomserver = 'http://nominatim.openstreetmap.org/search.php';
- $zoom = get_config('openstreetmap', 'zoom');
- if(! $zoom)
- $zoom = 16;
- $marker = get_config('openstreetmap', 'marker');
- if(! $marker)
- $marker = 0;
-
- $o = replace_macros($t, array(
- '$submit' => t('Submit'),
- '$tmsserver' => array('tmsserver', t('Tile Server URL'), $tmsserver, t('A list of <a href="http://wiki.openstreetmap.org/wiki/TMS" target="_blank">public tile servers</a>')),
- '$nomserver' => array('nomserver', t('Nominatim (reverse geocoding) Server URL'), $nomserver, t('A list of <a href="http://wiki.openstreetmap.org/wiki/Nominatim" target="_blank">Nominatim servers</a>')),
- '$zoom' => array('zoom', t('Default zoom'), $zoom, t('The default zoom level. (1:world, 18:highest, also depends on tile server)')),
- '$marker' => array('marker', t('Include marker on map'), $marker, t('Include a marker on the map.')),
- ));
+ $tmsserver = Config::get('openstreetmap', 'tmsserver', OSM_TMS);
+ $nomserver = Config::get('openstreetmap', 'nomserver', OSM_NOM);
+ $zoom = Config::get('openstreetmap', 'zoom', OSM_ZOOM);
+ $marker = Config::get('openstreetmap', 'marker', OSM_MARKER);
+
+ // This is needed since we stored an empty string in the config in previous versions
+ if (empty($nomserver)) {
+ $nomserver = OSM_NOM;
+ }
+
+ $o = replace_macros($t, [
+ '$submit' => L10n::t('Submit'),
+ '$tmsserver' => ['tmsserver', L10n::t('Tile Server URL'), $tmsserver, L10n::t('A list of <a href="http://wiki.openstreetmap.org/wiki/TMS" target="_blank">public tile servers</a>')],
+ '$nomserver' => ['nomserver', L10n::t('Nominatim (reverse geocoding) Server URL'), $nomserver, L10n::t('A list of <a href="http://wiki.openstreetmap.org/wiki/Nominatim" target="_blank">Nominatim servers</a>')],
+ '$zoom' => ['zoom', L10n::t('Default zoom'), $zoom, L10n::t('The default zoom level. (1:world, 18:highest, also depends on tile server)')],
+ '$marker' => ['marker', L10n::t('Include marker on map'), $marker, L10n::t('Include a marker on the map.')],
+ ]);
}
-function openstreetmap_plugin_admin_post(&$a) {
- $urltms = ((x($_POST, 'tmsserver')) ? notags(trim($_POST['tmsserver'])) : '');
- $urlnom = ((x($_POST, 'nomserver')) ? notags(trim($_POST['nomserver'])) : '');
- $zoom = ((x($_POST, 'zoom')) ? intval(trim($_POST['zoom'])) : '16');
- $marker = ((x($_POST, 'marker')) ? intval(trim($_POST['marker'])) : '0');
- set_config('openstreetmap', 'tmsserver', $urltms);
- set_config('openstreetmap', 'nomserver', $urlnom);
- set_config('openstreetmap', 'zoom', $zoom);
- set_config('openstreetmap', 'marker', $marker);
- info( t('Settings updated.') . EOL);
+
+function openstreetmap_addon_admin_post(&$a)
+{
+ $urltms = defaults($_POST, 'tmsserver', OSM_TMS);
+ $urlnom = defaults($_POST, 'nomserver', OSM_NOM);
+ $zoom = defaults($_POST, 'zoom', OSM_ZOOM);
+ $marker = defaults($_POST, 'marker', OSM_MARKER);
+
+ Config::set('openstreetmap', 'tmsserver', $urltms);
+ Config::set('openstreetmap', 'nomserver', $urlnom);
+ Config::set('openstreetmap', 'zoom', $zoom);
+ Config::set('openstreetmap', 'marker', $marker);
+
+ info(L10n::t('Settings updated.') . EOL);
}
{{include file="field_input.tpl" field=$tmsserver}}
-<!-- {{include file="field_input.tpl" field=$nomserver}}-->
+{{include file="field_input.tpl" field=$nomserver}}
{{include file="field_input.tpl" field=$zoom}}
{{include file="field_checkbox.tpl" field=$marker}}
<div class="submit"><input type="submit" name="openstreetmap" value="{{$submit}}"></div>
For server admins only.
Displays a text message for system announcements'
-The message is entered in the admin account at settings, Plugin settings.
+The message is entered in the admin account at settings, Addon settings.
If you want to use HTML in the pageheader, create a file called pageheader.html
in the document root of your friendica instance and add the html there.
\ No newline at end of file
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-27 05:01-0500\n"
+"POT-Creation-Date: 2018-03-11 18:52+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: pageheader.php:50
+#: pageheader.php:53
msgid "\"pageheader\" Settings"
msgstr ""
+#: pageheader.php:54
+msgid "Message"
+msgstr ""
+
+#: pageheader.php:54
+msgid ""
+"Message to display on every page on this server (or put a pageheader.html "
+"file in your docroot)"
+msgstr ""
+
#: pageheader.php:55
-msgid "Submit"
+msgid "Save Settings"
msgstr ""
-#: pageheader.php:68
+#: pageheader.php:69
msgid "pageheader Settings saved."
msgstr ""
#
#
# Translators:
-# Abrax <webmaster@a-zwenkau.de>, 2014
-# bavatar <tobias.diekershoff@gmx.net>, 2014
+# Andreas H., 2014
+# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2014
+# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2014-10-15 12:32+0000\n"
-"Last-Translator: Abrax <webmaster@a-zwenkau.de>\n"
-"Language-Team: German (http://www.transifex.com/projects/p/friendica/language/de/)\n"
+"POT-Creation-Date: 2018-03-11 18:52+0100\n"
+"PO-Revision-Date: 2018-03-16 07:42+0000\n"
+"Last-Translator: Tobias Diekershoff <tobias.diekershoff@gmx.net>\n"
+"Language-Team: German (http://www.transifex.com/Friendica/friendica/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: pageheader.php:50
+#: pageheader.php:53
msgid "\"pageheader\" Settings"
msgstr "\"pageheader\"-Einstellungen"
+#: pageheader.php:54
+msgid "Message"
+msgstr "Mitteilung"
+
+#: pageheader.php:54
+msgid ""
+"Message to display on every page on this server (or put a pageheader.html "
+"file in your docroot)"
+msgstr "Die Mitteilung, die auf jeder Seite dieses Knotens angezeigt werden soll (alternativ kann die Datei pageheader.html im Stammverzeichnis der Friendica Installation angelegt werden)."
+
#: pageheader.php:55
-msgid "Submit"
-msgstr "Senden"
+msgid "Save Settings"
+msgstr "Einstellungen speichern"
-#: pageheader.php:68
+#: pageheader.php:69
msgid "pageheader Settings saved."
msgstr "pageheader-Einstellungen gespeichert."
}}
;
$a->strings["\"pageheader\" Settings"] = "\"pageheader\"-Einstellungen";
-$a->strings["Submit"] = "Senden";
+$a->strings["Message"] = "Mitteilung";
+$a->strings["Message to display on every page on this server (or put a pageheader.html file in your docroot)"] = "Die Mitteilung, die auf jeder Seite dieses Knotens angezeigt werden soll (alternativ kann die Datei pageheader.html im Stammverzeichnis der Friendica Installation angelegt werden).";
+$a->strings["Save Settings"] = "Einstellungen speichern";
$a->strings["pageheader Settings saved."] = "pageheader-Einstellungen gespeichert.";
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:21+0000\n"
+"POT-Creation-Date: 2018-03-11 18:52+0100\n"
+"PO-Revision-Date: 2018-03-19 13:19+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: pageheader.php:50
+#: pageheader.php:53
msgid "\"pageheader\" Settings"
msgstr "Impostazioni \"Intestazione pagina\""
+#: pageheader.php:54
+msgid "Message"
+msgstr "Messaggio"
+
+#: pageheader.php:54
+msgid ""
+"Message to display on every page on this server (or put a pageheader.html "
+"file in your docroot)"
+msgstr "Il messaggio da mostrare su ogni pagina di questo server (puoi anche aggiungere un file pageheader.html nella root)"
+
#: pageheader.php:55
-msgid "Submit"
-msgstr "Invia"
+msgid "Save Settings"
+msgstr "Salva Impostazioni"
-#: pageheader.php:68
+#: pageheader.php:69
msgid "pageheader Settings saved."
msgstr "Impostazioni \"Intestazione pagina\" salvate."
}}
;
$a->strings["\"pageheader\" Settings"] = "Impostazioni \"Intestazione pagina\"";
-$a->strings["Submit"] = "Invia";
+$a->strings["Message"] = "Messaggio";
+$a->strings["Message to display on every page on this server (or put a pageheader.html file in your docroot)"] = "Il messaggio da mostrare su ogni pagina di questo server (puoi anche aggiungere un file pageheader.html nella root)";
+$a->strings["Save Settings"] = "Salva Impostazioni";
$a->strings["pageheader Settings saved."] = "Impostazioni \"Intestazione pagina\" salvate.";
<?php
-
-
/**
* Name: Page Header
* Description: Inserts a page header
* Hauke Altmann <https://snarl.de/profile/tugelblend>
*
*/
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
function pageheader_install() {
- register_hook('page_content_top', 'addon/pageheader/pageheader.php', 'pageheader_fetch');
- register_hook('plugin_settings', 'addon/pageheader/pageheader.php', 'pageheader_addon_settings');
- register_hook('plugin_settings_post', 'addon/pageheader/pageheader.php', 'pageheader_addon_settings_post');
+ Addon::registerHook('page_content_top', 'addon/pageheader/pageheader.php', 'pageheader_fetch');
+ Addon::registerHook('addon_settings', 'addon/pageheader/pageheader.php', 'pageheader_addon_settings');
+ Addon::registerHook('addon_settings_post', 'addon/pageheader/pageheader.php', 'pageheader_addon_settings_post');
}
function pageheader_uninstall() {
- unregister_hook('page_content_top', 'addon/pageheader/pageheader.php', 'pageheader_fetch');
- unregister_hook('plugin_settings', 'addon/pageheader/pageheader.php', 'pageheader_addon_settings');
- unregister_hook('plugin_settings_post', 'addon/pageheader/pageheader.php', 'pageheader_addon_settings_post');
+ Addon::unregisterHook('page_content_top', 'addon/pageheader/pageheader.php', 'pageheader_fetch');
+ Addon::unregisterHook('addon_settings', 'addon/pageheader/pageheader.php', 'pageheader_addon_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/pageheader/pageheader.php', 'pageheader_addon_settings_post');
// hook moved, uninstall the old one if still there.
- unregister_hook('page_header', 'addon/pageheader/pageheader.php', 'pageheader_fetch');
+ Addon::unregisterHook('page_header', 'addon/pageheader/pageheader.php', 'pageheader_fetch');
}
if(! $words)
$words = '';
- $s .= '<div class="settings-block">';
- $s .= '<h3>' . t('"pageheader" Settings') . '</h3>';
- $s .= '<div id="pageheader-wrapper">';
- $s .= '<label id="pageheader-label" for="pageheader-words">' . t('Message to display on every page on this server (or put a pageheader.html file in your docroot)') . ' </label>';
- $s .= '<textarea id="pageheader-words" type="text" name="pageheader-words">' . $words . '</textarea>';
- $s .= '</div><div class="clear"></div>';
-
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="pageheader-submit" name="pageheader-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $t = get_markup_template("settings.tpl", "addon/pageheader/");
+ $s .= replace_macros($t, [
+ '$title' => L10n::t('"pageheader" Settings'),
+ '$phwords' => ['pageheader-words', L10n::t('Message'), $words, L10n::t('Message to display on every page on this server (or put a pageheader.html file in your docroot)')],
+ '$submit' => L10n::t('Save Settings')
+ ]);
return;
return;
if($_POST['pageheader-submit']) {
- set_config('pageheader','text',trim(strip_tags($_POST['pageheader-words'])));
- info( t('pageheader Settings saved.') . EOL);
+ Config::set('pageheader','text',trim(strip_tags($_POST['pageheader-words'])));
+ info(L10n::t('pageheader Settings saved.') . EOL);
}
}
--- /dev/null
+<span id="settings_pageheader_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose('settings_pageheader_expanded'); openClose('settings_pageheader_inflated');">
+ <h3>{{$title}}</h3>
+</span>
+<div id="settings_pageheader_expanded" class="settings-block" style="display: none;">
+ <span class="fakelink" onclick="openClose('settings_pageheader_expanded'); openClose('settings_pageheader_inflated');">
+ <h3>{{$title}}</h3>
+ </span>
+ {{include file="field_textarea.tpl" field=$phwords}}
+
+ <div class="settings-submit-wrapper" >
+ <input type="submit" id="pageheader-submit" name="pageheader-submit" class="settings-submit" value="{{$submit}}" />
+ </div>
+</div>
+<div class="clear"></div>
-Piwik Plugin
+Piwik Addon
============
by Tobias Diekershoff and Klaus Weidenbach
Requirements
------------
-To use this plugin you need a [piwik](http://piwik.org/) installation.
+To use this addon you need a [piwik](http://piwik.org/) installation.
Where to find
-------------
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-07-26 12:49+0200\n"
-"PO-Revision-Date: 2015-08-31 10:22+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
--- /dev/null
+# ADDON piwik
+# Copyright (C)
+# This file is distributed under the same license as the Friendica piwik addon package.
+#
+#
+# Translators:
+# 朱陈锬 <tangenters@outlook.com>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: friendica\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-07-26 12:49+0200\n"
+"PO-Revision-Date: 2018-03-01 09:57+0000\n"
+"Last-Translator: 朱陈锬 <tangenters@outlook.com>\n"
+"Language-Team: Chinese (China) (http://www.transifex.com/Friendica/friendica/language/zh_CN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh_CN\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: piwik.php:79
+msgid ""
+"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
+"analytics tool."
+msgstr "此网站用 <a href='http://www.piwik.org'>Piwik</a> 追踪分析工具。"
+
+#: piwik.php:82
+#, php-format
+msgid ""
+"If you do not want that your visits are logged in this way you <a "
+"href='%s'>can set a cookie to prevent Piwik from tracking further visits of "
+"the site</a> (opt-out)."
+msgstr ""
+
+#: piwik.php:89
+msgid "Save Settings"
+msgstr "保存设置"
+
+#: piwik.php:90
+msgid "Piwik Base URL"
+msgstr ""
+
+#: piwik.php:90
+msgid ""
+"Absolute path to your Piwik installation. (without protocol (http/s), with "
+"trailing slash)"
+msgstr ""
+
+#: piwik.php:91
+msgid "Site ID"
+msgstr ""
+
+#: piwik.php:92
+msgid "Show opt-out cookie link?"
+msgstr ""
+
+#: piwik.php:93
+msgid "Asynchronous tracking"
+msgstr "异步追踪"
+
+#: piwik.php:105
+msgid "Settings updated."
+msgstr "设置已更新。"
-<?php\r
-\r
-$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "这个网站用<a href='http://www.piwik.org'>Piwik</a>分析工具追踪 。";\r
-$a->strings["If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = "如果您不想您访问这样记录您<a href='%s'>可以用一个cookie防Piwik追踪未来的访问</a>(选择性退出)。";\r
-$a->strings["Submit"] = "提交";\r
-$a->strings["Piwik Base URL"] = "Piwik基础URL";\r
-$a->strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "绝对道路到Piwik安装。(没有协议(http/s)跟斜线后缀)";\r
-$a->strings["Site ID"] = "网站ID";\r
-$a->strings["Show opt-out cookie link?"] = " 显示选择性退出cookie按钮?";\r
-$a->strings["Asynchronous tracking"] = "异步追踪";\r
-$a->strings["Settings updated."] = "设置跟新了";\r
+<?php
+
+if(! function_exists("string_plural_select_zh_cn")) {
+function string_plural_select_zh_cn($n){
+ return 0;;
+}}
+;
+$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "此网站用 <a href='http://www.piwik.org'>Piwik</a> 追踪分析工具。";
+$a->strings["If you do not want that your visits are logged in this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = "";
+$a->strings["Save Settings"] = "保存设置";
+$a->strings["Piwik Base URL"] = "";
+$a->strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "";
+$a->strings["Site ID"] = "";
+$a->strings["Show opt-out cookie link?"] = "";
+$a->strings["Asynchronous tracking"] = "异步追踪";
+$a->strings["Settings updated."] = "设置已更新。";
<?php
/**
* Name: Piwik Analytics
- * Description: Piwik Analytics Plugin for Friendica
+ * Description: Piwik Analytics Addon for Friendica
* Version: 1.3
* Author: Tobias Diekershoff <https://f.diekershoff.de/profile/tobias>
* Author: Klaus Weidenbach
*/
-/* Piwik Analytics Plugin for Friendica
+/* Piwik Analytics Addon for Friendica
*
* Author: Tobias Diekershoff
* tobias.diekershoff@gmx.net
* about http/https but beware to put the trailing / at the end of your
* setting.
*/
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
function piwik_install() {
- register_hook('page_end', 'addon/piwik/piwik.php', 'piwik_analytics');
+ Addon::registerHook('page_end', 'addon/piwik/piwik.php', 'piwik_analytics');
- logger("installed piwik plugin");
+ logger("installed piwik addon");
}
function piwik_uninstall() {
- unregister_hook('page_end', 'addon/piwik/piwik.php', 'piwik_analytics');
+ Addon::unregisterHook('page_end', 'addon/piwik/piwik.php', 'piwik_analytics');
- logger("uninstalled piwik plugin");
+ logger("uninstalled piwik addon");
}
function piwik_analytics($a,&$b) {
/*
- * styling of every HTML block added by this plugin is done in the
+ * styling of every HTML block added by this addon is done in the
* associated CSS file. We just have to tell Friendica to get it
* into the page header.
*/
*/
if ($optout) {
$b .= "<div id='piwik-optout-link'>";
- $b .= t("This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool.");
+ $b .= L10n::t("This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool.");
$b .= " ";
$the_url = "http://".$baseurl ."index.php?module=CoreAdminHome&action=optOut";
- $b .= sprintf(t("If you do not want that your visits are logged in this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."), $the_url);
+ $b .= L10n::t("If you do not want that your visits are logged in this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out).", $the_url);
$b .= "</div>";
}
}
-function piwik_plugin_admin (&$a, &$o) {
+function piwik_addon_admin (&$a, &$o) {
$t = get_markup_template( "admin.tpl", "addon/piwik/" );
- $o = replace_macros( $t, array(
- '$submit' => t('Save Settings'),
- '$piwikbaseurl' => array('baseurl', t('Piwik Base URL'), get_config('piwik','baseurl' ), t('Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)')),
- '$siteid' => array('siteid', t('Site ID'), get_config('piwik','siteid' ), ''),
- '$optout' => array('optout', t('Show opt-out cookie link?'), get_config('piwik','optout' ), ''),
- '$async' => array('async', t('Asynchronous tracking'), get_config('piwik','async' ), ''),
- ));
+ $o = replace_macros( $t, [
+ '$submit' => L10n::t('Save Settings'),
+ '$piwikbaseurl' => ['baseurl', L10n::t('Piwik Base URL'), Config::get('piwik','baseurl' ), L10n::t('Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)')],
+ '$siteid' => ['siteid', L10n::t('Site ID'), Config::get('piwik','siteid' ), ''],
+ '$optout' => ['optout', L10n::t('Show opt-out cookie link?'), Config::get('piwik','optout' ), ''],
+ '$async' => ['async', L10n::t('Asynchronous tracking'), Config::get('piwik','async' ), ''],
+ ]);
}
-function piwik_plugin_admin_post (&$a) {
+function piwik_addon_admin_post (&$a) {
$url = ((x($_POST, 'baseurl')) ? notags(trim($_POST['baseurl'])) : '');
$id = ((x($_POST, 'siteid')) ? trim($_POST['siteid']) : '');
$optout = ((x($_POST, 'optout')) ? trim($_POST['optout']) : '');
$async = ((x($_POST, 'async')) ? trim($_POST['async']) : '');
- set_config('piwik', 'baseurl', $url);
- set_config('piwik', 'siteid', $id);
- set_config('piwik', 'optout', $optout);
- set_config('piwik', 'async', $async);
- info( t('Settings updated.'). EOL);
+ Config::set('piwik', 'baseurl', $url);
+ Config::set('piwik', 'siteid', $id);
+ Config::set('piwik', 'optout', $optout);
+ Config::set('piwik', 'async', $async);
+ info(L10n::t('Settings updated.'). EOL);
}
msgstr ""
#: planets.php:152
-msgid "Enable Planets Plugin"
+msgid "Enable Planets Addon"
msgstr ""
#: planets.php:158
<?php\r
\r
$a->strings["Planets Settings"] = "Ajustos de Planet";\r
-$a->strings["Enable Planets Plugin"] = "Activa Plugin de Planet";\r
+$a->strings["Enable Planets Addon"] = "Activa Addon de Planet";\r
$a->strings["Submit"] = "Enviar";\r
msgstr "Planets Nastavení"
#: planets.php:152
-msgid "Enable Planets Plugin"
-msgstr "Povolit Planets plugin"
+msgid "Enable Planets Addon"
+msgstr "Povolit Planets addon"
#: planets.php:158
msgid "Submit"
}}
;
$a->strings["Planets Settings"] = "Planets Nastavení";
-$a->strings["Enable Planets Plugin"] = "Povolit Planets plugin";
+$a->strings["Enable Planets Addon"] = "Povolit Planets addon";
$a->strings["Submit"] = "Odeslat";
msgstr "Planeten Einstellungen"
#: planets.php:152
-msgid "Enable Planets Plugin"
-msgstr "Planeten-Plugin aktivieren"
+msgid "Enable Planets Addon"
+msgstr "Planeten-Addon aktivieren"
#: planets.php:158
msgid "Submit"
}}
;
$a->strings["Planets Settings"] = "Planeten Einstellungen";
-$a->strings["Enable Planets Plugin"] = "Planeten-Plugin aktivieren";
+$a->strings["Enable Planets Addon"] = "Planeten-Addon aktivieren";
$a->strings["Submit"] = "Senden";
<?php\r
\r
$a->strings["Planets Settings"] = "Agordo pri Planets";\r
-$a->strings["Enable Planets Plugin"] = "Ŝalti la Planets kromprogamon";\r
+$a->strings["Enable Planets Addon"] = "Ŝalti la Planets kromprogamon";\r
$a->strings["Submit"] = "Sendi";\r
msgstr "Ajustes de Planets"
#: planets.php:152
-msgid "Enable Planets Plugin"
-msgstr "Habilite el plugin Planets"
+msgid "Enable Planets Addon"
+msgstr "Habilite eladdonPlanets"
#: planets.php:158
msgid "Submit"
}}
;
$a->strings["Planets Settings"] = "Ajustes de Planets";
-$a->strings["Enable Planets Plugin"] = "Habilite el plugin Planets";
+$a->strings["Enable Planets Addon"] = "Habilite el addon Planets";
$a->strings["Submit"] = "Enviar";
<?php\r
\r
$a->strings["Planets Settings"] = "Réglages des Planets";\r
-$a->strings["Enable Planets Plugin"] = "Activer Planets";\r
+$a->strings["Enable Planets Addon"] = "Activer Planets";\r
$a->strings["Submit"] = "Envoyer";\r
<?php\r
\r
$a->strings["Planets Settings"] = "";\r
-$a->strings["Enable Planets Plugin"] = "";\r
+$a->strings["Enable Planets Addon"] = "";\r
$a->strings["Submit"] = "Senda inn";\r
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:22+0000\n"
+"PO-Revision-Date: 2018-03-19 13:25+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
msgstr "Impostazioni \"Pianeti\""
#: planets.php:152
-msgid "Enable Planets Plugin"
-msgstr "Abilita il plugin \"Pianeti\""
+msgid "Enable Planets Addon"
+msgstr "Abilita il componente aggiuntivo Pianeti"
#: planets.php:158
msgid "Submit"
}}
;
$a->strings["Planets Settings"] = "Impostazioni \"Pianeti\"";
-$a->strings["Enable Planets Plugin"] = "Abilita il plugin \"Pianeti\"";
+$a->strings["Enable Planets Addon"] = "Abilita il componente aggiuntivo Pianeti";
$a->strings["Submit"] = "Invia";
<?php\r
\r
$a->strings["Planets Settings"] = "";\r
-$a->strings["Enable Planets Plugin"] = "";\r
+$a->strings["Enable Planets Addon"] = "";\r
$a->strings["Submit"] = "Lagre";\r
<?php\r
\r
$a->strings["Planets Settings"] = "";\r
-$a->strings["Enable Planets Plugin"] = "";\r
+$a->strings["Enable Planets Addon"] = "";\r
$a->strings["Submit"] = "Potwierdź";\r
<?php\r
\r
$a->strings["Planets Settings"] = "Configuração dos planetas";\r
-$a->strings["Enable Planets Plugin"] = "Habilita configuração dos planetas";\r
+$a->strings["Enable Planets Addon"] = "Habilita configuração dos planetas";\r
$a->strings["Submit"] = "Enviar";\r
msgstr "Configurări Planets"
#: planets.php:152
-msgid "Enable Planets Plugin"
+msgid "Enable Planets Addon"
msgstr "Activare Modul Planets"
#: planets.php:158
}}
;
$a->strings["Planets Settings"] = "Configurări Planets";
-$a->strings["Enable Planets Plugin"] = "Activare Modul Planets";
+$a->strings["Enable Planets Addon"] = "Activare Modul Planets";
$a->strings["Submit"] = "Trimite";
<?php\r
\r
$a->strings["Planets Settings"] = "";\r
-$a->strings["Enable Planets Plugin"] = "";\r
+$a->strings["Enable Planets Addon"] = "";\r
$a->strings["Submit"] = "Подтвердить";\r
<?php\r
\r
$a->strings["Planets Settings"] = "行星设置";\r
-$a->strings["Enable Planets Plugin"] = "使行星插件可用";\r
+$a->strings["Enable Planets Addon"] = "使行星插件可用";\r
$a->strings["Submit"] = "提交";\r
<?php
/**
* Name: Random Planet, Empirial Version
- * Description: Sample Friendica plugin/addon. Set a random planet from the Emprire when posting.
+ * Description: Sample Friendica addon. Set a random planet from the Emprire when posting.
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
* Author: Tony Baldwin <https://free-haven.org/profile/tony>
*/
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
function planets_install() {
/**
- *
- * Our demo plugin will attach in three places.
+ *
+ * Our demo addon will attach in three places.
* The first is just prior to storing a local post.
*
*/
- register_hook('post_local', 'addon/planets/planets.php', 'planets_post_hook');
+ Addon::registerHook('post_local', 'addon/planets/planets.php', 'planets_post_hook');
/**
*
- * Then we'll attach into the plugin settings page, and also the
+ * Then we'll attach into the addon settings page, and also the
* settings post hook so that we can create and update
* user preferences.
*
*/
- register_hook('plugin_settings', 'addon/planets/planets.php', 'planets_settings');
- register_hook('plugin_settings_post', 'addon/planets/planets.php', 'planets_settings_post');
+ Addon::registerHook('addon_settings', 'addon/planets/planets.php', 'planets_settings');
+ Addon::registerHook('addon_settings_post', 'addon/planets/planets.php', 'planets_settings_post');
logger("installed planets");
}
*
*/
- unregister_hook('post_local', 'addon/planets/planets.php', 'planets_post_hook');
- unregister_hook('plugin_settings', 'addon/planets/planets.php', 'planets_settings');
- unregister_hook('plugin_settings_post', 'addon/planets/planets.php', 'planets_settings_post');
+ Addon::unregisterHook('post_local', 'addon/planets/planets.php', 'planets_post_hook');
+ Addon::unregisterHook('addon_settings', 'addon/planets/planets.php', 'planets_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/planets/planets.php', 'planets_settings_post');
logger("removed planets");
* An item was posted on the local system.
* We are going to look for specific items:
* - A status post by a profile owner
- * - The profile owner must have allowed our plugin
+ * - The profile owner must have allowed our addon
*
*/
/**
*
- * Called from the Plugin Setting form.
+ * Called from the Addon Setting form.
* Add our own settings info to the page.
*
*/
/* Add some HTML to the existing form */
$s .= '<span id="settings_planets_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_planets_expanded\'); openClose(\'settings_planets_inflated\');">';
- $s .= '<h3>' . t('Planets') . '</h3>';
+ $s .= '<h3>' . L10n::t('Planets') . '</h3>';
$s .= '</span>';
$s .= '<div id="settings_planets_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_planets_expanded\'); openClose(\'settings_planets_inflated\');">';
- $s .= '<h3>' . t('Planets') . '</h3>';
+ $s .= '<h3>' . L10n::t('Planets') . '</h3>';
$s .= '</span>';
$s .= '<div class="settings-block">';
- $s .= '<h3>' . t('Planets Settings') . '</h3>';
+ $s .= '<h3>' . L10n::t('Planets Settings') . '</h3>';
$s .= '<div id="planets-enable-wrapper">';
- $s .= '<label id="planets-enable-label" for="planets-checkbox">' . t('Enable Planets Plugin') . '</label>';
+ $s .= '<label id="planets-enable-label" for="planets-checkbox">' . L10n::t('Enable Planets Addon') . '</label>';
$s .= '<input id="planets-checkbox" type="checkbox" name="planets" value="1" ' . $checked . '/>';
$s .= '</div><div class="clear"></div></div>';
/* provide a submit button */
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="planets-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="planets-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
* Version: 1.1
* Author: tony baldwin <tony@free-haven.org>
* Hauke Altmann <https://snarl.de/profile/tugelblend>
- *
+ *
*/
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
function pledgie_install() {
- register_hook('page_end', 'addon/pledgie/pledgie.php', 'pledgie_active');
- register_hook('plugin_settings', 'addon/pledgie/pledgie.php', 'pledgie_addon_settings');
- register_hook('plugin_settings_post', 'addon/pledgie/pledgie.php', 'pledgie_addon_settings_post');
+ Addon::registerHook('page_end', 'addon/pledgie/pledgie.php', 'pledgie_active');
+ Addon::registerHook('addon_settings', 'addon/pledgie/pledgie.php', 'pledgie_addon_settings');
+ Addon::registerHook('addon_settings_post', 'addon/pledgie/pledgie.php', 'pledgie_addon_settings_post');
}
function pledgie_uninstall() {
- unregister_hook('page_end', 'addon/pledgie/pledgie.php', 'pledgie_active');
- unregister_hook('plugin_settings', 'addon/pledgie/pledgie.php', 'pledgie_addon_settings');
- unregister_hook('plugin_settings_post', 'addon/pledgie/pledgie.php', 'pledgie_addon_settings_post');
+ Addon::unregisterHook('page_end', 'addon/pledgie/pledgie.php', 'pledgie_active');
+ Addon::unregisterHook('addon_settings', 'addon/pledgie/pledgie.php', 'pledgie_addon_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/pledgie/pledgie.php', 'pledgie_addon_settings_post');
}
function pledgie_addon_settings(&$a,&$s) {
$describe = '';
$s .= '<div class="settings-block">';
- $s .= '<h3>' . t('"pledgie" Settings') . '</h3>';
+ $s .= '<h3>' . L10n::t('"pledgie" Settings') . '</h3>';
$s .= '<div id="pledgie-wrapper">';
- $s .= '<label id="pledgie-label" for="pledgie-campaign">' . t('Pledgie campaign number to use for donations') . ' </label>';
+ $s .= '<label id="pledgie-label" for="pledgie-campaign">' . L10n::t('Pledgie campaign number to use for donations') . ' </label>';
$s .= '<input id="pledgie-campaign" type="text" name="pledgie-campaign" value="' . $campaign . '">';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="pledgie-wrapper">';
- $s .= '<label id="pledgie-label" for="pledgie-describe">' . t('Description of the Pledgie campaign') . ' </label>';
+ $s .= '<label id="pledgie-label" for="pledgie-describe">' . L10n::t('Description of the Pledgie campaign') . ' </label>';
$s .= '<input id="pledgie-describe" type="text" name="pledgie-describe" value="' . $describe . '">';
$s .= '</div><div class="clear"></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="pledgie-submit" name="pledgie-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="pledgie-submit" name="pledgie-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
return;
}
return;
if($_POST['pledgie-submit']) {
- set_config('pledgie-describe','text',trim(strip_tags($_POST['pledgie-describe'])));
- set_config('pledgie-campaign','text',trim(strip_tags($_POST['pledgie-campaign'])));
- info( t('pledgie Settings saved.') . EOL);
+ Config::set('pledgie-describe','text',trim(strip_tags($_POST['pledgie-describe'])));
+ Config::set('pledgie-campaign','text',trim(strip_tags($_POST['pledgie-campaign'])));
+ info(L10n::t('pledgie Settings saved.') . EOL);
}
}
=============
-Public Server is a Friendica plugin which implements automatic account & post expiration so that a site may be used as a public
+Public Server is a Friendica addon which implements automatic account & post expiration so that a site may be used as a public
test bed with reduced data retention.
-This is a modified version of the testdrive plugin, DO NOT ACTIVATE AT THE SAME TIME AS THE TESTDRIVE PLUGIN.
+This is a modified version of the testdrive addon, DO NOT ACTIVATE AT THE SAME TIME AS THE TESTDRIVE ADDON.
//When an account is created on the site, it is given a hard expiration date of
$a->config['public_server']['expiredays'] = 30;
$a->config['public_server']['flagposts'] = 90;
$a->config['public_server']['flagpostsexpire'] = 146;
-Set these in your .htconfig.php file. By default nothing is defined in case the plugin is activated accidentally.
+Set these in your .htconfig.php file. By default nothing is defined in case the addon is activated accidentally.
They can be ommitted or set to 0 to disable each option.
The default values are those used by friendica.eu, change these as desired.
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2014-10-15 09:02+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
<?php
-
/**
* Name: public_server
- * Description: Friendica plugin/addon with functions suitable for a public server.
+ * Description: Friendica addon with functions suitable for a public server.
* Version: 1.1
* Author: Keith Fernie <http://friendika.me4.it/profile/keith>
*/
-
-
-
-function public_server_install() {
-
- register_hook('register_account', 'addon/public_server/public_server.php', 'public_server_register_account');
- register_hook('cron', 'addon/public_server/public_server.php', 'public_server_cron');
- register_hook('enotify','addon/public_server/public_server.php', 'public_server_enotify');
- register_hook('logged_in', 'addon/public_server/public_server.php', 'public_server_login');
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Database\DBM;
+use Friendica\Util\DateTimeFormat;
+
+function public_server_install()
+{
+ Addon::registerHook('register_account', 'addon/public_server/public_server.php', 'public_server_register_account');
+ Addon::registerHook('cron', 'addon/public_server/public_server.php', 'public_server_cron');
+ Addon::registerHook('enotify', 'addon/public_server/public_server.php', 'public_server_enotify');
+ Addon::registerHook('logged_in', 'addon/public_server/public_server.php', 'public_server_login');
}
-
-function public_server_uninstall() {
-
- unregister_hook('register_account', 'addon/public_server/public_server.php', 'public_server_register_account');
- unregister_hook('cron', 'addon/public_server/public_server.php', 'public_server_cron');
- unregister_hook('enotify','addon/public_server/public_server.php', 'public_server_enotify');
- unregister_hook('logged_in', 'addon/public_server/public_server.php', 'public_server_login');
+function public_server_uninstall()
+{
+ Addon::unregisterHook('register_account', 'addon/public_server/public_server.php', 'public_server_register_account');
+ Addon::unregisterHook('cron', 'addon/public_server/public_server.php', 'public_server_cron');
+ Addon::unregisterHook('enotify', 'addon/public_server/public_server.php', 'public_server_enotify');
+ Addon::unregisterHook('logged_in', 'addon/public_server/public_server.php', 'public_server_login');
}
-function public_server_register_account($a,$b) {
-
+function public_server_register_account($a, $b)
+{
$uid = $b;
- $days = get_config('public_server','expiredays');
- $days_posts = get_config('public_server','expireposts');
- if(! $days)
+ $days = Config::get('public_server', 'expiredays');
+ $days_posts = Config::get('public_server', 'expireposts');
+ if (!$days) {
return;
+ }
- $r = q("UPDATE user set account_expires_on = '%s', expire = %d where uid = %d",
- dbesc(datetime_convert('UTC','UTC','now +' . $days . ' days')),
- intval($days_posts),
- intval($uid)
- );
-
-};
-
+ $fields = ['account_expires_on' => DateTimeFormat::utc('now +' . $days . ' days'), 'expire' => $days_posts];
+ dba::update('user', $fields, ['uid' => $uid]);
+}
-function public_server_cron($a,$b) {
+function public_server_cron($a, $b)
+{
logger("public_server: cron start");
require_once('include/enotify.php');
- $r = q("select * from user where account_expires_on < UTC_TIMESTAMP() + INTERVAL 5 DAY and account_expires_on > '0000-00-00 00:00:00' and
- expire_notification_sent = '0000-00-00 00:00:00' ");
-
- if(count($r)) {
- foreach($r as $rr) {
- notification(array(
+ $r = q("SELECT * FROM `user` WHERE `account_expires_on` < UTC_TIMESTAMP() + INTERVAL 5 DAY AND
+ `account_expires_on` > '%s' AND
+ `expire_notification_sent` <= '%s'",
+ dbesc(NULL_DATE), dbesc(NULL_DATE));
+
+ if (DBM::is_result($r)) {
+ foreach ($r as $rr) {
+ notification([
'uid' => $rr['uid'],
'type' => NOTIFY_SYSTEM,
'system_type' => 'public_server_expire',
'language' => $rr['language'],
'to_name' => $rr['username'],
'to_email' => $rr['email'],
- 'source_name' => t('Administrator'),
+ 'source_name' => L10n::t('Administrator'),
'source_link' => $a->get_baseurl(),
'source_photo' => $a->get_baseurl() . '/images/person-80.jpg',
));
- q("update user set expire_notification_sent = '%s' where uid = %d",
- dbesc(datetime_convert()),
- intval($rr['uid'])
- );
+ $fields = ['expire_notification_sent' => DateTimeFormat::utcNow()];
+ dba::update('user', $fields, ['uid' => $rr['uid']]);
}
}
- $r = q("select * from user where account_expired = 1 and account_expires_on < UTC_TIMESTAMP() - INTERVAL 5 DAY and account_expires_on > '0000-00-00 00:00:00'");
- if(count($r)) {
- require_once('include/Contact.php');
- foreach($r as $rr)
- user_remove($rr['uid']);
-
- }
- $nologin = get_config('public_server','nologin');
- if($nologin) {
- $r = q("select uid from user where account_expired = 0 and login_date = '0000-00-00 00:00:00' and register_date < UTC_TIMESTAMP() - INTERVAL %d DAY and account_expires_on = '0000-00-00 00:00:00'",intval($nologin));
- if(count($r)) {
- foreach($r as $rr)
- q("update user set account_expires_on = '%s' where uid = %d",
- dbesc(datetime_convert('UTC','UTC','now +' . '6 days')),
- intval($rr['uid'])
- );
+ $nologin = Config::get('public_server', 'nologin', false);
+ if ($nologin) {
+ $r = q("SELECT `uid` FROM `user` WHERE NOT `account_expired` AND `login_date` <= '%s' AND `register_date` < UTC_TIMESTAMP() - INTERVAL %d DAY AND `account_expires_on` <= '%s'",
+ dbesc(NULL_DATE), intval($nologin), dbesc(NULL_DATE));
+ if (DBM::is_result($r)) {
+ foreach ($r as $rr) {
+ $fields = ['account_expires_on' => DateTimeFormat::utc('now +6 days')];
+ dba::update('user', $fields, ['uid' => $rr['uid']]);
+ }
}
- }
-
-
- $flagusers = get_config('public_server','flagusers');
- if($flagusers) {
- $r = q("select uid from user where account_expired = 0 and login_date < UTC_TIMESTAMP() - INTERVAL %d DAY and account_expires_on = '0000-00-00 00:00:00' and `page-flags` = 0",intval($flagusers));
- if(count($r)) {
- foreach($r as $rr)
- q("update user set account_expires_on = '%s' where uid = %d",
- dbesc(datetime_convert('UTC','UTC','now +' . '6 days')),
- intval($rr['uid'])
- );
+ }
+
+ $flagusers = Config::get('public_server', 'flagusers', false);
+ if ($flagusers) {
+ $r = q("SELECT `uid` FROM `user` WHERE NOT `account_expired` AND `login_date` < UTC_TIMESTAMP() - INTERVAL %d DAY AND `account_expires_on` <= '%s' AND `page-flags` = 0",
+ intval($flagusers), dbesc(NULL_DATE));
+ if (DBM::is_result($r)) {
+ foreach ($r as $rr) {
+ $fields = ['account_expires_on' => DateTimeFormat::utc('now +6 days')];
+ dba::update('user', $fields, ['uid' => $rr['uid']]);
+ }
}
- }
+ }
- $flagposts = get_config('public_server','flagposts');
- $flagpostsexpire = get_config('public_server','flagpostsexpire');
+ $flagposts = Config::get('public_server', 'flagposts');
+ $flagpostsexpire = Config::get('public_server', 'flagpostsexpire');
if ($flagposts && $flagpostsexpire) {
- $r = q("select uid from user where account_expired = 0 and login_date < UTC_TIMESTAMP() - INTERVAL %d DAY and account_expires_on = '0000-00-00 00:00:00' and expire = 0 and `page-flags` = 0",intval($flagposts));
- if(count($r)) {
- foreach($r as $rr)
- q("update user set expire = %d where uid = %d",
- intval($flagpostsexpire),
- intval($rr['uid'])
- );
+ $r = q("SELECT `uid` FROM `user` WHERE NOT `account_expired` AND `login_date` < UTC_TIMESTAMP() - INTERVAL %d DAY AND `account_expires_on` <= '%s' and `expire` = 0 AND `page-flags` = 0",
+ intval($flagposts), dbesc(NULL_DATE));
+ if (DBM::is_result($r)) {
+ foreach ($r as $rr) {
+ dba::update('user', ['expire' => $flagpostsexpire], ['uid' => $rr['uid']]);
+ }
}
- }
+ }
logger("public_server: cron end");
-
}
-function public_server_enotify(&$a, &$b) {
- if (x($b, 'params') && $b['params']['type'] == NOTIFY_SYSTEM
+function public_server_enotify(&$a, &$b)
+{
+ if (x($b, 'params') && $b['params']['type'] == NOTIFY_SYSTEM
&& x($b['params'], 'system_type') && $b['params']['system_type'] === 'public_server_expire') {
- $b['itemlink'] = $a->get_baseurl();
- $b['epreamble'] = $b['preamble'] = sprintf( t('Your account on %s will expire in a few days.'), get_config('system','sitename'));
- $b['subject'] = t('Your Friendica account is about to expire.');
- $b['body'] = sprintf( t("Hi %1\$s,\n\nYour account on %2\$s will expire in less than five days. You may keep your account by logging in at least once every 30 days"), $b['params']['to_name'], "[url=" . $app->config["system"]["url"] . "]" . $app->config["sitename"] . "[/url]");
- }
+ $b['itemlink'] = $a->get_baseurl();
+ $b['epreamble'] = $b['preamble'] = L10n::t('Your account on %s will expire in a few days.', Config::get('system', 'sitename'));
+ $b['subject'] = L10n::t('Your Friendica account is about to expire.');
+ $b['body'] = L10n::t("Hi %1\$s,\n\nYour account on %2\$s will expire in less than five days. You may keep your account by logging in at least once every 30 days", $b['params']['to_name'], "[url=" . $app->config["system"]["url"] . "]" . $app->config["sitename"] . "[/url]");
+ }
}
-function public_server_login($a,$b) {
- $days = get_config('public_server','expiredays');
- if(! $days)
+function public_server_login($a, $b)
+{
+ $days = Config::get('public_server', 'expiredays');
+ if (!$days) {
return;
- $r = q("UPDATE user set account_expires_on = '%s' where uid = %d and account_expires_on > '0000-00-00 00:00:00'",
- dbesc(datetime_convert('UTC','UTC','now +' . $days . ' days')),
- local_user()
- );
-}
+ }
-function public_server_plugin_admin_post ( &$a ) {
- check_form_security_token_redirectOnErr('/admin/plugins/publicserver', 'publicserver');
- $expiredays = (( x($_POST, 'expiredays') ) ? notags(trim($_POST['expiredays'] )) : '');
- $expireposts = (( x($_POST, 'expireposts') ) ? notags(trim($_POST['expireposts'] )) : '');
- $nologin = (( x($_POST, 'nologin') ) ? notags(trim($_POST['nologin'] )) : '');
- $flagusers = (( x($_POST, 'flagusers') ) ? notags(trim($_POST['flagusers'] )) : '');
- $flagposts = (( x($_POST, 'flagposts') ) ? notags(trim($_POST['flagposts'] )) : '');
- $flagpostsexpire = (( x($_POST, 'flagpostsexpire') ) ? notags(trim($_POST['flagpostsexpire'] )) : '');
- set_config( 'public_server','expiredays',$expiredays );
- set_config( 'public_server','expireposts',$expireposts );
- set_config( 'public_server','nologin',$nologin );
- set_config( 'public_server','flagusers',$flagusers);
- set_config( 'public_server','flagposts',$flagposts );
- set_config( 'public_server','flagpostsexpire',$flagpostsexpire );
- info( t('Settings saved').EOL );
+ $fields = ['account_expires_on' => DateTimeFormat::utc('now +' . $days . ' days')];
+ $condition = ["`uid` = ? AND `account_expires_on` > ?", local_user(), NULL_DATE];
+ dba::update('user', $fields, $condition);
}
-function public_server_plugin_admin ( &$a, &$o) {
- $token = get_form_security_token("publicserver");
- $t = get_markup_template( "admin.tpl", "addon/public_server");
- $o = replace_macros($t, array(
- '$submit' => t('Save Settings'),
- '$form_security_token' => $token,
- '$infotext' => t('Set any of these options to 0 to deactivate it.'),
- '$expiredays' => Array( "expiredays","Expire Days", intval(get_config('public_server', 'expiredays')), "When an account is created on the site, it is given a hard "),
- '$expireposts' => Array( "expireposts", "Expire Posts", intval(get_config('public_server','expireposts')), "Set the default days for posts to expire here"),
- '$nologin' => Array( "nologin", "No Login", intval(get_config('public_server','nologin')), "Remove users who have never logged in after nologin days "),
- '$flagusers' => Array( "flagusers", "Flag users", intval(get_config('public_server','flagusers')), "Remove users who last logged in over flagusers days ago"),
- '$flagposts' => Array( "flagposts", "Flag posts", intval(get_config('public_server','flagposts')), "For users who last logged in over flagposts days ago set post expiry days to flagpostsexpire "),
- '$flagpostsexpire' => Array( "flagpostsexpire", "Flag posts expire", intval(get_config('public_server','flagpostsexpire'))),
- ));
+
+function public_server_addon_admin_post(&$a)
+{
+ check_form_security_token_redirectOnErr('/admin/addons/publicserver', 'publicserver');
+ $expiredays = (x($_POST, 'expiredays') ? notags(trim($_POST['expiredays'])) : '');
+ $expireposts = (x($_POST, 'expireposts') ? notags(trim($_POST['expireposts'])) : '');
+ $nologin = (x($_POST, 'nologin') ? notags(trim($_POST['nologin'])) : '');
+ $flagusers = (x($_POST, 'flagusers') ? notags(trim($_POST['flagusers'])) : '');
+ $flagposts = (x($_POST, 'flagposts') ? notags(trim($_POST['flagposts'])) : '');
+ $flagpostsexpire = (x($_POST, 'flagpostsexpire') ? notags(trim($_POST['flagpostsexpire'])) : '');
+ Config::set('public_server', 'expiredays', $expiredays);
+ Config::set('public_server', 'expireposts', $expireposts);
+ Config::set('public_server', 'nologin', $nologin);
+ Config::set('public_server', 'flagusers', $flagusers);
+ Config::set('public_server', 'flagposts', $flagposts);
+ Config::set('public_server', 'flagpostsexpire', $flagpostsexpire);
+ info(L10n::t('Settings saved').EOL);
}
+function public_server_addon_admin(&$a, &$o)
+{
+ $token = get_form_security_token("publicserver");
+ $t = get_markup_template("admin.tpl", "addon/public_server");
+ $o = replace_macros($t, [
+ '$submit' => L10n::t('Save Settings'),
+ '$form_security_token' => $token,
+ '$infotext' => L10n::t('Set any of these options to 0 to deactivate it.'),
+ '$expiredays' => ["expiredays","Expire Days", intval(Config::get('public_server', 'expiredays')), "When an account is created on the site, it is given a hard "],
+ '$expireposts' => ["expireposts", "Expire Posts", intval(Config::get('public_server', 'expireposts')), "Set the default days for posts to expire here"],
+ '$nologin' => ["nologin", "No Login", intval(Config::get('public_server', 'nologin')), "Remove users who have never logged in after nologin days "],
+ '$flagusers' => ["flagusers", "Flag users", intval(Config::get('public_server', 'flagusers')), "Remove users who last logged in over flagusers days ago"],
+ '$flagposts' => ["flagposts", "Flag posts", intval(Config::get('public_server', 'flagposts')), "For users who last logged in over flagposts days ago set post expiry days to flagpostsexpire "],
+ '$flagpostsexpire' => ["flagpostsexpire", "Flag posts expire", intval(Config::get('public_server', 'flagpostsexpire'))],
+ ]);
+}
msgstr ""
#: pumpio.php:255
-msgid "Enable pump.io Post Plugin"
+msgid "Enable pump.io Post Addon"
msgstr ""
#: pumpio.php:260
msgstr "Importovat vzdálenou časovou osu"
#: pumpio.php:255
-msgid "Enable pump.io Post Plugin"
-msgstr "Aktivovat pump.io Post Plugin"
+msgid "Enable pump.io Post Addon"
+msgstr "Aktivovat pump.io Post Addon"
#: pumpio.php:260
msgid "Post to pump.io by default"
$a->strings["pump.io servername (without \"http://\" or \"https://\" )"] = "jméno serveru pump.io (bez \"http://\" nebo \"https://\" )";
$a->strings["Authenticate your pump.io connection"] = "Přihlásit ke spojení na pump.io";
$a->strings["Import the remote timeline"] = "Importovat vzdálenou časovou osu";
-$a->strings["Enable pump.io Post Plugin"] = "Aktivovat pump.io Post Plugin";
+$a->strings["Enable pump.io Post Addon"] = "Aktivovat pump.io Post Addon";
$a->strings["Post to pump.io by default"] = "Defaultní umístění na pump.oi ";
$a->strings["Should posts be public?"] = "Mají být příspěvky veřejné?";
$a->strings["Mirror all public posts"] = "Zrcadlit všechny veřejné příspěvky";
msgstr "Importiere die entfernte Zeitleiste"
#: pumpio.php:255
-msgid "Enable pump.io Post Plugin"
-msgstr "Pump.io-Post-Plugin aktivieren"
+msgid "Enable pump.io Post Addon"
+msgstr "Pump.io-Post-Addon aktivieren"
#: pumpio.php:260
msgid "Post to pump.io by default"
$a->strings["pump.io servername (without \"http://\" or \"https://\" )"] = " Pump.io Servername (ohne \"http://\" oder \"https://\" )";
$a->strings["Authenticate your pump.io connection"] = "Authentifiziere deine Pump.io Verbindung";
$a->strings["Import the remote timeline"] = "Importiere die entfernte Zeitleiste";
-$a->strings["Enable pump.io Post Plugin"] = "Pump.io-Post-Plugin aktivieren";
+$a->strings["Enable pump.io Post Addon"] = "Pump.io-Post-Addon aktivieren";
$a->strings["Post to pump.io by default"] = "Standardmäßig bei Pump.io veröffentlichen";
$a->strings["Should posts be public?"] = "Sollen Nachrichten öffentlich sein ?";
$a->strings["Mirror all public posts"] = "Spiegle alle öffentlichen Nachrichten";
msgstr "Importar la línea de tiempo remota"
#: pumpio.php:255
-msgid "Enable pump.io Post Plugin"
-msgstr "Habilitar Plugin de publicación de Pump.io"
+msgid "Enable pump.io Post Addon"
+msgstr "Habilitar Addon de publicación de Pump.io"
#: pumpio.php:260
msgid "Post to pump.io by default"
$a->strings["pump.io servername (without \"http://\" or \"https://\" )"] = "Nombre de servidor de Pump.io (sin \"http://\" o \"https://\" )";
$a->strings["Authenticate your pump.io connection"] = "Autenticar su conexión de Pump.io";
$a->strings["Import the remote timeline"] = "Importar la línea de tiempo remota";
-$a->strings["Enable pump.io Post Plugin"] = "Habilitar Plugin de publicación de Pump.io";
+$a->strings["Enable pump.io Post Addon"] = "Habilitar Addon de publicación de Pump.io";
$a->strings["Post to pump.io by default"] = "Publicar en Pump.io por defecto";
$a->strings["Should posts be public?"] = "¿Deberían de ser públicas las entradas?";
$a->strings["Mirror all public posts"] = "Reflejar todas las entradas públicas";
msgstr "Importer la timeline distante"
#: pumpio.php:255
-msgid "Enable pump.io Post Plugin"
+msgid "Enable pump.io Post Addon"
msgstr ""
#: pumpio.php:260
$a->strings["pump.io servername (without \"http://\" or \"https://\" )"] = "";
$a->strings["Authenticate your pump.io connection"] = "";
$a->strings["Import the remote timeline"] = "Importer la timeline distante";
-$a->strings["Enable pump.io Post Plugin"] = "";
+$a->strings["Enable pump.io Post Addon"] = "";
$a->strings["Post to pump.io by default"] = "Publier sur pump.io par défaut";
$a->strings["Should posts be public?"] = "Les messages devraient être publiques ?";
$a->strings["Mirror all public posts"] = "";
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014
+# fabrixxm <fabrix.xm@gmail.com>, 2014,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-06-23 14:45+0200\n"
-"PO-Revision-Date: 2015-11-01 11:05+0000\n"
+"PO-Revision-Date: 2018-03-19 13:25+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
msgstr "Importa la timeline remota"
#: pumpio.php:255
-msgid "Enable pump.io Post Plugin"
-msgstr "Abilita il plugin di invio ad pump.io"
+msgid "Enable pump.io Post Addon"
+msgstr "Abilita il componente aggiuntivo di invio ad pump.io"
#: pumpio.php:260
msgid "Post to pump.io by default"
$a->strings["pump.io servername (without \"http://\" or \"https://\" )"] = "nome del server pump.io (senza \"http://\" o \"https://\")";
$a->strings["Authenticate your pump.io connection"] = "Autentica la tua connessione pump.io";
$a->strings["Import the remote timeline"] = "Importa la timeline remota";
-$a->strings["Enable pump.io Post Plugin"] = "Abilita il plugin di invio ad pump.io";
+$a->strings["Enable pump.io Post Addon"] = "Abilita il componente aggiuntivo di invio ad pump.io";
$a->strings["Post to pump.io by default"] = "Invia sempre a pump.io";
$a->strings["Should posts be public?"] = "I messaggi devono essere pubblici?";
$a->strings["Mirror all public posts"] = "Clona tutti i messaggi pubblici";
msgstr "Importar a linha do tempo remota"
#: pumpio.php:255
-msgid "Enable pump.io Post Plugin"
+msgid "Enable pump.io Post Addon"
msgstr "Habilitar plug-in para publicar no Pump.io"
#: pumpio.php:260
$a->strings["pump.io servername (without \"http://\" or \"https://\" )"] = "";
$a->strings["Authenticate your pump.io connection"] = "";
$a->strings["Import the remote timeline"] = "Importar a linha do tempo remota";
-$a->strings["Enable pump.io Post Plugin"] = "Habilitar plug-in para publicar no Pump.io";
+$a->strings["Enable pump.io Post Addon"] = "Habilitar plug-in para publicar no Pump.io";
$a->strings["Post to pump.io by default"] = "Publicar no Pump.io por padrão";
$a->strings["Should posts be public?"] = "";
$a->strings["Mirror all public posts"] = "";
msgstr "Importare cronologie la distanță"
#: pumpio.php:255
-msgid "Enable pump.io Post Plugin"
+msgid "Enable pump.io Post Addon"
msgstr "Activare Modul Postare pump.io"
#: pumpio.php:260
$a->strings["pump.io servername (without \"http://\" or \"https://\" )"] = "Nume server pump.io (fără \"http://\" ori \"https://\" )";
$a->strings["Authenticate your pump.io connection"] = "Autentificați-vă conectarea la pump.io";
$a->strings["Import the remote timeline"] = "Importare cronologie la distanță";
-$a->strings["Enable pump.io Post Plugin"] = "Activare Modul Postare pump.io";
+$a->strings["Enable pump.io Post Addon"] = "Activare Modul Postare pump.io";
$a->strings["Post to pump.io by default"] = "Postați implicit pe pump.io";
$a->strings["Should posts be public?"] = "Postările ar trebui sa fie publice?";
$a->strings["Mirror all public posts"] = "Reproducere pentru toate postările publice";
* Version: 0.2
* Author: Michael Vogel <http://pirati.ca/profile/heluecht>
*/
-require('addon/pumpio/oauth/http.php');
-require('addon/pumpio/oauth/oauth_client.php');
-require_once('include/enotify.php');
-require_once('include/socgraph.php');
-require_once("include/Photo.php");
-require_once("mod/share.php");
+
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Core\Worker;
+use Friendica\Model\Contact;
+use Friendica\Model\GContact;
+use Friendica\Model\Group;
+use Friendica\Model\Item;
+use Friendica\Model\Queue;
+use Friendica\Model\User;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Network;
+
+require 'addon/pumpio/oauth/http.php';
+require 'addon/pumpio/oauth/oauth_client.php';
+require_once 'include/enotify.php';
+require_once "mod/share.php";
define('PUMPIO_DEFAULT_POLL_INTERVAL', 5); // given in minutes
function pumpio_install() {
- register_hook('post_local', 'addon/pumpio/pumpio.php', 'pumpio_post_local');
- register_hook('notifier_normal', 'addon/pumpio/pumpio.php', 'pumpio_send');
- register_hook('jot_networks', 'addon/pumpio/pumpio.php', 'pumpio_jot_nets');
- register_hook('connector_settings', 'addon/pumpio/pumpio.php', 'pumpio_settings');
- register_hook('connector_settings_post', 'addon/pumpio/pumpio.php', 'pumpio_settings_post');
- register_hook('cron', 'addon/pumpio/pumpio.php', 'pumpio_cron');
- register_hook('queue_predeliver', 'addon/pumpio/pumpio.php', 'pumpio_queue_hook');
- register_hook('check_item_notification','addon/pumpio/pumpio.php', 'pumpio_check_item_notification');
+ Addon::registerHook('post_local', 'addon/pumpio/pumpio.php', 'pumpio_post_local');
+ Addon::registerHook('notifier_normal', 'addon/pumpio/pumpio.php', 'pumpio_send');
+ Addon::registerHook('jot_networks', 'addon/pumpio/pumpio.php', 'pumpio_jot_nets');
+ Addon::registerHook('connector_settings', 'addon/pumpio/pumpio.php', 'pumpio_settings');
+ Addon::registerHook('connector_settings_post', 'addon/pumpio/pumpio.php', 'pumpio_settings_post');
+ Addon::registerHook('cron', 'addon/pumpio/pumpio.php', 'pumpio_cron');
+ Addon::registerHook('queue_predeliver', 'addon/pumpio/pumpio.php', 'pumpio_queue_hook');
+ Addon::registerHook('check_item_notification','addon/pumpio/pumpio.php', 'pumpio_check_item_notification');
}
function pumpio_uninstall() {
- unregister_hook('post_local', 'addon/pumpio/pumpio.php', 'pumpio_post_local');
- unregister_hook('notifier_normal', 'addon/pumpio/pumpio.php', 'pumpio_send');
- unregister_hook('jot_networks', 'addon/pumpio/pumpio.php', 'pumpio_jot_nets');
- unregister_hook('connector_settings', 'addon/pumpio/pumpio.php', 'pumpio_settings');
- unregister_hook('connector_settings_post', 'addon/pumpio/pumpio.php', 'pumpio_settings_post');
- unregister_hook('cron', 'addon/pumpio/pumpio.php', 'pumpio_cron');
- unregister_hook('queue_predeliver', 'addon/pumpio/pumpio.php', 'pumpio_queue_hook');
- unregister_hook('check_item_notification','addon/pumpio/pumpio.php', 'pumpio_check_item_notification');
+ Addon::unregisterHook('post_local', 'addon/pumpio/pumpio.php', 'pumpio_post_local');
+ Addon::unregisterHook('notifier_normal', 'addon/pumpio/pumpio.php', 'pumpio_send');
+ Addon::unregisterHook('jot_networks', 'addon/pumpio/pumpio.php', 'pumpio_jot_nets');
+ Addon::unregisterHook('connector_settings', 'addon/pumpio/pumpio.php', 'pumpio_settings');
+ Addon::unregisterHook('connector_settings_post', 'addon/pumpio/pumpio.php', 'pumpio_settings_post');
+ Addon::unregisterHook('cron', 'addon/pumpio/pumpio.php', 'pumpio_cron');
+ Addon::unregisterHook('queue_predeliver', 'addon/pumpio/pumpio.php', 'pumpio_queue_hook');
+ Addon::unregisterHook('check_item_notification','addon/pumpio/pumpio.php', 'pumpio_check_item_notification');
}
function pumpio_module() {}
function pumpio_content(&$a) {
if(! local_user()) {
- notice( t('Permission denied.') . EOL);
+ notice(L10n::t('Permission denied.') . EOL);
return '';
}
if (($consumer_key == "") || ($consumer_secret == "")) {
logger("pumpio_connect: ".sprintf("Unable to register the client at the pump.io server '%s'.", $hostname));
- $o .= sprintf(t("Unable to register the client at the pump.io server '%s'."), $hostname);
+ $o .= L10n::t("Unable to register the client at the pump.io server '%s'.", $hostname);
return($o);
}
// Let's begin. First we need a Request Token. The request token is required to send the user
// to pumpio's login page.
- // Create a new instance of the TumblrOAuth library. For this step, all we need to give the library is our
+ // Create a new instance of the oauth_client_class library. For this step, all we need to give the library is our
// Consumer Key and Consumer Secret
$client = new oauth_client_class;
$client->debug = 1;
if($success) {
logger("pumpio_connect: authenticated");
- $o .= t("You are now authenticated to pumpio.");
- $o .= '<br /><a href="'.$a->get_baseurl().'/settings/connectors">'.t("return to the connector page").'</a>';
+ $o .= L10n::t("You are now authenticated to pumpio.");
+ $o .= '<br /><a href="'.$a->get_baseurl().'/settings/connectors">'.L10n::t("return to the connector page").'</a>';
} else {
logger("pumpio_connect: could not connect");
$o = 'Could not connect to pumpio. Refresh the page or try again later.';
$pumpio_defpost = get_pconfig(local_user(),'pumpio','post_by_default');
$selected = ((intval($pumpio_defpost) == 1) ? ' checked="checked" ' : '');
$b .= '<div class="profile-jot-net"><input type="checkbox" name="pumpio_enable"' . $selected . ' value="1" /> '
- . t('Post to pumpio') . '</div>';
+ . L10n::t('Post to pumpio') . '</div>';
}
}
/* Add some HTML to the existing form */
$s .= '<span id="settings_pumpio_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_pumpio_expanded\'); openClose(\'settings_pumpio_inflated\');">';
- $s .= '<img class="connector'.$css.'" src="images/pumpio.png" /><h3 class="connector">'. t('Pump.io Import/Export/Mirror').'</h3>';
+ $s .= '<img class="connector'.$css.'" src="images/pumpio.png" /><h3 class="connector">'. L10n::t('Pump.io Import/Export/Mirror').'</h3>';
$s .= '</span>';
$s .= '<div id="settings_pumpio_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_pumpio_expanded\'); openClose(\'settings_pumpio_inflated\');">';
- $s .= '<img class="connector'.$css.'" src="images/pumpio.png" /><h3 class="connector">'. t('Pump.io Import/Export/Mirror').'</h3>';
+ $s .= '<img class="connector'.$css.'" src="images/pumpio.png" /><h3 class="connector">'. L10n::t('Pump.io Import/Export/Mirror').'</h3>';
$s .= '</span>';
$s .= '<div id="pumpio-username-wrapper">';
- $s .= '<label id="pumpio-username-label" for="pumpio-username">'.t('pump.io username (without the servername)').'</label>';
+ $s .= '<label id="pumpio-username-label" for="pumpio-username">'.L10n::t('pump.io username (without the servername)').'</label>';
$s .= '<input id="pumpio-username" type="text" name="pumpio_user" value="'.$username.'" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="pumpio-servername-wrapper">';
- $s .= '<label id="pumpio-servername-label" for="pumpio-servername">'.t('pump.io servername (without "http://" or "https://" )').'</label>';
+ $s .= '<label id="pumpio-servername-label" for="pumpio-servername">'.L10n::t('pump.io servername (without "http://" or "https://" )').'</label>';
$s .= '<input id="pumpio-servername" type="text" name="pumpio_host" value="'.$servername.'" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="pumpio-password-wrapper">';
if (($oauth_token == "") || ($oauth_token_secret == "")) {
$s .= '<div id="pumpio-authenticate-wrapper">';
- $s .= '<a href="'.$a->get_baseurl().'/pumpio/connect">'.t("Authenticate your pump.io connection").'</a>';
+ $s .= '<a href="'.$a->get_baseurl().'/pumpio/connect">'.L10n::t("Authenticate your pump.io connection").'</a>';
$s .= '</div><div class="clear"></div>';
} else {
$s .= '<div id="pumpio-import-wrapper">';
- $s .= '<label id="pumpio-import-label" for="pumpio-import">' . t('Import the remote timeline') . '</label>';
+ $s .= '<label id="pumpio-import-label" for="pumpio-import">' . L10n::t('Import the remote timeline') . '</label>';
$s .= '<input id="pumpio-import" type="checkbox" name="pumpio_import" value="1" ' . $import_checked . '/>';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="pumpio-enable-wrapper">';
- $s .= '<label id="pumpio-enable-label" for="pumpio-checkbox">' . t('Enable pump.io Post Plugin') . '</label>';
+ $s .= '<label id="pumpio-enable-label" for="pumpio-checkbox">' . L10n::t('Enable pump.io Post Addon') . '</label>';
$s .= '<input id="pumpio-checkbox" type="checkbox" name="pumpio" value="1" ' . $checked . '/>';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="pumpio-bydefault-wrapper">';
- $s .= '<label id="pumpio-bydefault-label" for="pumpio-bydefault">' . t('Post to pump.io by default') . '</label>';
+ $s .= '<label id="pumpio-bydefault-label" for="pumpio-bydefault">' . L10n::t('Post to pump.io by default') . '</label>';
$s .= '<input id="pumpio-bydefault" type="checkbox" name="pumpio_bydefault" value="1" ' . $def_checked . '/>';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="pumpio-public-wrapper">';
- $s .= '<label id="pumpio-public-label" for="pumpio-public">' . t('Should posts be public?') . '</label>';
+ $s .= '<label id="pumpio-public-label" for="pumpio-public">' . L10n::t('Should posts be public?') . '</label>';
$s .= '<input id="pumpio-public" type="checkbox" name="pumpio_public" value="1" ' . $public_checked . '/>';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="pumpio-mirror-wrapper">';
- $s .= '<label id="pumpio-mirror-label" for="pumpio-mirror">' . t('Mirror all public posts') . '</label>';
+ $s .= '<label id="pumpio-mirror-label" for="pumpio-mirror">' . L10n::t('Mirror all public posts') . '</label>';
$s .= '<input id="pumpio-mirror" type="checkbox" name="pumpio_mirror" value="1" ' . $mirror_checked . '/>';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="pumpio-delete-wrapper">';
- $s .= '<label id="pumpio-delete-label" for="pumpio-delete">' . t('Check to delete this preset') . '</label>';
+ $s .= '<label id="pumpio-delete-label" for="pumpio-delete">' . L10n::t('Check to delete this preset') . '</label>';
$s .= '<input id="pumpio-delete" type="checkbox" name="pumpio_delete" value="1" />';
$s .= '</div><div class="clear"></div>';
}
/* provide a submit button */
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="pumpio-submit" name="pumpio-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="pumpio-submit" name="pumpio-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
$public = get_pconfig($b['uid'], "pumpio", "public");
if($oauth_token && $oauth_token_secret) {
-
- require_once('include/bbcode.php');
-
$title = trim($b['title']);
- $content = bbcode($b['body'], false, false, 4);
+ $content = BBCode::convert($b['body'], false, 4);
$params = array();
logger('pumpio_send '.$username.': success '.$post_id);
if($post_id && $iscomment) {
logger('pumpio_send '.$username.': Update extid '.$post_id." for post id ".$b['id']);
- q("UPDATE `item` SET `extid` = '%s' WHERE `id` = %d",
- dbesc($post_id),
- intval($b['id'])
- );
+ Item::update(['extid' => $post_id], ['id' => $b['id']]);
}
} else {
logger('pumpio_send '.$username.': '.$url.' general error: ' . print_r($user,true));
if (count($r))
$a->contact = $r[0]["id"];
- $s = serialize(array('url' => $url, 'item' => $b['id'], 'post' => $params));
- require_once('include/queue_fn.php');
- add_to_queue($a->contact,NETWORK_PUMPIO,$s);
- notice(t('Pump.io post failed. Queued for retry.').EOL);
- }
+ $s = serialize(['url' => $url, 'item' => $b['id'], 'post' => $params]);
+ Queue::add($a->contact, NETWORK_PUMPIO, $s);
+ notice(L10n::t('Pump.io post failed. Queued for retry.').EOL);
+ }
}
}
if (count($r))
$a->contact = $r[0]["id"];
- $s = serialize(array('url' => $url, 'item' => $orig_post["id"], 'post' => $params));
- require_once('include/queue_fn.php');
- add_to_queue($a->contact,NETWORK_PUMPIO,$s);
- notice(t('Pump.io like failed. Queued for retry.').EOL);
+ $s = serialize(['url' => $url, 'item' => $orig_post["id"], 'post' => $params]);
+
+ Queue::add($a->contact, NETWORK_PUMPIO, $s);
+ notice(L10n::t('Pump.io like failed. Queued for retry.').EOL);
}
}
if ($abandon_days < 1)
$abandon_days = 0;
- $abandon_limit = date("Y-m-d H:i:s", time() - $abandon_days * 86400);
+ $abandon_limit = date(DateTimeFormat::MYSQL, time() - $abandon_days * 86400);
$r = q("SELECT * FROM `pconfig` WHERE `cat` = 'pumpio' AND `k` = 'import' AND `v` = '1' ORDER BY RAND() ");
if(count($r)) {
// get the application name for the pump.io app
// 1st try personal config, then system config and fallback to the
// hostname of the node if neither one is set.
- $application_name = get_pconfig( $uid, 'pumpio', 'application_name');
+ $application_name = PConfig::get($uid, 'pumpio', 'application_name');
if ($application_name == "")
$application_name = get_config('pumpio', 'application_name');
if ($application_name == "")
$contactid = $orig_post['contact-id'];
}
- $r = q("UPDATE `item` SET `deleted` = 1, `unseen` = 1, `changed` = '%s' WHERE `verb` = '%s' AND `uid` = %d AND `contact-id` = %d AND `thr-parent` = '%s'",
- dbesc(datetime_convert()),
- dbesc(ACTIVITY_LIKE),
- intval($uid),
- intval($contactid),
- dbesc($orig_post['uri'])
- );
+ Item::delete(['verb' => ACTIVITY_LIKE, 'uid' => $uid, 'contact-id' => $contactid, 'thr-parent' => $orig_post['uri']]);
if(count($r))
logger("pumpio_dounlike: unliked existing like. User ".$own_id." ".$uid." Contact: ".$contactid." Url ".$orig_post['uri']);
$author = '[url=' . $likedata['author-link'] . ']' . $likedata['author-name'] . '[/url]';
$objauthor = '[url=' . $orig_post['author-link'] . ']' . $orig_post['author-name'] . '[/url]';
- $post_type = t('status');
+ $post_type = L10n::t('status');
$plink = '[url=' . $orig_post['plink'] . ']' . $post_type . '[/url]';
$likedata['object-type'] = ACTIVITY_OBJ_NOTE;
- $likedata['body'] = sprintf( t('%1$s likes %2$s\'s %3$s'), $author, $objauthor, $plink);
+ $likedata['body'] = L10n::t('%1$s likes %2$s\'s %3$s', $author, $objauthor, $plink);
$likedata['object'] = '<object><type>' . ACTIVITY_OBJ_NOTE . '</type><local>1</local>' .
'<id>' . $orig_post['uri'] . '</id><link>' . xmlify('<link rel="alternate" type="text/html" href="' . xmlify($orig_post['plink']) . '" />') . '</link><title>' . $orig_post['title'] . '</title><content>' . $orig_post['body'] . '</content></object>';
- $ret = item_store($likedata);
+ $ret = Item::insert($likedata);
logger("pumpio_dolike: ".$ret." User ".$own_id." ".$uid." Contact: ".$contactid." Url ".$orig_post['uri']);
}
`location`, `about`, `writable`, `blocked`, `readonly`, `pending` )
VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', %d, 0, 0, 0)",
intval($uid),
- dbesc(datetime_convert()),
+ dbesc(DateTimeFormat::utcNow()),
dbesc($contact->url),
dbesc(normalise_link($contact->url)),
dbesc(str_replace("acct:", "", $contact->id)),
);
if (count($r))
- return drop_item($r[0]["id"], $false);
+ return Item::deleteById($r[0]["id"]);
$r = q("SELECT * FROM `item` WHERE `extid` = '%s' AND `uid` = %d LIMIT 1",
dbesc($post->object->id),
);
if (count($r))
- return drop_item($r[0]["id"], $false);
+ return Item::deleteById($r[0]["id"]);
}
function pumpio_dopost(&$a, $client, $uid, $self, $post, $own_id, $threadcompletion = true) {
if ($post->object->displayName != "")
$postarray['title'] = $post->object->displayName;
- $postarray['created'] = datetime_convert('UTC','UTC',$post->published);
+ $postarray['created'] = DateTimeFormat::utc($post->published);
if (isset($post->updated))
- $postarray['edited'] = datetime_convert('UTC','UTC',$post->updated);
+ $postarray['edited'] = DateTimeFormat::utc($post->updated);
elseif (isset($post->received))
- $postarray['edited'] = datetime_convert('UTC','UTC',$post->received);
+ $postarray['edited'] = DateTimeFormat::utc($post->received);
else
$postarray['edited'] = $postarray['created'];
$postarray['body'] = share_header($share_author, $post->object->author->url,
$post->object->author->image->url, "",
- datetime_convert('UTC','UTC',$post->object->created),
+ DateTimeFormat::utc($post->object->created),
$post->links->self->href).
$postarray['body']."[/share]";
$postarray['body'] = "[share author='".$share_author.
"' profile='".$post->object->author->url.
"' avatar='".$post->object->author->image->url.
- "' posted='".datetime_convert('UTC','UTC',$post->object->created).
+ "' posted='".DateTimeFormat::convert($post->object->created, 'UTC', 'UTC', ).
"' link='".$post->links->self->href."']".$postarray['body']."[/share]";
*/
} else {
if (trim($postarray['body']) == "")
return false;
- $top_item = item_store($postarray);
+ $top_item = Item::insert($postarray);
$postarray["id"] = $top_item;
if (($top_item == 0) && ($post->verb == "update")) {
- $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s' , `changed` = '%s' WHERE `uri` = '%s' AND `uid` = %d",
- dbesc($postarray["title"]),
- dbesc($postarray["body"]),
- dbesc($postarray["edited"]),
- dbesc($postarray["uri"]),
- intval($uid)
- );
+ $fields = ['title' => $postarray["title"], 'body' => $postarray["body"], 'changed' => $postarray["edited"]];
+ $condition = ['uri' => $postarray["uri"], 'uid' => $uid];
+ Item::update($fields, $condition);
}
if ($post->object->objectType == "comment") {
'to_email' => $user[0]['email'],
'uid' => $user[0]['uid'],
'item' => $postarray,
- 'link' => $a->get_baseurl().'/display/'.urlencode(get_item_guid($top_item)),
+ 'link' => $a->get_baseurl().'/display/'.urlencode(Item::getGuidById($top_item)),
'source_name' => $postarray['author-name'],
'source_link' => $postarray['author-link'],
'source_photo' => $postarray['author-avatar'],
if(! count($qi))
return;
- require_once('include/queue_fn.php');
-
foreach($qi as $x) {
if($x['network'] !== NETWORK_PUMPIO)
continue;
logger('pumpio_queue: send '.$username.': success '.$post_id);
if($post_id && $iscomment) {
logger('pumpio_send '.$username.': Update extid '.$post_id." for post id ".$z['item']);
- q("UPDATE `item` SET `extid` = '%s' WHERE `id` = %d",
- dbesc($post_id),
- intval($z['item'])
- );
+ Item::update(['extid' => $post_id], ['id' => $z['item']]);
}
- remove_queue_item($x['id']);
+ Queue::removeItem($x['id']);
} else
logger('pumpio_queue: send '.$username.': '.$url.' general error: ' . print_r($user,true));
} else
if (!$success) {
logger('pumpio_queue: delayed');
- update_queue_time($x['id']);
+ Queue::updateTime($x['id']);
}
}
}
function pumpio_reachable($url) {
- $data = z_fetch_url($url, false, $redirects, array('timeout'=>10));
+ $data = Network::curl($url, false, $redirects, ['timeout'=>10]);
return(intval($data['return_code']) != 0);
}
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:22+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
<?php
-
-
/**
* Name: Quick Comment
* Description: Two click comments
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
- *
+ *
* Provides a set of text "snippets" which can be inserted into a comment window by clicking on them.
- * First enable the addon in the system admin panel.
- * Then each person can tailor their choice of words in Settings->Plugin Settings in the Qcomment
+ * First enable the addon in the system admin panel.
+ * Then each person can tailor their choice of words in Settings->Addon Settings in the Qcomment
* pane. Initially no qcomments are provided, but on viewing the settings page, a default set of
- * of words is suggested. These can be accepted (click Submit) or edited first. Each text line represents
- * a different qcomment.
+ * of words is suggested. These can be accepted (click Submit) or edited first. Each text line represents
+ * a different qcomment.
* Many themes will hide the qcomments above or immediately adjacent to the comment input box until
* you wish to use them. On some themes they may be visible.
- * Wave the mouse around near the comment input box and the qcomments will show up. Click on any of
+ * Wave the mouse around near the comment input box and the qcomments will show up. Click on any of
* them to open the comment window fully and insert the qcomment. Then "Submit" will submit it.
*
*/
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
function qcomment_install() {
- register_hook('plugin_settings', 'addon/qcomment/qcomment.php', 'qcomment_addon_settings');
- register_hook('plugin_settings_post', 'addon/qcomment/qcomment.php', 'qcomment_addon_settings_post');
+ Addon::registerHook('addon_settings', 'addon/qcomment/qcomment.php', 'qcomment_addon_settings');
+ Addon::registerHook('addon_settings_post', 'addon/qcomment/qcomment.php', 'qcomment_addon_settings_post');
}
-
function qcomment_uninstall() {
- unregister_hook('plugin_settings', 'addon/qcomment/qcomment.php', 'qcomment_addon_settings');
- unregister_hook('plugin_settings_post', 'addon/qcomment/qcomment.php', 'qcomment_addon_settings_post');
+ Addon::unregisterHook('addon_settings', 'addon/qcomment/qcomment.php', 'qcomment_addon_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/qcomment/qcomment.php', 'qcomment_addon_settings_post');
}
-
-
-
-
-function qcomment_addon_settings(&$a,&$s) {
-
- if(! local_user())
+function qcomment_addon_settings(&$a, &$s)
+{
+ if (! local_user()) {
return;
/* Add our stylesheet to the page so we can make our settings look nice */
$a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' . $a->get_baseurl() . '/addon/qcomment/qcomment.css' . '" media="all" />' . "\r\n";
- $words = get_pconfig(local_user(),'qcomment','words');
- if($words === false)
- $words = t(':-)') . "\n" . t(':-(') . "\n" . t('lol');
+ $words = PConfig::get(local_user(), 'qcomment', 'words', L10n::t(':-)') . "\n" . L10n::t(':-(') . "\n" . L10n::t('lol'));
- $s .= '<div class="settings-block">';
- $s .= '<h3>' . t('Quick Comment Settings') . '</h3>';
- $s .= '<div id="qcomment-wrapper">';
- $s .= '<div id="qcomment-desc">' . t("Quick comments are found near comment boxes, sometimes hidden. Click them to provide simple replies.") . '</div>';
- $s .= '<label id="qcomment-label" for="qcomment-words">' . t('Enter quick comments, one per line') . ' </label>';
- $s .= '<textarea id="qcomment-words" type="text" name="qcomment-words" >' . htmlspecialchars(unxmlify($words)) . '</textarea>';
- $s .= '</div><div class="clear"></div>';
+ $s .= '<div class="settings-block">';
+ $s .= '<h3>' . L10n::t('Quick Comment Settings') . '</h3>';
+ $s .= '<div id="qcomment-wrapper">';
+ $s .= '<div id="qcomment-desc">' . L10n::t("Quick comments are found near comment boxes, sometimes hidden. Click them to provide simple replies.") . '</div>';
+ $s .= '<label id="qcomment-label" for="qcomment-words">' . L10n::t('Enter quick comments, one per line') . ' </label>';
+ $s .= '<textarea id="qcomment-words" type="text" name="qcomment-words" >' . htmlspecialchars(unxmlify($words)) . '</textarea>';
+ $s .= '</div><div class="clear"></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="qcomment-submit" name="qcomment-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="qcomment-submit" name="qcomment-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
$s .= '</div>';
return;
return;
if($_POST['qcomment-submit']) {
- set_pconfig(local_user(),'qcomment','words',xmlify($_POST['qcomment-words']));
- info( t('Quick Comment settings saved.') . EOL);
+ PConfig::set(local_user(),'qcomment','words',xmlify($_POST['qcomment-words']));
+ info(L10n::t('Quick Comment settings saved.') . EOL);
}
}
-
msgstr ""
#: randplace.php:171
-msgid "Enable Randplace Plugin"
+msgid "Enable Randplace Addon"
msgstr ""
#: randplace.php:177
<?php\r
\r
$a->strings["Randplace Settings"] = "Configuració de Randplace";\r
-$a->strings["Enable Randplace Plugin"] = "Habilitar el Plugin de Randplace";\r
+$a->strings["Enable Randplace Addon"] = "Habilitar el Addon de Randplace";\r
$a->strings["Submit"] = "Enviar";\r
msgstr "Randplace Nastavení"
#: randplace.php:171
-msgid "Enable Randplace Plugin"
-msgstr "Povolit Randplace Plugin"
+msgid "Enable Randplace Addon"
+msgstr "Povolit Randplace Addon"
#: randplace.php:177
msgid "Save Settings"
}}
;
$a->strings["Randplace Settings"] = "Randplace Nastavení";
-$a->strings["Enable Randplace Plugin"] = "Povolit Randplace Plugin";
+$a->strings["Enable Randplace Addon"] = "Povolit Randplace Addon";
$a->strings["Save Settings"] = "Uložit Nastavení";
msgstr "Randplace-Einstellungen"
#: randplace.php:171
-msgid "Enable Randplace Plugin"
-msgstr "Randplace-Plugin aktivieren"
+msgid "Enable Randplace Addon"
+msgstr "Randplace-Addon aktivieren"
#: randplace.php:177
msgid "Save Settings"
}}
;
$a->strings["Randplace Settings"] = "Randplace-Einstellungen";
-$a->strings["Enable Randplace Plugin"] = "Randplace-Plugin aktivieren";
+$a->strings["Enable Randplace Addon"] = "Randplace-Addon aktivieren";
$a->strings["Save Settings"] = "Einstellungen speichern";
<?php\r
\r
$a->strings["Randplace Settings"] = "Randplace agordoj.";\r
-$a->strings["Enable Randplace Plugin"] = "Aktivigi la Randplace kromprogramon.";\r
+$a->strings["Enable Randplace Addon"] = "Aktivigi la Randplace kromprogramon.";\r
$a->strings["Submit"] = "Sendi";\r
msgstr "Ajustes de Randplace"
#: randplace.php:171
-msgid "Enable Randplace Plugin"
-msgstr "Habilitar el Plugin de Randplace"
+msgid "Enable Randplace Addon"
+msgstr "Habilitar el Addon de Randplace"
#: randplace.php:177
msgid "Submit"
}}
;
$a->strings["Randplace Settings"] = "Ajustes de Randplace";
-$a->strings["Enable Randplace Plugin"] = "Habilitar el Plugin de Randplace";
+$a->strings["Enable Randplace Addon"] = "Habilitar el Addon de Randplace";
$a->strings["Submit"] = "Enviar";
<?php\r
\r
$a->strings["Randplace Settings"] = "Réglages de Randplace";\r
-$a->strings["Enable Randplace Plugin"] = "Activer l'extension Randplace";\r
+$a->strings["Enable Randplace Addon"] = "Activer l'extension Randplace";\r
$a->strings["Submit"] = "Envoyer";\r
<?php\r
\r
$a->strings["Randplace Settings"] = "Stilla Randplace";\r
-$a->strings["Enable Randplace Plugin"] = "Kveikja á Randplace einingu";\r
+$a->strings["Enable Randplace Addon"] = "Kveikja á Randplace einingu";\r
$a->strings["Submit"] = "Senda inn";\r
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:22+0000\n"
+"PO-Revision-Date: 2018-03-19 13:25+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
msgstr "Impostazioni \"Posizione casuale\""
#: randplace.php:171
-msgid "Enable Randplace Plugin"
-msgstr "Abilita il plugin \"Posizione casuale\""
+msgid "Enable Randplace Addon"
+msgstr "Abilita il componente aggiuntivo Posizione Casuale"
#: randplace.php:177
msgid "Submit"
}}
;
$a->strings["Randplace Settings"] = "Impostazioni \"Posizione casuale\"";
-$a->strings["Enable Randplace Plugin"] = "Abilita il plugin \"Posizione casuale\"";
+$a->strings["Enable Randplace Addon"] = "Abilita il componente aggiuntivo Posizione Casuale";
$a->strings["Submit"] = "Invia";
<?php\r
\r
$a->strings["Randplace Settings"] = "Tilfeldig plassering";\r
-$a->strings["Enable Randplace Plugin"] = "Aktiver Tilfeldig plassering-tillegget";\r
+$a->strings["Enable Randplace Addon"] = "Aktiver Tilfeldig plassering-tillegget";\r
$a->strings["Submit"] = "Lagre";\r
<?php\r
\r
$a->strings["Randplace Settings"] = "Ustawienia Randplace";\r
-$a->strings["Enable Randplace Plugin"] = "Włącz Randplace Plugin";\r
+$a->strings["Enable Randplace Addon"] = "Włącz Randplace Addon";\r
$a->strings["Submit"] = "Potwierdź";\r
<?php\r
\r
$a->strings["Randplace Settings"] = "Configurações do Randplace";\r
-$a->strings["Enable Randplace Plugin"] = "Habilitar o plugin Randplace";\r
+$a->strings["Enable Randplace Addon"] = "Habilitar o addon Randplace";\r
$a->strings["Submit"] = "Enviar";\r
msgstr "Configurări Randplace"
#: randplace.php:171
-msgid "Enable Randplace Plugin"
+msgid "Enable Randplace Addon"
msgstr "Activare Modul Randplace"
#: randplace.php:177
}}
;
$a->strings["Randplace Settings"] = "Configurări Randplace";
-$a->strings["Enable Randplace Plugin"] = "Activare Modul Randplace";
+$a->strings["Enable Randplace Addon"] = "Activare Modul Randplace";
$a->strings["Save Settings"] = "Salvare Configurări";
<?php\r
\r
$a->strings["Randplace Settings"] = "Настройки Случайного места";\r
-$a->strings["Enable Randplace Plugin"] = "Включить Randplace плагин";\r
+$a->strings["Enable Randplace Addon"] = "Включить Randplace плагин";\r
$a->strings["Submit"] = "Подтвердить";\r
<?php\r
\r
$a->strings["Randplace Settings"] = "Randplace Settings";\r
-$a->strings["Enable Randplace Plugin"] = "Enable Randplace Plugin";\r
+$a->strings["Enable Randplace Addon"] = "Enable Randplace Addon";\r
$a->strings["Submit"] = "Spara";\r
<?php\r
\r
$a->strings["Randplace Settings"] = "随意下设置";\r
-$a->strings["Enable Randplace Plugin"] = "使随意下插件能用";\r
+$a->strings["Enable Randplace Addon"] = "使随意下插件能用";\r
$a->strings["Submit"] = "提交";\r
<?php
/**
* Name: Random place
- * Description: Sample Friendica plugin/addon. Set a random place when posting.
+ * Description: Sample Friendica addon. Set a random place when posting.
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*
* Addons are registered with the system through the admin
* panel.
*
- * When registration is detected, the system calls the plugin
+ * When registration is detected, the system calls the addon
* name_install() function, located in 'addon/name/name.php',
* where 'name' is the name of the addon.
* If the addon is removed from the configuration list, the
* system will call the name_uninstall() function.
*
*/
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
function randplace_install() {
/**
- *
- * Our demo plugin will attach in three places.
+ *
+ * Our demo addon will attach in three places.
* The first is just prior to storing a local post.
*
*/
- register_hook('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
+ Addon::registerHook('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
/**
*
- * Then we'll attach into the plugin settings page, and also the
+ * Then we'll attach into the addon settings page, and also the
* settings post hook so that we can create and update
* user preferences.
*
*/
- register_hook('plugin_settings', 'addon/randplace/randplace.php', 'randplace_settings');
- register_hook('plugin_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
+ Addon::registerHook('addon_settings', 'addon/randplace/randplace.php', 'randplace_settings');
+ Addon::registerHook('addon_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
logger("installed randplace");
}
*
*/
- unregister_hook('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
- unregister_hook('plugin_settings', 'addon/randplace/randplace.php', 'randplace_settings');
- unregister_hook('plugin_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
+ Addon::unregisterHook('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
+ Addon::unregisterHook('addon_settings', 'addon/randplace/randplace.php', 'randplace_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
logger("removed randplace");
* An item was posted on the local system.
* We are going to look for specific items:
* - A status post by a profile owner
- * - The profile owner must have allowed our plugin
+ * - The profile owner must have allowed our addon
*
*/
/**
*
- * Called from the Plugin Setting form.
+ * Called from the Addon Setting form.
* Add our own settings info to the page.
*
*/
/* Add some HTML to the existing form */
$s .= '<div class="settings-block">';
- $s .= '<h3>' . t('Randplace Settings') . '</h3>';
+ $s .= '<h3>' . L10n::t('Randplace Settings') . '</h3>';
$s .= '<div id="randplace-enable-wrapper">';
- $s .= '<label id="randplace-enable-label" for="randplace-checkbox">' . t('Enable Randplace Plugin') . '</label>';
+ $s .= '<label id="randplace-enable-label" for="randplace-checkbox">' . L10n::t('Enable Randplace Addon') . '</label>';
$s .= '<input id="randplace-checkbox" type="checkbox" name="randplace" value="1" ' . $checked . '/>';
$s .= '</div><div class="clear"></div>';
/* provide a submit button */
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="randplace-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="randplace-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
-The Remote Permissions plugin enables recipients of private posts to see who else has received the post. This can be beneficial on community servers where people may want to modify the way they speak depending on who can see their comments to the post.
+The Remote Permissions addon enables recipients of private posts to see who else has received the post. This can be beneficial on community servers where people may want to modify the way they speak depending on who can see their comments to the post.
-Note that since Friendica is federated, the local hub may have posts that originated elsewhere. In that case, the plugin has no way of knowing all the recipients of the post, and it must settle for finding out who else can see it on the local hub.
+Note that since Friendica is federated, the local hub may have posts that originated elsewhere. In that case, the addon has no way of knowing all the recipients of the post, and it must settle for finding out who else can see it on the local hub.
-The hub admin can specify one of two behaviors for this plugin:
+The hub admin can specify one of two behaviors for this addon:
* **Global:** every private post on the local hub will show all recipients (or at least the ones it can discover) of the post to any other users on the local hub
* **Individual:** only private posts from those users on the local hub who "opt-in" will show the post recipients. None of the private posts that originated elsewhere will show even partial lists of post recipients
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:23+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
* Author: Zach <https://f.shmuz.in/profile/techcity>
*
*/
-
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
function remote_permissions_install() {
- register_hook('lockview_content', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_content');
- register_hook('plugin_settings', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_settings');
- register_hook('plugin_settings_post', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_settings_post');
+ Addon::registerHook('lockview_content', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_content');
+ Addon::registerHook('addon_settings', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_settings');
+ Addon::registerHook('addon_settings_post', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_settings_post');
}
function remote_permissions_uninstall() {
- unregister_hook('lockview_content', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_content');
- unregister_hook('plugin_settings', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_settings');
- unregister_hook('plugin_settings_post', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_settings_post');
+ Addon::unregisterHook('lockview_content', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_content');
+ Addon::unregisterHook('addon_settings', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_settings_post');
}
function remote_permissions_settings(&$a,&$o) {
// $t = file_get_contents("addon/remote_permissions/settings.tpl" );
$t = get_markup_template("settings.tpl", "addon/remote_permissions/" );
- $o .= replace_macros($t, array(
- '$remote_perms_title' => t('Remote Permissions Settings'),
- '$remote_perms_label' => t('Allow recipients of your private posts to see the other recipients of the posts'),
+ $o .= replace_macros($t, [
+ '$remote_perms_title' => L10n::t('Remote Permissions Settings'),
+ '$remote_perms_label' => L10n::t('Allow recipients of your private posts to see the other recipients of the posts'),
'$checked' => (($remote_perms == 1) ? 'checked="checked"' : ''),
- '$submit' => t('Save Settings')
- ));
+ '$submit' => L10n::t('Save Settings')
+ ]);
}
if(! local_user() || (! x($_POST,'remote-perms-submit')))
return;
- set_pconfig(local_user(),'remote_perms','show',intval($_POST['remote-perms']));
- info( t('Remote Permissions settings updated.') . EOL);
+ PConfig::set(local_user(),'remote_perms','show',intval($_POST['remote-perms']));
+ info(L10n::t('Remote Permissions settings updated.') . EOL);
}
function remote_permissions_content($a, $item_copy) {
$deny_users = expand_acl($item['deny_cid']);
$deny_groups = expand_acl($item['deny_gid']);
- $o = t('Visible to:') . '<br />';
- $allow = array();
- $deny = array();
+ $o = L10n::t('Visible to:') . '<br />';
+ $allow = [];
+ $deny = [];
if(count($allowed_groups)) {
$r = q("SELECT DISTINCT `contact-id` FROM group_member WHERE gid IN ( %s )",
if(! $r)
return;
- $o = t('Visible to') . ' (' . t('may only be a partial list') . '):<br />';
+ $o = L10n::t('Visible to') . ' (' . L10n::t('may only be a partial list') . '):<br />';
foreach($r as $rr)
$allow_names[] = $rr['username'];
return;
}
-function remote_permissions_plugin_admin(&$a, &$o){
+function remote_permissions_addon_admin(&$a, &$o){
$t = get_markup_template( "admin.tpl", "addon/remote_permissions/" );
- $o = replace_macros($t, array(
- '$submit' => t('Save Settings'),
- '$global' => array('remotepermschoice', t('Global'), 1, t('The posts of every user on this server show the post recipients'), get_config('remote_perms', 'global') == 1),
- '$individual' => array('remotepermschoice', t('Individual'), 2, t('Each user chooses whether his/her posts show the post recipients'), get_config('remote_perms', 'global') == 0)
- ));
+ $o = replace_macros($t, [
+ '$submit' => L10n::t('Save Settings'),
+ '$global' => ['remotepermschoice', L10n::t('Global'), 1, L10n::t('The posts of every user on this server show the post recipients'), Config::get('remote_perms', 'global') == 1],
+ '$individual' => ['remotepermschoice', L10n::t('Individual'), 2, L10n::t('Each user chooses whether his/her posts show the post recipients'), Config::get('remote_perms', 'global') == 0]
+ ]);
}
-function remote_permissions_plugin_admin_post(&$a){
+function remote_permissions_addon_admin_post(&$a){
$choice = ((x($_POST,'remotepermschoice')) ? notags(trim($_POST['remotepermschoice'])) : '');
- set_config('remote_perms','global',($choice == 1 ? 1 : 0));
- info( t('Settings updated.'). EOL );
+ Config::set('remote_perms','global',($choice == 1 ? 1 : 0));
+ info(L10n::t('Settings updated.'). EOL);
}
-
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2014-09-10 14:32+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
<?php
-
-
/**
* Name: rendertime
* Description: Shows the time that was needed to render the current page
* Author: Michael Vvogel <http://pirati.ca/profile/heluecht>
*
*/
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
function rendertime_install() {
- register_hook('page_end', 'addon/rendertime/rendertime.php', 'rendertime_page_end');
+ Addon::registerHook('page_end', 'addon/rendertime/rendertime.php', 'rendertime_page_end');
}
function rendertime_uninstall() {
- unregister_hook('init_1', 'addon/rendertime/rendertime.php', 'rendertime_init_1');
- unregister_hook('page_end', 'addon/rendertime/rendertime.php', 'rendertime_page_end');
+ Addon::unregisterHook('init_1', 'addon/rendertime/rendertime.php', 'rendertime_init_1');
+ Addon::unregisterHook('page_end', 'addon/rendertime/rendertime.php', 'rendertime_page_end');
}
function rendertime_init_1(&$a) {
$ignored = in_array($a->module, $ignored_modules);
if (is_site_admin() && ($_GET["mode"] != "minimal") && !$a->is_mobile && !$a->is_tablet && !$ignored) {
- $o = $o.'<div class="renderinfo">'.sprintf(t("Database: %s/%s, Network: %s, Rendering: %s, Session: %s, I/O: %s, Other: %s, Total: %s"),
- round($a->performance["database"] - $a->performance["database_write"], 3),
- round($a->performance["database_write"], 3),
- round($a->performance["network"], 2),
- round($a->performance["rendering"], 2),
- round($a->performance["parser"], 2),
- round($a->performance["file"], 2),
- round($duration - $a->performance["database"]
- - $a->performance["network"] - $a->performance["rendering"]
- - $a->performance["parser"] - $a->performance["file"], 2),
- round($duration, 2)
- //round($a->performance["markstart"], 3)
- //round($a->performance["plugin"], 3)
- )."</div>";
+ $o = $o.'<div class="renderinfo">'. L10n::t("Database: %s/%s, Network: %s, Rendering: %s, Session: %s, I/O: %s, Other: %s, Total: %s",
+ round($a->performance["database"] - $a->performance["database_write"], 3),
+ round($a->performance["database_write"], 3),
+ round($a->performance["network"], 2),
+ round($a->performance["rendering"], 2),
+ round($a->performance["parser"], 2),
+ round($a->performance["file"], 2),
+ round($duration - $a->performance["database"]
+ - $a->performance["network"] - $a->performance["rendering"]
+ - $a->performance["parser"] - $a->performance["file"], 2),
+ round($duration, 2)
+ //round($a->performance["markstart"], 3)
+ //round($a->performance["plugin"], 3)
+ )."</div>";
if (get_config("rendertime", "callstack")) {
$o .= "<pre>";
--- /dev/null
+# ADDON securemail
+# Copyright (C)
+# This file is distributed under the same license as the Friendica securemail addon package.
+#
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-04-11 21:14+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Richard Zsemberi <rzsemberi@gmail.com>, 2018\n"
+"Language-Team: German (https://www.transifex.com/Friendica/teams/12172/de/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: securemail.php:53
+msgid "\"Secure Mail\" Settings"
+msgstr "\"Secure Mail\" Einstellungen"
+
+#: securemail.php:54
+msgid "Save Settings"
+msgstr "Einstellungen speichern"
+
+#: securemail.php:55 securemail.php:76
+msgid "Save and send test"
+msgstr "Abspeichern und Test Senden"
+
+#: securemail.php:56
+msgid "Enable Secure Mail"
+msgstr "Secure Mail aktivieren"
+
+#: securemail.php:57
+msgid "Public key"
+msgstr "Öffentlicher Schlüssel"
+
+#: securemail.php:57
+msgid "Your public PGP key, ascii armored format"
+msgstr "Dein öffentlicher PGP Schlüssel, im Ascii-Format"
+
+#: securemail.php:74
+msgid "Secure Mail Settings saved."
+msgstr "Secure Mail Einstellungen gespeichert."
+
+#: securemail.php:111
+msgid "Test email sent"
+msgstr "Test-Email gesendet"
+
+#: securemail.php:113
+msgid "There was an error sending the test email"
+msgstr "Es gab ein Fehler beim Senden der Test-Email"
--- /dev/null
+<?php
+
+if(! function_exists("string_plural_select_de")) {
+function string_plural_select_de($n){
+ return ($n != 1);;
+}}
+;
+$a->strings["\"Secure Mail\" Settings"] = "\"Secure Mail\" Einstellungen";
+$a->strings["Save Settings"] = "Einstellungen speichern";
+$a->strings["Save and send test"] = "Abspeichern und Test Senden";
+$a->strings["Enable Secure Mail"] = "Secure Mail aktivieren";
+$a->strings["Public key"] = "Öffentlicher Schlüssel";
+$a->strings["Your public PGP key, ascii armored format"] = "Dein öffentlicher PGP Schlüssel, im Ascii-Format";
+$a->strings["Secure Mail Settings saved."] = "Secure Mail Einstellungen gespeichert.";
+$a->strings["Test email sent"] = "Test-Email gesendet";
+$a->strings["There was an error sending the test email"] = "Es gab ein Fehler beim Senden der Test-Email";
--- /dev/null
+# ADDON securemail
+# Copyright (C)
+# This file is distributed under the same license as the Friendica securemail addon package.
+#
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-04-11 21:14+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: fabrixxm <fabrix.xm@gmail.com>, 2018\n"
+"Language-Team: Italian (https://www.transifex.com/Friendica/teams/12172/it/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: it\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: securemail.php:53
+msgid "\"Secure Mail\" Settings"
+msgstr "Impostazioni Secure Mail"
+
+#: securemail.php:54
+msgid "Save Settings"
+msgstr "Salva Impostazioni"
+
+#: securemail.php:55 securemail.php:76
+msgid "Save and send test"
+msgstr "Salva e invia mail di prova"
+
+#: securemail.php:56
+msgid "Enable Secure Mail"
+msgstr "Abilita Secure Mail"
+
+#: securemail.php:57
+msgid "Public key"
+msgstr "Chiave pubblica"
+
+#: securemail.php:57
+msgid "Your public PGP key, ascii armored format"
+msgstr "La tua chiave pubblica PGP, in formato ascii armored"
+
+#: securemail.php:74
+msgid "Secure Mail Settings saved."
+msgstr "Impostazioni Secure Mail salvate."
+
+#: securemail.php:111
+msgid "Test email sent"
+msgstr "Email di prova invata"
+
+#: securemail.php:113
+msgid "There was an error sending the test email"
+msgstr "Si è verificato un errore durante l'invio dell'email di prova"
--- /dev/null
+<?php
+
+if(! function_exists("string_plural_select_it")) {
+function string_plural_select_it($n){
+ return ($n != 1);;
+}}
+;
+$a->strings["\"Secure Mail\" Settings"] = "Impostazioni Secure Mail";
+$a->strings["Save Settings"] = "Salva Impostazioni";
+$a->strings["Save and send test"] = "Salva e invia mail di prova";
+$a->strings["Enable Secure Mail"] = "Abilita Secure Mail";
+$a->strings["Public key"] = "Chiave pubblica";
+$a->strings["Your public PGP key, ascii armored format"] = "La tua chiave pubblica PGP, in formato ascii armored";
+$a->strings["Secure Mail Settings saved."] = "Impostazioni Secure Mail salvate.";
+$a->strings["Test email sent"] = "Email di prova invata";
+$a->strings["There was an error sending the test email"] = "Si è verificato un errore durante l'invio dell'email di prova";
*/
use Friendica\App;
-
-require_once 'include/Emailer.php';
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Util\Emailer;
/* because the fraking openpgp-php is in composer, require libs in composer
* and then don't use autoloader to load classes... */
function securemail_install() {
- register_hook('plugin_settings', 'addon/securemail/securemail.php', 'securemail_settings');
- register_hook('plugin_settings_post', 'addon/securemail/securemail.php', 'securemail_settings_post');
+ Addon::registerHook('addon_settings', 'addon/securemail/securemail.php', 'securemail_settings');
+ Addon::registerHook('addon_settings_post', 'addon/securemail/securemail.php', 'securemail_settings_post');
- register_hook('emailer_send_prepare', 'addon/securemail/securemail.php', 'securemail_emailer_send_prepare');
+ Addon::registerHook('emailer_send_prepare', 'addon/securemail/securemail.php', 'securemail_emailer_send_prepare');
logger('installed securemail');
}
function securemail_uninstall() {
- unregister_hook('plugin_settings', 'addon/securemail/securemail.php', 'securemail_settings');
- unregister_hook('plugin_settings_post', 'addon/securemail/securemail.php', 'securemail_settings_post');
+ Addon::unregisterHook('addon_settings', 'addon/securemail/securemail.php', 'securemail_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/securemail/securemail.php', 'securemail_settings_post');
- unregister_hook('emailer_send_prepare', 'addon/securemail/securemail.php', 'securemail_emailer_send_prepare');
+ Addon::unregisterHook('emailer_send_prepare', 'addon/securemail/securemail.php', 'securemail_emailer_send_prepare');
logger('removed securemail');
}
/**
* @brief Build user settings form
*
- * @link https://github.com/friendica/friendica/blob/develop/doc/Plugins.md#plugin_settings 'plugin_settings' hook
+ * @link https://github.com/friendica/friendica/blob/develop/doc/Addons.md#addon_settings 'addon_settings' hook
*
* @param App $a App instance
* @param string $s output html
$t = get_markup_template('admin.tpl', 'addon/securemail/');
- $s .= replace_macros($t, array(
- '$title' => t('"Secure Mail" Settings'),
- '$submit' => t('Save Settings'),
- '$test' => t('Save and send test'), //NOTE: update also in 'post'
- '$enable' => array('securemail-enable', t('Enable Secure Mail'), $enable, ''),
- '$publickey' => array('securemail-pkey', t('Public key'), $publickey, t('Your public PGP key, ascii armored format'), 'rows="10"')
- ));
+ $s .= replace_macros($t, [
+ '$title' => L10n::t('"Secure Mail" Settings'),
+ '$submit' => L10n::t('Save Settings'),
+ '$test' => L10n::t('Save and send test'), //NOTE: update also in 'post'
+ '$enable' => ['securemail-enable', L10n::t('Enable Secure Mail'), $enable, ''],
+ '$publickey' => ['securemail-pkey', L10n::t('Public key'), $publickey, L10n::t('Your public PGP key, ascii armored format'), 'rows="10"']
+ ]);
}
/**
* @brief Handle data from user settings form
*
- * @link https://github.com/friendica/friendica/blob/develop/doc/Plugins.md#plugin_settings_post 'plugin_settings_post' hook
+ * @link https://github.com/friendica/friendica/blob/develop/doc/Addons.md#addon_settings_post 'addon_settings_post' hook
*
* @param App $a App instance
* @param array $b hook data
if ($_POST['securemail-submit']) {
set_pconfig(local_user(), 'securemail', 'pkey', trim($_POST['securemail-pkey']));
$enable = ((x($_POST, 'securemail-enable')) ? 1 : 0);
- set_pconfig(local_user(), 'securemail', 'enable', $enable);
- info(t('Secure Mail Settings saved.') . EOL);
+ PConfig::set(local_user(), 'securemail', 'enable', $enable);
+ info(L10n::t('Secure Mail Settings saved.') . EOL);
- if ($_POST['securemail-submit'] == t('Save and send test')) {
+ if ($_POST['securemail-submit'] == L10n::t('Save and send test')) {
$sitename = $a->config['sitename'];
$hostname = $a->get_hostname();
set_pconfig(local_user(), 'securemail', 'enable', $enable);
if ($res) {
- info(t('Test email sent') . EOL);
+ info(L10n::t('Test email sent') . EOL);
} else {
- notice(t('There was an error sending the test email') . EOL);
+ notice(L10n::t('There was an error sending the test email') . EOL);
}
}
}
/**
* @brief Encrypt notification emails text
*
- * @link https://github.com/friendica/friendica/blob/develop/doc/Plugins.md#emailer_send_prepare 'emailer_send_prepare' hook
+ * @link https://github.com/friendica/friendica/blob/develop/doc/Addons.md#emailer_send_prepare 'emailer_send_prepare' hook
*
* @param App $a App instance
* @param array $b hook data
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:23+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
* based upon NSFW from Mike Macgirvin <http://macgirvin.com/profile/mike>
*
*/
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
function showmore_install() {
- register_hook('prepare_body', 'addon/showmore/showmore.php', 'showmore_prepare_body');
- register_hook('plugin_settings', 'addon/showmore/showmore.php', 'showmore_addon_settings');
- register_hook('plugin_settings_post', 'addon/showmore/showmore.php', 'showmore_addon_settings_post');
+ Addon::registerHook('prepare_body', 'addon/showmore/showmore.php', 'showmore_prepare_body');
+ Addon::registerHook('addon_settings', 'addon/showmore/showmore.php', 'showmore_addon_settings');
+ Addon::registerHook('addon_settings_post', 'addon/showmore/showmore.php', 'showmore_addon_settings_post');
}
function showmore_uninstall() {
- unregister_hook('prepare_body', 'addon/showmore/showmore.php', 'showmore_prepare_body');
- unregister_hook('plugin_settings', 'addon/showmore/showmore.php', 'showmore_addon_settings');
- unregister_hook('plugin_settings_post', 'addon/showmore/showmore.php', 'showmore_addon_settings_post');
+ Addon::unregisterHook('prepare_body', 'addon/showmore/showmore.php', 'showmore_prepare_body');
+ Addon::unregisterHook('addon_settings', 'addon/showmore/showmore.php', 'showmore_addon_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/showmore/showmore.php', 'showmore_addon_settings_post');
}
function showmore_addon_settings(&$a,&$s) {
$chars = '1100';
$s .= '<span id="settings_showmore_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_showmore_expanded\'); openClose(\'settings_showmore_inflated\');">';
- $s .= '<h3>' . t('"Show more" Settings').'</h3>';
+ $s .= '<h3>' . L10n::t('"Show more" Settings').'</h3>';
$s .= '</span>';
$s .= '<div id="settings_showmore_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_showmore_expanded\'); openClose(\'settings_showmore_inflated\');">';
- $s .= '<h3>' . t('"Show more" Settings').'</h3>';
+ $s .= '<h3>' . L10n::t('"Show more" Settings').'</h3>';
$s .= '</span>';
$s .= '<div id="showmore-wrapper">';
- $s .= '<label id="showmore-enable-label" for="showmore-enable">'.t('Enable Show More').'</label>';
+ $s .= '<label id="showmore-enable-label" for="showmore-enable">'.L10n::t('Enable Show More').'</label>';
$s .= '<input id="showmore-enable" type="checkbox" name="showmore-enable" value="1"'.$enable_checked.' />';
$s .= '<div class="clear"></div>';
- $s .= '<label id="showmore-label" for="showmore-chars">'.t('Cutting posts after how much characters').' </label>';
+ $s .= '<label id="showmore-label" for="showmore-chars">'.L10n::t('Cutting posts after how much characters').' </label>';
$s .= '<input id="showmore-words" type="text" name="showmore-chars" value="'.$chars.'" />';
$s .= '</div><div class="clear"></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="showmore-submit" name="showmore-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
-// $s .= '<div class="showmore-desc">' . t('Use /expression/ to provide regular expressions') . '</div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="showmore-submit" name="showmore-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
+// $s .= '<div class="showmore-desc">' . L10n::t('Use /expression/ to provide regular expressions') . '</div>';
$s .= '</div>';
return;
set_pconfig(local_user(),'showmore','chars',trim($_POST['showmore-chars']));
$enable = ((x($_POST,'showmore-enable')) ? intval($_POST['showmore-enable']) : 0);
$disable = 1-$enable;
- set_pconfig(local_user(),'showmore','disable', $disable);
- info( t('Show More Settings saved.') . EOL);
+ PConfig::set(local_user(),'showmore','disable', $disable);
+ info(L10n::t('Show More Settings saved.') . EOL);
}
}
if($found) {
$rnd = random_string(8);
$b['html'] = '<span id="showmore-teaser-'.$rnd.'" class="showmore-teaser" style="display: block;">'.$shortened." ".
- '<span id="showmore-wrap-'.$rnd.'" style="white-space:nowrap;" class="showmore-wrap fakelink" onclick="openClose(\'showmore-'.$rnd.'\'); openClose(\'showmore-teaser-'.$rnd.'\');" >'.sprintf(t('show more')).'</span></span>'.
+ '<span id="showmore-wrap-'.$rnd.'" style="white-space:nowrap;" class="showmore-wrap fakelink" onclick="openClose(\'showmore-'.$rnd.'\'); openClose(\'showmore-teaser-'.$rnd.'\');" >'.L10n::t('show more').'</span></span>'.
'<div id="showmore-'.$rnd.'" class="showmore-content" style="display: none;">'.$b['html'].'</div>';
}
}
* Author: Thomas Willingham (based on Mike Macgirvin's Adult Smile template)
* All smileys from sites offering them as Public Domain
*/
-
-/**
-
-*/
+use Friendica\Core\Addon;
function smiley_pack_es_install() {
- register_hook('smilie', 'addon/smiley_pack_es/smiley_pack_es.php', 'smiley_pack_smilies_es');
+ Addon::registerHook('smilie', 'addon/smiley_pack_es/smiley_pack_es.php', 'smiley_pack_smilies_es');
}
function smiley_pack_es_uninstall() {
- unregister_hook('smilie', 'addon/smiley_pack_es/smiley_pack_es.php', 'smiley_pack_smilies');
+ Addon::unregisterHook('smilie', 'addon/smiley_pack_es/smiley_pack_es.php', 'smiley_pack_smilies');
}
*
*
*/
+use Friendica\Core\Addon;
function smiley_pack_fr_install() {
- register_hook('smilie', 'addon/smiley_pack_fr/smiley_pack_fr.php', 'smiley_pack_fr_smilies');
+ Addon::registerHook('smilie', 'addon/smiley_pack_fr/smiley_pack_fr.php', 'smiley_pack_fr_smilies');
}
function smiley_pack_fr_uninstall() {
- unregister_hook('smilie', 'addon/smiley_pack_fr/smiley_pack_fr.php', 'smiley_pack_fr_smilies');
+ Addon::unregisterHook('smilie', 'addon/smiley_pack_fr/smiley_pack_fr.php', 'smiley_pack_fr_smilies');
}
* All smileys from sites offering them as Public Domain
*/
-/**
-
-*/
+use Friendica\Core\Addon;
function smiley_pack_install() {
- register_hook('smilie', 'addon/smiley_pack/smiley_pack.php', 'smiley_pack_smilies');
+ Addon::registerHook('smilie', 'addon/smiley_pack/smiley_pack.php', 'smiley_pack_smilies');
}
function smiley_pack_uninstall() {
- unregister_hook('smilie', 'addon/smiley_pack/smiley_pack.php', 'smiley_pack_smilies');
+ Addon::unregisterHook('smilie', 'addon/smiley_pack/smiley_pack.php', 'smiley_pack_smilies');
}
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-06-23 14:45+0200\n"
-"PO-Revision-Date: 2014-09-10 14:33+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
* Version: 0.2
* Author: Johannes Schwab <https://friendica.jschwab.org/profile/ddorian>
*/
-
+use Friendica\Core\Addon;
function smileybutton_install() {
- //Register hooks
- register_hook('jot_tool', 'addon/smileybutton/smileybutton.php', 'show_button');
-
+ //Register hooks
+ Addon::registerHook('jot_tool', 'addon/smileybutton/smileybutton.php', 'show_button');
+
logger("installed smileybutton");
}
function smileybutton_uninstall() {
//Delet registered hooks
- unregister_hook('jot_tool', 'addon/smileybutton/smileybutton.php', 'show_button');
+ Addon::unregisterHook('jot_tool', 'addon/smileybutton/smileybutton.php', 'show_button');
logger("removed smileybutton");
}
);
// Call hooks to get aditional smileies from other addons
- $params = array('texts' => $texts, 'icons' => $icons, 'string' => ""); //changed
- call_hooks('smilie', $params);
+ $params = ['texts' => $texts, 'icons' => $icons, 'string' => ""]; //changed
+ Addon::callHooks('smilie', $params);
//Generate html for smiley list
$s = "<table class=\"smiley-preview\"><tr>\n\t";
* This is a template for how to extend the "smily" code.
*
*/
+use Friendica\Core\Addon;
function smilies_adult_install() {
- register_hook('smilie', 'addon/smilies_adult/smilies_adult.php', 'smilies_adult_smilies');
+ Addon::registerHook('smilie', 'addon/smilies_adult/smilies_adult.php', 'smilies_adult_smilies');
}
function smilies_adult_uninstall() {
- unregister_hook('smilie', 'addon/smilies_adult/smilies_adult.php', 'smilies_adult_smilies');
+ Addon::unregisterHook('smilie', 'addon/smilies_adult/smilies_adult.php', 'smilies_adult_smilies');
}
<?php
/**
- * Demo plugin for adding various types of Flash games to Friendica.
+ * Demo addon for adding various types of Flash games to Friendica.
* In this case we're using "Hot Shot Sniper" by FlashGames247
*
* Name: Sniper
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*/
-
+use Friendica\Core\Addon;
function sniper_install() {
- register_hook('app_menu', 'addon/sniper/sniper.php', 'sniper_app_menu');
+ Addon::registerHook('app_menu', 'addon/sniper/sniper.php', 'sniper_app_menu');
}
function sniper_uninstall() {
- unregister_hook('app_menu', 'addon/sniper/sniper.php', 'sniper_app_menu');
+ Addon::unregisterHook('app_menu', 'addon/sniper/sniper.php', 'sniper_app_menu');
}
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:27+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*
*/
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
function startpage_install() {
- register_hook('home_init', 'addon/startpage/startpage.php', 'startpage_home_init');
- register_hook('plugin_settings', 'addon/startpage/startpage.php', 'startpage_settings');
- register_hook('plugin_settings_post', 'addon/startpage/startpage.php', 'startpage_settings_post');
+ Addon::registerHook('home_init', 'addon/startpage/startpage.php', 'startpage_home_init');
+ Addon::registerHook('addon_settings', 'addon/startpage/startpage.php', 'startpage_settings');
+ Addon::registerHook('addon_settings_post', 'addon/startpage/startpage.php', 'startpage_settings_post');
}
function startpage_uninstall() {
- unregister_hook('home_init', 'addon/startpage/startpage.php', 'startpage_home_init');
- unregister_hook('plugin_settings', 'addon/startpage/startpage.php', 'startpage_settings');
- unregister_hook('plugin_settings_post', 'addon/startpage/startpage.php', 'startpage_settings_post');
+ Addon::unregisterHook('home_init', 'addon/startpage/startpage.php', 'startpage_home_init');
+ Addon::unregisterHook('addon_settings', 'addon/startpage/startpage.php', 'startpage_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/startpage/startpage.php', 'startpage_settings_post');
}
set_pconfig(local_user(),'startpage','startpage',strip_tags(trim($_POST['startpage'])));
}
-
/**
*
- * Called from the Plugin Setting form.
+ * Called from the Addon Setting form.
* Add our own settings info to the page.
*
*/
-
-
-
function startpage_settings(&$a,&$s) {
if(! local_user())
/* Add some HTML to the existing form */
$s .= '<span id="settings_startpage_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_startpage_expanded\'); openClose(\'settings_startpage_inflated\');">';
- $s .= '<h3>' . t('Startpage') . '</h3>';
+ $s .= '<h3>' . L10n::t('Startpage') . '</h3>';
$s .= '</span>';
$s .= '<div id="settings_startpage_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_startpage_expanded\'); openClose(\'settings_startpage_inflated\');">';
- $s .= '<h3>' . t('Startpage') . '</h3>';
+ $s .= '<h3>' . L10n::t('Startpage') . '</h3>';
$s .= '</span>';
$s .= '<div id="startpage-page-wrapper">';
- $s .= '<label id="startpage-page-label" for="startpage-page">' . t('Home page to load after login - leave blank for profile wall') . '</label>';
+ $s .= '<label id="startpage-page-label" for="startpage-page">' . L10n::t('Home page to load after login - leave blank for profile wall') . '</label>';
$s .= '<input id="startpage-page" type="text" name="startpage" value="' . $page . '" />';
$s .= '</div><div class="clear"></div>';
- $s .= '<div id="startpage-desc">' . t('Examples: "network" or "notifications/system"') . '</div>';
+ $s .= '<div id="startpage-desc">' . L10n::t('Examples: "network" or "notifications/system"') . '</div>';
/* provide a submit button */
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="startpage-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="startpage-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
Due to the distributed nature of the GNU Social network, each user who wishes to
forward public messages to a GNU Social account has to get the OAuth credentials
for themselves, which makes this addon a little bit more user unfriendly than
-the Twitter Plugin is. Nothing too geeky though!
+the Twitter Addon is. Nothing too geeky though!
The inclusion of a shorturl for the original posting in cases when the message
was longer than the maximal allowed notice length requires it, that you have
After the required credentials for the application are stored in the
configuration you have to actually connect your friendica account with
GNU Social. To do so follow the Sign in with GNU Social button, allow the access
-and copy the security code into the plugin configuration. Friendica will then
+and copy the security code into the addon configuration. Friendica will then
try to acquire the final OAuth credentials from the API, if successful the
-plugin settings will allow you to select to post your public messages to your
+addon settings will allow you to select to post your public messages to your
GNU Social account.
License
+++ /dev/null
-<?php
-
-namespace CodebirdSN;
-
-/**
- * A Twitter library in PHP.
- *
- * @package codebird
- * @version 2.4.1
- * @author J.M. <me@mynetx.net>
- * @copyright 2010-2013 J.M. <me@mynetx.net>
- *
- * Modified for statusnet by Michael Vogel <heluecht@pirati.ca>
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-
-/**
- * Define constants
- */
-$constants = explode(' ', 'OBJECT ARRAY JSON');
-foreach ($constants as $i => $id) {
- $id = 'CODEBIRD_RETURNFORMAT_' . $id;
- defined($id) or define($id, $i);
-}
-$constants = array(
- 'CURLE_SSL_CERTPROBLEM' => 58,
- 'CURLE_SSL_CACERT' => 60,
- 'CURLE_SSL_CACERT_BADFILE' => 77,
- 'CURLE_SSL_CRL_BADFILE' => 82,
- 'CURLE_SSL_ISSUER_ERROR' => 83
-);
-foreach ($constants as $id => $i) {
- defined($id) or define($id, $i);
-}
-unset($constants);
-unset($i);
-unset($id);
-
-/**
- * A Twitter library in PHP.
- *
- * @package codebird
- * @subpackage codebird-php
- */
-class CodebirdSN
-{
- /**
- * The current singleton instance
- */
- private static $_instance = null;
-
- /**
- * The OAuth consumer key of your registered app
- */
- protected static $_oauth_consumer_key = null;
-
- /**
- * The corresponding consumer secret
- */
- protected static $_oauth_consumer_secret = null;
-
- /**
- * The app-only bearer token. Used to authorize app-only requests
- */
- protected static $_oauth_bearer_token = null;
-
- /**
- * The API endpoint to use
- */
- protected static $_endpoint = 'https://api.twitter.com/1.1/';
-
- /**
- * The API endpoint to use for OAuth requests
- */
- protected static $_endpoint_oauth = 'https://api.twitter.com/';
-
- /**
- * The Request or access token. Used to sign requests
- */
- protected $_oauth_token = null;
-
- /**
- * The corresponding request or access token secret
- */
- protected $_oauth_token_secret = null;
-
- /**
- * The format of data to return from API calls
- */
- protected $_return_format = CODEBIRD_RETURNFORMAT_OBJECT;
-
- /**
- * The file formats that Twitter accepts as image uploads
- */
- protected $_supported_media_files = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG);
-
- /**
- * The current Codebird version
- */
- protected $_version = '2.4.1';
-
- /**
- * Returns singleton class instance
- * Always use this method unless you're working with multiple authenticated users at once
- *
- * @return Codebird The instance
- */
- public static function getInstance()
- {
- if (self::$_instance == null) {
- self::$_instance = new self;
- }
- return self::$_instance;
- }
-
- /**
- * Sets the API endpoint
- *
- * @param string $api API endpoint
- *
- * @return void
- */
- public static function setAPIEndpoint($api)
- {
- self::$_endpoint_oauth = $api;
- self::$_endpoint = $api;
- }
-
- /**
- * Sets the OAuth consumer key and secret (App key)
- *
- * @param string $key OAuth consumer key
- * @param string $secret OAuth consumer secret
- *
- * @return void
- */
- public static function setConsumerKey($key, $secret)
- {
- self::$_oauth_consumer_key = $key;
- self::$_oauth_consumer_secret = $secret;
- }
-
- /**
- * Sets the OAuth2 app-only auth bearer token
- *
- * @param string $token OAuth2 bearer token
- *
- * @return void
- */
- public static function setBearerToken($token)
- {
- self::$_oauth_bearer_token = $token;
- }
-
- /**
- * Gets the current Codebird version
- *
- * @return string The version number
- */
- public function getVersion()
- {
- return $this->_version;
- }
-
- /**
- * Sets the OAuth request or access token and secret (User key)
- *
- * @param string $token OAuth request or access token
- * @param string $secret OAuth request or access token secret
- *
- * @return void
- */
- public function setToken($token, $secret)
- {
- $this->_oauth_token = $token;
- $this->_oauth_token_secret = $secret;
- }
-
- /**
- * Sets the format for API replies
- *
- * @param int $return_format One of these:
- * CODEBIRD_RETURNFORMAT_OBJECT (default)
- * CODEBIRD_RETURNFORMAT_ARRAY
- *
- * @return void
- */
- public function setReturnFormat($return_format)
- {
- $this->_return_format = $return_format;
- }
-
- /**
- * Main API handler working on any requests you issue
- *
- * @param string $fn The member function you called
- * @param array $params The parameters you sent along
- *
- * @return mixed The API reply encoded in the set return_format
- */
-
- public function __call($fn, $params)
- {
- // parse parameters
- $apiparams = array();
- if (count($params) > 0) {
- if (is_array($params[0])) {
- $apiparams = $params[0];
- } else {
- parse_str($params[0], $apiparams);
- // remove auto-added slashes if on magic quotes steroids
- if (get_magic_quotes_gpc()) {
- foreach($apiparams as $key => $value) {
- if (is_array($value)) {
- $apiparams[$key] = array_map('stripslashes', $value);
- } else {
- $apiparams[$key] = stripslashes($value);
- }
- }
- }
- }
- }
-
- // stringify null and boolean parameters
- foreach ($apiparams as $key => $value) {
- if (! is_scalar($value)) {
- continue;
- }
- if (is_null($value)) {
- $apiparams[$key] = 'null';
- } elseif (is_bool($value)) {
- $apiparams[$key] = $value ? 'true' : 'false';
- }
- }
-
- $app_only_auth = false;
- if (count($params) > 1) {
- $app_only_auth = !! $params[1];
- }
-
- // map function name to API method
- $method = '';
-
- // replace _ by /
- $path = explode('_', $fn);
- for ($i = 0; $i < count($path); $i++) {
- if ($i > 0) {
- $method .= '/';
- }
- $method .= $path[$i];
- }
- // undo replacement for URL parameters
- $url_parameters_with_underscore = array('screen_name');
- foreach ($url_parameters_with_underscore as $param) {
- $param = strtoupper($param);
- $replacement_was = str_replace('_', '/', $param);
- $method = str_replace($replacement_was, $param, $method);
- }
-
- // replace AA by URL parameters
- $method_template = $method;
- $match = array();
- if (preg_match('/[A-Z_]{2,}/', $method, $match)) {
- foreach ($match as $param) {
- $param_l = strtolower($param);
- $method_template = str_replace($param, ':' . $param_l, $method_template);
- if (!isset($apiparams[$param_l])) {
- for ($i = 0; $i < 26; $i++) {
- $method_template = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method_template);
- }
- throw new \Exception(
- 'To call the templated method "' . $method_template
- . '", specify the parameter value for "' . $param_l . '".'
- );
- }
- $method = str_replace($param, $apiparams[$param_l], $method);
- unset($apiparams[$param_l]);
- }
- }
-
- // replace A-Z by _a-z
- for ($i = 0; $i < 26; $i++) {
- $method = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method);
- $method_template = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method_template);
- }
-
- $httpmethod = $this->_detectMethod($method_template, $apiparams);
- $multipart = $this->_detectMultipart($method_template);
- return $this->_callApi(
- $httpmethod,
- $method,
- $method_template,
- $apiparams,
- $multipart,
- $app_only_auth
- );
- }
-
- /**
- * Uncommon API methods
- */
-
- /**
- * Gets the OAuth authenticate URL for the current request token
- *
- * @return string The OAuth authenticate URL
- */
- public function oauth_authenticate($force_login = NULL, $screen_name = NULL)
- {
- if ($this->_oauth_token == null) {
- throw new \Exception('To get the authenticate URL, the OAuth token must be set.');
- }
- $url = self::$_endpoint_oauth . 'oauth/authenticate?oauth_token=' . $this->_url($this->_oauth_token);
- if ($force_login) {
- $url .= "&force_login=1";
- }
- if ($screen_name) {
- $url .= "&screen_name=" . $screen_name;
- }
- return $url;
- }
-
- /**
- * Gets the OAuth authorize URL for the current request token
- *
- * @return string The OAuth authorize URL
- */
- public function oauth_authorize($force_login = NULL, $screen_name = NULL)
- {
- if ($this->_oauth_token == null) {
- throw new \Exception('To get the authorize URL, the OAuth token must be set.');
- }
- $url = self::$_endpoint_oauth . 'oauth/authorize?oauth_token=' . $this->_url($this->_oauth_token);
- if ($force_login) {
- $url .= "&force_login=1";
- }
- if ($screen_name) {
- $url .= "&screen_name=" . $screen_name;
- }
- return $url;
- }
-
- /**
- * Gets the OAuth bearer token
- *
- * @return string The OAuth bearer token
- */
-
- public function oauth2_token()
- {
- if (! function_exists('curl_init')) {
- throw new \Exception('To make API requests, the PHP curl extension must be available.');
- }
- if (self::$_oauth_consumer_key == null) {
- throw new \Exception('To obtain a bearer token, the consumer key must be set.');
- }
- $ch = false;
- $post_fields = array(
- 'grant_type' => 'client_credentials'
- );
- $url = self::$_endpoint_oauth . 'oauth2/token';
- $ch = curl_init($url);
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
- curl_setopt($ch, CURLOPT_HEADER, 1);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
- //curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/cacert.pem');
-
- curl_setopt($ch, CURLOPT_USERPWD, self::$_oauth_consumer_key . ':' . self::$_oauth_consumer_secret);
- curl_setopt($ch, CURLOPT_HTTPHEADER, array(
- 'Expect:'
- ));
- $reply = curl_exec($ch);
-
- // certificate validation results
- //$validation_result = curl_errno($ch);
- //if (in_array(
- // $validation_result,
- // array(
- // CURLE_SSL_CERTPROBLEM,
- // CURLE_SSL_CACERT,
- // CURLE_SSL_CACERT_BADFILE,
- // CURLE_SSL_CRL_BADFILE,
- // CURLE_SSL_ISSUER_ERROR
- // )
- // )
- //) {
- // throw new \Exception('Error ' . $validation_result . ' while validating the Twitter API certificate.');
- //}
-
- $httpstatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
- $reply = $this->_parseApiReply('oauth2/token', $reply);
- switch ($this->_return_format) {
- case CODEBIRD_RETURNFORMAT_ARRAY:
- $reply['httpstatus'] = $httpstatus;
- if ($httpstatus == 200) {
- self::setBearerToken($reply['access_token']);
- }
- break;
- case CODEBIRD_RETURNFORMAT_JSON:
- if ($httpstatus == 200) {
- $parsed = json_decode($reply);
- self::setBearerToken($parsed->access_token);
- }
- break;
- case CODEBIRD_RETURNFORMAT_OBJECT:
- $reply->httpstatus = $httpstatus;
- if ($httpstatus == 200) {
- self::setBearerToken($reply->access_token);
- }
- break;
- }
- return $reply;
- }
-
- /**
- * Signing helpers
- */
-
- /**
- * URL-encodes the given data
- *
- * @param mixed $data
- *
- * @return mixed The encoded data
- */
- private function _url($data)
- {
- if (is_array($data)) {
- return array_map(array(
- $this,
- '_url'
- ), $data);
- } elseif (is_scalar($data)) {
- return str_replace(array(
- '+',
- '!',
- '*',
- "'",
- '(',
- ')'
- ), array(
- ' ',
- '%21',
- '%2A',
- '%27',
- '%28',
- '%29'
- ), rawurlencode($data));
- } else {
- return '';
- }
- }
-
- /**
- * Gets the base64-encoded SHA1 hash for the given data
- *
- * @param string $data The data to calculate the hash from
- *
- * @return string The hash
- */
- private function _sha1($data)
- {
- if (self::$_oauth_consumer_secret == null) {
- throw new \Exception('To generate a hash, the consumer secret must be set.');
- }
- if (!function_exists('hash_hmac')) {
- throw new \Exception('To generate a hash, the PHP hash extension must be available.');
- }
- return base64_encode(hash_hmac('sha1', $data, self::$_oauth_consumer_secret . '&'
- . ($this->_oauth_token_secret != null ? $this->_oauth_token_secret : ''), true));
- }
-
- /**
- * Generates a (hopefully) unique random string
- *
- * @param int optional $length The length of the string to generate
- *
- * @return string The random string
- */
- protected function _nonce($length = 8)
- {
- if ($length < 1) {
- throw new \Exception('Invalid nonce length.');
- }
- return substr(md5(microtime(true)), 0, $length);
- }
-
- /**
- * Generates an OAuth signature
- *
- * @param string $httpmethod Usually either 'GET' or 'POST' or 'DELETE'
- * @param string $method The API method to call
- * @param array optional $params The API call parameters, associative
- *
- * @return string Authorization HTTP header
- */
- protected function _sign($httpmethod, $method, $params = array())
- {
- if (self::$_oauth_consumer_key == null) {
- throw new \Exception('To generate a signature, the consumer key must be set.');
- }
- $sign_params = array(
- 'consumer_key' => self::$_oauth_consumer_key,
- 'version' => '1.0',
- 'timestamp' => time(),
- 'nonce' => $this->_nonce(),
- 'signature_method' => 'HMAC-SHA1'
- );
- $sign_base_params = array();
- foreach ($sign_params as $key => $value) {
- $sign_base_params['oauth_' . $key] = $this->_url($value);
- }
- if ($this->_oauth_token != null) {
- $sign_base_params['oauth_token'] = $this->_url($this->_oauth_token);
- }
- $oauth_params = $sign_base_params;
- foreach ($params as $key => $value) {
- $sign_base_params[$key] = $this->_url($value);
- }
- ksort($sign_base_params);
- $sign_base_string = '';
- foreach ($sign_base_params as $key => $value) {
- $sign_base_string .= $key . '=' . $value . '&';
- }
- $sign_base_string = substr($sign_base_string, 0, -1);
- $signature = $this->_sha1($httpmethod . '&' . $this->_url($method) . '&' . $this->_url($sign_base_string));
-
- $params = array_merge($oauth_params, array(
- 'oauth_signature' => $signature
- ));
- ksort($params);
- $authorization = 'Authorization: OAuth ';
- foreach ($params as $key => $value) {
- $authorization .= $key . '="' . $this->_url($value) . '", ';
- }
- return substr($authorization, 0, -2);
- }
-
- /**
- * Detects HTTP method to use for API call
- *
- * @param string $method The API method to call
- * @param array $params The parameters to send along
- *
- * @return string The HTTP method that should be used
- */
- protected function _detectMethod($method, $params)
- {
- // multi-HTTP method endpoints
- switch($method) {
- case 'account/settings':
- $method = count($params) > 0 ? $method . '__post' : $method;
- break;
- }
-
- $httpmethods = array();
- $httpmethods['GET'] = array(
- // Timelines
- 'statuses/mentions_timeline',
- 'statuses/user_timeline',
- 'statuses/home_timeline',
- 'statuses/retweets_of_me',
-
- // Tweets
- 'statuses/retweets/:id',
- 'statuses/show/:id',
- 'statuses/oembed',
-
- // Search
- 'search/tweets',
-
- // Direct Messages
- 'direct_messages',
- 'direct_messages/sent',
- 'direct_messages/show',
-
- // Friends & Followers
- 'friendships/no_retweets/ids',
- 'friends/ids',
- 'followers/ids',
- 'friendships/lookup',
- 'friendships/incoming',
- 'friendships/outgoing',
- 'friendships/show',
- 'friends/list',
- 'followers/list',
-
- // Users
- 'account/settings',
- 'account/verify_credentials',
- 'blocks/list',
- 'blocks/ids',
- 'users/lookup',
- 'users/show',
- 'users/search',
- 'users/contributees',
- 'users/contributors',
- 'users/profile_banner',
-
- // Suggested Users
- 'users/suggestions/:slug',
- 'users/suggestions',
- 'users/suggestions/:slug/members',
-
- // Favorites
- 'favorites/list',
-
- // Lists
- 'lists/list',
- 'lists/statuses',
- 'lists/memberships',
- 'lists/subscribers',
- 'lists/subscribers/show',
- 'lists/members/show',
- 'lists/members',
- 'lists/show',
- 'lists/subscriptions',
-
- // Saved searches
- 'saved_searches/list',
- 'saved_searches/show/:id',
-
- // Places & Geo
- 'geo/id/:place_id',
- 'geo/reverse_geocode',
- 'geo/search',
- 'geo/similar_places',
-
- // Trends
- 'trends/place',
- 'trends/available',
- 'trends/closest',
-
- // OAuth
- 'oauth/authenticate',
- 'oauth/authorize',
-
- // Help
- 'help/configuration',
- 'help/languages',
- 'help/privacy',
- 'help/tos',
- 'application/rate_limit_status'
- );
- $httpmethods['POST'] = array(
- // Tweets
- 'statuses/destroy/:id',
- 'statuses/update',
- 'statuses/retweet/:id',
- 'statuses/update_with_media',
-
- // Media resources
- 'statusnet/media/upload',
-
- // Direct Messages
- 'direct_messages/destroy',
- 'direct_messages/new',
-
- // Friends & Followers
- 'friendships/create',
- 'friendships/destroy',
- 'friendships/update',
-
- // Users
- 'account/settings__post',
- 'account/update_delivery_device',
- 'account/update_profile',
- 'account/update_profile_background_image',
- 'account/update_profile_colors',
- 'account/update_profile_image',
- 'blocks/create',
- 'blocks/destroy',
- 'account/update_profile_banner',
- 'account/remove_profile_banner',
-
- // Favorites
- 'favorites/destroy',
- 'favorites/create',
-
- // Lists
- 'lists/members/destroy',
- 'lists/subscribers/create',
- 'lists/subscribers/destroy',
- 'lists/members/create_all',
- 'lists/members/create',
- 'lists/destroy',
- 'lists/update',
- 'lists/create',
- 'lists/members/destroy_all',
-
- // Saved Searches
- 'saved_searches/create',
- 'saved_searches/destroy/:id',
-
- // Places & Geo
- 'geo/place',
-
- // Spam Reporting
- 'users/report_spam',
-
- // OAuth
- 'oauth/access_token',
- 'oauth/request_token',
- 'oauth2/token',
- 'oauth2/invalidate_token'
- );
- foreach ($httpmethods as $httpmethod => $methods) {
- if (in_array($method, $methods)) {
- return $httpmethod;
- }
- }
- throw new \Exception('Can\'t find HTTP method to use for "' . $method . '".');
- }
-
- /**
- * Detects if API call should use multipart/form-data
- *
- * @param string $method The API method to call
- *
- * @return bool Whether the method should be sent as multipart
- */
- protected function _detectMultipart($method)
- {
- $multiparts = array(
- // Tweets
- 'statuses/update',
- 'statuses/update_with_media',
-
- // Media ressources
- 'statusnet/media/upload',
-
- // Users
- 'account/update_profile_background_image',
- 'account/update_profile_image',
- 'account/update_profile_banner'
- );
- return in_array($method, $multiparts);
- }
-
- /**
- * Detect filenames in upload parameters,
- * build multipart request from upload params
- *
- * @param string $method The API method to call
- * @param array $params The parameters to send along
- *
- * @return void
- */
- protected function _buildMultipart($method, $params)
- {
- // well, files will only work in multipart methods
- if (! $this->_detectMultipart($method)) {
- return;
- }
-
- // only check specific parameters
- $possible_files = array(
- // Tweets
- 'statuses/update' => 'media[]',
- 'statuses/update_with_media' => 'media[]',
- // Accounts
- 'account/update_profile_background_image' => 'image',
- 'account/update_profile_image' => 'image',
- 'account/update_profile_banner' => 'banner'
- );
- // method might have files?
- if (! in_array($method, array_keys($possible_files))) {
- return;
- }
-
- $possible_files = explode(' ', $possible_files[$method]);
-
- $multipart_border = '--------------------' . $this->_nonce();
- $multipart_request = '';
- foreach ($params as $key => $value) {
- // is it an array?
- if (is_array($value)) {
- throw new \Exception('Using URL-encoded parameters is not supported for uploading media.');
- continue;
- }
-
- // check for filenames
- if (in_array($key, $possible_files)) {
- if (// is it a file, a readable one?
- @file_exists($value)
- && @is_readable($value)
-
- // is it a valid image?
- && $data = @getimagesize($value)
- ) {
- if (// is it a supported image format?
- in_array($data[2], $this->_supported_media_files)
- ) {
- // try to read the file
- ob_start();
- readfile($value);
- $data = ob_get_contents();
- ob_end_clean();
- if (strlen($data) == 0) {
- continue;
- }
- $value = $data;
- }
- }
-
- // To-Do
- $tempfile = tempnam(get_temppath(), "mimecheck");
- file_put_contents($tempfile, $data);
- $mime = image_type_to_mime_type(exif_imagetype($tempfile));
- unlink($tempfile);
- $filename = "upload";
- $parametername = str_replace("[]", "", $key);
-
- $multipart_request .= "--".$multipart_border."\n";
- $multipart_request .= "Content-Disposition: form-data; name=\"{$parametername}\"; filename=\"{$filename}\"\n";
- $multipart_request .= "Content-Type: ".$mime."\n";
- $multipart_request .= "Content-Transfer-Encoding: binary\n\n";
- $multipart_request .= $data."\n";
- } else {
-
- $multipart_request .=
- '--' . $multipart_border . "\r\n"
- . 'Content-Disposition: form-data; name="' . $key . '"';
-
- $multipart_request .=
- "\r\n\r\n" . $value . "\r\n";
- }
- }
- $multipart_request .= '--' . $multipart_border . '--';
-
- return $multipart_request;
- }
-
-
- /**
- * Builds the complete API endpoint url
- *
- * @param string $method The API method to call
- * @param string $method_template The API method template to call
- *
- * @return string The URL to send the request to
- */
- protected function _getEndpoint($method, $method_template)
- {
- if (substr($method, 0, 5) == 'oauth') {
- $url = self::$_endpoint_oauth . $method;
- } else {
- $url = self::$_endpoint . $method . '.json';
- }
- return $url;
- }
-
- /**
- * Calls the API using cURL
- *
- * @param string $httpmethod The HTTP method to use for making the request
- * @param string $method The API method to call
- * @param string $method_template The templated API method to call
- * @param array optional $params The parameters to send along
- * @param bool optional $multipart Whether to use multipart/form-data
- * @param bool optional $app_only_auth Whether to use app-only bearer authentication
- *
- * @return mixed The API reply, encoded in the set return_format
- */
-
- protected function _callApi($httpmethod, $method, $method_template, $params = array(), $multipart = false, $app_only_auth = false)
- {
- if (! function_exists('curl_init')) {
- throw new \Exception('To make API requests, the PHP curl extension must be available.');
- }
- $url = $this->_getEndpoint($method, $method_template);
- $ch = false;
- if ($httpmethod == 'GET') {
- $url_with_params = $url;
- if (count($params) > 0) {
- $url_with_params .= '?' . http_build_query($params);
- }
- $authorization = $this->_sign($httpmethod, $url, $params);
- $ch = curl_init($url_with_params);
- } else {
- if ($multipart) {
- $authorization = $this->_sign($httpmethod, $url, array());
- $params = $this->_buildMultipart($method_template, $params);
- } else {
- $authorization = $this->_sign($httpmethod, $url, $params);
- $params = http_build_query($params);
- }
- $ch = curl_init($url);
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
- }
- if ($app_only_auth) {
- if (self::$_oauth_consumer_key == null) {
- throw new \Exception('To make an app-only auth API request, the consumer key must be set.');
- }
- // automatically fetch bearer token, if necessary
- if (self::$_oauth_bearer_token == null) {
- $this->oauth2_token();
- }
- $authorization = 'Authorization: Bearer ' . self::$_oauth_bearer_token;
- }
- $request_headers = array();
- if (isset($authorization)) {
- $request_headers[] = $authorization;
- $request_headers[] = 'Expect:';
- }
- if ($multipart) {
- $first_newline = strpos($params, "\r\n");
- $multipart_boundary = substr($params, 2, $first_newline - 2);
- $request_headers[] = 'Content-Length: ' . strlen($params);
- $request_headers[] = 'Content-Type: multipart/form-data; boundary='
- . $multipart_boundary;
- }
-
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
- curl_setopt($ch, CURLOPT_HEADER, 1);
- curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
- //curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/cacert.pem');
-
- $reply = curl_exec($ch);
-
- // certificate validation results
- //$validation_result = curl_errno($ch);
- //if (in_array(
- // $validation_result,
- // array(
- // CURLE_SSL_CERTPROBLEM,
- // CURLE_SSL_CACERT,
- // CURLE_SSL_CACERT_BADFILE,
- // CURLE_SSL_CRL_BADFILE,
- // CURLE_SSL_ISSUER_ERROR
- // )
- // )
- //) {
- // throw new \Exception('Error ' . $validation_result . ' while validating the Twitter API certificate.');
- //}
-
- $httpstatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
- $reply = $this->_parseApiReply($method_template, $reply);
- if ($this->_return_format == CODEBIRD_RETURNFORMAT_OBJECT) {
- $reply->httpstatus = $httpstatus;
- } elseif ($this->_return_format == CODEBIRD_RETURNFORMAT_ARRAY) {
- $reply['httpstatus'] = $httpstatus;
- }
- return $reply;
- }
-
- /**
- * Parses the API reply to encode it in the set return_format
- *
- * @param string $method The method that has been called
- * @param string $reply The actual reply, JSON-encoded or URL-encoded
- *
- * @return array|object The parsed reply
- */
- protected function _parseApiReply($method, $reply)
- {
- // split headers and body
- $headers = array();
- $reply = explode("\r\n\r\n", $reply, 4);
-
- // check if using proxy
- if (substr($reply[0], 0, 35) === 'HTTP/1.1 200 Connection Established') {
- array_shift($reply);
- } elseif (count($reply) > 2) {
- $headers = array_shift($reply);
- $reply = array(
- $headers,
- implode("\r\n", $reply)
- );
- }
-
- $headers_array = explode("\r\n", $reply[0]);
- foreach ($headers_array as $header) {
- $header_array = explode(': ', $header, 2);
- $key = $header_array[0];
- $value = '';
- if (count($header_array) > 1) {
- $value = $header_array[1];
- }
- $headers[$key] = $value;
- }
- if (count($reply) > 1) {
- $reply = $reply[1];
- } else {
- $reply = '';
- }
-
- $need_array = $this->_return_format == CODEBIRD_RETURNFORMAT_ARRAY;
- if ($reply == '[]') {
- switch ($this->_return_format) {
- case CODEBIRD_RETURNFORMAT_ARRAY:
- return array();
- case CODEBIRD_RETURNFORMAT_JSON:
- return '{}';
- case CODEBIRD_RETURNFORMAT_OBJECT:
- return new \stdClass;
- }
- }
- $parsed = array();
- if (! $parsed = json_decode($reply, $need_array)) {
- if ($reply) {
- if (stripos($reply, '<' . '?xml version="1.0" encoding="UTF-8"?' . '>') === 0) {
- // we received XML...
- // since this only happens for errors,
- // don't perform a full decoding
- preg_match('/<request>(.*)<\/request>/', $reply, $request);
- preg_match('/<error>(.*)<\/error>/', $reply, $error);
- $parsed['request'] = htmlspecialchars_decode($request[1]);
- $parsed['error'] = htmlspecialchars_decode($error[1]);
- } else {
- // assume query format
- $reply = explode('&', $reply);
- foreach ($reply as $element) {
- if (stristr($element, '=')) {
- list($key, $value) = explode('=', $element);
- $parsed[$key] = $value;
- } else {
- $parsed['message'] = $element;
- }
- }
- }
- }
- $reply = json_encode($parsed);
- }
- switch ($this->_return_format) {
- case CODEBIRD_RETURNFORMAT_ARRAY:
- return $parsed;
- case CODEBIRD_RETURNFORMAT_JSON:
- return $reply;
- case CODEBIRD_RETURNFORMAT_OBJECT:
- return (object) $parsed;
- }
- return $parsed;
- }
-}
-
-?>
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-07-27 07:21+0200\n"
-"PO-Revision-Date: 2015-08-31 10:27+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
--- /dev/null
+<?php
+
+namespace CodebirdSN;
+
+/**
+ * A Twitter library in PHP.
+ *
+ * @package codebird
+ * @version 2.4.1
+ * @author J.M. <me@mynetx.net>
+ * @copyright 2010-2013 J.M. <me@mynetx.net>
+ *
+ * Modified for statusnet by Michael Vogel <heluecht@pirati.ca>
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * Define constants
+ */
+$constants = explode(' ', 'OBJECT ARRAY JSON');
+foreach ($constants as $i => $id) {
+ $id = 'CODEBIRD_RETURNFORMAT_' . $id;
+ defined($id) or define($id, $i);
+}
+$constants = array(
+ 'CURLE_SSL_CERTPROBLEM' => 58,
+ 'CURLE_SSL_CACERT' => 60,
+ 'CURLE_SSL_CACERT_BADFILE' => 77,
+ 'CURLE_SSL_CRL_BADFILE' => 82,
+ 'CURLE_SSL_ISSUER_ERROR' => 83
+);
+foreach ($constants as $id => $i) {
+ defined($id) or define($id, $i);
+}
+unset($constants);
+unset($i);
+unset($id);
+
+/**
+ * A Twitter library in PHP.
+ *
+ * @package codebird
+ * @subpackage codebird-php
+ */
+class CodebirdSN
+{
+ /**
+ * The current singleton instance
+ */
+ private static $_instance = null;
+
+ /**
+ * The OAuth consumer key of your registered app
+ */
+ protected static $_oauth_consumer_key = null;
+
+ /**
+ * The corresponding consumer secret
+ */
+ protected static $_oauth_consumer_secret = null;
+
+ /**
+ * The app-only bearer token. Used to authorize app-only requests
+ */
+ protected static $_oauth_bearer_token = null;
+
+ /**
+ * The API endpoint to use
+ */
+ protected static $_endpoint = 'https://api.twitter.com/1.1/';
+
+ /**
+ * The API endpoint to use for OAuth requests
+ */
+ protected static $_endpoint_oauth = 'https://api.twitter.com/';
+
+ /**
+ * The Request or access token. Used to sign requests
+ */
+ protected $_oauth_token = null;
+
+ /**
+ * The corresponding request or access token secret
+ */
+ protected $_oauth_token_secret = null;
+
+ /**
+ * The format of data to return from API calls
+ */
+ protected $_return_format = CODEBIRD_RETURNFORMAT_OBJECT;
+
+ /**
+ * The file formats that Twitter accepts as image uploads
+ */
+ protected $_supported_media_files = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG);
+
+ /**
+ * The current Codebird version
+ */
+ protected $_version = '2.4.1';
+
+ /**
+ * Returns singleton class instance
+ * Always use this method unless you're working with multiple authenticated users at once
+ *
+ * @return Codebird The instance
+ */
+ public static function getInstance()
+ {
+ if (self::$_instance == null) {
+ self::$_instance = new self;
+ }
+ return self::$_instance;
+ }
+
+ /**
+ * Sets the API endpoint
+ *
+ * @param string $api API endpoint
+ *
+ * @return void
+ */
+ public static function setAPIEndpoint($api)
+ {
+ self::$_endpoint_oauth = $api;
+ self::$_endpoint = $api;
+ }
+
+ /**
+ * Sets the OAuth consumer key and secret (App key)
+ *
+ * @param string $key OAuth consumer key
+ * @param string $secret OAuth consumer secret
+ *
+ * @return void
+ */
+ public static function setConsumerKey($key, $secret)
+ {
+ self::$_oauth_consumer_key = $key;
+ self::$_oauth_consumer_secret = $secret;
+ }
+
+ /**
+ * Sets the OAuth2 app-only auth bearer token
+ *
+ * @param string $token OAuth2 bearer token
+ *
+ * @return void
+ */
+ public static function setBearerToken($token)
+ {
+ self::$_oauth_bearer_token = $token;
+ }
+
+ /**
+ * Gets the current Codebird version
+ *
+ * @return string The version number
+ */
+ public function getVersion()
+ {
+ return $this->_version;
+ }
+
+ /**
+ * Sets the OAuth request or access token and secret (User key)
+ *
+ * @param string $token OAuth request or access token
+ * @param string $secret OAuth request or access token secret
+ *
+ * @return void
+ */
+ public function setToken($token, $secret)
+ {
+ $this->_oauth_token = $token;
+ $this->_oauth_token_secret = $secret;
+ }
+
+ /**
+ * Sets the format for API replies
+ *
+ * @param int $return_format One of these:
+ * CODEBIRD_RETURNFORMAT_OBJECT (default)
+ * CODEBIRD_RETURNFORMAT_ARRAY
+ *
+ * @return void
+ */
+ public function setReturnFormat($return_format)
+ {
+ $this->_return_format = $return_format;
+ }
+
+ /**
+ * Main API handler working on any requests you issue
+ *
+ * @param string $fn The member function you called
+ * @param array $params The parameters you sent along
+ *
+ * @return mixed The API reply encoded in the set return_format
+ */
+
+ public function __call($fn, $params)
+ {
+ // parse parameters
+ $apiparams = array();
+ if (count($params) > 0) {
+ if (is_array($params[0])) {
+ $apiparams = $params[0];
+ } else {
+ parse_str($params[0], $apiparams);
+ // remove auto-added slashes if on magic quotes steroids
+ if (get_magic_quotes_gpc()) {
+ foreach($apiparams as $key => $value) {
+ if (is_array($value)) {
+ $apiparams[$key] = array_map('stripslashes', $value);
+ } else {
+ $apiparams[$key] = stripslashes($value);
+ }
+ }
+ }
+ }
+ }
+
+ // stringify null and boolean parameters
+ foreach ($apiparams as $key => $value) {
+ if (! is_scalar($value)) {
+ continue;
+ }
+ if (is_null($value)) {
+ $apiparams[$key] = 'null';
+ } elseif (is_bool($value)) {
+ $apiparams[$key] = $value ? 'true' : 'false';
+ }
+ }
+
+ $app_only_auth = false;
+ if (count($params) > 1) {
+ $app_only_auth = !! $params[1];
+ }
+
+ // map function name to API method
+ $method = '';
+
+ // replace _ by /
+ $path = explode('_', $fn);
+ for ($i = 0; $i < count($path); $i++) {
+ if ($i > 0) {
+ $method .= '/';
+ }
+ $method .= $path[$i];
+ }
+ // undo replacement for URL parameters
+ $url_parameters_with_underscore = array('screen_name');
+ foreach ($url_parameters_with_underscore as $param) {
+ $param = strtoupper($param);
+ $replacement_was = str_replace('_', '/', $param);
+ $method = str_replace($replacement_was, $param, $method);
+ }
+
+ // replace AA by URL parameters
+ $method_template = $method;
+ $match = array();
+ if (preg_match('/[A-Z_]{2,}/', $method, $match)) {
+ foreach ($match as $param) {
+ $param_l = strtolower($param);
+ $method_template = str_replace($param, ':' . $param_l, $method_template);
+ if (!isset($apiparams[$param_l])) {
+ for ($i = 0; $i < 26; $i++) {
+ $method_template = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method_template);
+ }
+ throw new \Exception(
+ 'To call the templated method "' . $method_template
+ . '", specify the parameter value for "' . $param_l . '".'
+ );
+ }
+ $method = str_replace($param, $apiparams[$param_l], $method);
+ unset($apiparams[$param_l]);
+ }
+ }
+
+ // replace A-Z by _a-z
+ for ($i = 0; $i < 26; $i++) {
+ $method = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method);
+ $method_template = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method_template);
+ }
+
+ $httpmethod = $this->_detectMethod($method_template, $apiparams);
+ $multipart = $this->_detectMultipart($method_template);
+ return $this->_callApi(
+ $httpmethod,
+ $method,
+ $method_template,
+ $apiparams,
+ $multipart,
+ $app_only_auth
+ );
+ }
+
+ /**
+ * Uncommon API methods
+ */
+
+ /**
+ * Gets the OAuth authenticate URL for the current request token
+ *
+ * @return string The OAuth authenticate URL
+ */
+ public function oauth_authenticate($force_login = NULL, $screen_name = NULL)
+ {
+ if ($this->_oauth_token == null) {
+ throw new \Exception('To get the authenticate URL, the OAuth token must be set.');
+ }
+ $url = self::$_endpoint_oauth . 'oauth/authenticate?oauth_token=' . $this->_url($this->_oauth_token);
+ if ($force_login) {
+ $url .= "&force_login=1";
+ }
+ if ($screen_name) {
+ $url .= "&screen_name=" . $screen_name;
+ }
+ return $url;
+ }
+
+ /**
+ * Gets the OAuth authorize URL for the current request token
+ *
+ * @return string The OAuth authorize URL
+ */
+ public function oauth_authorize($force_login = NULL, $screen_name = NULL)
+ {
+ if ($this->_oauth_token == null) {
+ throw new \Exception('To get the authorize URL, the OAuth token must be set.');
+ }
+ $url = self::$_endpoint_oauth . 'oauth/authorize?oauth_token=' . $this->_url($this->_oauth_token);
+ if ($force_login) {
+ $url .= "&force_login=1";
+ }
+ if ($screen_name) {
+ $url .= "&screen_name=" . $screen_name;
+ }
+ return $url;
+ }
+
+ /**
+ * Gets the OAuth bearer token
+ *
+ * @return string The OAuth bearer token
+ */
+
+ public function oauth2_token()
+ {
+ if (! function_exists('curl_init')) {
+ throw new \Exception('To make API requests, the PHP curl extension must be available.');
+ }
+ if (self::$_oauth_consumer_key == null) {
+ throw new \Exception('To obtain a bearer token, the consumer key must be set.');
+ }
+ $ch = false;
+ $post_fields = array(
+ 'grant_type' => 'client_credentials'
+ );
+ $url = self::$_endpoint_oauth . 'oauth2/token';
+ $ch = curl_init($url);
+ curl_setopt($ch, CURLOPT_POST, 1);
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
+ curl_setopt($ch, CURLOPT_HEADER, 1);
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
+ curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
+ //curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/cacert.pem');
+
+ curl_setopt($ch, CURLOPT_USERPWD, self::$_oauth_consumer_key . ':' . self::$_oauth_consumer_secret);
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
+ 'Expect:'
+ ));
+ $reply = curl_exec($ch);
+
+ // certificate validation results
+ //$validation_result = curl_errno($ch);
+ //if (in_array(
+ // $validation_result,
+ // array(
+ // CURLE_SSL_CERTPROBLEM,
+ // CURLE_SSL_CACERT,
+ // CURLE_SSL_CACERT_BADFILE,
+ // CURLE_SSL_CRL_BADFILE,
+ // CURLE_SSL_ISSUER_ERROR
+ // )
+ // )
+ //) {
+ // throw new \Exception('Error ' . $validation_result . ' while validating the Twitter API certificate.');
+ //}
+
+ $httpstatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+ $reply = $this->_parseApiReply('oauth2/token', $reply);
+ switch ($this->_return_format) {
+ case CODEBIRD_RETURNFORMAT_ARRAY:
+ $reply['httpstatus'] = $httpstatus;
+ if ($httpstatus == 200) {
+ self::setBearerToken($reply['access_token']);
+ }
+ break;
+ case CODEBIRD_RETURNFORMAT_JSON:
+ if ($httpstatus == 200) {
+ $parsed = json_decode($reply);
+ self::setBearerToken($parsed->access_token);
+ }
+ break;
+ case CODEBIRD_RETURNFORMAT_OBJECT:
+ $reply->httpstatus = $httpstatus;
+ if ($httpstatus == 200) {
+ self::setBearerToken($reply->access_token);
+ }
+ break;
+ }
+ return $reply;
+ }
+
+ /**
+ * Signing helpers
+ */
+
+ /**
+ * URL-encodes the given data
+ *
+ * @param mixed $data
+ *
+ * @return mixed The encoded data
+ */
+ private function _url($data)
+ {
+ if (is_array($data)) {
+ return array_map(array(
+ $this,
+ '_url'
+ ), $data);
+ } elseif (is_scalar($data)) {
+ return str_replace(array(
+ '+',
+ '!',
+ '*',
+ "'",
+ '(',
+ ')'
+ ), array(
+ ' ',
+ '%21',
+ '%2A',
+ '%27',
+ '%28',
+ '%29'
+ ), rawurlencode($data));
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Gets the base64-encoded SHA1 hash for the given data
+ *
+ * @param string $data The data to calculate the hash from
+ *
+ * @return string The hash
+ */
+ private function _sha1($data)
+ {
+ if (self::$_oauth_consumer_secret == null) {
+ throw new \Exception('To generate a hash, the consumer secret must be set.');
+ }
+ if (!function_exists('hash_hmac')) {
+ throw new \Exception('To generate a hash, the PHP hash extension must be available.');
+ }
+ return base64_encode(hash_hmac('sha1', $data, self::$_oauth_consumer_secret . '&'
+ . ($this->_oauth_token_secret != null ? $this->_oauth_token_secret : ''), true));
+ }
+
+ /**
+ * Generates a (hopefully) unique random string
+ *
+ * @param int optional $length The length of the string to generate
+ *
+ * @return string The random string
+ */
+ protected function _nonce($length = 8)
+ {
+ if ($length < 1) {
+ throw new \Exception('Invalid nonce length.');
+ }
+ return substr(md5(microtime(true)), 0, $length);
+ }
+
+ /**
+ * Generates an OAuth signature
+ *
+ * @param string $httpmethod Usually either 'GET' or 'POST' or 'DELETE'
+ * @param string $method The API method to call
+ * @param array optional $params The API call parameters, associative
+ *
+ * @return string Authorization HTTP header
+ */
+ protected function _sign($httpmethod, $method, $params = array())
+ {
+ if (self::$_oauth_consumer_key == null) {
+ throw new \Exception('To generate a signature, the consumer key must be set.');
+ }
+ $sign_params = array(
+ 'consumer_key' => self::$_oauth_consumer_key,
+ 'version' => '1.0',
+ 'timestamp' => time(),
+ 'nonce' => $this->_nonce(),
+ 'signature_method' => 'HMAC-SHA1'
+ );
+ $sign_base_params = array();
+ foreach ($sign_params as $key => $value) {
+ $sign_base_params['oauth_' . $key] = $this->_url($value);
+ }
+ if ($this->_oauth_token != null) {
+ $sign_base_params['oauth_token'] = $this->_url($this->_oauth_token);
+ }
+ $oauth_params = $sign_base_params;
+ foreach ($params as $key => $value) {
+ $sign_base_params[$key] = $this->_url($value);
+ }
+ ksort($sign_base_params);
+ $sign_base_string = '';
+ foreach ($sign_base_params as $key => $value) {
+ $sign_base_string .= $key . '=' . $value . '&';
+ }
+ $sign_base_string = substr($sign_base_string, 0, -1);
+ $signature = $this->_sha1($httpmethod . '&' . $this->_url($method) . '&' . $this->_url($sign_base_string));
+
+ $params = array_merge($oauth_params, array(
+ 'oauth_signature' => $signature
+ ));
+ ksort($params);
+ $authorization = 'Authorization: OAuth ';
+ foreach ($params as $key => $value) {
+ $authorization .= $key . '="' . $this->_url($value) . '", ';
+ }
+ return substr($authorization, 0, -2);
+ }
+
+ /**
+ * Detects HTTP method to use for API call
+ *
+ * @param string $method The API method to call
+ * @param array $params The parameters to send along
+ *
+ * @return string The HTTP method that should be used
+ */
+ protected function _detectMethod($method, $params)
+ {
+ // multi-HTTP method endpoints
+ switch($method) {
+ case 'account/settings':
+ $method = count($params) > 0 ? $method . '__post' : $method;
+ break;
+ }
+
+ $httpmethods = array();
+ $httpmethods['GET'] = array(
+ // Timelines
+ 'statuses/mentions_timeline',
+ 'statuses/user_timeline',
+ 'statuses/home_timeline',
+ 'statuses/retweets_of_me',
+
+ // Tweets
+ 'statuses/retweets/:id',
+ 'statuses/show/:id',
+ 'statuses/oembed',
+
+ // Search
+ 'search/tweets',
+
+ // Direct Messages
+ 'direct_messages',
+ 'direct_messages/sent',
+ 'direct_messages/show',
+
+ // Friends & Followers
+ 'friendships/no_retweets/ids',
+ 'friends/ids',
+ 'followers/ids',
+ 'friendships/lookup',
+ 'friendships/incoming',
+ 'friendships/outgoing',
+ 'friendships/show',
+ 'friends/list',
+ 'followers/list',
+
+ // Users
+ 'account/settings',
+ 'account/verify_credentials',
+ 'blocks/list',
+ 'blocks/ids',
+ 'users/lookup',
+ 'users/show',
+ 'users/search',
+ 'users/contributees',
+ 'users/contributors',
+ 'users/profile_banner',
+
+ // Suggested Users
+ 'users/suggestions/:slug',
+ 'users/suggestions',
+ 'users/suggestions/:slug/members',
+
+ // Favorites
+ 'favorites/list',
+
+ // Lists
+ 'lists/list',
+ 'lists/statuses',
+ 'lists/memberships',
+ 'lists/subscribers',
+ 'lists/subscribers/show',
+ 'lists/members/show',
+ 'lists/members',
+ 'lists/show',
+ 'lists/subscriptions',
+
+ // Saved searches
+ 'saved_searches/list',
+ 'saved_searches/show/:id',
+
+ // Places & Geo
+ 'geo/id/:place_id',
+ 'geo/reverse_geocode',
+ 'geo/search',
+ 'geo/similar_places',
+
+ // Trends
+ 'trends/place',
+ 'trends/available',
+ 'trends/closest',
+
+ // OAuth
+ 'oauth/authenticate',
+ 'oauth/authorize',
+
+ // Help
+ 'help/configuration',
+ 'help/languages',
+ 'help/privacy',
+ 'help/tos',
+ 'application/rate_limit_status'
+ );
+ $httpmethods['POST'] = array(
+ // Tweets
+ 'statuses/destroy/:id',
+ 'statuses/update',
+ 'statuses/retweet/:id',
+ 'statuses/update_with_media',
+
+ // Media resources
+ 'statusnet/media/upload',
+
+ // Direct Messages
+ 'direct_messages/destroy',
+ 'direct_messages/new',
+
+ // Friends & Followers
+ 'friendships/create',
+ 'friendships/destroy',
+ 'friendships/update',
+
+ // Users
+ 'account/settings__post',
+ 'account/update_delivery_device',
+ 'account/update_profile',
+ 'account/update_profile_background_image',
+ 'account/update_profile_colors',
+ 'account/update_profile_image',
+ 'blocks/create',
+ 'blocks/destroy',
+ 'account/update_profile_banner',
+ 'account/remove_profile_banner',
+
+ // Favorites
+ 'favorites/destroy',
+ 'favorites/create',
+
+ // Lists
+ 'lists/members/destroy',
+ 'lists/subscribers/create',
+ 'lists/subscribers/destroy',
+ 'lists/members/create_all',
+ 'lists/members/create',
+ 'lists/destroy',
+ 'lists/update',
+ 'lists/create',
+ 'lists/members/destroy_all',
+
+ // Saved Searches
+ 'saved_searches/create',
+ 'saved_searches/destroy/:id',
+
+ // Places & Geo
+ 'geo/place',
+
+ // Spam Reporting
+ 'users/report_spam',
+
+ // OAuth
+ 'oauth/access_token',
+ 'oauth/request_token',
+ 'oauth2/token',
+ 'oauth2/invalidate_token'
+ );
+ foreach ($httpmethods as $httpmethod => $methods) {
+ if (in_array($method, $methods)) {
+ return $httpmethod;
+ }
+ }
+ throw new \Exception('Can\'t find HTTP method to use for "' . $method . '".');
+ }
+
+ /**
+ * Detects if API call should use multipart/form-data
+ *
+ * @param string $method The API method to call
+ *
+ * @return bool Whether the method should be sent as multipart
+ */
+ protected function _detectMultipart($method)
+ {
+ $multiparts = array(
+ // Tweets
+ 'statuses/update',
+ 'statuses/update_with_media',
+
+ // Media ressources
+ 'statusnet/media/upload',
+
+ // Users
+ 'account/update_profile_background_image',
+ 'account/update_profile_image',
+ 'account/update_profile_banner'
+ );
+ return in_array($method, $multiparts);
+ }
+
+ /**
+ * Detect filenames in upload parameters,
+ * build multipart request from upload params
+ *
+ * @param string $method The API method to call
+ * @param array $params The parameters to send along
+ *
+ * @return void
+ */
+ protected function _buildMultipart($method, $params)
+ {
+ // well, files will only work in multipart methods
+ if (! $this->_detectMultipart($method)) {
+ return;
+ }
+
+ // only check specific parameters
+ $possible_files = array(
+ // Tweets
+ 'statuses/update' => 'media[]',
+ 'statuses/update_with_media' => 'media[]',
+ // Accounts
+ 'account/update_profile_background_image' => 'image',
+ 'account/update_profile_image' => 'image',
+ 'account/update_profile_banner' => 'banner'
+ );
+ // method might have files?
+ if (! in_array($method, array_keys($possible_files))) {
+ return;
+ }
+
+ $possible_files = explode(' ', $possible_files[$method]);
+
+ $multipart_border = '--------------------' . $this->_nonce();
+ $multipart_request = '';
+ foreach ($params as $key => $value) {
+ // is it an array?
+ if (is_array($value)) {
+ throw new \Exception('Using URL-encoded parameters is not supported for uploading media.');
+ continue;
+ }
+
+ // check for filenames
+ if (in_array($key, $possible_files)) {
+ if (// is it a file, a readable one?
+ @file_exists($value)
+ && @is_readable($value)
+
+ // is it a valid image?
+ && $data = @getimagesize($value)
+ ) {
+ if (// is it a supported image format?
+ in_array($data[2], $this->_supported_media_files)
+ ) {
+ // try to read the file
+ ob_start();
+ readfile($value);
+ $data = ob_get_contents();
+ ob_end_clean();
+ if (strlen($data) == 0) {
+ continue;
+ }
+ $value = $data;
+ }
+ }
+
+ // To-Do
+ $tempfile = tempnam(get_temppath(), "mimecheck");
+ file_put_contents($tempfile, $data);
+ $mime = image_type_to_mime_type(exif_imagetype($tempfile));
+ unlink($tempfile);
+ $filename = "upload";
+ $parametername = str_replace("[]", "", $key);
+
+ $multipart_request .= "--".$multipart_border."\n";
+ $multipart_request .= "Content-Disposition: form-data; name=\"{$parametername}\"; filename=\"{$filename}\"\n";
+ $multipart_request .= "Content-Type: ".$mime."\n";
+ $multipart_request .= "Content-Transfer-Encoding: binary\n\n";
+ $multipart_request .= $data."\n";
+ } else {
+
+ $multipart_request .=
+ '--' . $multipart_border . "\r\n"
+ . 'Content-Disposition: form-data; name="' . $key . '"';
+
+ $multipart_request .=
+ "\r\n\r\n" . $value . "\r\n";
+ }
+ }
+ $multipart_request .= '--' . $multipart_border . '--';
+
+ return $multipart_request;
+ }
+
+
+ /**
+ * Builds the complete API endpoint url
+ *
+ * @param string $method The API method to call
+ * @param string $method_template The API method template to call
+ *
+ * @return string The URL to send the request to
+ */
+ protected function _getEndpoint($method, $method_template)
+ {
+ if (substr($method, 0, 5) == 'oauth') {
+ $url = self::$_endpoint_oauth . $method;
+ } else {
+ $url = self::$_endpoint . $method . '.json';
+ }
+ return $url;
+ }
+
+ /**
+ * Calls the API using cURL
+ *
+ * @param string $httpmethod The HTTP method to use for making the request
+ * @param string $method The API method to call
+ * @param string $method_template The templated API method to call
+ * @param array optional $params The parameters to send along
+ * @param bool optional $multipart Whether to use multipart/form-data
+ * @param bool optional $app_only_auth Whether to use app-only bearer authentication
+ *
+ * @return mixed The API reply, encoded in the set return_format
+ */
+
+ protected function _callApi($httpmethod, $method, $method_template, $params = array(), $multipart = false, $app_only_auth = false)
+ {
+ if (! function_exists('curl_init')) {
+ throw new \Exception('To make API requests, the PHP curl extension must be available.');
+ }
+ $url = $this->_getEndpoint($method, $method_template);
+ $ch = false;
+ if ($httpmethod == 'GET') {
+ $url_with_params = $url;
+ if (count($params) > 0) {
+ $url_with_params .= '?' . http_build_query($params);
+ }
+ $authorization = $this->_sign($httpmethod, $url, $params);
+ $ch = curl_init($url_with_params);
+ } else {
+ if ($multipart) {
+ $authorization = $this->_sign($httpmethod, $url, array());
+ $params = $this->_buildMultipart($method_template, $params);
+ } else {
+ $authorization = $this->_sign($httpmethod, $url, $params);
+ $params = http_build_query($params);
+ }
+ $ch = curl_init($url);
+ curl_setopt($ch, CURLOPT_POST, 1);
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
+ }
+ if ($app_only_auth) {
+ if (self::$_oauth_consumer_key == null) {
+ throw new \Exception('To make an app-only auth API request, the consumer key must be set.');
+ }
+ // automatically fetch bearer token, if necessary
+ if (self::$_oauth_bearer_token == null) {
+ $this->oauth2_token();
+ }
+ $authorization = 'Authorization: Bearer ' . self::$_oauth_bearer_token;
+ }
+ $request_headers = array();
+ if (isset($authorization)) {
+ $request_headers[] = $authorization;
+ $request_headers[] = 'Expect:';
+ }
+ if ($multipart) {
+ $first_newline = strpos($params, "\r\n");
+ $multipart_boundary = substr($params, 2, $first_newline - 2);
+ $request_headers[] = 'Content-Length: ' . strlen($params);
+ $request_headers[] = 'Content-Type: multipart/form-data; boundary='
+ . $multipart_boundary;
+ }
+
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
+ curl_setopt($ch, CURLOPT_HEADER, 1);
+ curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
+ curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
+ //curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/cacert.pem');
+
+ $reply = curl_exec($ch);
+
+ // certificate validation results
+ //$validation_result = curl_errno($ch);
+ //if (in_array(
+ // $validation_result,
+ // array(
+ // CURLE_SSL_CERTPROBLEM,
+ // CURLE_SSL_CACERT,
+ // CURLE_SSL_CACERT_BADFILE,
+ // CURLE_SSL_CRL_BADFILE,
+ // CURLE_SSL_ISSUER_ERROR
+ // )
+ // )
+ //) {
+ // throw new \Exception('Error ' . $validation_result . ' while validating the Twitter API certificate.');
+ //}
+
+ $httpstatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+ $reply = $this->_parseApiReply($method_template, $reply);
+ if ($this->_return_format == CODEBIRD_RETURNFORMAT_OBJECT) {
+ $reply->httpstatus = $httpstatus;
+ } elseif ($this->_return_format == CODEBIRD_RETURNFORMAT_ARRAY) {
+ $reply['httpstatus'] = $httpstatus;
+ }
+ return $reply;
+ }
+
+ /**
+ * Parses the API reply to encode it in the set return_format
+ *
+ * @param string $method The method that has been called
+ * @param string $reply The actual reply, JSON-encoded or URL-encoded
+ *
+ * @return array|object The parsed reply
+ */
+ protected function _parseApiReply($method, $reply)
+ {
+ // split headers and body
+ $headers = array();
+ $reply = explode("\r\n\r\n", $reply, 4);
+
+ // check if using proxy
+ if (substr($reply[0], 0, 35) === 'HTTP/1.1 200 Connection Established') {
+ array_shift($reply);
+ } elseif (count($reply) > 2) {
+ $headers = array_shift($reply);
+ $reply = array(
+ $headers,
+ implode("\r\n", $reply)
+ );
+ }
+
+ $headers_array = explode("\r\n", $reply[0]);
+ foreach ($headers_array as $header) {
+ $header_array = explode(': ', $header, 2);
+ $key = $header_array[0];
+ $value = '';
+ if (count($header_array) > 1) {
+ $value = $header_array[1];
+ }
+ $headers[$key] = $value;
+ }
+ if (count($reply) > 1) {
+ $reply = $reply[1];
+ } else {
+ $reply = '';
+ }
+
+ $need_array = $this->_return_format == CODEBIRD_RETURNFORMAT_ARRAY;
+ if ($reply == '[]') {
+ switch ($this->_return_format) {
+ case CODEBIRD_RETURNFORMAT_ARRAY:
+ return array();
+ case CODEBIRD_RETURNFORMAT_JSON:
+ return '{}';
+ case CODEBIRD_RETURNFORMAT_OBJECT:
+ return new \stdClass;
+ }
+ }
+ $parsed = array();
+ if (! $parsed = json_decode($reply, $need_array)) {
+ if ($reply) {
+ if (stripos($reply, '<' . '?xml version="1.0" encoding="UTF-8"?' . '>') === 0) {
+ // we received XML...
+ // since this only happens for errors,
+ // don't perform a full decoding
+ preg_match('/<request>(.*)<\/request>/', $reply, $request);
+ preg_match('/<error>(.*)<\/error>/', $reply, $error);
+ $parsed['request'] = htmlspecialchars_decode($request[1]);
+ $parsed['error'] = htmlspecialchars_decode($error[1]);
+ } else {
+ // assume query format
+ $reply = explode('&', $reply);
+ foreach ($reply as $element) {
+ if (stristr($element, '=')) {
+ list($key, $value) = explode('=', $element);
+ $parsed[$key] = $value;
+ } else {
+ $parsed['message'] = $element;
+ }
+ }
+ }
+ }
+ $reply = json_encode($parsed);
+ }
+ switch ($this->_return_format) {
+ case CODEBIRD_RETURNFORMAT_ARRAY:
+ return $parsed;
+ case CODEBIRD_RETURNFORMAT_JSON:
+ return $reply;
+ case CODEBIRD_RETURNFORMAT_OBJECT:
+ return (object) $parsed;
+ }
+ return $parsed;
+ }
+}
+
+?>
--- /dev/null
+<?php\r
+\r
+use Friendica\Core\Config;\r
+\r
+require_once __DIR__ . DIRECTORY_SEPARATOR . 'twitteroauth.php';\r
+\r
+/*\r
+ * We have to alter the TwitterOAuth class a little bit to work with any GNU Social\r
+ * installation abroad. Basically it's only make the API path variable and be happy.\r
+ *\r
+ * Thank you guys for the Twitter compatible API!\r
+ */\r
+class StatusNetOAuth extends TwitterOAuth\r
+{\r
+ function get_maxlength()\r
+ {\r
+ $config = $this->get($this->host . 'statusnet/config.json');\r
+ return $config->site->textlimit;\r
+ }\r
+\r
+ function accessTokenURL()\r
+ {\r
+ return $this->host . 'oauth/access_token';\r
+ }\r
+\r
+ function authenticateURL()\r
+ {\r
+ return $this->host . 'oauth/authenticate';\r
+ }\r
+\r
+ function authorizeURL()\r
+ {\r
+ return $this->host . 'oauth/authorize';\r
+ }\r
+\r
+ function requestTokenURL()\r
+ {\r
+ return $this->host . 'oauth/request_token';\r
+ }\r
+\r
+ function __construct($apipath, $consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL)\r
+ {\r
+ parent::__construct($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret);\r
+ $this->host = $apipath;\r
+ }\r
+\r
+ /**\r
+ * Make an HTTP request\r
+ *\r
+ * Copied here from the TwitterOAuth library and complemented by applying the proxy settings of Friendica\r
+ *\r
+ * @param string $method\r
+ * @param string $host\r
+ * @param string $path\r
+ * @param array $parameters\r
+ *\r
+ * @return array|object API results\r
+ */\r
+ function http($url, $method, $postfields = NULL)\r
+ {\r
+ $this->http_info = [];\r
+ $ci = curl_init();\r
+ /* Curl settings */\r
+ $prx = Config::get('system', 'proxy');\r
+ if (strlen($prx)) {\r
+ curl_setopt($ci, CURLOPT_HTTPPROXYTUNNEL, 1);\r
+ curl_setopt($ci, CURLOPT_PROXY, $prx);\r
+ $prxusr = Config::get('system', 'proxyuser');\r
+ if (strlen($prxusr)) {\r
+ curl_setopt($ci, CURLOPT_PROXYUSERPWD, $prxusr);\r
+ }\r
+ }\r
+ curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);\r
+ curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);\r
+ curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);\r
+ curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);\r
+ curl_setopt($ci, CURLOPT_HTTPHEADER, ['Expect:']);\r
+ curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);\r
+ curl_setopt($ci, CURLOPT_HEADERFUNCTION, [$this, 'getHeader']);\r
+ curl_setopt($ci, CURLOPT_HEADER, FALSE);\r
+\r
+ switch ($method) {\r
+ case 'POST':\r
+ curl_setopt($ci, CURLOPT_POST, TRUE);\r
+ if (!empty($postfields)) {\r
+ curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);\r
+ }\r
+ break;\r
+ case 'DELETE':\r
+ curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');\r
+ if (!empty($postfields)) {\r
+ $url = "{$url}?{$postfields}";\r
+ }\r
+ }\r
+\r
+ curl_setopt($ci, CURLOPT_URL, $url);\r
+ $response = curl_exec($ci);\r
+ $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);\r
+ $this->http_info = array_merge($this->http_info, curl_getinfo($ci));\r
+ $this->url = $url;\r
+ curl_close($ci);\r
+ return $response;\r
+ }\r
+}\r
--- /dev/null
+<?php
+
+/*
+ * Abraham Williams (abraham@abrah.am) http://abrah.am
+ *
+ * The first PHP Library to support OAuth for Twitter's REST API.
+ *
+ * Version 0.2.0 kept for compatibility purpose with StatusNetOAuth
+ */
+
+/**
+ * Twitter OAuth class
+ */
+class TwitterOAuth
+{
+ /* Contains the last HTTP status code returned. */
+ public $http_code;
+ /* Contains the last API call. */
+ public $url;
+ /* Set up the API root URL. */
+ public $host = "https://api.twitter.com/1.1/";
+ /* Set timeout default. */
+ public $timeout = 30;
+ /* Set connect timeout. */
+ public $connecttimeout = 30;
+ /* Verify SSL Cert. */
+ public $ssl_verifypeer = FALSE;
+ /* Respons format. */
+ public $format = 'json';
+ /* Decode returned json data. */
+ public $decode_json = TRUE;
+ /* Contains the last HTTP headers returned. */
+ public $http_info;
+ /* Set the useragnet. */
+ public $useragent = 'TwitterOAuth v0.2.0-beta2';
+
+ /* Immediately retry the API call if the response was not successful. */
+ //public $retry = TRUE;
+
+ /**
+ * Set API URLS
+ */
+ function accessTokenURL()
+ {
+ return 'https://api.twitter.com/oauth/access_token';
+ }
+
+ function authenticateURL()
+ {
+ return 'https://twitter.com/oauth/authenticate';
+ }
+
+ function authorizeURL()
+ {
+ return 'https://twitter.com/oauth/authorize';
+ }
+
+ function requestTokenURL()
+ {
+ return 'https://api.twitter.com/oauth/request_token';
+ }
+
+ /**
+ * Debug helpers
+ */
+ function lastStatusCode()
+ {
+ return $this->http_status;
+ }
+
+ function lastAPICall()
+ {
+ return $this->last_api_call;
+ }
+
+ /**
+ * construct TwitterOAuth object
+ */
+ function __construct($consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL)
+ {
+ $this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1();
+ $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret);
+ if (!empty($oauth_token) && !empty($oauth_token_secret)) {
+ $this->token = new OAuthConsumer($oauth_token, $oauth_token_secret);
+ } else {
+ $this->token = NULL;
+ }
+ }
+
+ /**
+ * Get a request_token from Twitter
+ *
+ * @returns a key/value array containing oauth_token and oauth_token_secret
+ */
+ function getRequestToken($oauth_callback = NULL)
+ {
+ $parameters = array();
+ if (!empty($oauth_callback)) {
+ $parameters['oauth_callback'] = $oauth_callback;
+ }
+ $request = $this->oAuthRequest($this->requestTokenURL(), 'GET', $parameters);
+ $token = OAuthUtil::parse_parameters($request);
+ $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
+ return $token;
+ }
+
+ /**
+ * Get the authorize URL
+ *
+ * @returns a string
+ */
+ function getAuthorizeURL($token, $sign_in_with_twitter = TRUE)
+ {
+ if (is_array($token)) {
+ $token = $token['oauth_token'];
+ }
+ if (empty($sign_in_with_twitter)) {
+ return $this->authorizeURL() . "?oauth_token={$token}";
+ } else {
+ return $this->authenticateURL() . "?oauth_token={$token}";
+ }
+ }
+
+ /**
+ * Exchange request token and secret for an access token and
+ * secret, to sign API calls.
+ *
+ * @returns array("oauth_token" => "the-access-token",
+ * "oauth_token_secret" => "the-access-secret",
+ * "user_id" => "9436992",
+ * "screen_name" => "abraham")
+ */
+ function getAccessToken($oauth_verifier = FALSE)
+ {
+ $parameters = array();
+ if (!empty($oauth_verifier)) {
+ $parameters['oauth_verifier'] = $oauth_verifier;
+ }
+ $request = $this->oAuthRequest($this->accessTokenURL(), 'GET', $parameters);
+ $token = OAuthUtil::parse_parameters($request);
+ $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
+ return $token;
+ }
+
+ /**
+ * One time exchange of username and password for access token and secret.
+ *
+ * @returns array("oauth_token" => "the-access-token",
+ * "oauth_token_secret" => "the-access-secret",
+ * "user_id" => "9436992",
+ * "screen_name" => "abraham",
+ * "x_auth_expires" => "0")
+ */
+ function getXAuthToken($username, $password)
+ {
+ $parameters = array();
+ $parameters['x_auth_username'] = $username;
+ $parameters['x_auth_password'] = $password;
+ $parameters['x_auth_mode'] = 'client_auth';
+ $request = $this->oAuthRequest($this->accessTokenURL(), 'POST', $parameters);
+ $token = OAuthUtil::parse_parameters($request);
+ $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
+ return $token;
+ }
+
+ /**
+ * GET wrapper for oAuthRequest.
+ */
+ function get($url, $parameters = array())
+ {
+ $response = $this->oAuthRequest($url, 'GET', $parameters);
+ if ($this->format === 'json' && $this->decode_json) {
+ return json_decode($response);
+ }
+ return $response;
+ }
+
+ /**
+ * POST wrapper for oAuthRequest.
+ */
+ function post($url, $parameters = array())
+ {
+ $response = $this->oAuthRequest($url, 'POST', $parameters);
+ if ($this->format === 'json' && $this->decode_json) {
+ return json_decode($response);
+ }
+ return $response;
+ }
+
+ /**
+ * DELETE wrapper for oAuthReqeust.
+ */
+ function delete($url, $parameters = array())
+ {
+ $response = $this->oAuthRequest($url, 'DELETE', $parameters);
+ if ($this->format === 'json' && $this->decode_json) {
+ return json_decode($response);
+ }
+ return $response;
+ }
+
+ /**
+ * Format and sign an OAuth / API request
+ */
+ function oAuthRequest($url, $method, $parameters)
+ {
+ if (strrpos($url, 'https://') !== 0 && strrpos($url, 'http://') !== 0) {
+ $url = "{$this->host}{$url}.{$this->format}";
+ }
+ $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters);
+ $request->sign_request($this->sha1_method, $this->consumer, $this->token);
+ switch ($method) {
+ case 'GET':
+ return $this->http($request->to_url(), 'GET');
+ case 'UPLOAD':
+ return $this->http($request->get_normalized_http_url(), 'POST', $request->to_postdata(true));
+ default:
+ return $this->http($request->get_normalized_http_url(), $method, $request->to_postdata());
+ }
+ }
+
+ /**
+ * Make an HTTP request
+ *
+ * @return API results
+ */
+ function http($url, $method, $postfields = NULL)
+ {
+ $this->http_info = array();
+ $ci = curl_init();
+ /* Curl settings */
+ curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);
+ curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
+ curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
+ curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
+ curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));
+ curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
+ curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));
+ curl_setopt($ci, CURLOPT_HEADER, FALSE);
+
+ switch ($method) {
+ case 'POST':
+ curl_setopt($ci, CURLOPT_POST, TRUE);
+ if (!empty($postfields)) {
+ curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
+ }
+ break;
+ case 'DELETE':
+ curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
+ if (!empty($postfields)) {
+ $url = "{$url}?{$postfields}";
+ }
+ }
+
+ curl_setopt($ci, CURLOPT_URL, $url);
+ $response = curl_exec($ci);
+ $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
+ $this->http_info = array_merge($this->http_info, curl_getinfo($ci));
+ $this->url = $url;
+ curl_close($ci);
+ return $response;
+ }
+
+ /**
+ * Get the header info to store.
+ */
+ function getHeader($ch, $header)
+ {
+ $i = strpos($header, ':');
+ if (!empty($i)) {
+ $key = str_replace('-', '_', strtolower(substr($header, 0, $i)));
+ $value = trim(substr($header, $i + 2));
+ $this->http_header[$key] = $value;
+ }
+ return strlen($header);
+ }
+}
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
-
-
-/***
- * We have to alter the TwitterOAuth class a little bit to work with any GNU Social
- * installation abroad. Basically it's only make the API path variable and be happy.
- *
- * Thank you guys for the Twitter compatible API!
- */
-
define('STATUSNET_DEFAULT_POLL_INTERVAL', 5); // given in minutes
-require_once('library/twitteroauth.php');
-require_once('include/enotify.php');
-require_once("include/socgraph.php");
-
-class StatusNetOAuth extends TwitterOAuth {
- function get_maxlength() {
- $config = $this->get($this->host . 'statusnet/config.json');
- return $config->site->textlimit;
- }
- function accessTokenURL() { return $this->host.'oauth/access_token'; }
- function authenticateURL() { return $this->host.'oauth/authenticate'; }
- function authorizeURL() { return $this->host.'oauth/authorize'; }
- function requestTokenURL() { return $this->host.'oauth/request_token'; }
- function __construct($apipath, $consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL) {
- parent::__construct($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret);
- $this->host = $apipath;
- }
- /**
- * Make an HTTP request
- *
- * @return API results
- *
- * Copied here from the twitteroauth library and complemented by applying the proxy settings of friendica
- */
- function http($url, $method, $postfields = NULL) {
- $this->http_info = array();
- $ci = curl_init();
- /* Curl settings */
- $prx = get_config('system','proxy');
- if(strlen($prx)) {
- curl_setopt($ci, CURLOPT_HTTPPROXYTUNNEL, 1);
- curl_setopt($ci, CURLOPT_PROXY, $prx);
- $prxusr = get_config('system','proxyuser');
- if(strlen($prxusr))
- curl_setopt($ci, CURLOPT_PROXYUSERPWD, $prxusr);
- }
- curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);
- curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
- curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
- curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
- curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));
- curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
- curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));
- curl_setopt($ci, CURLOPT_HEADER, FALSE);
-
- switch ($method) {
- case 'POST':
- curl_setopt($ci, CURLOPT_POST, TRUE);
- if (!empty($postfields)) {
- curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
- }
- break;
- case 'DELETE':
- curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
- if (!empty($postfields)) {
- $url = "{$url}?{$postfields}";
- }
- }
-
- curl_setopt($ci, CURLOPT_URL, $url);
- $response = curl_exec($ci);
- $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
- $this->http_info = array_merge($this->http_info, curl_getinfo($ci));
- $this->url = $url;
- curl_close ($ci);
- return $response;
- }
-}
+require_once __DIR__ . DIRECTORY_SEPARATOR . 'library' . DIRECTORY_SEPARATOR . 'statusnetoauth.php';
+require_once 'include/enotify.php';
+
+use Codebird\Codebird;
+use CodebirdSN\CodebirdSN;
+use Friendica\App;
+use Friendica\Content\OEmbed;
+use Friendica\Content\Text\BBCode;
+use Friendica\Content\Text\Plaintext;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Model\GContact;
+use Friendica\Model\Group;
+use Friendica\Model\Item;
+use Friendica\Model\Photo;
+use Friendica\Model\User;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Network;
function statusnet_install() {
// we need some hooks, for the configuration and for sending tweets
- register_hook('connector_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings');
- register_hook('connector_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post');
- register_hook('notifier_normal', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
- register_hook('post_local', 'addon/statusnet/statusnet.php', 'statusnet_post_local');
- register_hook('jot_networks', 'addon/statusnet/statusnet.php', 'statusnet_jot_nets');
- register_hook('cron', 'addon/statusnet/statusnet.php', 'statusnet_cron');
- register_hook('prepare_body', 'addon/statusnet/statusnet.php', 'statusnet_prepare_body');
- register_hook('check_item_notification','addon/statusnet/statusnet.php', 'statusnet_check_item_notification');
+ Addon::registerHook('connector_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings');
+ Addon::registerHook('connector_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post');
+ Addon::registerHook('notifier_normal', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
+ Addon::registerHook('post_local', 'addon/statusnet/statusnet.php', 'statusnet_post_local');
+ Addon::registerHook('jot_networks', 'addon/statusnet/statusnet.php', 'statusnet_jot_nets');
+ Addon::registerHook('cron', 'addon/statusnet/statusnet.php', 'statusnet_cron');
+ Addon::registerHook('prepare_body', 'addon/statusnet/statusnet.php', 'statusnet_prepare_body');
+ Addon::registerHook('check_item_notification', 'addon/statusnet/statusnet.php', 'statusnet_check_item_notification');
logger("installed GNU Social");
}
-
-function statusnet_uninstall() {
- unregister_hook('connector_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings');
- unregister_hook('connector_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post');
- unregister_hook('notifier_normal', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
- unregister_hook('post_local', 'addon/statusnet/statusnet.php', 'statusnet_post_local');
- unregister_hook('jot_networks', 'addon/statusnet/statusnet.php', 'statusnet_jot_nets');
- unregister_hook('cron', 'addon/statusnet/statusnet.php', 'statusnet_cron');
- unregister_hook('prepare_body', 'addon/statusnet/statusnet.php', 'statusnet_prepare_body');
- unregister_hook('check_item_notification','addon/statusnet/statusnet.php', 'statusnet_check_item_notification');
+function statusnet_uninstall()
+{
+ Addon::unregisterHook('connector_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings');
+ Addon::unregisterHook('connector_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post');
+ Addon::unregisterHook('notifier_normal', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
+ Addon::unregisterHook('post_local', 'addon/statusnet/statusnet.php', 'statusnet_post_local');
+ Addon::unregisterHook('jot_networks', 'addon/statusnet/statusnet.php', 'statusnet_jot_nets');
+ Addon::unregisterHook('cron', 'addon/statusnet/statusnet.php', 'statusnet_cron');
+ Addon::unregisterHook('prepare_body', 'addon/statusnet/statusnet.php', 'statusnet_prepare_body');
+ Addon::unregisterHook('check_item_notification', 'addon/statusnet/statusnet.php', 'statusnet_check_item_notification');
// old setting - remove only
- unregister_hook('post_local_end', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
- unregister_hook('plugin_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings');
- unregister_hook('plugin_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post');
-
+ Addon::unregisterHook('post_local_end', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
+ Addon::unregisterHook('addon_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post');
}
function statusnet_check_item_notification($a, &$notification_data) {
$statusnet_defpost = get_pconfig(local_user(),'statusnet','post_by_default');
$selected = ((intval($statusnet_defpost) == 1) ? ' checked="checked" ' : '');
$b .= '<div class="profile-jot-net"><input type="checkbox" name="statusnet_enable"' . $selected . ' value="1" /> '
- . t('Post to GNU Social') . '</div>';
+ . L10n::t('Post to GNU Social') . '</div>';
}
}
del_pconfig(local_user(), 'statusnet', 'create_user');
del_pconfig(local_user(), 'statusnet', 'own_id');
} else {
- if (isset($_POST['statusnet-preconf-apiurl'])) {
- /***
- * If the user used one of the preconfigured GNU Social server credentials
- * use them. All the data are available in the global config.
- * Check the API Url never the less and blame the admin if it's not working ^^
- */
- $globalsn = get_config('statusnet', 'sites');
- foreach ( $globalsn as $asn) {
- if ($asn['apiurl'] == $_POST['statusnet-preconf-apiurl'] ) {
- $apibase = $asn['apiurl'];
- $c = fetch_url( $apibase . 'statusnet/version.xml' );
+ if (isset($_POST['statusnet-preconf-apiurl'])) {
+ /* * *
+ * If the user used one of the preconfigured GNU Social server credentials
+ * use them. All the data are available in the global config.
+ * Check the API Url never the less and blame the admin if it's not working ^^
+ */
+ $globalsn = Config::get('statusnet', 'sites');
+ foreach ($globalsn as $asn) {
+ if ($asn['apiurl'] == $_POST['statusnet-preconf-apiurl']) {
+ $apibase = $asn['apiurl'];
+ $c = Network::fetchUrl($apibase . 'statusnet/version.xml');
+ if (strlen($c) > 0) {
+ PConfig::set(local_user(), 'statusnet', 'consumerkey', $asn['consumerkey']);
+ PConfig::set(local_user(), 'statusnet', 'consumersecret', $asn['consumersecret']);
+ PConfig::set(local_user(), 'statusnet', 'baseapi', $asn['apiurl']);
+ //PConfig::set(local_user(), 'statusnet', 'application_name', $asn['applicationname'] );
+ } else {
+ notice(L10n::t('Please contact your site administrator.<br />The provided API URL is not valid.') . EOL . $asn['apiurl'] . EOL);
+ }
+ }
+ }
+ goaway('settings/connectors');
+ } else {
+ if (isset($_POST['statusnet-consumersecret'])) {
+ // check if we can reach the API of the GNU Social server
+ // we'll check the API Version for that, if we don't get one we'll try to fix the path but will
+ // resign quickly after this one try to fix the path ;-)
+ $apibase = $_POST['statusnet-baseapi'];
+ $c = Network::fetchUrl($apibase . 'statusnet/version.xml');
if (strlen($c) > 0) {
set_pconfig(local_user(), 'statusnet', 'consumerkey', $asn['consumerkey'] );
set_pconfig(local_user(), 'statusnet', 'consumersecret', $asn['consumersecret'] );
set_pconfig(local_user(), 'statusnet', 'baseapi', $asn['apiurl'] );
//set_pconfig(local_user(), 'statusnet', 'application_name', $asn['applicationname'] );
} else {
- notice( t('Please contact your site administrator.<br />The provided API URL is not valid.').EOL.$asn['apiurl'].EOL );
+ // the API path is not correct, maybe missing trailing / ?
+ $apibase = $apibase . '/';
+ $c = Network::fetchUrl($apibase . 'statusnet/version.xml');
+ if (strlen($c) > 0) {
+ // ok the API path is now correct, let's save the settings
+ PConfig::set(local_user(), 'statusnet', 'consumerkey', $_POST['statusnet-consumerkey']);
+ PConfig::set(local_user(), 'statusnet', 'consumersecret', $_POST['statusnet-consumersecret']);
+ PConfig::set(local_user(), 'statusnet', 'baseapi', $apibase);
+ } else {
+ // still not the correct API base, let's do noting
+ notice(L10n::t('We could not contact the GNU Social API with the Path you entered.') . EOL);
+ }
}
}
}
set_pconfig(local_user(), 'statusnet', 'consumersecret', $_POST['statusnet-consumersecret']);
set_pconfig(local_user(), 'statusnet', 'baseapi', $apibase );
} else {
- // still not the correct API base, let's do noting
- notice( t('We could not contact the GNU Social API with the Path you entered.').EOL );
+ if (isset($_POST['statusnet-pin'])) {
+ // if the user supplied us with a PIN from GNU Social, let the magic of OAuth happen
+ $api = PConfig::get(local_user(), 'statusnet', 'baseapi');
+ $ckey = PConfig::get(local_user(), 'statusnet', 'consumerkey');
+ $csecret = PConfig::get(local_user(), 'statusnet', 'consumersecret');
+ // the token and secret for which the PIN was generated were hidden in the settings
+ // form as token and token2, we need a new connection to GNU Social using these token
+ // and secret to request a Access Token with the PIN
+ $connection = new StatusNetOAuth($api, $ckey, $csecret, $_POST['statusnet-token'], $_POST['statusnet-token2']);
+ $token = $connection->getAccessToken($_POST['statusnet-pin']);
+ // ok, now that we have the Access Token, save them in the user config
+ PConfig::set(local_user(), 'statusnet', 'oauthtoken', $token['oauth_token']);
+ PConfig::set(local_user(), 'statusnet', 'oauthsecret', $token['oauth_token_secret']);
+ PConfig::set(local_user(), 'statusnet', 'post', 1);
+ PConfig::set(local_user(), 'statusnet', 'post_taglinks', 1);
+ // reload the Addon Settings page, if we don't do it see Bug #42
+ goaway('settings/connectors');
+ } else {
+ // if no PIN is supplied in the POST variables, the user has changed the setting
+ // to post a dent for every new __public__ posting to the wall
+ PConfig::set(local_user(), 'statusnet', 'post', intval($_POST['statusnet-enable']));
+ PConfig::set(local_user(), 'statusnet', 'post_by_default', intval($_POST['statusnet-default']));
+ PConfig::set(local_user(), 'statusnet', 'mirror_posts', intval($_POST['statusnet-mirror']));
+ PConfig::set(local_user(), 'statusnet', 'import', intval($_POST['statusnet-import']));
+ PConfig::set(local_user(), 'statusnet', 'create_user', intval($_POST['statusnet-create_user']));
+
+ if (!intval($_POST['statusnet-mirror']))
+ PConfig::delete(local_user(), 'statusnet', 'lastid');
+
+ info(L10n::t('GNU Social settings updated.') . EOL);
+ }
}
}
goaway($a->get_baseurl().'/settings/connectors');
$css = (($enabled) ? '' : '-disabled');
$s .= '<span id="settings_statusnet_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_statusnet_expanded\'); openClose(\'settings_statusnet_inflated\');">';
- $s .= '<img class="connector'.$css.'" src="images/gnusocial.png" /><h3 class="connector">'. t('GNU Social Import/Export/Mirror').'</h3>';
+ $s .= '<img class="connector' . $css . '" src="images/gnusocial.png" /><h3 class="connector">' . L10n::t('GNU Social Import/Export/Mirror') . '</h3>';
$s .= '</span>';
$s .= '<div id="settings_statusnet_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_statusnet_expanded\'); openClose(\'settings_statusnet_inflated\');">';
- $s .= '<img class="connector'.$css.'" src="images/gnusocial.png" /><h3 class="connector">'. t('GNU Social Import/Export/Mirror').'</h3>';
+ $s .= '<img class="connector' . $css . '" src="images/gnusocial.png" /><h3 class="connector">' . L10n::t('GNU Social Import/Export/Mirror') . '</h3>';
$s .= '</span>';
if ( (!$ckey) && (!$csecret) ) {
* with a little explanation to the user as choice - otherwise
* ignore this option entirely.
*/
- if (! $globalsn == null) {
- $s .= '<h4>' . t('Globally Available GNU Social OAuthKeys') . '</h4>';
- $s .= '<p>'. t("There are preconfigured OAuth key pairs for some GNU Social servers available. If you are using one of them, please use these credentials. If not feel free to connect to any other GNU Social instance \x28see below\x29.") .'</p>';
+ if (!$globalsn == null) {
+ $s .= '<h4>' . L10n::t('Globally Available GNU Social OAuthKeys') . '</h4>';
+ $s .= '<p>' . L10n::t("There are preconfigured OAuth key pairs for some GNU Social servers available. If you are using one of them, please use these credentials. If not feel free to connect to any other GNU Social instance \x28see below\x29.") . '</p>';
$s .= '<div id="statusnet-preconf-wrapper">';
foreach ($globalsn as $asn) {
$s .= '<input type="radio" name="statusnet-preconf-apiurl" value="'. $asn['apiurl'] .'">'. $asn['sitename'] .'<br />';
}
$s .= '<p></p><div class="clear"></div></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
}
- $s .= '<h4>' . t('Provide your own OAuth Credentials') . '</h4>';
- $s .= '<p>'. t('No consumer key pair for GNU Social found. Register your Friendica Account as an desktop client on your GNU Social account, copy the consumer key pair here and enter the API base root.<br />Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited GNU Social installation.') .'</p>';
+ $s .= '<h4>' . L10n::t('Provide your own OAuth Credentials') . '</h4>';
+ $s .= '<p>' . L10n::t('No consumer key pair for GNU Social found. Register your Friendica Account as an desktop client on your GNU Social account, copy the consumer key pair here and enter the API base root.<br />Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited GNU Social installation.') . '</p>';
$s .= '<div id="statusnet-consumer-wrapper">';
- $s .= '<label id="statusnet-consumerkey-label" for="statusnet-consumerkey">'. t('OAuth Consumer Key') .'</label>';
+ $s .= '<label id="statusnet-consumerkey-label" for="statusnet-consumerkey">' . L10n::t('OAuth Consumer Key') . '</label>';
$s .= '<input id="statusnet-consumerkey" type="text" name="statusnet-consumerkey" size="35" /><br />';
$s .= '<div class="clear"></div>';
- $s .= '<label id="statusnet-consumersecret-label" for="statusnet-consumersecret">'. t('OAuth Consumer Secret') .'</label>';
+ $s .= '<label id="statusnet-consumersecret-label" for="statusnet-consumersecret">' . L10n::t('OAuth Consumer Secret') . '</label>';
$s .= '<input id="statusnet-consumersecret" type="text" name="statusnet-consumersecret" size="35" /><br />';
$s .= '<div class="clear"></div>';
- $s .= '<label id="statusnet-baseapi-label" for="statusnet-baseapi">'. t("Base API Path \x28remember the trailing /\x29") .'</label>';
+ $s .= '<label id="statusnet-baseapi-label" for="statusnet-baseapi">' . L10n::t("Base API Path \x28remember the trailing /\x29") . '</label>';
$s .= '<input id="statusnet-baseapi" type="text" name="statusnet-baseapi" size="35" /><br />';
$s .= '<div class="clear"></div>';
- //$s .= '<label id="statusnet-applicationname-label" for="statusnet-applicationname">'.t('GNU Socialapplication name').'</label>';
+ //$s .= '<label id="statusnet-applicationname-label" for="statusnet-applicationname">'.L10n::t('GNU Socialapplication name').'</label>';
//$s .= '<input id="statusnet-applicationname" type="text" name="statusnet-applicationname" size="35" /><br />';
$s .= '<p></p><div class="clear"></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
$s .= '</div>';
} else {
/***
/***
* make some nice form
*/
- $s .= '<p>'. t('To connect to your GNU Social account click the button below to get a security code from GNU Social which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to GNU Social.') .'</p>';
- $s .= '<a href="'.$connection->getAuthorizeURL($token,False).'" target="_statusnet"><img src="addon/statusnet/signinwithstatusnet.png" alt="'. t('Log in with GNU Social') .'"></a>';
+ $s .= '<p>' . L10n::t('To connect to your GNU Social account click the button below to get a security code from GNU Social which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to GNU Social.') . '</p>';
+ $s .= '<a href="' . $connection->getAuthorizeURL($token, False) . '" target="_statusnet"><img src="addon/statusnet/signinwithstatusnet.png" alt="' . L10n::t('Log in with GNU Social') . '"></a>';
$s .= '<div id="statusnet-pin-wrapper">';
- $s .= '<label id="statusnet-pin-label" for="statusnet-pin">'. t('Copy the security code from GNU Social here') .'</label>';
+ $s .= '<label id="statusnet-pin-label" for="statusnet-pin">' . L10n::t('Copy the security code from GNU Social here') . '</label>';
$s .= '<input id="statusnet-pin" type="text" name="statusnet-pin" />';
$s .= '<input id="statusnet-token" type="hidden" name="statusnet-token" value="'.$token.'" />';
$s .= '<input id="statusnet-token2" type="hidden" name="statusnet-token2" value="'.$request_token['oauth_token_secret'].'" />';
$s .= '</div><div class="clear"></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
- $s .= '<h4>'.t('Cancel Connection Process').'</h4>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
+ $s .= '<h4>' . L10n::t('Cancel Connection Process') . '</h4>';
$s .= '<div id="statusnet-cancel-wrapper">';
- $s .= '<p>'.t('Current GNU Social API is').': '.$api.'</p>';
- $s .= '<label id="statusnet-cancel-label" for="statusnet-cancel">'. t('Cancel GNU Social Connection') . '</label>';
+ $s .= '<p>' . L10n::t('Current GNU Social API is') . ': ' . $api . '</p>';
+ $s .= '<label id="statusnet-cancel-label" for="statusnet-cancel">' . L10n::t('Cancel GNU Social Connection') . '</label>';
$s .= '<input id="statusnet-cancel" type="checkbox" name="statusnet-disconnect" value="1" />';
$s .= '</div><div class="clear"></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
} else {
/***
* we have an OAuth key / secret pair for the user
*/
$connection = new StatusNetOAuth($api,$ckey,$csecret,$otoken,$osecret);
$details = $connection->get('account/verify_credentials');
- $s .= '<div id="statusnet-info" ><img id="statusnet-avatar" src="'.$details->profile_image_url.'" /><p id="statusnet-info-block">'. t('Currently connected to: ') .'<a href="'.$details->statusnet_profile_url.'" target="_statusnet">'.$details->screen_name.'</a><br /><em>'.$details->description.'</em></p></div>';
- $s .= '<p>'. t('If enabled all your <strong>public</strong> postings can be posted to the associated GNU Social account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry.') .'</p>';
+ $s .= '<div id="statusnet-info" ><img id="statusnet-avatar" src="' . $details->profile_image_url . '" /><p id="statusnet-info-block">' . L10n::t('Currently connected to: ') . '<a href="' . $details->statusnet_profile_url . '" target="_statusnet">' . $details->screen_name . '</a><br /><em>' . $details->description . '</em></p></div>';
+ $s .= '<p>' . L10n::t('If enabled all your <strong>public</strong> postings can be posted to the associated GNU Social account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry.') . '</p>';
if ($a->user['hidewall']) {
- $s .= '<p>'. t('<strong>Note</strong>: Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to GNU Social will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted.') .'</p>';
+ $s .= '<p>' . L10n::t('<strong>Note</strong>: Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to GNU Social will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted.') . '</p>';
}
$s .= '<div id="statusnet-enable-wrapper">';
- $s .= '<label id="statusnet-enable-label" for="statusnet-checkbox">'. t('Allow posting to GNU Social') .'</label>';
+ $s .= '<label id="statusnet-enable-label" for="statusnet-checkbox">' . L10n::t('Allow posting to GNU Social') . '</label>';
$s .= '<input id="statusnet-checkbox" type="checkbox" name="statusnet-enable" value="1" ' . $checked . '/>';
$s .= '<div class="clear"></div>';
- $s .= '<label id="statusnet-default-label" for="statusnet-default">'. t('Send public postings to GNU Social by default') .'</label>';
+ $s .= '<label id="statusnet-default-label" for="statusnet-default">' . L10n::t('Send public postings to GNU Social by default') . '</label>';
$s .= '<input id="statusnet-default" type="checkbox" name="statusnet-default" value="1" ' . $defchecked . '/>';
$s .= '<div class="clear"></div>';
- $s .= '<label id="statusnet-mirror-label" for="statusnet-mirror">'.t('Mirror all posts from GNU Social that are no replies or repeated messages').'</label>';
- $s .= '<input id="statusnet-mirror" type="checkbox" name="statusnet-mirror" value="1" '. $mirrorchecked . '/>';
+ $s .= '<label id="statusnet-mirror-label" for="statusnet-mirror">' . L10n::t('Mirror all posts from GNU Social that are no replies or repeated messages') . '</label>';
+ $s .= '<input id="statusnet-mirror" type="checkbox" name="statusnet-mirror" value="1" ' . $mirrorchecked . '/>';
$s .= '<div class="clear"></div>';
$s .= '</div>';
- $s .= '<label id="statusnet-import-label" for="statusnet-import">'.t('Import the remote timeline').'</label>';
+ $s .= '<label id="statusnet-import-label" for="statusnet-import">' . L10n::t('Import the remote timeline') . '</label>';
//$s .= '<input id="statusnet-import" type="checkbox" name="statusnet-import" value="1" '. $importchecked . '/>';
$s .= '<select name="statusnet-import" id="statusnet-import" />';
- $s .= '<option value="0" '.$importselected[0].'>'.t("Disabled").'</option>';
- $s .= '<option value="1" '.$importselected[1].'>'.t("Full Timeline").'</option>';
- $s .= '<option value="2" '.$importselected[2].'>'.t("Only Mentions").'</option>';
+ $s .= '<option value="0" ' . $importselected[0] . '>' . L10n::t("Disabled") . '</option>';
+ $s .= '<option value="1" ' . $importselected[1] . '>' . L10n::t("Full Timeline") . '</option>';
+ $s .= '<option value="2" ' . $importselected[2] . '>' . L10n::t("Only Mentions") . '</option>';
$s .= '</select>';
$s .= '<div class="clear"></div>';
-/*
- $s .= '<label id="statusnet-create_user-label" for="statusnet-create_user">'.t('Automatically create contacts').'</label>';
- $s .= '<input id="statusnet-create_user" type="checkbox" name="statusnet-create_user" value="1" '. $create_userchecked . '/>';
- $s .= '<div class="clear"></div>';
-*/
+ /*
+ $s .= '<label id="statusnet-create_user-label" for="statusnet-create_user">'.L10n::t('Automatically create contacts').'</label>';
+ $s .= '<input id="statusnet-create_user" type="checkbox" name="statusnet-create_user" value="1" '. $create_userchecked . '/>';
+ $s .= '<div class="clear"></div>';
+ */
$s .= '<div id="statusnet-disconnect-wrapper">';
- $s .= '<label id="statusnet-disconnect-label" for="statusnet-disconnect">'. t('Clear OAuth configuration') .'</label>';
+ $s .= '<label id="statusnet-disconnect-label" for="statusnet-disconnect">' . L10n::t('Clear OAuth configuration') . '</label>';
$s .= '<input id="statusnet-disconnect" type="checkbox" name="statusnet-disconnect" value="1" />';
$s .= '</div><div class="clear"></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
}
}
$s .= '</div><div class="clear"></div>';
if (statusnet_is_retweet($a, $b['uid'], $b['body']))
return;
- require_once('include/bbcode.php');
- $dent = new StatusNetOAuth($api,$ckey,$csecret,$otoken,$osecret);
+ $dent = new StatusNetOAuth($api, $ckey, $csecret, $otoken, $osecret);
$max_char = $dent->get_maxlength(); // max. length for a dent
set_pconfig($b['uid'], 'statusnet', 'max_char', $max_char);
$tempfile = "";
- require_once("include/plaintext.php");
- require_once("include/network.php");
- $msgarr = plaintext($a, $b, $max_char, true, 7);
+ $msgarr = BBCode::toPlaintext($b, $max_char, true, 7);
$msg = $msgarr["text"];
if (($msg == "") && isset($msgarr["title"]))
- $msg = shortenmsg($msgarr["title"], $max_char - 50);
+ $msg = Plaintext::shorten($msgarr["title"], $max_char - 50);
$image = "";
if (isset($msgarr["url"]) && ($msgarr["type"] != "photo")) {
- if ((strlen($msgarr["url"]) > 20) &&
- ((strlen($msg." \n".$msgarr["url"]) > $max_char)))
- $msg .= " \n".short_link($msgarr["url"]);
- else
- $msg .= " \n".$msgarr["url"];
- } elseif (isset($msgarr["image"]) && ($msgarr["type"] != "video"))
+ $msg .= " \n" . $msgarr["url"];
+ } elseif (isset($msgarr["image"]) && ($msgarr["type"] != "video")) {
$image = $msgarr["image"];
if ($image != "") {
- $img_str = fetch_url($image);
+ $img_str = Network::fetchUrl($image);
$tempfile = tempnam(get_temppath(), "cache");
file_put_contents($tempfile, $img_str);
$postdata = array("status" => $msg, "media[]" => $tempfile);
} else
$postdata = array("status"=>$msg);
- // and now dent it :-)
- if(strlen($msg)) {
-
+ // and now send it :-)
+ if (strlen($msg)) {
if ($iscomment) {
$postdata["in_reply_to_status_id"] = substr($orig_post["uri"], $hostlength);
logger('statusnet_post send reply '.print_r($postdata, true), LOGGER_DEBUG);
}
// New code that is able to post pictures
- require_once("addon/statusnet/codebird.php");
+ require_once __DIR__ . DIRECTORY_SEPARATOR . 'library' . DIRECTORY_SEPARATOR . 'codebirdsn.php';
$cb = \CodebirdSN\CodebirdSN::getInstance();
$cb->setAPIEndpoint($api);
$cb->setConsumerKey($ckey, $csecret);
if ($result->error) {
logger('Send to GNU Social failed: "'.$result->error.'"');
} elseif ($iscomment) {
- logger('statusnet_post: Update extid '.$result->id." for post id ".$b['id']);
- q("UPDATE `item` SET `extid` = '%s', `body` = '%s' WHERE `id` = %d",
- dbesc($hostname."::".$result->id),
- dbesc($result->text),
- intval($b['id'])
- );
+ logger('statusnet_post: Update extid ' . $result->id . " for post id " . $b['id']);
+ Item::update(['extid' => $hostname . "::" . $result->id, 'body' => $result->text], ['id' => $b['id']]);
}
}
if ($tempfile != "")
}
}
-function statusnet_plugin_admin_post(&$a){
+function statusnet_addon_admin_post(App $a)
+{
+ $sites = [];
$sites = array();
}
-function statusnet_plugin_admin(&$a, &$o){
-
- $sites = get_config('statusnet','sites');
- $sitesform=array();
- if (is_array($sites)){
- foreach($sites as $id=>$s){
- $sitesform[] = Array(
- 'sitename' => Array("sitename[$id]", "Site name", $s['sitename'], ""),
- 'apiurl' => Array("apiurl[$id]", "Api url", $s['apiurl'], t("Base API Path \x28remember the trailing /\x29") ),
- 'secret' => Array("secret[$id]", "Secret", $s['consumersecret'], ""),
- 'key' => Array("key[$id]", "Key", $s['consumerkey'], ""),
+function statusnet_addon_admin(App $a, &$o)
+{
+ $sites = Config::get('statusnet', 'sites');
+ $sitesform = [];
+ if (is_array($sites)) {
+ foreach ($sites as $id => $s) {
+ $sitesform[] = [
+ 'sitename' => ["sitename[$id]", "Site name", $s['sitename'], ""],
+ 'apiurl' => ["apiurl[$id]", "Api url", $s['apiurl'], L10n::t("Base API Path \x28remember the trailing /\x29")],
+ 'secret' => ["secret[$id]", "Secret", $s['consumersecret'], ""],
+ 'key' => ["key[$id]", "Key", $s['consumerkey'], ""],
//'applicationname' => Array("applicationname[$id]", "Application name", $s['applicationname'], ""),
'delete' => Array("delete[$id]", "Delete", False , "Check to delete this preset"),
);
}
/* empty form to add new site */
$id++;
- $sitesform[] = Array(
- 'sitename' => Array("sitename[$id]", t("Site name"), "", ""),
- 'apiurl' => Array("apiurl[$id]", "Api url", "", t("Base API Path \x28remember the trailing /\x29") ),
- 'secret' => Array("secret[$id]", t("Consumer Secret"), "", ""),
- 'key' => Array("key[$id]", t("Consumer Key"), "", ""),
- //'applicationname' => Array("applicationname[$id]", t("Application name"), "", ""),
- );
-
- $t = get_markup_template( "admin.tpl", "addon/statusnet/" );
- $o = replace_macros($t, array(
- '$submit' => t('Save Settings'),
+ $sitesform[] = [
+ 'sitename' => ["sitename[$id]", L10n::t("Site name"), "", ""],
+ 'apiurl' => ["apiurl[$id]", "Api url", "", L10n::t("Base API Path \x28remember the trailing /\x29")],
+ 'secret' => ["secret[$id]", L10n::t("Consumer Secret"), "", ""],
+ 'key' => ["key[$id]", L10n::t("Consumer Key"), "", ""],
+ //'applicationname' => Array("applicationname[$id]", L10n::t("Application name"), "", ""),
+ ];
+
+ $t = get_markup_template("admin.tpl", "addon/statusnet/");
+ $o = replace_macros($t, [
+ '$submit' => L10n::t('Save Settings'),
'$sites' => $sitesform,
));
}
if (intval($max_char) == 0)
$max_char = 140;
- require_once("include/plaintext.php");
- $item = $b["item"];
- $item["plink"] = $a->get_baseurl()."/display/".$a->user["nickname"]."/".$item["parent"];
+ $item = $b["item"];
+ $item["plink"] = $a->get_baseurl() . "/display/" . $a->user["nickname"] . "/" . $item["parent"];
$r = q("SELECT `item`.`author-link`, `item`.`uri`, `contact`.`nick` AS contact_nick
FROM `item` INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
$item["body"] = $nickname." ".$item["body"];
}
+ $msgarr = BBCode::toPlaintext($item, $max_char, true, 7);
+ $msg = $msgarr["text"];
$msgarr = plaintext($a, $item, $max_char, true, 7);
$msg = $msgarr["text"];
if ($abandon_days < 1)
$abandon_days = 0;
- $abandon_limit = date("Y-m-d H:i:s", time() - $abandon_days * 86400);
+ $abandon_limit = date(DateTimeFormat::MYSQL, time() - $abandon_days * 86400);
$r = q("SELECT * FROM `pconfig` WHERE `cat` = 'statusnet' AND `k` = 'import' AND `v` ORDER BY RAND()");
if(count($r)) {
`location`, `about`, `writable`, `blocked`, `readonly`, `pending` )
VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', %d, 0, 0, 0 ) ",
intval($uid),
- dbesc(datetime_convert()),
+ dbesc(DateTimeFormat::utcNow()),
dbesc($contact->statusnet_profile_url),
dbesc(normalise_link($contact->statusnet_profile_url)),
dbesc(statusnet_address($contact)),
dbesc($photos[0]),
dbesc($photos[1]),
dbesc($photos[2]),
- dbesc(datetime_convert()),
+ dbesc(DateTimeFormat::utcNow()),
intval($contact_id)
);
} else {
// update profile photos once every two weeks as we have no notification of when they change.
-
- //$update_photo = (($r[0]['avatar-date'] < datetime_convert('','','now -2 days')) ? true : false);
- $update_photo = ($r[0]['avatar-date'] < datetime_convert('','','now -12 hours'));
+ //$update_photo = (($r[0]['avatar-date'] < DateTimeFormat::convert('now -2 days', '', '', )) ? true : false);
+ $update_photo = ($r[0]['avatar-date'] < DateTimeFormat::utc('now -12 hours'));
// check that we have all the photos, this has been known to fail on occasion
dbesc($photos[0]),
dbesc($photos[1]),
dbesc($photos[2]),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
+ dbesc(DateTimeFormat::utcNow()),
+ dbesc(DateTimeFormat::utcNow()),
+ dbesc(DateTimeFormat::utcNow()),
dbesc($contact->statusnet_profile_url),
dbesc(normalise_link($contact->statusnet_profile_url)),
dbesc(statusnet_address($contact)),
$otoken = get_pconfig($uid, 'statusnet', 'oauthtoken');
$osecret = get_pconfig($uid, 'statusnet', 'oauthsecret');
- require_once("addon/statusnet/codebird.php");
+ require_once __DIR__ . DIRECTORY_SEPARATOR . 'library' . DIRECTORY_SEPARATOR . 'codebirdsn.php';
- $cb = \Codebird\Codebird::getInstance();
+ $cb = \CodebirdSN\CodebirdSN::getInstance();
$cb->setConsumerKey($ckey, $csecret);
$cb->setToken($otoken, $osecret);
$postarray['body'] = $converted["body"];
$postarray['tag'] = $converted["tags"];
- $postarray['created'] = datetime_convert('UTC','UTC',$content->created_at);
- $postarray['edited'] = datetime_convert('UTC','UTC',$content->created_at);
+ $postarray['created'] = DateTimeFormat::utc($content->created_at);
+ $postarray['edited'] = DateTimeFormat::utc($content->created_at);
if (is_string($content->place->name))
$postarray["location"] = $content->place->name;
notification(array(
'type' => NOTIFY_COMMENT,
'notify_flags' => $user[0]['notify-flags'],
- 'language' => $user[0]['language'],
- 'to_name' => $user[0]['username'],
- 'to_email' => $user[0]['email'],
- 'uid' => $user[0]['uid'],
- 'item' => $postarray,
- 'link' => $a->get_baseurl().'/display/'.urlencode(get_item_guid($top_item)),
- 'source_name' => $postarray['author-name'],
- 'source_link' => $postarray['author-link'],
+ 'language' => $user[0]['language'],
+ 'to_name' => $user[0]['username'],
+ 'to_email' => $user[0]['email'],
+ 'uid' => $user[0]['uid'],
+ 'item' => $postarray,
+ 'link' => $a->get_baseurl() . '/display/' . urlencode(Item::getGuidById($top_item)),
+ 'source_name' => $postarray['author-name'],
+ 'source_link' => $postarray['author-link'],
'source_photo' => $postarray['author-avatar'],
'verb' => ACTIVITY_POST,
'otype' => 'item',
logger("statusnet_fetchhometimeline: Fetching for user ".$uid, LOGGER_DEBUG);
- require_once('library/twitteroauth.php');
- require_once('include/items.php');
+ require_once 'include/items.php';
$connection = new StatusNetOAuth($api, $ckey,$csecret,$otoken,$osecret);
if (trim($postarray['body']) == "")
continue;
- $item = item_store($postarray);
+ $item = Item::insert($postarray);
$postarray["id"] = $item;
logger('statusnet_fetchhometimeline: User '.$self["nick"].' posted home timeline item '.$item);
if (trim($postarray['body']) != "") {
continue;
- $item = item_store($postarray);
- $postarray["id"] = $item;
+ $item = Item::insert($postarray);
+ $postarray["id"] = $item;
logger('statusnet_fetchhometimeline: User '.$self["nick"].' posted mention timeline item '.$item);
'to_email' => $u[0]['email'],
'uid' => $u[0]['uid'],
'item' => $postarray,
- 'link' => $a->get_baseurl().'/display/'.urlencode(get_item_guid($item)),
+ 'link' => $a->get_baseurl() . '/display/' . urlencode(Item::getGuidById($item)),
'source_name' => $postarray['author-name'],
'source_link' => $postarray['author-link'],
'source_photo' => $postarray['author-avatar'],
$osecret = get_pconfig($uid, 'statusnet', 'oauthsecret');
$own_url = get_pconfig($uid, 'statusnet', 'own_url');
- require_once('library/twitteroauth.php');
-
- $connection = new StatusNetOAuth($api, $ckey,$csecret,$otoken,$osecret);
+ $connection = new StatusNetOAuth($api, $ckey, $csecret, $otoken, $osecret);
$parameters["count"] = 200;
if (is_array($items)) {
$posts = array_reverse($items);
- foreach($posts AS $post) {
+ foreach ($posts as $post) {
$postarray = statusnet_createpost($a, $uid, $post, $self, false, false);
if (trim($postarray['body']) == "")
continue;
- //print_r($postarray);
- $item = item_store($postarray);
+ $item = Item::insert($postarray);
$postarray["id"] = $item;
logger('statusnet_complete_conversation: User '.$self["nick"].' posted home timeline item '.$item);
}
}
-function statusnet_convertmsg($a, $body, $no_tags = false) {
-
- require_once("include/oembed.php");
- require_once("include/items.php");
- require_once("include/network.php");
+function statusnet_convertmsg(App $a, $body, $no_tags = false)
+{
+ require_once "include/items.php";
$body = preg_replace("=\[url\=https?://([0-9]*).([0-9]*).([0-9]*).([0-9]*)/([0-9]*)\](.*?)\[\/url\]=ism","$1.$2.$3.$4/$5",$body);
logger("statusnet_convertmsg: expanding url ".$match[1], LOGGER_DEBUG);
- $expanded_url = original_url($match[1]);
+ $expanded_url = Network::finalUrl($match[1]);
logger("statusnet_convertmsg: fetching data for ".$expanded_url, LOGGER_DEBUG);
$footerlink = "[url=".$expanded_url."]".$expanded_url."[/url]";
$body = str_replace($search, $footerlink, $body);
- } elseif (($oembed_data->type == "photo") && isset($oembed_data->url) && !$dontincludemedia)
- $body = str_replace($search, "[url=".$expanded_url."][img]".$oembed_data->url."[/img][/url]", $body);
- elseif ($oembed_data->type != "link")
- $body = str_replace($search, "[url=".$expanded_url."]".$expanded_url."[/url]", $body);
- else {
- $img_str = fetch_url($expanded_url, true, $redirects, 4);
+ } elseif (($oembed_data->type == "photo") && isset($oembed_data->url) && !$dontincludemedia) {
+ $body = str_replace($search, "[url=" . $expanded_url . "][img]" . $oembed_data->url . "[/img][/url]", $body);
+ } elseif ($oembed_data->type != "link") {
+ $body = str_replace($search, "[url=" . $expanded_url . "]" . $expanded_url . "[/url]", $body);
+ } else {
+ $img_str = Network::fetchUrl($expanded_url, true, $redirects, 4);
$tempfile = tempnam(get_temppath(), "cache");
file_put_contents($tempfile, $img_str);
$contact_id = 0;
if ($own_url == "") {
- require_once('library/twitteroauth.php');
-
- $connection = new StatusNetOAuth($api, $ckey,$csecret,$otoken,$osecret);
+ $connection = new StatusNetOAuth($api, $ckey, $csecret, $otoken, $osecret);
// Fetching user data
$user = $connection->get('account/verify_credentials');
-# ADDON blockem
+# ADDON superblock
# Copyright (C)
-# This file is distributed under the same license as the Friendica blockem addon package.
+# This file is distributed under the same license as the Friendica superblock addon package.
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2017
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:28+0000\n"
+"POT-Creation-Date: 2017-04-21 08:45+0200\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: blockem.php:51
-msgid "\"Blockem\" Settings"
-msgstr "Impostazioni \"Blockem\""
+#: superblock.php:53 superblock.php:57
+msgid "\"Superblock\""
+msgstr "\"Superblocco\""
-#: blockem.php:53
+#: superblock.php:60
msgid "Comma separated profile URLS to block"
msgstr "Lista, separata da virgola, di indirizzi di profili da bloccare"
-#: blockem.php:57
-msgid "Submit"
-msgstr "Invia"
+#: superblock.php:64
+msgid "Save Settings"
+msgstr "Salva Impostazioni"
-#: blockem.php:70
-msgid "BLOCKEM Settings saved."
-msgstr "Impostazioni \"Blockem\" salvate."
+#: superblock.php:76
+msgid "SUPERBLOCK Settings saved."
+msgstr "Impostazioni \"Superblocco\" salvate."
-#: blockem.php:105
-#, php-format
-msgid "Blocked %s - Click to open/close"
-msgstr "%s bloccato - Clicca per aprire/chiudere"
+#: superblock.php:148
+msgid "Block Completely"
+msgstr "Blocca Completamente"
-#: blockem.php:160
-msgid "Unblock Author"
-msgstr "Sblocca autore"
-
-#: blockem.php:162
-msgid "Block Author"
-msgstr "Blocca autore"
-
-#: blockem.php:194
-msgid "blockem settings updated"
-msgstr "Impostazioni 'blockem' aggiornate."
+#: superblock.php:168
+msgid "superblock settings updated"
+msgstr "impostazioni \"superblocco\" aggiornate."
return ($n != 1);;
}}
;
-$a->strings["\"Blockem\" Settings"] = "Impostazioni \"Blockem\"";
+$a->strings["\"Superblock\""] = "\"Superblocco\"";
$a->strings["Comma separated profile URLS to block"] = "Lista, separata da virgola, di indirizzi di profili da bloccare";
-$a->strings["Submit"] = "Invia";
-$a->strings["BLOCKEM Settings saved."] = "Impostazioni \"Blockem\" salvate.";
-$a->strings["Blocked %s - Click to open/close"] = "%s bloccato - Clicca per aprire/chiudere";
-$a->strings["Unblock Author"] = "Sblocca autore";
-$a->strings["Block Author"] = "Blocca autore";
-$a->strings["blockem settings updated"] = "Impostazioni 'blockem' aggiornate.";
+$a->strings["Save Settings"] = "Salva Impostazioni";
+$a->strings["SUPERBLOCK Settings saved."] = "Impostazioni \"Superblocco\" salvate.";
+$a->strings["Block Completely"] = "Blocca Completamente";
+$a->strings["superblock settings updated"] = "impostazioni \"superblocco\" aggiornate.";
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*
*/
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
function superblock_install() {
- register_hook('plugin_settings', 'addon/superblock/superblock.php', 'superblock_addon_settings');
- register_hook('plugin_settings_post', 'addon/superblock/superblock.php', 'superblock_addon_settings_post');
- register_hook('conversation_start', 'addon/superblock/superblock.php', 'superblock_conversation_start');
- register_hook('item_photo_menu', 'addon/superblock/superblock.php', 'superblock_item_photo_menu');
- register_hook('enotify_store', 'addon/superblock/superblock.php', 'superblock_enotify_store');
+ Addon::registerHook('addon_settings', 'addon/superblock/superblock.php', 'superblock_addon_settings');
+ Addon::registerHook('addon_settings_post', 'addon/superblock/superblock.php', 'superblock_addon_settings_post');
+ Addon::registerHook('conversation_start', 'addon/superblock/superblock.php', 'superblock_conversation_start');
+ Addon::registerHook('item_photo_menu', 'addon/superblock/superblock.php', 'superblock_item_photo_menu');
+ Addon::registerHook('enotify_store', 'addon/superblock/superblock.php', 'superblock_enotify_store');
}
function superblock_uninstall() {
- unregister_hook('plugin_settings', 'addon/superblock/superblock.php', 'superblock_addon_settings');
- unregister_hook('plugin_settings_post', 'addon/superblock/superblock.php', 'superblock_addon_settings_post');
- unregister_hook('conversation_start', 'addon/superblock/superblock.php', 'superblock_conversation_start');
- unregister_hook('item_photo_menu', 'addon/superblock/superblock.php', 'superblock_item_photo_menu');
- unregister_hook('enotify_store', 'addon/superblock/superblock.php', 'superblock_enotify_store');
+ Addon::unregisterHook('addon_settings', 'addon/superblock/superblock.php', 'superblock_addon_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/superblock/superblock.php', 'superblock_addon_settings_post');
+ Addon::unregisterHook('conversation_start', 'addon/superblock/superblock.php', 'superblock_conversation_start');
+ Addon::unregisterHook('item_photo_menu', 'addon/superblock/superblock.php', 'superblock_item_photo_menu');
+ Addon::unregisterHook('enotify_store', 'addon/superblock/superblock.php', 'superblock_enotify_store');
}
}
$s .= '<span id="settings_superblock_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_superblock_expanded\'); openClose(\'settings_superblock_inflated\');">';
- $s .= '<h3>' . t('"Superblock"') . '</h3>';
+ $s .= '<h3>' . L10n::t('"Superblock"') . '</h3>';
$s .= '</span>';
$s .= '<div id="settings_superblock_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_superblock_expanded\'); openClose(\'settings_superblock_inflated\');">';
- $s .= '<h3>' . t('"Superblock"') . '</h3>';
+ $s .= '<h3>' . L10n::t('"Superblock"') . '</h3>';
$s .= '</span>';
$s .= '<div id="superblock-wrapper">';
- $s .= '<label id="superblock-label" for="superblock-words">' . t('Comma separated profile URLS to block') . ' </label>';
+ $s .= '<label id="superblock-label" for="superblock-words">' . L10n::t('Comma separated profile URLS to block') . ' </label>';
$s .= '<textarea id="superblock-words" type="text" name="superblock-words" >' . htmlspecialchars($words) . '</textarea>';
$s .= '</div><div class="clear"></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="superblock-submit" name="superblock-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="superblock-submit" name="superblock-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
return;
}
return;
if($_POST['superblock-submit']) {
- set_pconfig(local_user(),'system','blocked',trim($_POST['superblock-words']));
- info( t('SUPERBLOCK Settings saved.') . EOL);
+ PConfig::set(local_user(),'system','blocked',trim($_POST['superblock-words']));
+ info(L10n::t('SUPERBLOCK Settings saved.') . EOL);
}
}
}
}
- $b['menu'][ t('Block Completely')] = 'javascript:superblockBlock(\'' . $author . '\'); return false;';
+ $b['menu'][L10n::t('Block Completely')] = 'javascript:superblockBlock(\'' . $author . '\'); return false;';
}
function superblock_module() {}
$words .= trim($_GET['block']);
}
- set_pconfig(local_user(),'system','blocked',$words);
- info( t('superblock settings updated') . EOL );
+ PConfig::set(local_user(),'system','blocked',$words);
+ info(L10n::t('superblock settings updated') . EOL );
killme();
}
=========
-Testdrive is a Friendica plugin which implements automatic account expiration so that a site may be used as a public
+Testdrive is a Friendica addon which implements automatic account expiration so that a site may be used as a public
test bed.
When an account is created on the site, it is given a hard expiration date of
$a->config['testdrive']['expiredays'] = 30;
Set this in your .htconfig.php file to allow a 30 day test drive period. By default no expiration period is defined
-in case the plugin is activated accidentally.
+in case the addon is activated accidentally.
-There is no opportunity to extend an expired account using this plugin. Expiration is final. Other plugins may be created
-which charge for service and extend the expiration as long as a balance is maintained. This plugin is purely for creating
+There is no opportunity to extend an expired account using this addon. Expiration is final. Other addons may be created
+which charge for service and extend the expiration as long as a balance is maintained. This addon is purely for creating
a limited use test site.
An email warning will be sent out approximately five days before the expiration occurs. Once it occurs logins and many
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-08-23 17:30+0200\n"
-"PO-Revision-Date: 2015-08-31 10:28+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
<?php
-
/**
* Name: testdrive
- * Description: Sample Friendica plugin/addon for creating a test drive Friendica site with automatic account expiration.
+ * Description: Sample Friendica addon for creating a test drive Friendica site with automatic account expiration.
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*/
-
-
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Model\User;
+use Friendica\Util\DateTimeFormat;
function testdrive_install() {
- register_hook('register_account', 'addon/testdrive/testdrive.php', 'testdrive_register_account');
- register_hook('cron', 'addon/testdrive/testdrive.php', 'testdrive_cron');
- register_hook('enotify','addon/testdrive/testdrive.php', 'testdrive_enotify');
- register_hook('globaldir_update','addon/testdrive/testdrive.php', 'testdrive_globaldir_update');
+ Addon::registerHook('register_account', 'addon/testdrive/testdrive.php', 'testdrive_register_account');
+ Addon::registerHook('cron', 'addon/testdrive/testdrive.php', 'testdrive_cron');
+ Addon::registerHook('enotify','addon/testdrive/testdrive.php', 'testdrive_enotify');
+ Addon::registerHook('globaldir_update','addon/testdrive/testdrive.php', 'testdrive_globaldir_update');
}
function testdrive_uninstall() {
- unregister_hook('register_account', 'addon/testdrive/testdrive.php', 'testdrive_register_account');
- unregister_hook('cron', 'addon/testdrive/testdrive.php', 'testdrive_cron');
- unregister_hook('enotify','addon/testdrive/testdrive.php', 'testdrive_enotify');
- unregister_hook('globaldir_update','addon/testdrive/testdrive.php', 'testdrive_globaldir_update');
+ Addon::unregisterHook('register_account', 'addon/testdrive/testdrive.php', 'testdrive_register_account');
+ Addon::unregisterHook('cron', 'addon/testdrive/testdrive.php', 'testdrive_cron');
+ Addon::unregisterHook('enotify','addon/testdrive/testdrive.php', 'testdrive_enotify');
+ Addon::unregisterHook('globaldir_update','addon/testdrive/testdrive.php', 'testdrive_globaldir_update');
}
return;
$r = q("UPDATE user set account_expires_on = '%s' where uid = %d",
- dbesc(datetime_convert('UTC','UTC','now +' . $days . ' days')),
+ dbesc(DateTimeFormat::convert('now +' . $days . ' days')),
intval($uid)
);
'language' => $rr['language'],
'to_name' => $rr['username'],
'to_email' => $rr['email'],
- 'source_name' => t('Administrator'),
+ 'source_name' => L10n::t('Administrator'),
'source_link' => $a->get_baseurl(),
'source_photo' => $a->get_baseurl() . '/images/person-80.jpg',
));
q("update user set expire_notification_sent = '%s' where uid = %d",
- dbesc(datetime_convert()),
+ dbesc(DateTimeFormat::utcNow()),
intval($rr['uid'])
);
if (x($b, 'params') && $b['params']['type'] == NOTIFY_SYSTEM
&& x($b['params'], 'system_type') && $b['params']['system_type'] === 'testdrive_expire') {
$b['itemlink'] = $a->get_baseurl();
- $b['epreamble'] = $b['preamble'] = sprintf( t('Your account on %s will expire in a few days.'), get_config('system','sitename'));
- $b['subject'] = t('Your Friendica test account is about to expire.');
- $b['body'] = sprintf( t("Hi %1\$s,\n\nYour test account on %2\$s will expire in less than five days. We hope you enjoyed this test drive and use this opportunity to find a permanent Friendica website for your integrated social communications. A list of public sites is available at %s/siteinfo - and for more information on setting up your own Friendica server please see the Friendica project website at http://friendica.com."), $b['params']['to_name'], "[url=".$app->config["system"]["url"]."]".$app->config["sitename"]."[/url]", get_server());
+ $b['epreamble'] = $b['preamble'] = L10n::t('Your account on %s will expire in a few days.', Config::get('system', 'sitename'));
+ $b['subject'] = L10n::t('Your Friendica test account is about to expire.');
+ $b['body'] = L10n::t("Hi %1\$s,\n\nYour test account on %2\$s will expire in less than five days. We hope you enjoyed this test drive and use this opportunity to find a permanent Friendica website for your integrated social communications. A list of public sites is available at %s/siteinfo - and for more information on setting up your own Friendica server please see the Friendica project website at http://friendica.com.", $b['params']['to_name'], "[url=".$app->config["system"]["url"]."]".$app->config["sitename"]."[/url]", get_server());
}
}
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2014-09-10 14:43+0000\n"
+"PO-Revision-Date: 2017-09-20 06:09+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*/
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
function tictac_install() {
- register_hook('app_menu', 'addon/tictac/tictac.php', 'tictac_app_menu');
+ Addon::registerHook('app_menu', 'addon/tictac/tictac.php', 'tictac_app_menu');
}
function tictac_uninstall() {
- unregister_hook('app_menu', 'addon/tictac/tictac.php', 'tictac_app_menu');
+ Addon::unregisterHook('app_menu', 'addon/tictac/tictac.php', 'tictac_app_menu');
}
function tictac_app_menu($a,&$b) {
- $b['app_menu'][] = '<div class="app-title"><a href="tictac">' . t('Three Dimensional Tic-Tac-Toe') . '</a></div>';
+ $b['app_menu'][] = '<div class="app-title"><a href="tictac">' . L10n::t('Three Dimensional Tic-Tac-Toe') . '</a></div>';
}
$dimen = 3;
}
- $o .= '<h3>' . t('3D Tic-Tac-Toe') . '</h3><br />';
+ $o .= '<h3>' . L10n::t('3D Tic-Tac-Toe') . '</h3><br />';
$t = new tictac($dimen,$handicap,$mefirst,$yours,$mine);
$o .= $t->play();
- $o .= '<a href="tictac">' . t('New game') . '</a><br />';
- $o .= '<a href="tictac/1">' . t('New game with handicap') . '</a><br />';
- $o .= '<p>' . t('Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. ');
- $o .= t('In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels.');
- $o .= '</p><p>';
- $o .= t('The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage.');
+ $o .= '<a href="tictac">' . L10n::t('New game') . '</a><br />';
+ $o .= '<a href="tictac/1">' . L10n::t('New game with handicap') . '</a><br />';
+ $o .= '<p>' . L10n::t('Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. ');
+ $o .= L10n::t('In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels.');
+ $o .= '</p><p>';
+ $o .= L10n::t('The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage.');
$o .= '</p>';
return $o;
if($this->first_move) {
if(rand(0,1) == 1) {
- $o .= '<div class="error-message">' . t('You go first...') . '</div><br />';
+ $o .= '<div class="error-message">' . L10n::t('You go first...') . '</div><br />';
$this->mefirst = 0;
$o .= $this->draw_board();
return $o;
}
- $o .= '<div class="error-message">' . t('I\'m going first this time...') . ' </div><br />';
+ $o .= '<div class="error-message">' . L10n::t('I\'m going first this time...') . ' </div><br />';
$this->mefirst = 1;
}
if($this->check_youwin()) {
- $o .= '<div class="error-message">' . t('You won!') . '</div><br />';
+ $o .= '<div class="error-message">' . L10n::t('You won!') . '</div><br />';
$o .= $this->draw_board();
return $o;
}
if($this->fullboard())
- $o .= '<div class="error-message">' . t('"Cat" game!') . '</div><br />';
+ $o .= '<div class="error-message">' . L10n::t('"Cat" game!') . '</div><br />';
$move = $this->winning_move();
if(strlen($move)) {
}
if($this->check_iwon())
- $o .= '<div class="error-message">' . t('I won!') . '</div><br />';
+ $o .= '<div class="error-message">' . L10n::t('I won!') . '</div><br />';
if($this->fullboard())
- $o .= '<div class="error-message">' . t('"Cat" game!') . '</div><br />';
+ $o .= '<div class="error-message">' . L10n::t('"Cat" game!') . '</div><br />';
$o .= $this->draw_board();
return $o;
}
[Register](http://www.tumblr.com/oauth/apps) an application and use (your server name)/addon/tumblr/callback.php as
callback URL
-After the registration please enter the values for "Consumer Key" and "Consumer Secret" in the [administration](admin/plugins/tumblr).
+After the registration please enter the values for "Consumer Key" and "Consumer Secret" in the [administration](admin/addons/tumblr).
Notice
------
msgstr ""
#: tumblr.php:192
-msgid "Enable Tumblr Post Plugin"
+msgid "Enable Tumblr Post Addon"
msgstr ""
#: tumblr.php:197
$a->strings["Post to Tumblr"] = "Publica-ho al Tumblr";\r
$a->strings["Tumblr Post Settings"] = "Configuració d'Enviaments de Tumblr";\r
$a->strings["(Re-)Authenticate your tumblr page"] = "";\r
-$a->strings["Enable Tumblr Post Plugin"] = "Habilita el plugin de enviaments de Tumblr";\r
+$a->strings["Enable Tumblr Post Addon"] = "Habilita el addon de enviaments de Tumblr";\r
$a->strings["Post to Tumblr by default"] = "Enviar a Tumblr per defecte";\r
$a->strings["Post to page:"] = "";\r
$a->strings["You are not authenticated to tumblr"] = "";\r
msgstr "(Znovu) přihlásit k Vaší tumblr stránce"
#: tumblr.php:198
-msgid "Enable Tumblr Post Plugin"
+msgid "Enable Tumblr Post Addon"
msgstr "Povolit rozšíření Tumbir"
#: tumblr.php:203
$a->strings["Post to Tumblr"] = "Příspěvek na Tumbir";
$a->strings["Tumblr Export"] = "Tumbir export";
$a->strings["(Re-)Authenticate your tumblr page"] = "(Znovu) přihlásit k Vaší tumblr stránce";
-$a->strings["Enable Tumblr Post Plugin"] = "Povolit rozšíření Tumbir";
+$a->strings["Enable Tumblr Post Addon"] = "Povolit rozšíření Tumbir";
$a->strings["Post to Tumblr by default"] = "Standardně posílat příspěvky na Tumbir";
$a->strings["Post to page:"] = "Příspěvek ke stránce:";
$a->strings["You are not authenticated to tumblr"] = "Nyní nejste přihlášen k tumblr.";
msgstr "(Re-)Authentifizierung deiner tumblr Seite"
#: tumblr.php:192
-msgid "Enable Tumblr Post Plugin"
-msgstr "Tumblr-Post-Plugin aktivieren"
+msgid "Enable Tumblr Post Addon"
+msgstr "Tumblr-Post-Addon aktivieren"
#: tumblr.php:197
msgid "Post to Tumblr by default"
$a->strings["Post to Tumblr"] = "Auf Tumblr veröffentlichen";
$a->strings["Tumblr Post Settings"] = "Tumblr-Beitragseinstellungen";
$a->strings["(Re-)Authenticate your tumblr page"] = "(Re-)Authentifizierung deiner tumblr Seite";
-$a->strings["Enable Tumblr Post Plugin"] = "Tumblr-Post-Plugin aktivieren";
+$a->strings["Enable Tumblr Post Addon"] = "Tumblr-Post-Addon aktivieren";
$a->strings["Post to Tumblr by default"] = "Standardmäßig bei Tumblr veröffentlichen";
$a->strings["Post to page:"] = "Auf tumblr veröffentlichen";
$a->strings["You are not authenticated to tumblr"] = "Du bist gegenüber tumblr nicht authentifiziert";
$a->strings["Permission denied."] = "Malpermesita.";\r
$a->strings["Post to Tumblr"] = "Afiŝi al Tumblr";\r
$a->strings["Tumblr Post Settings"] = "Agordoj pri afiŝoj ĉe Tumblr";\r
-$a->strings["Enable Tumblr Post Plugin"] = "Ŝalti la kromprogramon por Tumblr afiŝoj";\r
+$a->strings["Enable Tumblr Post Addon"] = "Ŝalti la kromprogramon por Tumblr afiŝoj";\r
$a->strings["Post to Tumblr by default"] = "Defaŭlte afiŝi ĉe Tumblr";\r
$a->strings["Submit"] = "Sendi";\r
msgstr "(Re-)autenticar su página de tumblr"
#: tumblr.php:192
-msgid "Enable Tumblr Post Plugin"
-msgstr "Habilite el plugin Tumblr Post"
+msgid "Enable Tumblr Post Addon"
+msgstr "Habilite el addon Tumblr Post"
#: tumblr.php:197
msgid "Post to Tumblr by default"
$a->strings["Post to Tumblr"] = "Publicar en Tumblr";
$a->strings["Tumblr Post Settings"] = "Ajustes de publicación de Tumblr";
$a->strings["(Re-)Authenticate your tumblr page"] = "(Re-)autenticar su página de tumblr";
-$a->strings["Enable Tumblr Post Plugin"] = "Habilite el plugin Tumblr Post";
+$a->strings["Enable Tumblr Post Addon"] = "Habilite el addon Tumblr Post";
$a->strings["Post to Tumblr by default"] = "Publique en Tumblr por defecto";
$a->strings["Post to page:"] = "Publicar en página:";
$a->strings["You are not authenticated to tumblr"] = "No está autenticado en tumblr";
$a->strings["Permission denied."] = "Permission refusée.";\r
$a->strings["Post to Tumblr"] = "Publier sur Tumblr";\r
$a->strings["Tumblr Post Settings"] = "Réglages de Tumblr";\r
-$a->strings["Enable Tumblr Post Plugin"] = "Activer l'extension Tumblr";\r
+$a->strings["Enable Tumblr Post Addon"] = "Activer l'extension Tumblr";\r
$a->strings["Post to Tumblr by default"] = "Publier sur Tumblr par défaut";\r
$a->strings["Submit"] = "Envoyer";\r
$a->strings["Permission denied."] = "Heimild ekki veitt.";\r
$a->strings["Post to Tumblr"] = "Senda fæslu til Tumblr";\r
$a->strings["Tumblr Post Settings"] = "Tumblr færslu stillingar";\r
-$a->strings["Enable Tumblr Post Plugin"] = "Leyfa Tumblr færslu viðbót";\r
+$a->strings["Enable Tumblr Post Addon"] = "Leyfa Tumblr færslu viðbót";\r
$a->strings["Post to Tumblr by default"] = "Senda færslu á Tumblr sjálfvirkt";\r
$a->strings["Submit"] = "Senda inn";\r
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:28+0000\n"
+"PO-Revision-Date: 2018-03-19 13:25+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
msgstr "(Ri)Autenticati con la tua pagina Tumblr"
#: tumblr.php:192
-msgid "Enable Tumblr Post Plugin"
-msgstr "Abilita Plugin Tumblr"
+msgid "Enable Tumblr Post Addon"
+msgstr "Abilita componente aggiuntivo di invio a Tumblr"
#: tumblr.php:197
msgid "Post to Tumblr by default"
$a->strings["Post to Tumblr"] = "Invia a Tumblr";
$a->strings["Tumblr Post Settings"] = "Impostazioni di invio a Tumblr";
$a->strings["(Re-)Authenticate your tumblr page"] = "(Ri)Autenticati con la tua pagina Tumblr";
-$a->strings["Enable Tumblr Post Plugin"] = "Abilita Plugin Tumblr";
+$a->strings["Enable Tumblr Post Addon"] = "Abilita componente aggiuntivo di invio a Tumblr";
$a->strings["Post to Tumblr by default"] = "Invia sempre a Tumblr";
$a->strings["Post to page:"] = "Invia alla pagina:";
$a->strings["You are not authenticated to tumblr"] = "Non sei autenticato su Tumblr";
$a->strings["Permission denied."] = "Ingen tilgang.";\r
$a->strings["Post to Tumblr"] = "";\r
$a->strings["Tumblr Post Settings"] = "";\r
-$a->strings["Enable Tumblr Post Plugin"] = "";\r
+$a->strings["Enable Tumblr Post Addon"] = "";\r
$a->strings["Post to Tumblr by default"] = "";\r
$a->strings["Submit"] = "Lagre";\r
$a->strings["Post to Tumblr"] = "Opublikuj na Tumblrze";\r
$a->strings["Tumblr Post Settings"] = "Ustawienia postu Tumblr";\r
$a->strings["(Re-)Authenticate your tumblr page"] = "";\r
-$a->strings["Enable Tumblr Post Plugin"] = "Zezwól na wtyczkę postu Tumblr";\r
+$a->strings["Enable Tumblr Post Addon"] = "Zezwól na wtyczkę postu Tumblr";\r
$a->strings["Post to Tumblr by default"] = "Post do Tumblr przez standard";\r
$a->strings["Post to page:"] = "Napisz na stronę:";\r
$a->strings["You are not authenticated to tumblr"] = "";\r
msgstr "(Re)autenticar sua página no Tumblr"
#: tumblr.php:192
-msgid "Enable Tumblr Post Plugin"
+msgid "Enable Tumblr Post Addon"
msgstr "Habilitar plug-in para publicar no Tumblr"
#: tumblr.php:197
$a->strings["Post to Tumblr"] = "Publicar no Tumblr";
$a->strings["Tumblr Post Settings"] = "Configurações de publicação no Tumblr";
$a->strings["(Re-)Authenticate your tumblr page"] = "(Re)autenticar sua página no Tumblr";
-$a->strings["Enable Tumblr Post Plugin"] = "Habilitar plug-in para publicar no Tumblr";
+$a->strings["Enable Tumblr Post Addon"] = "Habilitar plug-in para publicar no Tumblr";
$a->strings["Post to Tumblr by default"] = "Publicar no Tumblr por padrão";
$a->strings["Post to page:"] = "Publicar na página:";
$a->strings["You are not authenticated to tumblr"] = "Você não se autenticou no Tumblr";
msgstr "(Re- )Autentificare pagină tumblr "
#: tumblr.php:198
-msgid "Enable Tumblr Post Plugin"
+msgid "Enable Tumblr Post Addon"
msgstr "Activare Modul Postare pe Tumblr "
#: tumblr.php:203
$a->strings["Post to Tumblr"] = "Postați pe Tumblr";
$a->strings["Tumblr Export"] = "Export Tumblr";
$a->strings["(Re-)Authenticate your tumblr page"] = "(Re- )Autentificare pagină tumblr ";
-$a->strings["Enable Tumblr Post Plugin"] = "Activare Modul Postare pe Tumblr ";
+$a->strings["Enable Tumblr Post Addon"] = "Activare Modul Postare pe Tumblr ";
$a->strings["Post to Tumblr by default"] = "Postați implicit pe Tumblr";
$a->strings["Post to page:"] = "Postare pe pagina:";
$a->strings["You are not authenticated to tumblr"] = "Nu sunteți autentificat pe tumblr.";
$a->strings["Permission denied."] = "Нет разрешения.";\r
$a->strings["Post to Tumblr"] = "Написать в Tumblr";\r
$a->strings["Tumblr Post Settings"] = "Tumblr Настройки сообщения";\r
-$a->strings["Enable Tumblr Post Plugin"] = "Включить Tumblr плагин сообщений";\r
+$a->strings["Enable Tumblr Post Addon"] = "Включить Tumblr плагин сообщений";\r
$a->strings["Post to Tumblr by default"] = "Сообщение Tumblr по умолчанию";\r
$a->strings["Submit"] = "Подтвердить";\r
$a->strings["Post to Tumblr"] = "发送到Tumblr";\r
$a->strings["Tumblr Post Settings"] = "Tumblr发送设置";\r
$a->strings["(Re-)Authenticate your tumblr page"] = "再认证您的tumblr页";\r
-$a->strings["Enable Tumblr Post Plugin"] = "使Tumblr发送插件能够";\r
+$a->strings["Enable Tumblr Post Addon"] = "使Tumblr发送插件能够";\r
$a->strings["Post to Tumblr by default"] = "默认地给Tumblr发送";\r
$a->strings["Post to page:"] = "放在页:";\r
$a->strings["You are not authenticated to tumblr"] = "tumblr没证明您是真的";\r
--- /dev/null
+<?php
+
+/*
+ * Abraham Williams (abraham@abrah.am) http://abrah.am
+ *
+ * The first PHP Library to support OAuth for Tumblr's REST API. (Originally for Twitter, modified for Tumblr by Lucas)
+ */
+
+/**
+ * Tumblr OAuth class
+ */
+class TumblrOAuth {
+ /* Contains the last HTTP status code returned. */
+ public $http_code;
+ /* Contains the last API call. */
+ public $url;
+ /* Set up the API root URL. */
+ public $host = "http://api.tumblr.com/v2/";
+ /* Set timeout default. */
+ public $timeout = 30;
+ /* Set connect timeout. */
+ public $connecttimeout = 30;
+ /* Verify SSL Cert. */
+ public $ssl_verifypeer = FALSE;
+ /* Respons format. */
+ public $format = 'json';
+ /* Decode returned json data. */
+ public $decode_json = TRUE;
+ /* Contains the last HTTP headers returned. */
+ public $http_info;
+ /* Set the useragnet. */
+ public $useragent = 'TumblrOAuth v0.2.0-beta2';
+ /* Immediately retry the API call if the response was not successful. */
+ //public $retry = TRUE;
+
+
+
+
+ /**
+ * Set API URLS
+ */
+ function accessTokenURL() { return 'http://www.tumblr.com/oauth/access_token'; }
+ function authenticateURL() { return 'http://www.tumblr.com/oauth/authorize'; }
+ function authorizeURL() { return 'http://www.tumblr.com/oauth/authorize'; }
+ function requestTokenURL() { return 'http://www.tumblr.com/oauth/request_token'; }
+
+ /**
+ * Debug helpers
+ */
+ function lastStatusCode() { return $this->http_status; }
+ function lastAPICall() { return $this->last_api_call; }
+
+ /**
+ * construct TumblrOAuth object
+ */
+ function __construct($consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL) {
+ $this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1();
+ $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret);
+ if (!empty($oauth_token) && !empty($oauth_token_secret)) {
+ $this->token = new OAuthConsumer($oauth_token, $oauth_token_secret);
+ } else {
+ $this->token = NULL;
+ }
+ }
+
+
+ /**
+ * Get a request_token from Tumblr
+ *
+ * @returns a key/value array containing oauth_token and oauth_token_secret
+ */
+ function getRequestToken($oauth_callback = NULL) {
+ $parameters = array();
+ if (!empty($oauth_callback)) {
+ $parameters['oauth_callback'] = $oauth_callback;
+ }
+ $request = $this->oAuthRequest($this->requestTokenURL(), 'GET', $parameters);
+ $token = OAuthUtil::parse_parameters($request);
+ $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
+ return $token;
+ }
+
+ /**
+ * Get the authorize URL
+ *
+ * @returns a string
+ */
+ function getAuthorizeURL($token, $sign_in_with_tumblr = TRUE) {
+ if (is_array($token)) {
+ $token = $token['oauth_token'];
+ }
+ if (empty($sign_in_with_tumblr)) {
+ return $this->authorizeURL() . "?oauth_token={$token}";
+ } else {
+ return $this->authenticateURL() . "?oauth_token={$token}";
+ }
+ }
+
+ /**
+ * Exchange request token and secret for an access token and
+ * secret, to sign API calls.
+ *
+ * @returns array("oauth_token" => "the-access-token",
+ * "oauth_token_secret" => "the-access-secret",
+ * "user_id" => "9436992",
+ * "screen_name" => "abraham")
+ */
+ function getAccessToken($oauth_verifier = FALSE) {
+ $parameters = array();
+ if (!empty($oauth_verifier)) {
+ $parameters['oauth_verifier'] = $oauth_verifier;
+ }
+ $request = $this->oAuthRequest($this->accessTokenURL(), 'GET', $parameters);
+ $token = OAuthUtil::parse_parameters($request);
+ $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
+ return $token;
+ }
+
+ /**
+ * One time exchange of username and password for access token and secret.
+ *
+ * @returns array("oauth_token" => "the-access-token",
+ * "oauth_token_secret" => "the-access-secret",
+ * "user_id" => "9436992",
+ * "screen_name" => "abraham",
+ * "x_auth_expires" => "0")
+ */
+ function getXAuthToken($username, $password) {
+ $parameters = array();
+ $parameters['x_auth_username'] = $username;
+ $parameters['x_auth_password'] = $password;
+ $parameters['x_auth_mode'] = 'client_auth';
+ $request = $this->oAuthRequest($this->accessTokenURL(), 'POST', $parameters);
+ $token = OAuthUtil::parse_parameters($request);
+ $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
+ return $token;
+ }
+
+ /**
+ * GET wrapper for oAuthRequest.
+ */
+ function get($url, $parameters = array()) {
+ $response = $this->oAuthRequest($url, 'GET', $parameters);
+ if ($this->format === 'json' && $this->decode_json) {
+ return json_decode($response);
+ }
+ return $response;
+ }
+
+ /**
+ * POST wrapper for oAuthRequest.
+ */
+ function post($url, $parameters = array()) {
+ $response = $this->oAuthRequest($url, 'POST', $parameters);
+ if ($this->format === 'json' && $this->decode_json) {
+ return json_decode($response);
+ }
+ return $response;
+ }
+
+ /**
+ * DELETE wrapper for oAuthReqeust.
+ */
+ function delete($url, $parameters = array()) {
+ $response = $this->oAuthRequest($url, 'DELETE', $parameters);
+ if ($this->format === 'json' && $this->decode_json) {
+ return json_decode($response);
+ }
+ return $response;
+ }
+
+ /**
+ * Format and sign an OAuth / API request
+ */
+ function oAuthRequest($url, $method, $parameters) {
+ if (strrpos($url, 'https://') !== 0 && strrpos($url, 'http://') !== 0) {
+ $url = "{$this->host}{$url}";
+ }
+ $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters);
+ $request->sign_request($this->sha1_method, $this->consumer, $this->token);
+ switch ($method) {
+ case 'GET':
+ return $this->http($request->to_url(), 'GET');
+ default:
+ return $this->http($request->get_normalized_http_url(), $method, $request->to_postdata());
+ }
+ }
+
+ /**
+ * Make an HTTP request
+ *
+ * @return API results
+ */
+ function http($url, $method, $postfields = NULL) {
+ $this->http_info = array();
+ $ci = curl_init();
+ /* Curl settings */
+ curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);
+ curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
+ curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
+ curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
+ curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));
+ curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
+ curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));
+ curl_setopt($ci, CURLOPT_HEADER, FALSE);
+
+ switch ($method) {
+ case 'POST':
+ curl_setopt($ci, CURLOPT_POST, TRUE);
+ if (!empty($postfields)) {
+ curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
+ }
+ break;
+ case 'DELETE':
+ curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
+ if (!empty($postfields)) {
+ $url = "{$url}?{$postfields}";
+ }
+ }
+
+ curl_setopt($ci, CURLOPT_URL, $url);
+ $response = curl_exec($ci);
+ $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
+ $this->http_info = array_merge($this->http_info, curl_getinfo($ci));
+ $this->url = $url;
+ curl_close ($ci);
+ return $response;
+ }
+
+ /**
+ * Get the header info to store.
+ */
+ function getHeader($ch, $header) {
+ $i = strpos($header, ':');
+ if (!empty($i)) {
+ $key = str_replace('-', '_', strtolower(substr($header, 0, $i)));
+ $value = trim(substr($header, $i + 2));
+ $this->http_header[$key] = $value;
+ }
+ return strlen($header);
+ }
+}
<?php
-
/**
* Name: Tumblr Post Connector
* Description: Post to Tumblr
* Author: Michael Vogel <https://pirati.ca/profile/heluecht>
*/
-require_once('library/OAuth1.php');
-require_once('addon/tumblr/tumblroauth/tumblroauth.php');
+require_once __DIR__ . DIRECTORY_SEPARATOR . 'library' . DIRECTORY_SEPARATOR . 'tumblroauth.php';
+
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
function tumblr_install() {
- register_hook('post_local', 'addon/tumblr/tumblr.php', 'tumblr_post_local');
- register_hook('notifier_normal', 'addon/tumblr/tumblr.php', 'tumblr_send');
- register_hook('jot_networks', 'addon/tumblr/tumblr.php', 'tumblr_jot_nets');
- register_hook('connector_settings', 'addon/tumblr/tumblr.php', 'tumblr_settings');
- register_hook('connector_settings_post', 'addon/tumblr/tumblr.php', 'tumblr_settings_post');
+ Addon::registerHook('post_local', 'addon/tumblr/tumblr.php', 'tumblr_post_local');
+ Addon::registerHook('notifier_normal', 'addon/tumblr/tumblr.php', 'tumblr_send');
+ Addon::registerHook('jot_networks', 'addon/tumblr/tumblr.php', 'tumblr_jot_nets');
+ Addon::registerHook('connector_settings', 'addon/tumblr/tumblr.php', 'tumblr_settings');
+ Addon::registerHook('connector_settings_post', 'addon/tumblr/tumblr.php', 'tumblr_settings_post');
}
function tumblr_uninstall() {
- unregister_hook('post_local', 'addon/tumblr/tumblr.php', 'tumblr_post_local');
- unregister_hook('notifier_normal', 'addon/tumblr/tumblr.php', 'tumblr_send');
- unregister_hook('jot_networks', 'addon/tumblr/tumblr.php', 'tumblr_jot_nets');
- unregister_hook('connector_settings', 'addon/tumblr/tumblr.php', 'tumblr_settings');
- unregister_hook('connector_settings_post', 'addon/tumblr/tumblr.php', 'tumblr_settings_post');
+ Addon::unregisterHook('post_local', 'addon/tumblr/tumblr.php', 'tumblr_post_local');
+ Addon::unregisterHook('notifier_normal', 'addon/tumblr/tumblr.php', 'tumblr_send');
+ Addon::unregisterHook('jot_networks', 'addon/tumblr/tumblr.php', 'tumblr_jot_nets');
+ Addon::unregisterHook('connector_settings', 'addon/tumblr/tumblr.php', 'tumblr_settings');
+ Addon::unregisterHook('connector_settings_post', 'addon/tumblr/tumblr.php', 'tumblr_settings_post');
}
function tumblr_module() {}
function tumblr_content(&$a) {
if(! local_user()) {
- notice( t('Permission denied.') . EOL);
+ notice(L10n::t('Permission denied.') . EOL);
return '';
}
return $o;
}
-function tumblr_plugin_admin(&$a, &$o){
+function tumblr_addon_admin(&$a, &$o){
$t = get_markup_template( "admin.tpl", "addon/tumblr/" );
- $o = replace_macros($t, array(
- '$submit' => t('Save Settings'),
+ $o = replace_macros($t, [
+ '$submit' => L10n::t('Save Settings'),
// name, label, value, help, [extra values]
- '$consumer_key' => array('consumer_key', t('Consumer Key'), get_config('tumblr', 'consumer_key' ), ''),
- '$consumer_secret' => array('consumer_secret', t('Consumer Secret'), get_config('tumblr', 'consumer_secret' ), ''),
- ));
+ '$consumer_key' => ['consumer_key', L10n::t('Consumer Key'), Config::get('tumblr', 'consumer_key' ), ''],
+ '$consumer_secret' => ['consumer_secret', L10n::t('Consumer Secret'), Config::get('tumblr', 'consumer_secret' ), ''],
+ ]);
}
-function tumblr_plugin_admin_post(&$a){
+function tumblr_addon_admin_post(&$a){
$consumer_key = ((x($_POST,'consumer_key')) ? notags(trim($_POST['consumer_key'])) : '');
$consumer_secret = ((x($_POST,'consumer_secret')) ? notags(trim($_POST['consumer_secret'])): '');
- set_config('tumblr','consumer_key',$consumer_key);
- set_config('tumblr','consumer_secret',$consumer_secret);
- info( t('Settings updated.'). EOL );
+ Config::set('tumblr','consumer_key',$consumer_key);
+ Config::set('tumblr','consumer_secret',$consumer_secret);
+ info(L10n::t('Settings updated.'). EOL);
}
function tumblr_connect($a) {
set_pconfig(local_user(), "tumblr", "oauth_token", $access_token['oauth_token']);
set_pconfig(local_user(), "tumblr", "oauth_token_secret", $access_token['oauth_token_secret']);
- $o = t("You are now authenticated to tumblr.");
- $o .= '<br /><a href="'.$a->get_baseurl().'/settings/connectors">'.t("return to the connector page").'</a>';
+ $o = L10n::t("You are now authenticated to tumblr.");
+ $o .= '<br /><a href="'.$a->get_baseurl().'/settings/connectors">'.L10n::t("return to the connector page").'</a>';
return($o);
}
$tmbl_defpost = get_pconfig(local_user(),'tumblr','post_by_default');
$selected = ((intval($tmbl_defpost) == 1) ? ' checked="checked" ' : '');
$b .= '<div class="profile-jot-net"><input type="checkbox" name="tumblr_enable"' . $selected . ' value="1" /> '
- . t('Post to Tumblr') . '</div>';
+ . L10n::t('Post to Tumblr') . '</div>';
}
}
/* Add some HTML to the existing form */
$s .= '<span id="settings_tumblr_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_tumblr_expanded\'); openClose(\'settings_tumblr_inflated\');">';
- $s .= '<img class="connector'.$css.'" src="images/tumblr.png" /><h3 class="connector">'. t('Tumblr Export').'</h3>';
+ $s .= '<img class="connector'.$css.'" src="images/tumblr.png" /><h3 class="connector">'. L10n::t('Tumblr Export').'</h3>';
$s .= '</span>';
$s .= '<div id="settings_tumblr_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_tumblr_expanded\'); openClose(\'settings_tumblr_inflated\');">';
- $s .= '<img class="connector'.$css.'" src="images/tumblr.png" /><h3 class="connector">'. t('Tumblr Export').'</h3>';
+ $s .= '<img class="connector'.$css.'" src="images/tumblr.png" /><h3 class="connector">'. L10n::t('Tumblr Export').'</h3>';
$s .= '</span>';
$s .= '<div id="tumblr-username-wrapper">';
- $s .= '<a href="'.$a->get_baseurl().'/tumblr/connect">'.t("(Re-)Authenticate your tumblr page").'</a>';
+ $s .= '<a href="'.$a->get_baseurl().'/tumblr/connect">'.L10n::t("(Re-)Authenticate your tumblr page").'</a>';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="tumblr-enable-wrapper">';
- $s .= '<label id="tumblr-enable-label" for="tumblr-checkbox">' . t('Enable Tumblr Post Plugin') . '</label>';
+ $s .= '<label id="tumblr-enable-label" for="tumblr-checkbox">' . L10n::t('Enable Tumblr Post Addon') . '</label>';
$s .= '<input id="tumblr-checkbox" type="checkbox" name="tumblr" value="1" ' . $checked . '/>';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="tumblr-bydefault-wrapper">';
- $s .= '<label id="tumblr-bydefault-label" for="tumblr-bydefault">' . t('Post to Tumblr by default') . '</label>';
+ $s .= '<label id="tumblr-bydefault-label" for="tumblr-bydefault">' . L10n::t('Post to Tumblr by default') . '</label>';
$s .= '<input id="tumblr-bydefault" type="checkbox" name="tumblr_bydefault" value="1" ' . $def_checked . '/>';
$s .= '</div><div class="clear"></div>';
$blogs = array();
- $s .= '<label id="tumblr-page-label" for="tumblr-page">' . t('Post to page:') . '</label>';
+ $s .= '<label id="tumblr-page-label" for="tumblr-page">' . L10n::t('Post to page:') . '</label>';
$s .= '<select name="tumblr_page" id="tumblr-page">';
foreach($userinfo->response->user->blogs as $blog) {
$blogurl = substr(str_replace(array("http://", "https://"), array("", ""), $blog->url), 0, -1);
$s .= "</select>";
} else
- $s .= t("You are not authenticated to tumblr");
+ $s .= L10n::t("You are not authenticated to tumblr");
$s .= '</div><div class="clear"></div>';
/* provide a submit button */
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="tumblr-submit" name="tumblr-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="tumblr-submit" name="tumblr-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
$tmbl_blog = 'blog/'.$page.'/post';
if($oauth_token && $oauth_token_secret && $tmbl_blog) {
-
- require_once('include/bbcode.php');
-
- $tag_arr = array();
+ $tag_arr = [];
$tags = '';
$x = preg_match_all('/\#\[(.*?)\](.*?)\[/',$b['tag'],$matches,PREG_SET_ORDER);
$tags = implode(',',$tag_arr);
$title = trim($b['title']);
- require_once('include/plaintext.php');
- $siteinfo = get_attached_data($b["body"]);
+ $siteinfo = BBCode::getAttachedData($b["body"]);
$params = array(
'state' => 'published',
if (isset($siteinfo["text"]))
$body = $siteinfo["text"];
else
- $body = bb_remove_share_information($b["body"]);
+ $body = BBCode::removeShareInformation($b["body"]);
switch ($siteinfo["type"]) {
case "photo":
$params['type'] = "photo";
- $params['caption'] = bbcode($body, false, false, 4);
+ $params['caption'] = BBCode::convert($body, false, 4);
if (isset($siteinfo["url"]))
$params['link'] = $siteinfo["url"];
$params['type'] = "link";
$params['title'] = $title;
$params['url'] = $siteinfo["url"];
- $params['description'] = bbcode($body, false, false, 4);
+ $params['description'] = BBCode::convert($body, false, 4);
break;
case "audio":
$params['type'] = "audio";
$params['external_url'] = $siteinfo["url"];
- $params['caption'] = bbcode($body, false, false, 4);
+ $params['caption'] = BBCode::convert($body, false, 4);
break;
case "video":
$params['type'] = "video";
$params['embed'] = $siteinfo["url"];
- $params['caption'] = bbcode($body, false, false, 4);
+ $params['caption'] = BBCode::convert($body, false, 4);
break;
default:
$params['type'] = "text";
$params['title'] = $title;
- $params['body'] = bbcode($b['body'], false, false, 4);
+ $params['body'] = BBCode::convert($b['body'], false, 4);
break;
}
"<p>".$params['caption']."</p>";
if (trim($params['caption']) == "")
- $params['caption'] = bbcode("[quote]".$siteinfo["description"]."[/quote]", false, false, 4);
+ $params['caption'] = BBCode::convert("[quote]" . $siteinfo["description"] . "[/quote]", false, 4);
$consumer_key = get_config('tumblr','consumer_key');
$consumer_secret = get_config('tumblr','consumer_secret');
+++ /dev/null
-<?php\r
-// vim: foldmethod=marker\r
-\r
-/* Generic exception class\r
- */\r
-class OAuthException extends Exception {\r
- // pass\r
-}\r
-\r
-class OAuthConsumer {\r
- public $key;\r
- public $secret;\r
-\r
- function __construct($key, $secret, $callback_url=NULL) {\r
- $this->key = $key;\r
- $this->secret = $secret;\r
- $this->callback_url = $callback_url;\r
- }\r
-\r
- function __toString() {\r
- return "OAuthConsumer[key=$this->key,secret=$this->secret]";\r
- }\r
-}\r
-\r
-class OAuthToken {\r
- // access tokens and request tokens\r
- public $key;\r
- public $secret;\r
-\r
- /**\r
- * key = the token\r
- * secret = the token secret\r
- */\r
- function __construct($key, $secret) {\r
- $this->key = $key;\r
- $this->secret = $secret;\r
- }\r
-\r
- /**\r
- * generates the basic string serialization of a token that a server\r
- * would respond to request_token and access_token calls with\r
- */\r
- function to_string() {\r
- return "oauth_token=" .\r
- OAuthUtil::urlencode_rfc3986($this->key) .\r
- "&oauth_token_secret=" .\r
- OAuthUtil::urlencode_rfc3986($this->secret);\r
- }\r
-\r
- function __toString() {\r
- return $this->to_string();\r
- }\r
-}\r
-\r
-/**\r
- * A class for implementing a Signature Method\r
- * See section 9 ("Signing Requests") in the spec\r
- */\r
-abstract class OAuthSignatureMethod {\r
- /**\r
- * Needs to return the name of the Signature Method (ie HMAC-SHA1)\r
- * @return string\r
- */\r
- abstract public function get_name();\r
-\r
- /**\r
- * Build up the signature\r
- * NOTE: The output of this function MUST NOT be urlencoded.\r
- * the encoding is handled in OAuthRequest when the final\r
- * request is serialized\r
- * @param OAuthRequest $request\r
- * @param OAuthConsumer $consumer\r
- * @param OAuthToken $token\r
- * @return string\r
- */\r
- abstract public function build_signature($request, $consumer, $token);\r
-\r
- /**\r
- * Verifies that a given signature is correct\r
- * @param OAuthRequest $request\r
- * @param OAuthConsumer $consumer\r
- * @param OAuthToken $token\r
- * @param string $signature\r
- * @return bool\r
- */\r
- public function check_signature($request, $consumer, $token, $signature) {\r
- $built = $this->build_signature($request, $consumer, $token);\r
- return $built == $signature;\r
- }\r
-}\r
-\r
-/**\r
- * The HMAC-SHA1 signature method uses the HMAC-SHA1 signature algorithm as defined in [RFC2104] \r
- * where the Signature Base String is the text and the key is the concatenated values (each first \r
- * encoded per Parameter Encoding) of the Consumer Secret and Token Secret, separated by an '&' \r
- * character (ASCII code 38) even if empty.\r
- * - Chapter 9.2 ("HMAC-SHA1")\r
- */\r
-class OAuthSignatureMethod_HMAC_SHA1 extends OAuthSignatureMethod {\r
- function get_name() {\r
- return "HMAC-SHA1";\r
- }\r
-\r
- public function build_signature($request, $consumer, $token) {\r
- $base_string = $request->get_signature_base_string();\r
- $request->base_string = $base_string;\r
-\r
- $key_parts = array(\r
- $consumer->secret,\r
- ($token) ? $token->secret : ""\r
- );\r
-\r
- $key_parts = OAuthUtil::urlencode_rfc3986($key_parts);\r
- $key = implode('&', $key_parts);\r
-\r
- return base64_encode(hash_hmac('sha1', $base_string, $key, true));\r
- }\r
-}\r
-\r
-/**\r
- * The PLAINTEXT method does not provide any security protection and SHOULD only be used \r
- * over a secure channel such as HTTPS. It does not use the Signature Base String.\r
- * - Chapter 9.4 ("PLAINTEXT")\r
- */\r
-class OAuthSignatureMethod_PLAINTEXT extends OAuthSignatureMethod {\r
- public function get_name() {\r
- return "PLAINTEXT";\r
- }\r
-\r
- /**\r
- * oauth_signature is set to the concatenated encoded values of the Consumer Secret and \r
- * Token Secret, separated by a '&' character (ASCII code 38), even if either secret is \r
- * empty. The result MUST be encoded again.\r
- * - Chapter 9.4.1 ("Generating Signatures")\r
- *\r
- * Please note that the second encoding MUST NOT happen in the SignatureMethod, as\r
- * OAuthRequest handles this!\r
- */\r
- public function build_signature($request, $consumer, $token) {\r
- $key_parts = array(\r
- $consumer->secret,\r
- ($token) ? $token->secret : ""\r
- );\r
-\r
- $key_parts = OAuthUtil::urlencode_rfc3986($key_parts);\r
- $key = implode('&', $key_parts);\r
- $request->base_string = $key;\r
-\r
- return $key;\r
- }\r
-}\r
-\r
-/**\r
- * The RSA-SHA1 signature method uses the RSASSA-PKCS1-v1_5 signature algorithm as defined in \r
- * [RFC3447] section 8.2 (more simply known as PKCS#1), using SHA-1 as the hash function for \r
- * EMSA-PKCS1-v1_5. It is assumed that the Consumer has provided its RSA public key in a \r
- * verified way to the Service Provider, in a manner which is beyond the scope of this \r
- * specification.\r
- * - Chapter 9.3 ("RSA-SHA1")\r
- */\r
-abstract class OAuthSignatureMethod_RSA_SHA1 extends OAuthSignatureMethod {\r
- public function get_name() {\r
- return "RSA-SHA1";\r
- }\r
-\r
- // Up to the SP to implement this lookup of keys. Possible ideas are:\r
- // (1) do a lookup in a table of trusted certs keyed off of consumer\r
- // (2) fetch via http using a url provided by the requester\r
- // (3) some sort of specific discovery code based on request\r
- //\r
- // Either way should return a string representation of the certificate\r
- protected abstract function fetch_public_cert(&$request);\r
-\r
- // Up to the SP to implement this lookup of keys. Possible ideas are:\r
- // (1) do a lookup in a table of trusted certs keyed off of consumer\r
- //\r
- // Either way should return a string representation of the certificate\r
- protected abstract function fetch_private_cert(&$request);\r
-\r
- public function build_signature($request, $consumer, $token) {\r
- $base_string = $request->get_signature_base_string();\r
- $request->base_string = $base_string;\r
-\r
- // Fetch the private key cert based on the request\r
- $cert = $this->fetch_private_cert($request);\r
-\r
- // Pull the private key ID from the certificate\r
- $privatekeyid = openssl_get_privatekey($cert);\r
-\r
- // Sign using the key\r
- $ok = openssl_sign($base_string, $signature, $privatekeyid);\r
-\r
- // Release the key resource\r
- openssl_free_key($privatekeyid);\r
-\r
- return base64_encode($signature);\r
- }\r
-\r
- public function check_signature($request, $consumer, $token, $signature) {\r
- $decoded_sig = base64_decode($signature);\r
-\r
- $base_string = $request->get_signature_base_string();\r
-\r
- // Fetch the public key cert based on the request\r
- $cert = $this->fetch_public_cert($request);\r
-\r
- // Pull the public key ID from the certificate\r
- $publickeyid = openssl_get_publickey($cert);\r
-\r
- // Check the computed signature against the one passed in the query\r
- $ok = openssl_verify($base_string, $decoded_sig, $publickeyid);\r
-\r
- // Release the key resource\r
- openssl_free_key($publickeyid);\r
-\r
- return $ok == 1;\r
- }\r
-}\r
-\r
-class OAuthRequest {\r
- private $parameters;\r
- private $http_method;\r
- private $http_url;\r
- // for debug purposes\r
- public $base_string;\r
- public static $version = '1.0';\r
- public static $POST_INPUT = 'php://input';\r
-\r
- function __construct($http_method, $http_url, $parameters=NULL) {\r
- @$parameters or $parameters = array();\r
- $parameters = array_merge( OAuthUtil::parse_parameters(parse_url($http_url, PHP_URL_QUERY)), $parameters);\r
- $this->parameters = $parameters;\r
- $this->http_method = $http_method;\r
- $this->http_url = $http_url;\r
- }\r
-\r
-\r
- /**\r
- * attempt to build up a request from what was passed to the server\r
- */\r
- public static function from_request($http_method=NULL, $http_url=NULL, $parameters=NULL) {\r
- $scheme = (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on")\r
- ? 'http'\r
- : 'https';\r
- @$http_url or $http_url = $scheme .\r
- '://' . $_SERVER['HTTP_HOST'] .\r
- ':' .\r
- $_SERVER['SERVER_PORT'] .\r
- $_SERVER['REQUEST_URI'];\r
- @$http_method or $http_method = $_SERVER['REQUEST_METHOD'];\r
-\r
- // We weren't handed any parameters, so let's find the ones relevant to\r
- // this request.\r
- // If you run XML-RPC or similar you should use this to provide your own\r
- // parsed parameter-list\r
- if (!$parameters) {\r
- // Find request headers\r
- $request_headers = OAuthUtil::get_headers();\r
-\r
- // Parse the query-string to find GET parameters\r
- $parameters = OAuthUtil::parse_parameters($_SERVER['QUERY_STRING']);\r
-\r
- // It's a POST request of the proper content-type, so parse POST\r
- // parameters and add those overriding any duplicates from GET\r
- if ($http_method == "POST"\r
- && @strstr($request_headers["Content-Type"],\r
- "application/x-www-form-urlencoded")\r
- ) {\r
- $post_data = OAuthUtil::parse_parameters(\r
- file_get_contents(self::$POST_INPUT)\r
- );\r
- $parameters = array_merge($parameters, $post_data);\r
- }\r
-\r
- // We have a Authorization-header with OAuth data. Parse the header\r
- // and add those overriding any duplicates from GET or POST\r
- if (@substr($request_headers['Authorization'], 0, 6) == "OAuth ") {\r
- $header_parameters = OAuthUtil::split_header(\r
- $request_headers['Authorization']\r
- );\r
- $parameters = array_merge($parameters, $header_parameters);\r
- }\r
-\r
- }\r
-\r
- return new OAuthRequest($http_method, $http_url, $parameters);\r
- }\r
-\r
- /**\r
- * pretty much a helper function to set up the request\r
- */\r
- public static function from_consumer_and_token($consumer, $token, $http_method, $http_url, $parameters=NULL) {\r
- @$parameters or $parameters = array();\r
- $defaults = array("oauth_version" => OAuthRequest::$version,\r
- "oauth_nonce" => OAuthRequest::generate_nonce(),\r
- "oauth_timestamp" => OAuthRequest::generate_timestamp(),\r
- "oauth_consumer_key" => $consumer->key);\r
- if ($token)\r
- $defaults['oauth_token'] = $token->key;\r
-\r
- $parameters = array_merge($defaults, $parameters);\r
-\r
- return new OAuthRequest($http_method, $http_url, $parameters);\r
- }\r
-\r
- public function set_parameter($name, $value, $allow_duplicates = true) {\r
- if ($allow_duplicates && isset($this->parameters[$name])) {\r
- // We have already added parameter(s) with this name, so add to the list\r
- if (is_scalar($this->parameters[$name])) {\r
- // This is the first duplicate, so transform scalar (string)\r
- // into an array so we can add the duplicates\r
- $this->parameters[$name] = array($this->parameters[$name]);\r
- }\r
-\r
- $this->parameters[$name][] = $value;\r
- } else {\r
- $this->parameters[$name] = $value;\r
- }\r
- }\r
-\r
- public function get_parameter($name) {\r
- return isset($this->parameters[$name]) ? $this->parameters[$name] : null;\r
- }\r
-\r
- public function get_parameters() {\r
- return $this->parameters;\r
- }\r
-\r
- public function unset_parameter($name) {\r
- unset($this->parameters[$name]);\r
- }\r
-\r
- /**\r
- * The request parameters, sorted and concatenated into a normalized string.\r
- * @return string\r
- */\r
- public function get_signable_parameters() {\r
- // Grab all parameters\r
- $params = $this->parameters;\r
-\r
- // Remove oauth_signature if present\r
- // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.")\r
- if (isset($params['oauth_signature'])) {\r
- unset($params['oauth_signature']);\r
- }\r
-\r
- return OAuthUtil::build_http_query($params);\r
- }\r
-\r
- /**\r
- * Returns the base string of this request\r
- *\r
- * The base string defined as the method, the url\r
- * and the parameters (normalized), each urlencoded\r
- * and the concated with &.\r
- */\r
- public function get_signature_base_string() {\r
- $parts = array(\r
- $this->get_normalized_http_method(),\r
- $this->get_normalized_http_url(),\r
- $this->get_signable_parameters()\r
- );\r
-\r
- $parts = OAuthUtil::urlencode_rfc3986($parts);\r
-\r
- return implode('&', $parts);\r
- }\r
-\r
- /**\r
- * just uppercases the http method\r
- */\r
- public function get_normalized_http_method() {\r
- return strtoupper($this->http_method);\r
- }\r
-\r
- /**\r
- * parses the url and rebuilds it to be\r
- * scheme://host/path\r
- */\r
- public function get_normalized_http_url() {\r
- $parts = parse_url($this->http_url);\r
-\r
- $port = @$parts['port'];\r
- $scheme = $parts['scheme'];\r
- $host = $parts['host'];\r
- $path = @$parts['path'];\r
-\r
- $port or $port = ($scheme == 'https') ? '443' : '80';\r
-\r
- if (($scheme == 'https' && $port != '443')\r
- || ($scheme == 'http' && $port != '80')) {\r
- $host = "$host:$port";\r
- }\r
- return "$scheme://$host$path";\r
- }\r
-\r
- /**\r
- * builds a url usable for a GET request\r
- */\r
- public function to_url() {\r
- $post_data = $this->to_postdata();\r
- $out = $this->get_normalized_http_url();\r
- if ($post_data) {\r
- $out .= '?'.$post_data;\r
- }\r
- return $out;\r
- }\r
-\r
- /**\r
- * builds the data one would send in a POST request\r
- */\r
- public function to_postdata() {\r
- return OAuthUtil::build_http_query($this->parameters);\r
- }\r
-\r
- /**\r
- * builds the Authorization: header\r
- */\r
- public function to_header($realm=null) {\r
- $first = true;\r
- if($realm) {\r
- $out = 'Authorization: OAuth realm="' . OAuthUtil::urlencode_rfc3986($realm) . '"';\r
- $first = false;\r
- } else\r
- $out = 'Authorization: OAuth';\r
-\r
- $total = array();\r
- foreach ($this->parameters as $k => $v) {\r
- if (substr($k, 0, 5) != "oauth") continue;\r
- if (is_array($v)) {\r
- throw new OAuthException('Arrays not supported in headers');\r
- }\r
- $out .= ($first) ? ' ' : ',';\r
- $out .= OAuthUtil::urlencode_rfc3986($k) .\r
- '="' .\r
- OAuthUtil::urlencode_rfc3986($v) .\r
- '"';\r
- $first = false;\r
- }\r
- return $out;\r
- }\r
-\r
- public function __toString() {\r
- return $this->to_url();\r
- }\r
-\r
-\r
- public function sign_request($signature_method, $consumer, $token) {\r
- $this->set_parameter(\r
- "oauth_signature_method",\r
- $signature_method->get_name(),\r
- false\r
- );\r
- $signature = $this->build_signature($signature_method, $consumer, $token);\r
- $this->set_parameter("oauth_signature", $signature, false);\r
- }\r
-\r
- public function build_signature($signature_method, $consumer, $token) {\r
- $signature = $signature_method->build_signature($this, $consumer, $token);\r
- return $signature;\r
- }\r
-\r
- /**\r
- * util function: current timestamp\r
- */\r
- private static function generate_timestamp() {\r
- return time();\r
- }\r
-\r
- /**\r
- * util function: current nonce\r
- */\r
- private static function generate_nonce() {\r
- $mt = microtime();\r
- $rand = mt_rand();\r
-\r
- return md5($mt . $rand); // md5s look nicer than numbers\r
- }\r
-}\r
-\r
-class OAuthServer {\r
- protected $timestamp_threshold = 300; // in seconds, five minutes\r
- protected $version = '1.0'; // hi blaine\r
- protected $signature_methods = array();\r
-\r
- protected $data_store;\r
-\r
- function __construct($data_store) {\r
- $this->data_store = $data_store;\r
- }\r
-\r
- public function add_signature_method($signature_method) {\r
- $this->signature_methods[$signature_method->get_name()] =\r
- $signature_method;\r
- }\r
-\r
- // high level functions\r
-\r
- /**\r
- * process a request_token request\r
- * returns the request token on success\r
- */\r
- public function fetch_request_token(&$request) {\r
- $this->get_version($request);\r
-\r
- $consumer = $this->get_consumer($request);\r
-\r
- // no token required for the initial token request\r
- $token = NULL;\r
-\r
- $this->check_signature($request, $consumer, $token);\r
-\r
- // Rev A change\r
- $callback = $request->get_parameter('oauth_callback');\r
- $new_token = $this->data_store->new_request_token($consumer, $callback);\r
-\r
- return $new_token;\r
- }\r
-\r
- /**\r
- * process an access_token request\r
- * returns the access token on success\r
- */\r
- public function fetch_access_token(&$request) {\r
- $this->get_version($request);\r
-\r
- $consumer = $this->get_consumer($request);\r
-\r
- // requires authorized request token\r
- $token = $this->get_token($request, $consumer, "request");\r
-\r
- $this->check_signature($request, $consumer, $token);\r
-\r
- // Rev A change\r
- $verifier = $request->get_parameter('oauth_verifier');\r
- $new_token = $this->data_store->new_access_token($token, $consumer, $verifier);\r
-\r
- return $new_token;\r
- }\r
-\r
- /**\r
- * verify an api call, checks all the parameters\r
- */\r
- public function verify_request(&$request) {\r
- $this->get_version($request);\r
- $consumer = $this->get_consumer($request);\r
- $token = $this->get_token($request, $consumer, "access");\r
- $this->check_signature($request, $consumer, $token);\r
- return array($consumer, $token);\r
- }\r
-\r
- // Internals from here\r
- /**\r
- * version 1\r
- */\r
- private function get_version(&$request) {\r
- $version = $request->get_parameter("oauth_version");\r
- if (!$version) {\r
- // Service Providers MUST assume the protocol version to be 1.0 if this parameter is not present. \r
- // Chapter 7.0 ("Accessing Protected Ressources")\r
- $version = '1.0';\r
- }\r
- if ($version !== $this->version) {\r
- throw new OAuthException("OAuth version '$version' not supported");\r
- }\r
- return $version;\r
- }\r
-\r
- /**\r
- * figure out the signature with some defaults\r
- */\r
- private function get_signature_method(&$request) {\r
- $signature_method =\r
- @$request->get_parameter("oauth_signature_method");\r
-\r
- if (!$signature_method) {\r
- // According to chapter 7 ("Accessing Protected Ressources") the signature-method\r
- // parameter is required, and we can't just fallback to PLAINTEXT\r
- throw new OAuthException('No signature method parameter. This parameter is required');\r
- }\r
-\r
- if (!in_array($signature_method,\r
- array_keys($this->signature_methods))) {\r
- throw new OAuthException(\r
- "Signature method '$signature_method' not supported " .\r
- "try one of the following: " .\r
- implode(", ", array_keys($this->signature_methods))\r
- );\r
- }\r
- return $this->signature_methods[$signature_method];\r
- }\r
-\r
- /**\r
- * try to find the consumer for the provided request's consumer key\r
- */\r
- private function get_consumer(&$request) {\r
- $consumer_key = @$request->get_parameter("oauth_consumer_key");\r
- if (!$consumer_key) {\r
- throw new OAuthException("Invalid consumer key");\r
- }\r
-\r
- $consumer = $this->data_store->lookup_consumer($consumer_key);\r
- if (!$consumer) {\r
- throw new OAuthException("Invalid consumer");\r
- }\r
-\r
- return $consumer;\r
- }\r
-\r
- /**\r
- * try to find the token for the provided request's token key\r
- */\r
- private function get_token(&$request, $consumer, $token_type="access") {\r
- $token_field = @$request->get_parameter('oauth_token');\r
- $token = $this->data_store->lookup_token(\r
- $consumer, $token_type, $token_field\r
- );\r
- if (!$token) {\r
- throw new OAuthException("Invalid $token_type token: $token_field");\r
- }\r
- return $token;\r
- }\r
-\r
- /**\r
- * all-in-one function to check the signature on a request\r
- * should guess the signature method appropriately\r
- */\r
- private function check_signature(&$request, $consumer, $token) {\r
- // this should probably be in a different method\r
- $timestamp = @$request->get_parameter('oauth_timestamp');\r
- $nonce = @$request->get_parameter('oauth_nonce');\r
-\r
- $this->check_timestamp($timestamp);\r
- $this->check_nonce($consumer, $token, $nonce, $timestamp);\r
-\r
- $signature_method = $this->get_signature_method($request);\r
-\r
- $signature = $request->get_parameter('oauth_signature');\r
- $valid_sig = $signature_method->check_signature(\r
- $request,\r
- $consumer,\r
- $token,\r
- $signature\r
- );\r
-\r
- if (!$valid_sig) {\r
- throw new OAuthException("Invalid signature");\r
- }\r
- }\r
-\r
- /**\r
- * check that the timestamp is new enough\r
- */\r
- private function check_timestamp($timestamp) {\r
- if( ! $timestamp )\r
- throw new OAuthException(\r
- 'Missing timestamp parameter. The parameter is required'\r
- );\r
- \r
- // verify that timestamp is recentish\r
- $now = time();\r
- if (abs($now - $timestamp) > $this->timestamp_threshold) {\r
- throw new OAuthException(\r
- "Expired timestamp, yours $timestamp, ours $now"\r
- );\r
- }\r
- }\r
-\r
- /**\r
- * check that the nonce is not repeated\r
- */\r
- private function check_nonce($consumer, $token, $nonce, $timestamp) {\r
- if( ! $nonce )\r
- throw new OAuthException(\r
- 'Missing nonce parameter. The parameter is required'\r
- );\r
-\r
- // verify that the nonce is uniqueish\r
- $found = $this->data_store->lookup_nonce(\r
- $consumer,\r
- $token,\r
- $nonce,\r
- $timestamp\r
- );\r
- if ($found) {\r
- throw new OAuthException("Nonce already used: $nonce");\r
- }\r
- }\r
-\r
-}\r
-\r
-class OAuthDataStore {\r
- function lookup_consumer($consumer_key) {\r
- // implement me\r
- }\r
-\r
- function lookup_token($consumer, $token_type, $token) {\r
- // implement me\r
- }\r
-\r
- function lookup_nonce($consumer, $token, $nonce, $timestamp) {\r
- // implement me\r
- }\r
-\r
- function new_request_token($consumer, $callback = null) {\r
- // return a new token attached to this consumer\r
- }\r
-\r
- function new_access_token($token, $consumer, $verifier = null) {\r
- // return a new access token attached to this consumer\r
- // for the user associated with this token if the request token\r
- // is authorized\r
- // should also invalidate the request token\r
- }\r
-\r
-}\r
-\r
-class OAuthUtil {\r
- public static function urlencode_rfc3986($input) {\r
- if (is_array($input)) {\r
- return array_map(array('OAuthUtil', 'urlencode_rfc3986'), $input);\r
- } else if (is_scalar($input)) {\r
- return str_replace(\r
- '+',\r
- ' ',\r
- str_replace('%7E', '~', rawurlencode($input))\r
- );\r
- } else {\r
- return '';\r
- }\r
-}\r
-\r
-\r
- // This decode function isn't taking into consideration the above\r
- // modifications to the encoding process. However, this method doesn't\r
- // seem to be used anywhere so leaving it as is.\r
- public static function urldecode_rfc3986($string) {\r
- return urldecode($string);\r
- }\r
-\r
- // Utility function for turning the Authorization: header into\r
- // parameters, has to do some unescaping\r
- // Can filter out any non-oauth parameters if needed (default behaviour)\r
- public static function split_header($header, $only_allow_oauth_parameters = true) {\r
- $pattern = '/(([-_a-z]*)=("([^"]*)"|([^,]*)),?)/';\r
- $offset = 0;\r
- $params = array();\r
- while (preg_match($pattern, $header, $matches, PREG_OFFSET_CAPTURE, $offset) > 0) {\r
- $match = $matches[0];\r
- $header_name = $matches[2][0];\r
- $header_content = (isset($matches[5])) ? $matches[5][0] : $matches[4][0];\r
- if (preg_match('/^oauth_/', $header_name) || !$only_allow_oauth_parameters) {\r
- $params[$header_name] = OAuthUtil::urldecode_rfc3986($header_content);\r
- }\r
- $offset = $match[1] + strlen($match[0]);\r
- }\r
-\r
- if (isset($params['realm'])) {\r
- unset($params['realm']);\r
- }\r
-\r
- return $params;\r
- }\r
-\r
- // helper to try to sort out headers for people who aren't running apache\r
- public static function get_headers() {\r
- if (function_exists('apache_request_headers')) {\r
- // we need this to get the actual Authorization: header\r
- // because apache tends to tell us it doesn't exist\r
- $headers = apache_request_headers();\r
-\r
- // sanitize the output of apache_request_headers because\r
- // we always want the keys to be Cased-Like-This and arh()\r
- // returns the headers in the same case as they are in the\r
- // request\r
- $out = array();\r
- foreach( $headers AS $key => $value ) {\r
- $key = str_replace(\r
- " ",\r
- "-",\r
- ucwords(strtolower(str_replace("-", " ", $key)))\r
- );\r
- $out[$key] = $value;\r
- }\r
- } else {\r
- // otherwise we don't have apache and are just going to have to hope\r
- // that $_SERVER actually contains what we need\r
- $out = array();\r
- if( isset($_SERVER['CONTENT_TYPE']) )\r
- $out['Content-Type'] = $_SERVER['CONTENT_TYPE'];\r
- if( isset($_ENV['CONTENT_TYPE']) )\r
- $out['Content-Type'] = $_ENV['CONTENT_TYPE'];\r
-\r
- foreach ($_SERVER as $key => $value) {\r
- if (substr($key, 0, 5) == "HTTP_") {\r
- // this is chaos, basically it is just there to capitalize the first\r
- // letter of every word that is not an initial HTTP and strip HTTP\r
- // code from przemek\r
- $key = str_replace(\r
- " ",\r
- "-",\r
- ucwords(strtolower(str_replace("_", " ", substr($key, 5))))\r
- );\r
- $out[$key] = $value;\r
- }\r
- }\r
- }\r
- return $out;\r
- }\r
-\r
- // This function takes a input like a=b&a=c&d=e and returns the parsed\r
- // parameters like this\r
- // array('a' => array('b','c'), 'd' => 'e')\r
- public static function parse_parameters( $input ) {\r
- if (!isset($input) || !$input) return array();\r
-\r
- $pairs = explode('&', $input);\r
-\r
- $parsed_parameters = array();\r
- foreach ($pairs as $pair) {\r
- $split = explode('=', $pair, 2);\r
- $parameter = OAuthUtil::urldecode_rfc3986($split[0]);\r
- $value = isset($split[1]) ? OAuthUtil::urldecode_rfc3986($split[1]) : '';\r
-\r
- if (isset($parsed_parameters[$parameter])) {\r
- // We have already recieved parameter(s) with this name, so add to the list\r
- // of parameters with this name\r
-\r
- if (is_scalar($parsed_parameters[$parameter])) {\r
- // This is the first duplicate, so transform scalar (string) into an array\r
- // so we can add the duplicates\r
- $parsed_parameters[$parameter] = array($parsed_parameters[$parameter]);\r
- }\r
-\r
- $parsed_parameters[$parameter][] = $value;\r
- } else {\r
- $parsed_parameters[$parameter] = $value;\r
- }\r
- }\r
- return $parsed_parameters;\r
- }\r
-\r
- public static function build_http_query($params) {\r
- if (!$params) return '';\r
-\r
- // Urlencode both keys and values\r
- $keys = OAuthUtil::urlencode_rfc3986(array_keys($params));\r
- $values = OAuthUtil::urlencode_rfc3986(array_values($params));\r
- $params = array_combine($keys, $values);\r
-\r
- // Parameters are sorted by name, using lexicographical byte value ordering.\r
- // Ref: Spec: 9.1.1 (1)\r
- uksort($params, 'strcmp');\r
-\r
- $pairs = array();\r
- foreach ($params as $parameter => $value) {\r
- if (is_array($value)) {\r
- // If two or more parameters share the same name, they are sorted by their value\r
- // Ref: Spec: 9.1.1 (1)\r
- natsort($value);\r
- foreach ($value as $duplicate_value) {\r
- $pairs[] = $parameter . '=' . $duplicate_value;\r
- }\r
- } else {\r
- $pairs[] = $parameter . '=' . $value;\r
- }\r
- }\r
- // For each parameter, the name is separated from the corresponding value by an '=' character (ASCII code 61)\r
- // Each name-value pair is separated by an '&' character (ASCII code 38)\r
- return implode('&', $pairs);\r
- }\r
-}\r
-\r
-?>\r
+++ /dev/null
-<?php\r
-\r
-/*\r
- * Abraham Williams (abraham@abrah.am) http://abrah.am\r
- *\r
- * The first PHP Library to support OAuth for Tumblr's REST API. (Originally for Twitter, modified for Tumblr by Lucas)\r
- */\r
-\r
-/* Load OAuth lib. You can find it at http://oauth.net */\r
-//require_once('OAuth.php');\r
-\r
-/**\r
- * Tumblr OAuth class\r
- */\r
-class TumblrOAuth {\r
- /* Contains the last HTTP status code returned. */\r
- public $http_code;\r
- /* Contains the last API call. */\r
- public $url;\r
- /* Set up the API root URL. */\r
- public $host = "http://api.tumblr.com/v2/";\r
- /* Set timeout default. */\r
- public $timeout = 30;\r
- /* Set connect timeout. */\r
- public $connecttimeout = 30; \r
- /* Verify SSL Cert. */\r
- public $ssl_verifypeer = FALSE;\r
- /* Respons format. */\r
- public $format = 'json';\r
- /* Decode returned json data. */\r
- public $decode_json = TRUE;\r
- /* Contains the last HTTP headers returned. */\r
- public $http_info;\r
- /* Set the useragnet. */\r
- public $useragent = 'TumblrOAuth v0.2.0-beta2';\r
- /* Immediately retry the API call if the response was not successful. */\r
- //public $retry = TRUE;\r
-\r
-\r
-\r
-\r
- /**\r
- * Set API URLS\r
- */\r
- function accessTokenURL() { return 'http://www.tumblr.com/oauth/access_token'; }\r
- function authenticateURL() { return 'http://www.tumblr.com/oauth/authorize'; }\r
- function authorizeURL() { return 'http://www.tumblr.com/oauth/authorize'; }\r
- function requestTokenURL() { return 'http://www.tumblr.com/oauth/request_token'; }\r
-\r
- /**\r
- * Debug helpers\r
- */\r
- function lastStatusCode() { return $this->http_status; }\r
- function lastAPICall() { return $this->last_api_call; }\r
-\r
- /**\r
- * construct TumblrOAuth object\r
- */\r
- function __construct($consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL) {\r
- $this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1();\r
- $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret);\r
- if (!empty($oauth_token) && !empty($oauth_token_secret)) {\r
- $this->token = new OAuthConsumer($oauth_token, $oauth_token_secret);\r
- } else {\r
- $this->token = NULL;\r
- }\r
- }\r
-\r
-\r
- /**\r
- * Get a request_token from Tumblr\r
- *\r
- * @returns a key/value array containing oauth_token and oauth_token_secret\r
- */\r
- function getRequestToken($oauth_callback = NULL) {\r
- $parameters = array();\r
- if (!empty($oauth_callback)) {\r
- $parameters['oauth_callback'] = $oauth_callback;\r
- } \r
- $request = $this->oAuthRequest($this->requestTokenURL(), 'GET', $parameters);\r
- $token = OAuthUtil::parse_parameters($request);\r
- $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);\r
- return $token;\r
- }\r
-\r
- /**\r
- * Get the authorize URL\r
- *\r
- * @returns a string\r
- */\r
- function getAuthorizeURL($token, $sign_in_with_tumblr = TRUE) {\r
- if (is_array($token)) {\r
- $token = $token['oauth_token'];\r
- }\r
- if (empty($sign_in_with_tumblr)) {\r
- return $this->authorizeURL() . "?oauth_token={$token}";\r
- } else {\r
- return $this->authenticateURL() . "?oauth_token={$token}";\r
- }\r
- }\r
-\r
- /**\r
- * Exchange request token and secret for an access token and\r
- * secret, to sign API calls.\r
- *\r
- * @returns array("oauth_token" => "the-access-token",\r
- * "oauth_token_secret" => "the-access-secret",\r
- * "user_id" => "9436992",\r
- * "screen_name" => "abraham")\r
- */\r
- function getAccessToken($oauth_verifier = FALSE) {\r
- $parameters = array();\r
- if (!empty($oauth_verifier)) {\r
- $parameters['oauth_verifier'] = $oauth_verifier;\r
- }\r
- $request = $this->oAuthRequest($this->accessTokenURL(), 'GET', $parameters);\r
- $token = OAuthUtil::parse_parameters($request);\r
- $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);\r
- return $token;\r
- }\r
-\r
- /**\r
- * One time exchange of username and password for access token and secret.\r
- *\r
- * @returns array("oauth_token" => "the-access-token",\r
- * "oauth_token_secret" => "the-access-secret",\r
- * "user_id" => "9436992",\r
- * "screen_name" => "abraham",\r
- * "x_auth_expires" => "0")\r
- */ \r
- function getXAuthToken($username, $password) {\r
- $parameters = array();\r
- $parameters['x_auth_username'] = $username;\r
- $parameters['x_auth_password'] = $password;\r
- $parameters['x_auth_mode'] = 'client_auth';\r
- $request = $this->oAuthRequest($this->accessTokenURL(), 'POST', $parameters);\r
- $token = OAuthUtil::parse_parameters($request);\r
- $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);\r
- return $token;\r
- }\r
-\r
- /**\r
- * GET wrapper for oAuthRequest.\r
- */\r
- function get($url, $parameters = array()) {\r
- $response = $this->oAuthRequest($url, 'GET', $parameters);\r
- if ($this->format === 'json' && $this->decode_json) {\r
- return json_decode($response);\r
- }\r
- return $response;\r
- }\r
- \r
- /**\r
- * POST wrapper for oAuthRequest.\r
- */\r
- function post($url, $parameters = array()) {\r
- $response = $this->oAuthRequest($url, 'POST', $parameters);\r
- if ($this->format === 'json' && $this->decode_json) {\r
- return json_decode($response);\r
- }\r
- return $response;\r
- }\r
-\r
- /**\r
- * DELETE wrapper for oAuthReqeust.\r
- */\r
- function delete($url, $parameters = array()) {\r
- $response = $this->oAuthRequest($url, 'DELETE', $parameters);\r
- if ($this->format === 'json' && $this->decode_json) {\r
- return json_decode($response);\r
- }\r
- return $response;\r
- }\r
-\r
- /**\r
- * Format and sign an OAuth / API request\r
- */\r
- function oAuthRequest($url, $method, $parameters) {\r
- if (strrpos($url, 'https://') !== 0 && strrpos($url, 'http://') !== 0) {\r
- $url = "{$this->host}{$url}";\r
- }\r
- $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters);\r
- $request->sign_request($this->sha1_method, $this->consumer, $this->token);\r
- switch ($method) {\r
- case 'GET':\r
- return $this->http($request->to_url(), 'GET');\r
- default:\r
- return $this->http($request->get_normalized_http_url(), $method, $request->to_postdata());\r
- }\r
- }\r
-\r
- /**\r
- * Make an HTTP request\r
- *\r
- * @return API results\r
- */\r
- function http($url, $method, $postfields = NULL) {\r
- $this->http_info = array();\r
- $ci = curl_init();\r
- /* Curl settings */\r
- curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);\r
- curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);\r
- curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);\r
- curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);\r
- curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));\r
- curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);\r
- curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));\r
- curl_setopt($ci, CURLOPT_HEADER, FALSE);\r
-\r
- switch ($method) {\r
- case 'POST':\r
- curl_setopt($ci, CURLOPT_POST, TRUE);\r
- if (!empty($postfields)) {\r
- curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);\r
- }\r
- break;\r
- case 'DELETE':\r
- curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');\r
- if (!empty($postfields)) {\r
- $url = "{$url}?{$postfields}";\r
- }\r
- }\r
-\r
- curl_setopt($ci, CURLOPT_URL, $url);\r
- $response = curl_exec($ci);\r
- $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);\r
- $this->http_info = array_merge($this->http_info, curl_getinfo($ci));\r
- $this->url = $url;\r
- curl_close ($ci);\r
- return $response;\r
- }\r
-\r
- /**\r
- * Get the header info to store.\r
- */\r
- function getHeader($ch, $header) {\r
- $i = strpos($header, ':');\r
- if (!empty($i)) {\r
- $key = str_replace('-', '_', strtolower(substr($header, 0, $i)));\r
- $value = trim(substr($header, $i + 2));\r
- $this->http_header[$key] = $value;\r
- }\r
- return strlen($header);\r
- }\r
-}\r
-Copyright (c) 2011-2013 Tobias Diekershoff, Michael Vogel
+Copyright (c) 2011-2018 Tobias Diekershoff, Michael Vogel, Hypolite Petovan
All rights reserved.
Redistribution and use in source and binary forms, with or without
-Twitter Plugin
+Twitter Addon
==============
-Main authors Tobias Diekershoff and Michael Vogel.
+Main authors Tobias Diekershoff, Michael Vogel and Hypolite Petovan.
-With this addon to friendica you can give your users the possibility to post their *public* messages to Twitter and
-to import their timeline. The messages will be strapped their rich context and shortened to 140 characters length if
-necessary.
+This bi-directional connector addon allows each user to crosspost their Friendica public posts to Twitter, import their
+Twitter timeline, interact with tweets from Friendica, and crosspost to Friendica their public tweets.
-The addon can also mirror a users Tweets into the ~friendica wall.
+## Installation
-Installation
-------------
+To use this addon you have to register an [application](https://apps.twitter.com/) for your Friendica instance on Twitter.
+Please leave the field "Callback URL" empty.
-To use this plugin you have to register an [application](https://apps.twitter.com/) for your friendica instance on Twitter. Please leave the field "Callback URL" empty.
+After the registration please enter the values for "Consumer Key" and "Consumer Secret" in the [administration](admin/addons/twitter).
-After the registration please enter the values for "Consumer Key" and "Consumer Secret" in the [administration](admin/plugins/twitter).
+## License
-Where to find
--------------
-
-In the friendica addon git repository /twitter/, this directory contains
-all required PHP files (including the [Twitter OAuth library][1] by Abraham
-Williams, MIT licensed and the [Slinky library][2] by Beau Lebens, BSD license),
-a CSS file for styling of the user configuration and an image to _Sign in with
-Twitter_.
-
-[1]: https://github.com/abraham/twitteroauth
-[2]: http://dentedreality.com.au/projects/slinky/
-
-License
-=======
-
-The _StatusNet Connector_ is licensed under the [3-clause BSD license][3] see the
-LICENSE file in the addons directory.
-
-[3]: http://opensource.org/licenses/BSD-3-Clause
+The _Twitter Connector_ is licensed under the [3-clause BSD license][2] see the LICENSE file in the addons directory.
+The _Twitter Connector_ uses the [Twitter OAuth library][2] by Abraham Williams, MIT licensed
+[1]: http://opensource.org/licenses/BSD-3-Clause
+[2]: https://github.com/abraham/twitteroauth
+++ /dev/null
-##
-## ca-bundle.crt -- Bundle of CA Root Certificates
-##
-## Certificate data from Mozilla as of: Sat Dec 29 20:03:40 2012
-##
-## This is a bundle of X.509 certificates of public Certificate Authorities
-## (CA). These were automatically extracted from Mozilla's root certificates
-## file (certdata.txt). This file can be found in the mozilla source tree:
-## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1
-##
-## It contains the certificates in PEM format and therefore
-## can be directly used with curl / libcurl / php_curl, or with
-## an Apache+mod_ssl webserver for SSL client authentication.
-## Just configure this file as the SSLCACertificateFile.
-##
-
-# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.87 $ $Date: 2012/12/29 16:32:45 $
-
-GTE CyberTrust Global Root
-==========================
------BEGIN CERTIFICATE-----
-MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg
-Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG
-A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz
-MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL
-Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0
-IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u
-sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql
-HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID
-AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW
-M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF
-NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
------END CERTIFICATE-----
-
-Thawte Server CA
-================
------BEGIN CERTIFICATE-----
-MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
-DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
-dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE
-AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j
-b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV
-BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u
-c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG
-A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0
-ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl
-/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7
-1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR
-MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J
-GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ
-GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=
------END CERTIFICATE-----
-
-Thawte Premium Server CA
-========================
------BEGIN CERTIFICATE-----
-MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT
-DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
-dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE
-AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl
-ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT
-AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
-VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
-aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ
-cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
-aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh
-Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/
-qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm
-SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf
-8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t
-UCemDaYj+bvLpgcUQg==
------END CERTIFICATE-----
-
-Equifax Secure CA
-=================
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
-ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
-MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
-B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
-nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
-fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
-8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
-A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
-CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
-A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
-spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
-Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
-zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
-BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
-70+sB3c4
------END CERTIFICATE-----
-
-Digital Signature Trust Co. Global CA 1
-=======================================
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
-ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy
-MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
-IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA
-A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE
-NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i
-o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
-BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
-dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
-IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY
-MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM
-BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
-ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq
-kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4
-RbyhkwS7hp86W0N6w4pl
------END CERTIFICATE-----
-
-Digital Signature Trust Co. Global CA 3
-=======================================
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
-ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy
-MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
-IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA
-A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD
-VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS
-xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
-BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
-dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
-IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
-MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM
-BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
-AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi
-up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1
-mPnHfxsb1gYgAlihw6ID
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority
-=======================================================
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
-FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
-XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
-IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
-f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
-hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
-TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
-WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
-Tqj/ZA1k
------END CERTIFICATE-----
-
-Verisign Class 1 Public Primary Certification Authority - G2
-============================================================
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
-dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
-dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd
-k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq
-WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB
-MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM
-XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC
-lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ
------END CERTIFICATE-----
-
-Verisign Class 2 Public Primary Certification Authority - G2
-============================================================
------BEGIN CERTIFICATE-----
-MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h
-cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp
-Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
-c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h
-cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp
-Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
-c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx
-nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC
-wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA
-ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK
-1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk
-LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg==
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority - G2
-============================================================
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
-dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
-dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
-FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
-lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
-MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
-1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
-Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
------END CERTIFICATE-----
-
-GlobalSign Root CA
-==================
------BEGIN CERTIFICATE-----
-MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
-GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
-b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
-BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
-VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
-DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
-THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
-Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
-c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
-gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
-AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
-Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
-j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
-hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
-X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
------END CERTIFICATE-----
-
-GlobalSign Root CA - R2
-=======================
------BEGIN CERTIFICATE-----
-MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
-YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
-bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
-aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
-bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
-ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
-s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
-S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
-TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
-ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
-FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
-YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
-BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
-9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
-01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
-9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
-TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
------END CERTIFICATE-----
-
-ValiCert Class 1 VA
-===================
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
-b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
-bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy
-MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
-d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg
-UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
-LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi
-GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm
-DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG
-lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX
-icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP
-Orf1LXLI
------END CERTIFICATE-----
-
-ValiCert Class 2 VA
-===================
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
-b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
-bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
-MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
-d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg
-UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
-LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC
-CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf
-ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ
-SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV
-UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8
-W9ViH0Pd
------END CERTIFICATE-----
-
-RSA Root Certificate 1
-======================
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
-b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
-bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
-MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
-d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg
-UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
-LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td
-3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H
-BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs
-3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF
-V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r
-on+jjBXu
------END CERTIFICATE-----
-
-Verisign Class 1 Public Primary Certification Authority - G3
-============================================================
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
-dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E
-bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ
-rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+
-Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB
-FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
-q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N
-y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3
-ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h
-a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc
-D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==
------END CERTIFICATE-----
-
-Verisign Class 2 Public Primary Certification Authority - G3
-============================================================
------BEGIN CERTIFICATE-----
-MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y
-azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug
-b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0
-aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ
-BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
-c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y
-aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6
-tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7
-C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS
-0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs
-Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0
-JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf
-0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU
-sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx
-JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j
-GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority - G3
-============================================================
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
-dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
-EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
-cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
-EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
-055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
-ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
-j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
-/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
-xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
-t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
------END CERTIFICATE-----
-
-Verisign Class 4 Public Primary Certification Authority - G3
-============================================================
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
-dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
-tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
-8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
-Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
-Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
-j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
-mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
-fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
-RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
-UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
------END CERTIFICATE-----
-
-Entrust.net Secure Server CA
-============================
------BEGIN CERTIFICATE-----
-MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV
-BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg
-cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl
-ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG
-A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi
-eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p
-dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ
-aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5
-gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw
-ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw
-CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l
-dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
-bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
-dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw
-NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow
-HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA
-BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN
-Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9
-n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
------END CERTIFICATE-----
-
-Entrust.net Premium 2048 Secure Server CA
-=========================================
------BEGIN CERTIFICATE-----
-MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
-ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
-bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
-BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
-NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
-d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
-MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
-ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
-Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
-hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
-nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
-VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC
-AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER
-gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B
-AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
-oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS
-o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z
-2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX
-OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==
------END CERTIFICATE-----
-
-Baltimore CyberTrust Root
-=========================
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
-ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
-ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
-SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
-dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
-uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
-UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
-G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
-XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
-l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
-VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
-BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
-cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
-hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
-Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
-RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
------END CERTIFICATE-----
-
-Equifax Secure Global eBusiness CA
-==================================
------BEGIN CERTIFICATE-----
-MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp
-bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx
-HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds
-b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV
-PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN
-qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn
-hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
-BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs
-MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN
-I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY
-NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
------END CERTIFICATE-----
-
-Equifax Secure eBusiness CA 1
-=============================
------BEGIN CERTIFICATE-----
-MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB
-LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE
-ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz
-IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ
-1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a
-IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk
-MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW
-Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF
-AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5
-lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+
-KpYrtWKmpj29f5JZzVoqgrI3eQ==
------END CERTIFICATE-----
-
-Equifax Secure eBusiness CA 2
-=============================
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE
-ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y
-MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT
-DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB
-nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn
-2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5
-BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG
-A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx
-JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG
-A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e
-uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB
-Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1
-jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia
-78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm
-V+GRMOrN
------END CERTIFICATE-----
-
-AddTrust Low-Value Services Root
-================================
------BEGIN CERTIFICATE-----
-MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
-cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
-CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
-ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
-AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
-54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
-oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
-Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
-GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
-HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
-AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
-RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
-HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
-ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
-iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
-eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
-mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
-ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
------END CERTIFICATE-----
-
-AddTrust External Root
-======================
------BEGIN CERTIFICATE-----
-MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
-VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
-NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
-cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
-Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
-+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
-Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
-aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
-2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
-7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
-BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
-VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
-VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
-IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
-j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
-6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
-e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
-G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
------END CERTIFICATE-----
-
-AddTrust Public Services Root
-=============================
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
-cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
-BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
-dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
-nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
-d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
-Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
-HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
-A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
-FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
-A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
-JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
-+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
-GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
-Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
-EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
------END CERTIFICATE-----
-
-AddTrust Qualified Certificates Root
-====================================
------BEGIN CERTIFICATE-----
-MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
-cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
-CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
-IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
-64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
-KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
-L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
-wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
-MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
-BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
-BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
-azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
-ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
-GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
-dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
-RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
-iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
------END CERTIFICATE-----
-
-Entrust Root Certification Authority
-====================================
------BEGIN CERTIFICATE-----
-MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
-BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
-b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
-A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
-MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
-MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
-Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
-dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
-A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
-Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
-j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
-rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
-DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
-MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
-hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
-A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
-Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
-v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
-W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
-tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
------END CERTIFICATE-----
-
-RSA Security 2048 v3
-====================
------BEGIN CERTIFICATE-----
-MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
-ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
-MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
-BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
-Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
-WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
-KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
-+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
-MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
-FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
-v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
-0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
-VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
-nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
-pKnXwiJPZ9d37CAFYd4=
------END CERTIFICATE-----
-
-GeoTrust Global CA
-==================
------BEGIN CERTIFICATE-----
-MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
-Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
-MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
-LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
-BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
-8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
-T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
-vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
-AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
-DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
-zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
-d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
-mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
-XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
-Mw==
------END CERTIFICATE-----
-
-GeoTrust Global CA 2
-====================
------BEGIN CERTIFICATE-----
-MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
-R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
-MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
-LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
-NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
-LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
-Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
-HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
-MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
-K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
-srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
-ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
-OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
-x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
-H4z1Ir+rzoPz4iIprn2DQKi6bA==
------END CERTIFICATE-----
-
-GeoTrust Universal CA
-=====================
------BEGIN CERTIFICATE-----
-MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
-R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
-MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
-Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
-ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
-JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
-RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
-7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
-8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
-qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
-Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
-Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
-KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
-ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
-XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
-hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
-aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
-qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
-oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
-xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
-KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
-DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
-xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
-p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
-P/rmMuGNG2+k5o7Y+SlIis5z/iw=
------END CERTIFICATE-----
-
-GeoTrust Universal CA 2
-=======================
------BEGIN CERTIFICATE-----
-MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
-R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
-MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
-SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
-A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
-DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
-j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
-JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
-QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
-WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
-20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
-ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
-SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
-8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
-+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
-BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
-dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
-4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
-mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
-A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
-Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
-pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
-FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
-gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
-X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
------END CERTIFICATE-----
-
-UTN-USER First-Network Applications
-===================================
------BEGIN CERTIFICATE-----
-MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE
-BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
-IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp
-BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5
-WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T
-YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
-dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB
-cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug
-mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj
-DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu
-Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi
-P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE
-j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w
-HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j
-cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G
-CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y
-IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK
-RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp
-xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq
-DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE
------END CERTIFICATE-----
-
-America Online Root Certification Authority 1
-=============================================
------BEGIN CERTIFICATE-----
-MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG
-A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
-T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG
-v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z
-DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh
-sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP
-8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T
-AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z
-o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf
-GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF
-VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft
-3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g
-Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
-sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
------END CERTIFICATE-----
-
-America Online Root Certification Authority 2
-=============================================
------BEGIN CERTIFICATE-----
-MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG
-A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
-T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD
-ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en
-fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8
-f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO
-qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN
-RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0
-gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn
-6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid
-FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6
-Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj
-B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op
-aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
-AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY
-T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p
-+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg
-JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy
-zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO
-ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh
-1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf
-GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff
-Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP
-cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk=
------END CERTIFICATE-----
-
-Visa eCommerce Root
-===================
------BEGIN CERTIFICATE-----
-MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
-EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
-QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
-WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
-VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
-bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
-F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
-RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
-TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
-/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
-GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
-MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
-CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
-YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
-zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
-YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
-398znM/jra6O1I7mT1GvFpLgXPYHDw==
------END CERTIFICATE-----
-
-Certum Root CA
-==============
------BEGIN CERTIFICATE-----
-MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
-ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
-Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
-by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
-wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
-kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
-89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
-Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
-NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
-hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
-GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
-GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
-0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
-qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
------END CERTIFICATE-----
-
-Comodo AAA Services root
-========================
------BEGIN CERTIFICATE-----
-MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
-R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
-TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
-MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
-c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
-BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
-C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
-i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
-Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
-Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
-Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
-BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
-cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
-LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
-7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
-Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
-8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
-12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
------END CERTIFICATE-----
-
-Comodo Secure Services root
-===========================
------BEGIN CERTIFICATE-----
-MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
-R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
-TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
-MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
-Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
-BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
-9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
-rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
-oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
-p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
-FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
-gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
-YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
-aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
-4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
-Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
-DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
-pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
-RR3B7Hzs/Sk=
------END CERTIFICATE-----
-
-Comodo Trusted Services root
-============================
------BEGIN CERTIFICATE-----
-MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
-R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
-TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
-MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
-bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
-IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
-3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
-/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
-juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
-ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
-DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
-ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
-cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
-uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
-pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
-BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
-R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
-9y5Xt5hwXsjEeLBi
------END CERTIFICATE-----
-
-QuoVadis Root CA
-================
------BEGIN CERTIFICATE-----
-MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
-ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
-eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
-MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
-cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
-EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
-J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
-F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
-YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
-AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
-PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
-ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
-MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
-YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
-ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
-Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
-Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
-BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
-FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
-tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
-fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
-LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
-gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
-5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
-5nrQNiOKSnQ2+Q==
------END CERTIFICATE-----
-
-QuoVadis Root CA 2
-==================
------BEGIN CERTIFICATE-----
-MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
-EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
-ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
-aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
-DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
-XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
-lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
-lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
-lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
-66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
-wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
-D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
-BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
-J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
-DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
-a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
-ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
-Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
-UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
-VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
-+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
-IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
-WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
-f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
-4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
-VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
------END CERTIFICATE-----
-
-QuoVadis Root CA 3
-==================
------BEGIN CERTIFICATE-----
-MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
-EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
-OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
-aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
-DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
-DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
-KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
-DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
-BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
-p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
-nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
-MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
-Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
-uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
-BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
-YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
-aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
-BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
-VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
-ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
-AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
-qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
-hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
-POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
-Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
-8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
-bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
-g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
-vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
-qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
------END CERTIFICATE-----
-
-Security Communication Root CA
-==============================
------BEGIN CERTIFICATE-----
-MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
-U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
-HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
-U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
-8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
-DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
-5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
-DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
-JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
-DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
-0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
-mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
-s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
-6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
-FL39vmwLAw==
------END CERTIFICATE-----
-
-Sonera Class 1 Root CA
-======================
------BEGIN CERTIFICATE-----
-MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
-U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw
-NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
-IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88
-7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9
-EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl
-0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645
-2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa
-HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT
-iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9
-28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV
-yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR
-vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P
-qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z
-IRlXvVWa
------END CERTIFICATE-----
-
-Sonera Class 2 Root CA
-======================
------BEGIN CERTIFICATE-----
-MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
-U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
-NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
-IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
-/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
-dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
-f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
-tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
-nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
-XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
-0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
-cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
-Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
-EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
-llpwrN9M
------END CERTIFICATE-----
-
-Staat der Nederlanden Root CA
-=============================
------BEGIN CERTIFICATE-----
-MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
-ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
-Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
-HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
-bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
-vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
-jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
-C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
-vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
-22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
-HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
-dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
-BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
-EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
-MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
-nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
-iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
------END CERTIFICATE-----
-
-TDC Internet Root CA
-====================
------BEGIN CERTIFICATE-----
-MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE
-ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx
-NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu
-ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j
-xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL
-znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc
-5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6
-otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI
-AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM
-VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM
-MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC
-AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe
-UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G
-CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m
-gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
-2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb
-O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU
-Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l
------END CERTIFICATE-----
-
-TDC OCES Root CA
-================
------BEGIN CERTIFICATE-----
-MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE
-ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5
-MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB
-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH
-nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0
-zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV
-iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde
-dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO
-3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB
-5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k
-ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm
-cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp
-Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x
-LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM
-MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm
-aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy
-MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647
-+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6
-NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4
-A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc
-A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9
-AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1
-AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw==
------END CERTIFICATE-----
-
-UTN DATACorp SGC Root CA
-========================
------BEGIN CERTIFICATE-----
-MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE
-BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
-IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ
-BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa
-MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w
-HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy
-dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys
-raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo
-wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA
-9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv
-33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud
-DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9
-BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD
-LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
-DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
-Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0
-I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx
-EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP
-DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
------END CERTIFICATE-----
-
-UTN USERFirst Email Root CA
-===========================
------BEGIN CERTIFICATE-----
-MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE
-BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
-IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0
-BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05
-OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx
-FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx
-ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz
-dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx
-B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8
-om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG
-TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl
-yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE
-AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV
-HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll
-bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH
-AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne
-xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+
-5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV
-NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ
-w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ=
------END CERTIFICATE-----
-
-UTN USERFirst Hardware Root CA
-==============================
------BEGIN CERTIFICATE-----
-MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
-BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
-IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
-BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
-OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
-eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
-ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
-wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
-tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
-i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
-Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
-gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
-lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
-UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
-BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
-//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
-XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
-lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
-iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
-nfhmqA==
------END CERTIFICATE-----
-
-UTN USERFirst Object Root CA
-============================
------BEGIN CERTIFICATE-----
-MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE
-BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
-IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb
-BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz
-NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx
-HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy
-dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB
-BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR
-loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ
-w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu
-lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7
-RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL
-BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8
-ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly
-c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw
-DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw
-NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO
-PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE
-qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG
-hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g=
------END CERTIFICATE-----
-
-Camerfirma Chambers of Commerce Root
-====================================
------BEGIN CERTIFICATE-----
-MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
-QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
-ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
-NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
-cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
-MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
-AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
-xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
-NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
-DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
-d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
-EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
-cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
-AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
-bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
-VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
-aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
-fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
-L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
-UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
-ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
-erfutGWaIZDgqtCYvDi1czyL+Nw=
------END CERTIFICATE-----
-
-Camerfirma Global Chambersign Root
-==================================
------BEGIN CERTIFICATE-----
-MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
-QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
-ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
-NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
-YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
-MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
-ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
-1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
-by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
-6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
-8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
-BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
-aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
-Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
-aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
-ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
-bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
-PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
-gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
-PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
-IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
-t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
------END CERTIFICATE-----
-
-NetLock Qualified (Class QA) Root
-=================================
------BEGIN CERTIFICATE-----
-MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
-CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
-BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn
-eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0
-bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER
-MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0
-LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0
-dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP
-aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV
-CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e
-8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb
-m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ
-0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM
-0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
-HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2
-YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh
-biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p
-a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz
-YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg
-YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg
-ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov
-L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr
-Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0
-aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg
-YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0
-IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3
-DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN
-wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg
-W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc
-R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR
-5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko
------END CERTIFICATE-----
-
-NetLock Notary (Class A) Root
-=============================
------BEGIN CERTIFICATE-----
-MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
-EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
-dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
-ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
-DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
-EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
-VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
-cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
-D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
-z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
-/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
-tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
-4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
-A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
-Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
-bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
-IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
-LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
-ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
-IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
-IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
-b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
-bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
-Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
-bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
-ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
-ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
-CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
-KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
-8CgHrTwXZoi1/baI
------END CERTIFICATE-----
-
-NetLock Business (Class B) Root
-===============================
------BEGIN CERTIFICATE-----
-MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
-CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
-BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg
-VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD
-VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv
-bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg
-VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
-iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S
-o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr
-1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
-HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ
-RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh
-dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0
-ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv
-c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg
-YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
-c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz
-Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA
-bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl
-IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2
-YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj
-cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM
-43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR
-stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI
------END CERTIFICATE-----
-
-NetLock Express (Class C) Root
-==============================
------BEGIN CERTIFICATE-----
-MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT
-CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
-BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD
-KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ
-BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
-dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j
-ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB
-jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z
-W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63
-euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw
-DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN
-RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn
-YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB
-IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i
-aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0
-ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
-ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo
-dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y
-emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k
-IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ
-UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg
-YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2
-xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW
-gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A==
------END CERTIFICATE-----
-
-XRamp Global CA Root
-====================
------BEGIN CERTIFICATE-----
-MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
-BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
-dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
-HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
-U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
-IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
-foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
-zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
-AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
-xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
-EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
-oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
-AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
-/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
-qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
-nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
-8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
------END CERTIFICATE-----
-
-Go Daddy Class 2 CA
-===================
------BEGIN CERTIFICATE-----
-MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
-VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
-A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
-RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
-ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
-2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
-qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
-YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
-vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
-BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
-atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
-MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
-A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
-PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
-I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
-HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
-Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
-vZ8=
------END CERTIFICATE-----
-
-Starfield Class 2 CA
-====================
------BEGIN CERTIFICATE-----
-MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
-U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
-MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
-A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
-SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
-bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
-JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
-epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
-F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
-MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
-hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
-bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
-QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
-afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
-PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
-xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
-KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
-QBFGmh95DmK/D5fs4C8fF5Q=
------END CERTIFICATE-----
-
-StartCom Certification Authority
-================================
------BEGIN CERTIFICATE-----
-MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
-U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
-ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
-NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
-LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
-U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
-ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
-o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
-Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
-eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
-2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
-6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
-osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
-untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
-UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
-37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
-FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
-Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
-YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
-AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
-Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
-U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
-LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
-cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
-dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
-AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
-3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
-vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
-fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
-fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
-EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
-yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
-1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
-lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
-g14=
------END CERTIFICATE-----
-
-Taiwan GRCA
-===========
------BEGIN CERTIFICATE-----
-MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
-EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
-DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
-dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
-ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
-w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
-BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
-1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
-htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
-J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
-Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
-B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
-O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
-lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
-HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
-09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
-TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
-Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
-Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
-D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
-DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
-Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
-7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
-CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
-+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
------END CERTIFICATE-----
-
-Firmaprofesional Root CA
-========================
------BEGIN CERTIFICATE-----
-MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT
-GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp
-Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA
-ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL
-MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT
-OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2
-ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB
-AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V
-j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH
-lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf
-3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8
-NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww
-KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG
-AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud
-DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD
-ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq
-u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf
-wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm
-7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG
-VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA=
------END CERTIFICATE-----
-
-Wells Fargo Root CA
-===================
------BEGIN CERTIFICATE-----
-MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV
-BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
-MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl
-bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv
-MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX
-x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3
-E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5
-OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j
-sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj
-YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF
-BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD
-ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv
-m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R
-OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx
-x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023
-tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=
------END CERTIFICATE-----
-
-Swisscom Root CA 1
-==================
------BEGIN CERTIFICATE-----
-MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG
-EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
-dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4
-MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
-aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC
-IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM
-MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF
-NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe
-AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC
-b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn
-7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN
-cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp
-WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5
-haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY
-MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
-HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
-BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9
-MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn
-jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ
-MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H
-VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl
-vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl
-OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3
-1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq
-nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy
-x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW
-NY6E0F/6MBr1mmz0DlP5OlvRHA==
------END CERTIFICATE-----
-
-DigiCert Assured ID Root CA
-===========================
------BEGIN CERTIFICATE-----
-MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
-IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
-MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
-ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
-9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
-UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
-/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
-oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
-GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
-66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
-hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
-EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
-SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
-8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
-+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
------END CERTIFICATE-----
-
-DigiCert Global Root CA
-=======================
------BEGIN CERTIFICATE-----
-MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
-HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
-MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
-dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
-TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
-BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
-4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
-7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
-o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
-8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
-BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
-EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
-tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
-UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
-CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
------END CERTIFICATE-----
-
-DigiCert High Assurance EV Root CA
-==================================
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
-KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
-MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
-MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
-Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
-Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
-OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
-MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
-NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
-h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
-Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
-JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
-V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
-myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
-mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
-vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
------END CERTIFICATE-----
-
-Certplus Class 2 Primary CA
-===========================
------BEGIN CERTIFICATE-----
-MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
-BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
-OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
-dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
-5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
-Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
-YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
-e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
-CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
-YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
-L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
-P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
-TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
-7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
-//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
-l7+ijrRU
------END CERTIFICATE-----
-
-DST Root CA X3
-==============
------BEGIN CERTIFICATE-----
-MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
-ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
-DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
-cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
-rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
-UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
-xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
-utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
-AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
-MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
-dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
-GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
-RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
-fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
------END CERTIFICATE-----
-
-DST ACES CA X6
-==============
------BEGIN CERTIFICATE-----
-MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
-EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
-MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
-MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
-CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
-DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
-pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
-GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
-MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
-EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
-Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
-dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
-CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
-5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
-Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
-nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
-vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
-oKfN5XozNmr6mis=
------END CERTIFICATE-----
-
-TURKTRUST Certificate Services Provider Root 1
-==============================================
------BEGIN CERTIFICATE-----
-MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
-bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP
-MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0
-acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx
-MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg
-U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB
-TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC
-aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX
-yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i
-Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ
-8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4
-W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME
-BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46
-sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE
-q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
-B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY
-nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H
------END CERTIFICATE-----
-
-TURKTRUST Certificate Services Provider Root 2
-==============================================
------BEGIN CERTIFICATE-----
-MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF
-bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
-MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
-QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN
-MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr
-dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G
-A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
-acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe
-LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI
-x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g
-QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr
-5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB
-AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G
-A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
-Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
-Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+
-hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P
-9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5
-UrbnBEI=
------END CERTIFICATE-----
-
-SwissSign Platinum CA - G2
-==========================
------BEGIN CERTIFICATE-----
-MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCQ0gxFTAT
-BgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWduIFBsYXRpbnVtIENBIC0gRzIw
-HhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAwWjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMM
-U3dpc3NTaWduIEFHMSMwIQYDVQQDExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJ
-KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu
-669yIIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2HtnIuJpX+UF
-eNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+6ixuEFGSzH7VozPY1kne
-WCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5objM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIo
-j5+saCB9bzuohTEJfwvH6GXp43gOCWcwizSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/6
-8++QHkwFix7qepF6w9fl+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34T
-aNhxKFrYzt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaPpZjy
-domyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtFKwH3HBqi7Ri6Cr2D
-+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuWae5ogObnmLo2t/5u7Su9IPhlGdpV
-CX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMBAAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
-EwEB/wQFMAMBAf8wHQYDVR0OBBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCv
-zAeHFUdvOMW0ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW
-IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUAA4ICAQAIhab1
-Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0uMoI3LQwnkAHFmtllXcBrqS3
-NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4
-U99REJNi54Av4tHgvI42Rncz7Lj7jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8
-KV2LwUvJ4ooTHbG/u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl
-9x8DYSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1puEa+S1B
-aYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXaicYwu+uPyyIIoK6q8QNs
-OktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbGDI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSY
-Mdp08YSTcU1f+2BY0fvEwW2JorsgH51xkcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAci
-IfNAChs0B0QTwoRqjt8ZWr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g==
------END CERTIFICATE-----
-
-SwissSign Gold CA - G2
-======================
------BEGIN CERTIFICATE-----
-MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
-EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
-MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
-c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
-t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
-jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
-vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
-ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
-AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
-jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
-peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
-7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
-GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
-OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
-L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
-5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
-44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
-Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
-Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
-mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
-vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
-KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
-NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
-viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
------END CERTIFICATE-----
-
-SwissSign Silver CA - G2
-========================
------BEGIN CERTIFICATE-----
-MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
-BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
-DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
-aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
-9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
-N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
-+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
-6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
-MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
-qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
-FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
-ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
-celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
-CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
-BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
-tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
-cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
-4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
-kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
-3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
-/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
-DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
-e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
-WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
-DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
-DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
------END CERTIFICATE-----
-
-GeoTrust Primary Certification Authority
-========================================
------BEGIN CERTIFICATE-----
-MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
-EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
-CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
-cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
-b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
-nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
-RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
-tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
-AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
-hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
-Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
-NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
-Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
-1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
------END CERTIFICATE-----
-
-thawte Primary Root CA
-======================
------BEGIN CERTIFICATE-----
-MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
-BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
-aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
-MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
-SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
-KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
-FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
-oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
-1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
-q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
-aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
-afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
-VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
-AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
-uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
-xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
-jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
-z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
------END CERTIFICATE-----
-
-VeriSign Class 3 Public Primary Certification Authority - G5
-============================================================
------BEGIN CERTIFICATE-----
-MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
-BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
-ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
-IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
-yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
-biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
-dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
-YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
-j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
-Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
-Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
-fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
-BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
-Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
-aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
-SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
-X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
-KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
-Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
-ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
------END CERTIFICATE-----
-
-SecureTrust CA
-==============
------BEGIN CERTIFICATE-----
-MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
-EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
-dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
-BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
-ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
-OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
-DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
-GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
-01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
-ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
-BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
-aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
-KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
-SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
-mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
-nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
-3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
------END CERTIFICATE-----
-
-Secure Global CA
-================
------BEGIN CERTIFICATE-----
-MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
-EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
-bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
-MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
-Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
-YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
-bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
-8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
-HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
-0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
-EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
-oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
-MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
-OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
-CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
-3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
-f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
------END CERTIFICATE-----
-
-COMODO Certification Authority
-==============================
------BEGIN CERTIFICATE-----
-MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
-BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
-A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
-dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
-MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
-T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
-+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
-xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
-4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
-1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
-rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
-BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
-b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
-AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
-OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
-RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
-IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
-+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
------END CERTIFICATE-----
-
-Network Solutions Certificate Authority
-=======================================
------BEGIN CERTIFICATE-----
-MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
-EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
-IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
-MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
-MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
-jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
-aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
-crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
-/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
-AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
-bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
-A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
-4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
-GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
-wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
-ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
------END CERTIFICATE-----
-
-WellsSecure Public Root Certificate Authority
-=============================================
------BEGIN CERTIFICATE-----
-MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
-F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
-NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
-MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
-bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
-VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
-iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
-i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
-bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
-K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
-AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
-cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
-lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
-i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
-GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
-Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
-K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
-bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
-qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
-E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
-tylv2G0xffX8oRAHh84vWdw+WNs=
------END CERTIFICATE-----
-
-COMODO ECC Certification Authority
-==================================
------BEGIN CERTIFICATE-----
-MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
-R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
-ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
-GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
-Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
-b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
-4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
-wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
-BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
-FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
-U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
------END CERTIFICATE-----
-
-IGC/A
-=====
------BEGIN CERTIFICATE-----
-MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
-VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
-Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
-MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
-EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
-STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
-TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
-So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
-HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
-frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
-tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
-egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
-iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
-q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
-MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
-Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
-lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
-0mBWWg==
------END CERTIFICATE-----
-
-Security Communication EV RootCA1
-=================================
------BEGIN CERTIFICATE-----
-MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
-U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
-dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
-BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
-Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
-/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
-WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
-ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
-bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
-9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
-SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
-iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
-Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
-mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
-T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
------END CERTIFICATE-----
-
-OISTE WISeKey Global Root GA CA
-===============================
------BEGIN CERTIFICATE-----
-MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
-BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
-A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
-bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
-VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
-IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
-IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
-Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
-Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
-d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
-/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
-LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
-KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
-MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
-+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
-hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
-okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
------END CERTIFICATE-----
-
-S-TRUST Authentication and Encryption Root CA 2005 PN
-=====================================================
------BEGIN CERTIFICATE-----
-MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE
-BhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcpMRIwEAYDVQQHEwlTdHV0dGdh
-cnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fzc2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVT
-LVRSVVNUIEF1dGhlbnRpY2F0aW9uIGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0w
-NTA2MjIwMDAwMDBaFw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFk
-ZW4tV3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMgRGV1dHNj
-aGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJVU1QgQXV0aGVudGljYXRp
-b24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob
-4QSwI7+Vio5bG0F/WsPoTUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXL
-g3KSwlOyggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1Xgqf
-eN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteFhy+S8dF2g08LOlk3
-KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm7QIDAQABo4GSMIGPMBIGA1UdEwEB
-/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJv
-bmxpbmUxLTIwNDgtNTAdBgNVHQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAU
-D8oeXHngovMpttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD
-pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFoLtU96G7m1R08
-P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersFiXOMy6ZNwPv2AtawB6MDwidA
-nwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0yh9WUUpY6RsZxlj33mA6ykaqP2vROJAA5Veit
-F7nTNCtKqUDMFypVZUF0Qn71wK/Ik63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8b
-Hz2eBIPdltkdOpQ=
------END CERTIFICATE-----
-
-Microsec e-Szigno Root CA
-=========================
------BEGIN CERTIFICATE-----
-MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
-BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
-EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
-MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
-dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
-GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
-AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
-d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
-oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
-QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
-PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
-MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
-IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
-VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
-LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
-dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
-AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
-4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
-AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
-egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
-Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
-PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
-c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
-cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
-IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
-WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
-MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
-MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
-Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
-HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
-nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
-aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
-86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
-yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
-S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
------END CERTIFICATE-----
-
-Certigna
-========
------BEGIN CERTIFICATE-----
-MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
-EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
-MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
-Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
-XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
-GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
-ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
-DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
-Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
-tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
-BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
-SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
-hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
-ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
-PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
-1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
-WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
------END CERTIFICATE-----
-
-AC Ra\xC3\xADz Certic\xC3\xA1mara S.A.
-======================================
------BEGIN CERTIFICATE-----
-MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT
-AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg
-LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w
-HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+
-U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh
-IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN
-yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU
-2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3
-4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP
-2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm
-8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf
-HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa
-Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK
-5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b
-czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
-AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g
-ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF
-BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug
-cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf
-AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX
-EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v
-/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3
-MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4
-3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk
-eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f
-/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h
-RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU
-Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ==
------END CERTIFICATE-----
-
-TC TrustCenter Class 2 CA II
-============================
------BEGIN CERTIFICATE-----
-MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
-IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw
-MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
-c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE
-AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw
-IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2
-xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ
-Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u
-SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB
-7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
-Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
-cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
-SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
-TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G
-dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ
-KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj
-TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP
-JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk
-vQ==
------END CERTIFICATE-----
-
-TC TrustCenter Class 3 CA II
-============================
------BEGIN CERTIFICATE-----
-MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
-IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw
-MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
-c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE
-AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W
-yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo
-6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ
-uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk
-2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB
-7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
-Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
-cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
-SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
-TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE
-O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8
-yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9
-IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal
-092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc
-5A==
------END CERTIFICATE-----
-
-TC TrustCenter Universal CA I
-=============================
------BEGIN CERTIFICATE-----
-MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
-IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN
-MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg
-VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw
-JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC
-qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv
-xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw
-ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O
-gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j
-BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG
-1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy
-vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3
-ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
-ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a
-7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
------END CERTIFICATE-----
-
-Deutsche Telekom Root CA 2
-==========================
------BEGIN CERTIFICATE-----
-MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
-RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
-A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
-MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
-A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
-b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
-bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
-KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
-AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
-Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
-jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
-HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
-E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
-zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
-rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
-dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
-Cm26OWMohpLzGITY+9HPBVZkVw==
------END CERTIFICATE-----
-
-ComSign CA
-==========
------BEGIN CERTIFICATE-----
-MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0MRMwEQYDVQQD
-EwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTMy
-MThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMTCkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNp
-Z24xCzAJBgNVBAYTAklMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49q
-ROR+WCf4C9DklBKK8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTy
-P2Q298CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb2CEJKHxN
-GGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxCejVb7Us6eva1jsz/D3zk
-YDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7KpiXd3DTKaCQeQzC6zJMw9kglcq/QytNuEM
-rkvF7zuZ2SOzW120V+x0cAwqTwIDAQABo4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAy
-oDCgLoYsaHR0cDovL2ZlZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0P
-AQH/BAQDAgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRLAZs+
-VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWdfoPPbrxHbvUanlR2
-QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0McXS6hMTXcpuEfDhOZAYnKuGntewI
-mbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb
-/627HOkthIDYIb6FUtnUdLlphbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VG
-zT2ouvDzuFYkRes3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U
-AGegcQCCSA==
------END CERTIFICATE-----
-
-ComSign Secured CA
-==================
------BEGIN CERTIFICATE-----
-MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE
-AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w
-NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD
-QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs
-49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH
-7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB
-kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1
-9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw
-AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t
-U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA
-j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC
-AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a
-BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp
-FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP
-51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
-OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
------END CERTIFICATE-----
-
-Cybertrust Global Root
-======================
------BEGIN CERTIFICATE-----
-MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
-ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
-MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
-ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
-+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
-0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
-AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
-89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
-8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
-MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
-A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
-lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
-5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
-hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
-X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
-WL1WMRJOEcgh4LMRkWXbtKaIOM5V
------END CERTIFICATE-----
-
-ePKI Root Certification Authority
-=================================
------BEGIN CERTIFICATE-----
-MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
-EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
-Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
-MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
-MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
-IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
-lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
-qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
-12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
-WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
-ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
-lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
-vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
-Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
-MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
-ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
-1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
-KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
-xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
-NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
-GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
-xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
-gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
-sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
-BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
------END CERTIFICATE-----
-
-T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3
-=============================================================================================================================
------BEGIN CERTIFICATE-----
-MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
-DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
-aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
-b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
-BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
-S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
-MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
-IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
-n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
-IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
-dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
-cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
-Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
-xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
-6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
-hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
-BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
-MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
-N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
-y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
-LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
-dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
------END CERTIFICATE-----
-
-Buypass Class 2 CA 1
-====================
------BEGIN CERTIFICATE-----
-MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
-QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
-MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
-c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
-cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
-0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
-0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
-uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
-AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
-1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
-7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
-fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
-wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
------END CERTIFICATE-----
-
-Buypass Class 3 CA 1
-====================
------BEGIN CERTIFICATE-----
-MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
-QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1
-MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
-c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx
-ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0
-n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia
-AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c
-1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P
-AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7
-pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA
-EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5
-htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj
-el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
------END CERTIFICATE-----
-
-EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
-==========================================================================
------BEGIN CERTIFICATE-----
-MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF
-bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg
-QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe
-Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p
-ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt
-IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by
-X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b
-gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr
-eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ
-TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy
-Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn
-uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI
-qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm
-ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0
-Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
-/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW
-Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t
-FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm
-zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k
-XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT
-bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU
-RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK
-1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt
-2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ
-Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9
-AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
------END CERTIFICATE-----
-
-certSIGN ROOT CA
-================
------BEGIN CERTIFICATE-----
-MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
-VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
-Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
-CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
-JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
-rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
-ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
-0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
-AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
-Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
-AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
-SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
-x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
-vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
-TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
------END CERTIFICATE-----
-
-CNNIC ROOT
-==========
------BEGIN CERTIFICATE-----
-MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
-ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
-OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
-o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
-VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
-VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
-czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
-y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
-wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
-lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
-Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
-O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
-BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
-G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
-mxE=
------END CERTIFICATE-----
-
-ApplicationCA - Japanese Government
-===================================
------BEGIN CERTIFICATE-----
-MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
-SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
-MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
-cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
-fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
-wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
-jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
-nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
-WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
-BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
-vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
-o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
-/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
-io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
-dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
-rosot4LKGAfmt1t06SAZf7IbiVQ=
------END CERTIFICATE-----
-
-GeoTrust Primary Certification Authority - G3
-=============================================
------BEGIN CERTIFICATE-----
-MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
-BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
-IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
-NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
-YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
-LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
-K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
-c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
-IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
-dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
-2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
-cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
-Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
-AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
-t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
------END CERTIFICATE-----
-
-thawte Primary Root CA - G2
-===========================
------BEGIN CERTIFICATE-----
-MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
-VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
-IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
-Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
-MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
-b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
-IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
-LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
-8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
-mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
-G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
-rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
------END CERTIFICATE-----
-
-thawte Primary Root CA - G3
-===========================
------BEGIN CERTIFICATE-----
-MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
-BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
-aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
-ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
-d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
-VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
-A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
-P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
-+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
-7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
-vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
-BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
-KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
-A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
-t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
-8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
-er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
------END CERTIFICATE-----
-
-GeoTrust Primary Certification Authority - G2
-=============================================
------BEGIN CERTIFICATE-----
-MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
-VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
-Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
-OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
-MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
-b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
-BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
-KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
-VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
-EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
-ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
-npaqBA+K
------END CERTIFICATE-----
-
-VeriSign Universal Root Certification Authority
-===============================================
------BEGIN CERTIFICATE-----
-MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
-BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
-ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
-IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
-IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
-1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
-MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
-9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
-AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
-tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
-CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
-a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
-DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
-Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
-Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
-P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
-wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
-mJO37M2CYfE45k+XmCpajQ==
------END CERTIFICATE-----
-
-VeriSign Class 3 Public Primary Certification Authority - G4
-============================================================
------BEGIN CERTIFICATE-----
-MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
-VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
-b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
-ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
-MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
-cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
-b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
-Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
-rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
-/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
-HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
-Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
-A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
-AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
------END CERTIFICATE-----
-
-NetLock Arany (Class Gold) Főtanúsítvány
-============================================
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
-A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
-dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
-cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
-MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
-ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
-biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
-c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
-0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
-/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
-H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
-fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
-neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
-BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
-qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
-YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
-bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
-NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
-dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
------END CERTIFICATE-----
-
-Staat der Nederlanden Root CA - G2
-==================================
------BEGIN CERTIFICATE-----
-MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
-CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
-Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
-TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
-ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
-5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
-vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
-CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
-e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
-OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
-CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
-48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
-trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
-qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
-AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
-ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
-HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
-A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
-+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
-f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
-kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
-CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
-URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
-CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
-oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
-IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
-66+KAQ==
------END CERTIFICATE-----
-
-CA Disig
-========
------BEGIN CERTIFICATE-----
-MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK
-QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw
-MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz
-bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm
-GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD
-Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo
-hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt
-ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w
-gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P
-AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz
-aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff
-ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa
-BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t
-WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3
-mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
-CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K
-ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA
-4Z7CRneC9VkGjCFMhwnN5ag=
------END CERTIFICATE-----
-
-Juur-SK
-=======
------BEGIN CERTIFICATE-----
-MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA
-c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw
-DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG
-SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy
-aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf
-TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC
-+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw
-UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa
-Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF
-MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD
-HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh
-AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA
-cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr
-AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw
-cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
-FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G
-A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo
-ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL
-abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678
-IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh
-Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2
-yyqcjg==
------END CERTIFICATE-----
-
-Hongkong Post Root CA 1
-=======================
------BEGIN CERTIFICATE-----
-MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
-DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
-NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
-IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
-ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
-auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
-qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
-V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
-HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
-h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
-l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
-IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
-T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
-c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
------END CERTIFICATE-----
-
-SecureSign RootCA11
-===================
------BEGIN CERTIFICATE-----
-MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
-SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
-b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
-KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
-cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
-TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
-wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
-g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
-O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
-bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
-t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
-OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
-bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
-Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
-y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
-lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
------END CERTIFICATE-----
-
-ACEDICOM Root
-=============
------BEGIN CERTIFICATE-----
-MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD
-T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4
-MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG
-A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF
-AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk
-WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD
-YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew
-MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb
-m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk
-HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT
-xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2
-3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9
-2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq
-TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz
-4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU
-9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
-bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg
-aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP
-eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk
-zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1
-ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI
-KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq
-nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE
-I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp
-MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o
-tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==
------END CERTIFICATE-----
-
-Verisign Class 1 Public Primary Certification Authority
-=======================================================
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
-FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
-XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAx
-IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0fzGVuDLDQ
-VoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHiTkVWaR94AoDa3EeRKbs2
-yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFgVKTk8d6Pa
-XCUDfGD67gmZPCcQcMgMCeazh88K4hiWNWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n
-0a3hUKw8fGJLj7qE1xIVGx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZ
-RjXZ+Hxb
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority
-=======================================================
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
-FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
-XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
-IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
-f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
-hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky
-CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX
-bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/
-D/xwzoiQ
------END CERTIFICATE-----
-
-Microsec e-Szigno Root CA 2009
-==============================
------BEGIN CERTIFICATE-----
-MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
-MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
-c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
-dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
-BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
-U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
-DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
-fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
-0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
-pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
-1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
-AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
-QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
-FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
-lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
-I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
-tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
-yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
-LXpUq3DDfSJlgnCW
------END CERTIFICATE-----
-
-E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi
-===================================================
------BEGIN CERTIFICATE-----
-MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
-EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz
-ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3
-MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0
-cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u
-aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY
-8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y
-jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI
-JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk
-9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD
-AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG
-SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d
-F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq
-D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4
-Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq
-fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX
------END CERTIFICATE-----
-
-GlobalSign Root CA - R3
-=======================
------BEGIN CERTIFICATE-----
-MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
-YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
-bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
-aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
-bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
-iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
-0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
-rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
-OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
-xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
-FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
-lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
-EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
-bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
-YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
-kpeDMdmztcpHWD9f
------END CERTIFICATE-----
-
-TC TrustCenter Universal CA III
-===============================
------BEGIN CERTIFICATE-----
-MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
-IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe
-Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU
-QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex
-KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB
-AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt
-QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO
-juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut
-CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1
-M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G
-A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
-BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA
-g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+
-KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK
-BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV
-CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq
-woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==
------END CERTIFICATE-----
-
-Autoridad de Certificacion Firmaprofesional CIF A62634068
-=========================================================
------BEGIN CERTIFICATE-----
-MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
-BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
-MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
-QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
-NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
-Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
-B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
-7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
-ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
-plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
-MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
-LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
-bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
-vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
-EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
-DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
-cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
-bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
-ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
-51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
-R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
-T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
-Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
-osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
-crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
-saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
-KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
-6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
------END CERTIFICATE-----
-
-Izenpe.com
-==========
------BEGIN CERTIFICATE-----
-MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
-EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
-MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
-QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
-03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
-ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
-+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
-PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
-OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
-F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
-0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
-0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
-leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
-AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
-SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
-NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
-MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
-BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
-Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
-kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
-hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
-g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
-aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
-nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
-ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
-Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
-WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
------END CERTIFICATE-----
-
-Chambers of Commerce Root - 2008
-================================
------BEGIN CERTIFICATE-----
-MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
-MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
-bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
-QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
-Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
-ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
-EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
-cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
-AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
-XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
-h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
-ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
-NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
-D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
-lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
-0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
-ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
-EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
-G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
-BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
-bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
-bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
-CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
-AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
-wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
-3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
-RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
-M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
-YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
-9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
-zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
-nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
-OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
------END CERTIFICATE-----
-
-Global Chambersign Root - 2008
-==============================
------BEGIN CERTIFICATE-----
-MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
-MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
-bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
-QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
-NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
-Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
-QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
-aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
-VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
-XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
-ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
-/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
-TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
-H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
-Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
-HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
-wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
-AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
-BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
-BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
-aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
-aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
-1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
-dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
-/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
-ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
-dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
-9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
-foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
-qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
-P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
-c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
-09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
------END CERTIFICATE-----
-
-Go Daddy Root Certificate Authority - G2
-========================================
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
-B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
-MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
-MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
-b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
-A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
-9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
-+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
-fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
-NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
-BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
-vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
-5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
-N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
-LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
------END CERTIFICATE-----
-
-Starfield Root Certificate Authority - G2
-=========================================
------BEGIN CERTIFICATE-----
-MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
-B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
-b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
-eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
-DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
-VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
-dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
-W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
-bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
-N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
-ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
-JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
-TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
-4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
-F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
-pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
-c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
------END CERTIFICATE-----
-
-Starfield Services Root Certificate Authority - G2
-==================================================
------BEGIN CERTIFICATE-----
-MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
-B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
-b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
-IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
-BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
-dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
-Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
-h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
-hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
-LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
-rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
-AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
-SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
-E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
-xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
-iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
-YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
------END CERTIFICATE-----
-
-AffirmTrust Commercial
-======================
------BEGIN CERTIFICATE-----
-MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
-BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
-MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
-bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
-DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
-C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
-BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
-MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
-HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
-hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
-qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
-0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
-sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
------END CERTIFICATE-----
-
-AffirmTrust Networking
-======================
------BEGIN CERTIFICATE-----
-MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
-BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
-MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
-bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
-Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
-dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
-/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
-h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
-HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
-UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
-12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
-WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
-/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
------END CERTIFICATE-----
-
-AffirmTrust Premium
-===================
------BEGIN CERTIFICATE-----
-MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
-BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
-OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
-dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
-MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
-BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
-5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
-+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
-GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
-p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
-S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
-6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
-/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
-+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
-MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
-Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
-6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
-L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
-+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
-BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
-IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
-g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
-zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
------END CERTIFICATE-----
-
-AffirmTrust Premium ECC
-=======================
------BEGIN CERTIFICATE-----
-MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
-BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
-MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
-cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
-IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
-N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
-BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
-BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
-57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
-eQ==
------END CERTIFICATE-----
-
-Certum Trusted Network CA
-=========================
------BEGIN CERTIFICATE-----
-MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
-ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
-biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
-MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
-ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
-l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
-J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
-fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
-cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
-Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
-DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
-jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
-mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
-Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
-03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
------END CERTIFICATE-----
-
-Certinomis - Autorité Racine
-=============================
------BEGIN CERTIFICATE-----
-MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
-Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
-LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG
-A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw
-JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD
-ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa
-wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly
-Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw
-2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N
-jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q
-c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC
-lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb
-xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g
-530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna
-4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
-A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
-KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x
-WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva
-R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40
-nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B
-CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv
-JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE
-qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b
-WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE
-wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/
-vgt2Fl43N+bYdJeimUV5
------END CERTIFICATE-----
-
-Root CA Generalitat Valenciana
-==============================
------BEGIN CERTIFICATE-----
-MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE
-ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290
-IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3
-WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE
-CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2
-F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B
-ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ
-D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte
-JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB
-AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n
-dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB
-ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl
-AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA
-YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy
-AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
-aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt
-AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA
-YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu
-AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA
-OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0
-dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV
-BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G
-A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S
-b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh
-TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz
-Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63
-NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH
-iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
-+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
------END CERTIFICATE-----
-
-A-Trust-nQual-03
-================
------BEGIN CERTIFICATE-----
-MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE
-Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy
-a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R
-dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw
-RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0
-ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1
-c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA
-zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n
-yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE
-SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4
-iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V
-cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV
-eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40
-ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr
-sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd
-JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
-mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6
-ahq97BvIxYSazQ==
------END CERTIFICATE-----
-
-TWCA Root Certification Authority
-=================================
------BEGIN CERTIFICATE-----
-MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
-VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
-EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
-IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
-AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
-QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
-oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
-4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
-y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
-BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
-9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
-mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
-QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
-T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
-Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
------END CERTIFICATE-----
-
-Security Communication RootCA2
-==============================
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
-U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
-dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
-SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
-aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
-+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
-3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
-spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
-EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
-QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
-CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
-u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
-3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
-tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
-mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
------END CERTIFICATE-----
-
-EC-ACC
-======
------BEGIN CERTIFICATE-----
-MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
-BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
-ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
-VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
-CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
-BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
-MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
-SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
-Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
-cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
-w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
-ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
-HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
-E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
-0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
-BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
-VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
-Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
-dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
-lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
-Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
-l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
-E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
-5EI=
------END CERTIFICATE-----
-
-Hellenic Academic and Research Institutions RootCA 2011
-=======================================================
------BEGIN CERTIFICATE-----
-MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
-O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
-aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
-IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
-AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
-IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
-IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
-1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
-71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
-8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
-3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
-MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
-MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
-b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
-XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
-TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
-/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
-7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
------END CERTIFICATE-----
-
-Actalis Authentication Root CA
-==============================
------BEGIN CERTIFICATE-----
-MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
-BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
-AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
-MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
-IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
-IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
-wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
-by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
-zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
-YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
-oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
-EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
-hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
-EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
-jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
-iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
-ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
-WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
-JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
-K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
-Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
-4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
-2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
-lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
-OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
-vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
------END CERTIFICATE-----
-
-Trustis FPS Root CA
-===================
------BEGIN CERTIFICATE-----
-MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
-EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
-IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
-BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
-KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
-RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
-H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
-cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
-o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
-AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
-BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
-GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
-yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
-8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
-l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
-iB6XzCGcKQENZetX2fNXlrtIzYE=
------END CERTIFICATE-----
-
-StartCom Certification Authority
-================================
------BEGIN CERTIFICATE-----
-MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
-U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
-ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
-NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
-LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
-U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
-ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
-o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
-Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
-eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
-2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
-6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
-osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
-untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
-UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
-37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
-VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ
-Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0
-dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu
-c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv
-bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0
-aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0
-aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
-L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG
-cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5
-fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm
-N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN
-Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T
-tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX
-e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA
-2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs
-HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
-JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib
-D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=
------END CERTIFICATE-----
-
-StartCom Certification Authority G2
-===================================
------BEGIN CERTIFICATE-----
-MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
-U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
-RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE
-ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O
-o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG
-4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi
-Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul
-Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs
-O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H
-vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L
-nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS
-FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa
-z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E
-BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ
-KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
-2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk
-J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+
-JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG
-/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc
-nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld
-blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc
-l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm
-7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm
-obp573PYtlNXLfbQ4ddI
------END CERTIFICATE-----
-
-Buypass Class 2 Root CA
-=======================
------BEGIN CERTIFICATE-----
-MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
-QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X
-DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
-eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw
-DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1
-g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn
-9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b
-/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU
-CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff
-awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI
-zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn
-Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX
-Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs
-M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
-VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
-AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
-A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI
-osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S
-aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd
-DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD
-LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0
-oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC
-wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS
-CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN
-rJgWVqA=
------END CERTIFICATE-----
-
-Buypass Class 3 Root CA
-=======================
------BEGIN CERTIFICATE-----
-MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
-QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X
-DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
-eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw
-DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH
-sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR
-5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh
-7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ
-ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH
-2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV
-/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ
-RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA
-Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq
-j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
-VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
-AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
-cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G
-uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG
-Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8
-ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2
-KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz
-6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug
-UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe
-eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi
-Cp/HuZc=
------END CERTIFICATE-----
-
-T-TeleSec GlobalRoot Class 3
-============================
------BEGIN CERTIFICATE-----
-MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
-IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
-cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
-MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
-dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
-ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
-9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
-NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
-iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
-0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
-MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
-AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
-fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
-ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
-P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
-e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
------END CERTIFICATE-----
-
-EE Certification Centre Root CA
-===============================
------BEGIN CERTIFICATE-----
-MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
-EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
-dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
-MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
-UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
-ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
-DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
-TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
-rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
-93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
-P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
-AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
-MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
-BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
-xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
-lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
-uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
-3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
-dcGWxZ0=
------END CERTIFICATE-----
+++ /dev/null
-<?php
-
-namespace Codebird;
-
-/**
- * A Twitter library in PHP.
- *
- * @package codebird
- * @version 2.4.1
- * @author J.M. <me@mynetx.net>
- * @copyright 2010-2013 J.M. <me@mynetx.net>
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-
-/**
- * Define constants
- */
-$constants = explode(' ', 'OBJECT ARRAY JSON');
-foreach ($constants as $i => $id) {
- $id = 'CODEBIRD_RETURNFORMAT_' . $id;
- defined($id) or define($id, $i);
-}
-$constants = array(
- 'CURLE_SSL_CERTPROBLEM' => 58,
- 'CURLE_SSL_CACERT' => 60,
- 'CURLE_SSL_CACERT_BADFILE' => 77,
- 'CURLE_SSL_CRL_BADFILE' => 82,
- 'CURLE_SSL_ISSUER_ERROR' => 83
-);
-foreach ($constants as $id => $i) {
- defined($id) or define($id, $i);
-}
-unset($constants);
-unset($i);
-unset($id);
-
-/**
- * A Twitter library in PHP.
- *
- * @package codebird
- * @subpackage codebird-php
- */
-class Codebird
-{
- /**
- * The current singleton instance
- */
- private static $_instance = null;
-
- /**
- * The OAuth consumer key of your registered app
- */
- protected static $_oauth_consumer_key = null;
-
- /**
- * The corresponding consumer secret
- */
- protected static $_oauth_consumer_secret = null;
-
- /**
- * The app-only bearer token. Used to authorize app-only requests
- */
- protected static $_oauth_bearer_token = null;
-
- /**
- * The API endpoint to use
- */
- protected static $_endpoint = 'https://api.twitter.com/1.1/';
-
- /**
- * The API endpoint to use for OAuth requests
- */
- protected static $_endpoint_oauth = 'https://api.twitter.com/';
-
- /**
- * The Request or access token. Used to sign requests
- */
- protected $_oauth_token = null;
-
- /**
- * The corresponding request or access token secret
- */
- protected $_oauth_token_secret = null;
-
- /**
- * The format of data to return from API calls
- */
- protected $_return_format = CODEBIRD_RETURNFORMAT_OBJECT;
-
- /**
- * The file formats that Twitter accepts as image uploads
- */
- protected $_supported_media_files = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG);
-
- /**
- * The current Codebird version
- */
- protected $_version = '2.4.1';
-
- /**
- * Returns singleton class instance
- * Always use this method unless you're working with multiple authenticated users at once
- *
- * @return Codebird The instance
- */
- public static function getInstance()
- {
- if (self::$_instance == null) {
- self::$_instance = new self;
- }
- return self::$_instance;
- }
-
- /**
- * Sets the OAuth consumer key and secret (App key)
- *
- * @param string $key OAuth consumer key
- * @param string $secret OAuth consumer secret
- *
- * @return void
- */
- public static function setConsumerKey($key, $secret)
- {
- self::$_oauth_consumer_key = $key;
- self::$_oauth_consumer_secret = $secret;
- }
-
- /**
- * Sets the OAuth2 app-only auth bearer token
- *
- * @param string $token OAuth2 bearer token
- *
- * @return void
- */
- public static function setBearerToken($token)
- {
- self::$_oauth_bearer_token = $token;
- }
-
- /**
- * Gets the current Codebird version
- *
- * @return string The version number
- */
- public function getVersion()
- {
- return $this->_version;
- }
-
- /**
- * Sets the OAuth request or access token and secret (User key)
- *
- * @param string $token OAuth request or access token
- * @param string $secret OAuth request or access token secret
- *
- * @return void
- */
- public function setToken($token, $secret)
- {
- $this->_oauth_token = $token;
- $this->_oauth_token_secret = $secret;
- }
-
- /**
- * Sets the format for API replies
- *
- * @param int $return_format One of these:
- * CODEBIRD_RETURNFORMAT_OBJECT (default)
- * CODEBIRD_RETURNFORMAT_ARRAY
- *
- * @return void
- */
- public function setReturnFormat($return_format)
- {
- $this->_return_format = $return_format;
- }
-
- /**
- * Main API handler working on any requests you issue
- *
- * @param string $fn The member function you called
- * @param array $params The parameters you sent along
- *
- * @return mixed The API reply encoded in the set return_format
- */
-
- public function __call($fn, $params)
- {
- // parse parameters
- $apiparams = array();
- if (count($params) > 0) {
- if (is_array($params[0])) {
- $apiparams = $params[0];
- } else {
- parse_str($params[0], $apiparams);
- // remove auto-added slashes if on magic quotes steroids
- if (get_magic_quotes_gpc()) {
- foreach($apiparams as $key => $value) {
- if (is_array($value)) {
- $apiparams[$key] = array_map('stripslashes', $value);
- } else {
- $apiparams[$key] = stripslashes($value);
- }
- }
- }
- }
- }
-
- // stringify null and boolean parameters
- foreach ($apiparams as $key => $value) {
- if (! is_scalar($value)) {
- continue;
- }
- if (is_null($value)) {
- $apiparams[$key] = 'null';
- } elseif (is_bool($value)) {
- $apiparams[$key] = $value ? 'true' : 'false';
- }
- }
-
- $app_only_auth = false;
- if (count($params) > 1) {
- $app_only_auth = !! $params[1];
- }
-
- // map function name to API method
- $method = '';
-
- // replace _ by /
- $path = explode('_', $fn);
- for ($i = 0; $i < count($path); $i++) {
- if ($i > 0) {
- $method .= '/';
- }
- $method .= $path[$i];
- }
- // undo replacement for URL parameters
- $url_parameters_with_underscore = array('screen_name');
- foreach ($url_parameters_with_underscore as $param) {
- $param = strtoupper($param);
- $replacement_was = str_replace('_', '/', $param);
- $method = str_replace($replacement_was, $param, $method);
- }
-
- // replace AA by URL parameters
- $method_template = $method;
- $match = array();
- if (preg_match('/[A-Z_]{2,}/', $method, $match)) {
- foreach ($match as $param) {
- $param_l = strtolower($param);
- $method_template = str_replace($param, ':' . $param_l, $method_template);
- if (!isset($apiparams[$param_l])) {
- for ($i = 0; $i < 26; $i++) {
- $method_template = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method_template);
- }
- throw new \Exception(
- 'To call the templated method "' . $method_template
- . '", specify the parameter value for "' . $param_l . '".'
- );
- }
- $method = str_replace($param, $apiparams[$param_l], $method);
- unset($apiparams[$param_l]);
- }
- }
-
- // replace A-Z by _a-z
- for ($i = 0; $i < 26; $i++) {
- $method = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method);
- $method_template = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method_template);
- }
-
- $httpmethod = $this->_detectMethod($method_template, $apiparams);
- $multipart = $this->_detectMultipart($method_template);
-
- return $this->_callApi(
- $httpmethod,
- $method,
- $method_template,
- $apiparams,
- $multipart,
- $app_only_auth
- );
- }
-
- /**
- * Uncommon API methods
- */
-
- /**
- * Gets the OAuth authenticate URL for the current request token
- *
- * @return string The OAuth authenticate URL
- */
- public function oauth_authenticate($force_login = NULL, $screen_name = NULL)
- {
- if ($this->_oauth_token == null) {
- throw new \Exception('To get the authenticate URL, the OAuth token must be set.');
- }
- $url = self::$_endpoint_oauth . 'oauth/authenticate?oauth_token=' . $this->_url($this->_oauth_token);
- if ($force_login) {
- $url .= "&force_login=1";
- }
- if ($screen_name) {
- $url .= "&screen_name=" . $screen_name;
- }
- return $url;
- }
-
- /**
- * Gets the OAuth authorize URL for the current request token
- *
- * @return string The OAuth authorize URL
- */
- public function oauth_authorize($force_login = NULL, $screen_name = NULL)
- {
- if ($this->_oauth_token == null) {
- throw new \Exception('To get the authorize URL, the OAuth token must be set.');
- }
- $url = self::$_endpoint_oauth . 'oauth/authorize?oauth_token=' . $this->_url($this->_oauth_token);
- if ($force_login) {
- $url .= "&force_login=1";
- }
- if ($screen_name) {
- $url .= "&screen_name=" . $screen_name;
- }
- return $url;
- }
-
- /**
- * Gets the OAuth bearer token
- *
- * @return string The OAuth bearer token
- */
-
- public function oauth2_token()
- {
- if (! function_exists('curl_init')) {
- throw new \Exception('To make API requests, the PHP curl extension must be available.');
- }
- if (self::$_oauth_consumer_key == null) {
- throw new \Exception('To obtain a bearer token, the consumer key must be set.');
- }
- $ch = false;
- $post_fields = array(
- 'grant_type' => 'client_credentials'
- );
- $url = self::$_endpoint_oauth . 'oauth2/token';
- $ch = curl_init($url);
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
- curl_setopt($ch, CURLOPT_HEADER, 1);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
- curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/cacert.pem');
-
- curl_setopt($ch, CURLOPT_USERPWD, self::$_oauth_consumer_key . ':' . self::$_oauth_consumer_secret);
- curl_setopt($ch, CURLOPT_HTTPHEADER, array(
- 'Expect:'
- ));
- $reply = curl_exec($ch);
-
- // certificate validation results
- $validation_result = curl_errno($ch);
- if (in_array(
- $validation_result,
- array(
- CURLE_SSL_CERTPROBLEM,
- CURLE_SSL_CACERT,
- CURLE_SSL_CACERT_BADFILE,
- CURLE_SSL_CRL_BADFILE,
- CURLE_SSL_ISSUER_ERROR
- )
- )
- ) {
- throw new \Exception('Error ' . $validation_result . ' while validating the Twitter API certificate.');
- }
-
- $httpstatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
- $reply = $this->_parseApiReply('oauth2/token', $reply);
- switch ($this->_return_format) {
- case CODEBIRD_RETURNFORMAT_ARRAY:
- $reply['httpstatus'] = $httpstatus;
- if ($httpstatus == 200) {
- self::setBearerToken($reply['access_token']);
- }
- break;
- case CODEBIRD_RETURNFORMAT_JSON:
- if ($httpstatus == 200) {
- $parsed = json_decode($reply);
- self::setBearerToken($parsed->access_token);
- }
- break;
- case CODEBIRD_RETURNFORMAT_OBJECT:
- $reply->httpstatus = $httpstatus;
- if ($httpstatus == 200) {
- self::setBearerToken($reply->access_token);
- }
- break;
- }
- return $reply;
- }
-
- /**
- * Signing helpers
- */
-
- /**
- * URL-encodes the given data
- *
- * @param mixed $data
- *
- * @return mixed The encoded data
- */
- private function _url($data)
- {
- if (is_array($data)) {
- return array_map(array(
- $this,
- '_url'
- ), $data);
- } elseif (is_scalar($data)) {
- return str_replace(array(
- '+',
- '!',
- '*',
- "'",
- '(',
- ')'
- ), array(
- ' ',
- '%21',
- '%2A',
- '%27',
- '%28',
- '%29'
- ), rawurlencode($data));
- } else {
- return '';
- }
- }
-
- /**
- * Gets the base64-encoded SHA1 hash for the given data
- *
- * @param string $data The data to calculate the hash from
- *
- * @return string The hash
- */
- private function _sha1($data)
- {
- if (self::$_oauth_consumer_secret == null) {
- throw new \Exception('To generate a hash, the consumer secret must be set.');
- }
- if (!function_exists('hash_hmac')) {
- throw new \Exception('To generate a hash, the PHP hash extension must be available.');
- }
- return base64_encode(hash_hmac('sha1', $data, self::$_oauth_consumer_secret . '&'
- . ($this->_oauth_token_secret != null ? $this->_oauth_token_secret : ''), true));
- }
-
- /**
- * Generates a (hopefully) unique random string
- *
- * @param int optional $length The length of the string to generate
- *
- * @return string The random string
- */
- protected function _nonce($length = 8)
- {
- if ($length < 1) {
- throw new \Exception('Invalid nonce length.');
- }
- return substr(md5(microtime(true)), 0, $length);
- }
-
- /**
- * Generates an OAuth signature
- *
- * @param string $httpmethod Usually either 'GET' or 'POST' or 'DELETE'
- * @param string $method The API method to call
- * @param array optional $params The API call parameters, associative
- *
- * @return string Authorization HTTP header
- */
- protected function _sign($httpmethod, $method, $params = array())
- {
- if (self::$_oauth_consumer_key == null) {
- throw new \Exception('To generate a signature, the consumer key must be set.');
- }
- $sign_params = array(
- 'consumer_key' => self::$_oauth_consumer_key,
- 'version' => '1.0',
- 'timestamp' => time(),
- 'nonce' => $this->_nonce(),
- 'signature_method' => 'HMAC-SHA1'
- );
- $sign_base_params = array();
- foreach ($sign_params as $key => $value) {
- $sign_base_params['oauth_' . $key] = $this->_url($value);
- }
- if ($this->_oauth_token != null) {
- $sign_base_params['oauth_token'] = $this->_url($this->_oauth_token);
- }
- $oauth_params = $sign_base_params;
- foreach ($params as $key => $value) {
- $sign_base_params[$key] = $this->_url($value);
- }
- ksort($sign_base_params);
- $sign_base_string = '';
- foreach ($sign_base_params as $key => $value) {
- $sign_base_string .= $key . '=' . $value . '&';
- }
- $sign_base_string = substr($sign_base_string, 0, -1);
- $signature = $this->_sha1($httpmethod . '&' . $this->_url($method) . '&' . $this->_url($sign_base_string));
-
- $params = array_merge($oauth_params, array(
- 'oauth_signature' => $signature
- ));
- ksort($params);
- $authorization = 'Authorization: OAuth ';
- foreach ($params as $key => $value) {
- $authorization .= $key . '="' . $this->_url($value) . '", ';
- }
- return substr($authorization, 0, -2);
- }
-
- /**
- * Detects HTTP method to use for API call
- *
- * @param string $method The API method to call
- * @param array $params The parameters to send along
- *
- * @return string The HTTP method that should be used
- */
- protected function _detectMethod($method, $params)
- {
- // multi-HTTP method endpoints
- switch($method) {
- case 'account/settings':
- $method = count($params) > 0 ? $method . '__post' : $method;
- break;
- }
-
- $httpmethods = array();
- $httpmethods['GET'] = array(
- // Timelines
- 'statuses/mentions_timeline',
- 'statuses/user_timeline',
- 'statuses/home_timeline',
- 'statuses/retweets_of_me',
-
- // Tweets
- 'statuses/retweets/:id',
- 'statuses/show/:id',
- 'statuses/oembed',
-
- // Search
- 'search/tweets',
-
- // Direct Messages
- 'direct_messages',
- 'direct_messages/sent',
- 'direct_messages/show',
-
- // Friends & Followers
- 'friendships/no_retweets/ids',
- 'friends/ids',
- 'followers/ids',
- 'friendships/lookup',
- 'friendships/incoming',
- 'friendships/outgoing',
- 'friendships/show',
- 'friends/list',
- 'followers/list',
-
- // Users
- 'account/settings',
- 'account/verify_credentials',
- 'blocks/list',
- 'blocks/ids',
- 'users/lookup',
- 'users/show',
- 'users/search',
- 'users/contributees',
- 'users/contributors',
- 'users/profile_banner',
-
- // Suggested Users
- 'users/suggestions/:slug',
- 'users/suggestions',
- 'users/suggestions/:slug/members',
-
- // Favorites
- 'favorites/list',
-
- // Lists
- 'lists/list',
- 'lists/statuses',
- 'lists/memberships',
- 'lists/subscribers',
- 'lists/subscribers/show',
- 'lists/members/show',
- 'lists/members',
- 'lists/show',
- 'lists/subscriptions',
-
- // Saved searches
- 'saved_searches/list',
- 'saved_searches/show/:id',
-
- // Places & Geo
- 'geo/id/:place_id',
- 'geo/reverse_geocode',
- 'geo/search',
- 'geo/similar_places',
-
- // Trends
- 'trends/place',
- 'trends/available',
- 'trends/closest',
-
- // OAuth
- 'oauth/authenticate',
- 'oauth/authorize',
-
- // Help
- 'help/configuration',
- 'help/languages',
- 'help/privacy',
- 'help/tos',
- 'application/rate_limit_status'
- );
- $httpmethods['POST'] = array(
- // Tweets
- 'statuses/destroy/:id',
- 'statuses/update',
- 'statuses/retweet/:id',
- 'statuses/update_with_media',
-
- // Direct Messages
- 'direct_messages/destroy',
- 'direct_messages/new',
-
- // Friends & Followers
- 'friendships/create',
- 'friendships/destroy',
- 'friendships/update',
-
- // Users
- 'account/settings__post',
- 'account/update_delivery_device',
- 'account/update_profile',
- 'account/update_profile_background_image',
- 'account/update_profile_colors',
- 'account/update_profile_image',
- 'blocks/create',
- 'blocks/destroy',
- 'account/update_profile_banner',
- 'account/remove_profile_banner',
-
- // Favorites
- 'favorites/destroy',
- 'favorites/create',
-
- // Lists
- 'lists/members/destroy',
- 'lists/subscribers/create',
- 'lists/subscribers/destroy',
- 'lists/members/create_all',
- 'lists/members/create',
- 'lists/destroy',
- 'lists/update',
- 'lists/create',
- 'lists/members/destroy_all',
-
- // Saved Searches
- 'saved_searches/create',
- 'saved_searches/destroy/:id',
-
- // Places & Geo
- 'geo/place',
-
- // Spam Reporting
- 'users/report_spam',
-
- // OAuth
- 'oauth/access_token',
- 'oauth/request_token',
- 'oauth2/token',
- 'oauth2/invalidate_token'
- );
- foreach ($httpmethods as $httpmethod => $methods) {
- if (in_array($method, $methods)) {
- return $httpmethod;
- }
- }
- throw new \Exception('Can\'t find HTTP method to use for "' . $method . '".');
- }
-
- /**
- * Detects if API call should use multipart/form-data
- *
- * @param string $method The API method to call
- *
- * @return bool Whether the method should be sent as multipart
- */
- protected function _detectMultipart($method)
- {
- $multiparts = array(
- // Tweets
- 'statuses/update_with_media',
-
- // Users
- 'account/update_profile_background_image',
- 'account/update_profile_image',
- 'account/update_profile_banner'
- );
- return in_array($method, $multiparts);
- }
-
- /**
- * Detect filenames in upload parameters,
- * build multipart request from upload params
- *
- * @param string $method The API method to call
- * @param array $params The parameters to send along
- *
- * @return void
- */
- protected function _buildMultipart($method, $params)
- {
- // well, files will only work in multipart methods
- if (! $this->_detectMultipart($method)) {
- return;
- }
-
- // only check specific parameters
- $possible_files = array(
- // Tweets
- 'statuses/update_with_media' => 'media[]',
- // Accounts
- 'account/update_profile_background_image' => 'image',
- 'account/update_profile_image' => 'image',
- 'account/update_profile_banner' => 'banner'
- );
- // method might have files?
- if (! in_array($method, array_keys($possible_files))) {
- return;
- }
-
- $possible_files = explode(' ', $possible_files[$method]);
-
- $multipart_border = '--------------------' . $this->_nonce();
- $multipart_request = '';
-
- foreach ($params as $key => $value) {
- // is it an array?
- if (is_array($value)) {
- throw new \Exception('Using URL-encoded parameters is not supported for uploading media.');
- continue;
- }
- $multipart_request .=
- '--' . $multipart_border . "\r\n"
- . 'Content-Disposition: form-data; name="' . $key . '"';
-
- // check for filenames
- if (in_array($key, $possible_files)) {
- if (// is it a file, a readable one?
- @file_exists($value)
- && @is_readable($value)
-
- // is it a valid image?
- && $data = @getimagesize($value)
- ) {
- if (// is it a supported image format?
- in_array($data[2], $this->_supported_media_files)
- ) {
- // try to read the file
- ob_start();
- readfile($value);
- $data = ob_get_contents();
- ob_end_clean();
- if (strlen($data) == 0) {
- continue;
- }
- $value = $data;
- }
- }
-
- /*
- $multipart_request .=
- "\r\nContent-Transfer-Encoding: base64";
- $value = base64_encode($value);
- */
- }
-
- $multipart_request .=
- "\r\n\r\n" . $value . "\r\n";
- }
- $multipart_request .= '--' . $multipart_border . '--';
-
- return $multipart_request;
- }
-
-
- /**
- * Builds the complete API endpoint url
- *
- * @param string $method The API method to call
- * @param string $method_template The API method template to call
- *
- * @return string The URL to send the request to
- */
- protected function _getEndpoint($method, $method_template)
- {
- if (substr($method, 0, 5) == 'oauth') {
- $url = self::$_endpoint_oauth . $method;
- } else {
- $url = self::$_endpoint . $method . '.json';
- }
- return $url;
- }
-
- /**
- * Calls the API using cURL
- *
- * @param string $httpmethod The HTTP method to use for making the request
- * @param string $method The API method to call
- * @param string $method_template The templated API method to call
- * @param array optional $params The parameters to send along
- * @param bool optional $multipart Whether to use multipart/form-data
- * @param bool optional $app_only_auth Whether to use app-only bearer authentication
- *
- * @return mixed The API reply, encoded in the set return_format
- */
-
- protected function _callApi($httpmethod, $method, $method_template, $params = array(), $multipart = false, $app_only_auth = false)
- {
- if (! function_exists('curl_init')) {
- throw new \Exception('To make API requests, the PHP curl extension must be available.');
- }
- $url = $this->_getEndpoint($method, $method_template);
- $ch = false;
- if ($httpmethod == 'GET') {
- $url_with_params = $url;
- if (count($params) > 0) {
- $url_with_params .= '?' . http_build_query($params);
- }
- $authorization = $this->_sign($httpmethod, $url, $params);
- $ch = curl_init($url_with_params);
- } else {
- if ($multipart) {
- $authorization = $this->_sign($httpmethod, $url, array());
- $params = $this->_buildMultipart($method_template, $params);
- } else {
- $authorization = $this->_sign($httpmethod, $url, $params);
- $params = http_build_query($params);
- }
- $ch = curl_init($url);
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
- }
- if ($app_only_auth) {
- if (self::$_oauth_consumer_key == null) {
- throw new \Exception('To make an app-only auth API request, the consumer key must be set.');
- }
- // automatically fetch bearer token, if necessary
- if (self::$_oauth_bearer_token == null) {
- $this->oauth2_token();
- }
- $authorization = 'Authorization: Bearer ' . self::$_oauth_bearer_token;
- }
- $request_headers = array();
- if (isset($authorization)) {
- $request_headers[] = $authorization;
- $request_headers[] = 'Expect:';
- }
- if ($multipart) {
- $first_newline = strpos($params, "\r\n");
- $multipart_boundary = substr($params, 2, $first_newline - 2);
- $request_headers[] = 'Content-Length: ' . strlen($params);
- $request_headers[] = 'Content-Type: multipart/form-data; boundary='
- . $multipart_boundary;
- }
-
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
- curl_setopt($ch, CURLOPT_HEADER, 1);
- curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
- curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/cacert.pem');
-
- $reply = curl_exec($ch);
-
- // certificate validation results
- $validation_result = curl_errno($ch);
- if (in_array(
- $validation_result,
- array(
- CURLE_SSL_CERTPROBLEM,
- CURLE_SSL_CACERT,
- CURLE_SSL_CACERT_BADFILE,
- CURLE_SSL_CRL_BADFILE,
- CURLE_SSL_ISSUER_ERROR
- )
- )
- ) {
- throw new \Exception('Error ' . $validation_result . ' while validating the Twitter API certificate.');
- }
-
- $httpstatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
- $reply = $this->_parseApiReply($method_template, $reply);
- if ($this->_return_format == CODEBIRD_RETURNFORMAT_OBJECT) {
- $reply->httpstatus = $httpstatus;
- } elseif ($this->_return_format == CODEBIRD_RETURNFORMAT_ARRAY) {
- $reply['httpstatus'] = $httpstatus;
- }
- return $reply;
- }
-
- /**
- * Parses the API reply to encode it in the set return_format
- *
- * @param string $method The method that has been called
- * @param string $reply The actual reply, JSON-encoded or URL-encoded
- *
- * @return array|object The parsed reply
- */
- protected function _parseApiReply($method, $reply)
- {
- // split headers and body
- $headers = array();
- $reply = explode("\r\n\r\n", $reply, 4);
-
- // check if using proxy
- if (substr($reply[0], 0, 35) === 'HTTP/1.1 200 Connection Established') {
- array_shift($reply);
- } elseif (count($reply) > 2) {
- $headers = array_shift($reply);
- $reply = array(
- $headers,
- implode("\r\n", $reply)
- );
- }
-
- $headers_array = explode("\r\n", $reply[0]);
- foreach ($headers_array as $header) {
- $header_array = explode(': ', $header, 2);
- $key = $header_array[0];
- $value = '';
- if (count($header_array) > 1) {
- $value = $header_array[1];
- }
- $headers[$key] = $value;
- }
- if (count($reply) > 1) {
- $reply = $reply[1];
- } else {
- $reply = '';
- }
-
- $need_array = $this->_return_format == CODEBIRD_RETURNFORMAT_ARRAY;
- if ($reply == '[]') {
- switch ($this->_return_format) {
- case CODEBIRD_RETURNFORMAT_ARRAY:
- return array();
- case CODEBIRD_RETURNFORMAT_JSON:
- return '{}';
- case CODEBIRD_RETURNFORMAT_OBJECT:
- return new \stdClass;
- }
- }
- $parsed = array();
- if (! $parsed = json_decode($reply, $need_array)) {
- if ($reply) {
- if (stripos($reply, '<' . '?xml version="1.0" encoding="UTF-8"?' . '>') === 0) {
- // we received XML...
- // since this only happens for errors,
- // don't perform a full decoding
- preg_match('/<request>(.*)<\/request>/', $reply, $request);
- preg_match('/<error>(.*)<\/error>/', $reply, $error);
- $parsed['request'] = htmlspecialchars_decode($request[1]);
- $parsed['error'] = htmlspecialchars_decode($error[1]);
- } else {
- // assume query format
- $reply = explode('&', $reply);
- foreach ($reply as $element) {
- if (stristr($element, '=')) {
- list($key, $value) = explode('=', $element);
- $parsed[$key] = $value;
- } else {
- $parsed['message'] = $element;
- }
- }
- }
- }
- $reply = json_encode($parsed);
- }
- switch ($this->_return_format) {
- case CODEBIRD_RETURNFORMAT_ARRAY:
- return $parsed;
- case CODEBIRD_RETURNFORMAT_JSON:
- return $reply;
- case CODEBIRD_RETURNFORMAT_OBJECT:
- return (object) $parsed;
- }
- return $parsed;
- }
-}
-
-?>
--- /dev/null
+{
+ "name": "friendica-addons/twitter",
+ "description": "Twitter Connector addon for Friendica",
+ "type": "friendica-addon",
+ "authors": [
+ {
+ "name": "Tobias Diekershoff",
+ "homepage": "https://f.diekershoff.de/profile/tobias",
+ "role": "Developer"
+ },
+ {
+ "name": "Michael Vogel",
+ "homepage": "https://pirati.ca/profile/heluecht",
+ "role": "Developer"
+ },
+ {
+ "name": "Hypolite Petovan",
+ "email": "mrpetovan@gmail.com",
+ "homepage": "https://friendica.mrpetovan.com/profile/hypolite",
+ "role": "Developer"
+ }
+ ],
+ "require": {
+ "abraham/twitteroauth": "^0.7.4"
+ },
+ "license": "3-clause BSD license",
+ "minimum-stability": "stable"
+}
--- /dev/null
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "341c2ca2f25177375c65577f7e5d7369",
+ "packages": [
+ {
+ "name": "abraham/twitteroauth",
+ "version": "0.7.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/abraham/twitteroauth.git",
+ "reference": "c6f9e692552dd037b2324ed0dfa28a4e60875acf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/abraham/twitteroauth/zipball/c6f9e692552dd037b2324ed0dfa28a4e60875acf",
+ "reference": "c6f9e692552dd037b2324ed0dfa28a4e60875acf",
+ "shasum": ""
+ },
+ "require": {
+ "ext-curl": "*",
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "phpmd/phpmd": "~2.6",
+ "phpunit/phpunit": "~5.7",
+ "squizlabs/php_codesniffer": "~3.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Abraham\\TwitterOAuth\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Abraham Williams",
+ "email": "abraham@abrah.am",
+ "homepage": "https://abrah.am",
+ "role": "Developer"
+ }
+ ],
+ "description": "The most popular PHP library for use with the Twitter OAuth REST API.",
+ "homepage": "https://twitteroauth.com",
+ "keywords": [
+ "Twitter API",
+ "Twitter oAuth",
+ "api",
+ "oauth",
+ "rest",
+ "social",
+ "twitter"
+ ],
+ "time": "2017-06-30T22:02:01+00:00"
+ }
+ ],
+ "packages-dev": [],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": [],
+ "platform-dev": []
+}
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-27 05:01-0500\n"
+"POT-Creation-Date: 2018-02-08 07:07+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: twitter.php:77
+#: twitter.php:193
msgid "Post to Twitter"
msgstr ""
-#: twitter.php:129
+#: twitter.php:234
+msgid ""
+"You submitted an empty PIN, please Sign In with Twitter again to get a new "
+"one."
+msgstr ""
+
+#: twitter.php:261
msgid "Twitter settings updated."
msgstr ""
-#: twitter.php:157
-msgid "Twitter Posting Settings"
+#: twitter.php:291 twitter.php:295
+msgid "Twitter Import/Export/Mirror"
msgstr ""
-#: twitter.php:164
+#: twitter.php:302
msgid ""
"No consumer key pair for Twitter found. Please contact your site "
"administrator."
msgstr ""
-#: twitter.php:183
+#: twitter.php:314
msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
+"At this Friendica instance the Twitter addon was enabled but you have not "
"yet connected your account to your Twitter account. To do so click the "
"button below to get a PIN from Twitter which you have to copy into the input "
"box below and submit the form. Only your <strong>public</strong> posts will "
"be posted to Twitter."
msgstr ""
-#: twitter.php:184
+#: twitter.php:315
msgid "Log in with Twitter"
msgstr ""
-#: twitter.php:186
+#: twitter.php:317
msgid "Copy the PIN from Twitter here"
msgstr ""
-#: twitter.php:191 twitter.php:229 twitter.php:556
-msgid "Submit"
+#: twitter.php:322 twitter.php:364 twitter.php:642
+msgid "Save Settings"
msgstr ""
-#: twitter.php:200
+#: twitter.php:334
msgid "Currently connected to: "
msgstr ""
-#: twitter.php:201
+#: twitter.php:335
+msgid "Disconnect"
+msgstr ""
+
+#: twitter.php:345
+msgid "Allow posting to Twitter"
+msgstr ""
+
+#: twitter.php:345
msgid ""
"If enabled all your <strong>public</strong> postings can be posted to the "
"associated Twitter account. You can choose to do so by default (here) or for "
"every posting separately in the posting options when writing the entry."
msgstr ""
-#: twitter.php:203
+#: twitter.php:348
msgid ""
-"<strong>Note</strong>: Due your privacy settings (<em>Hide your profile "
+"<strong>Note</strong>: Due to your privacy settings (<em>Hide your profile "
"details from unknown viewers?</em>) the link potentially included in public "
"postings relayed to Twitter will lead the visitor to a blank page informing "
"the visitor that the access to your profile has been restricted."
msgstr ""
-#: twitter.php:206
-msgid "Allow posting to Twitter"
-msgstr ""
-
-#: twitter.php:209
+#: twitter.php:351
msgid "Send public postings to Twitter by default"
msgstr ""
-#: twitter.php:213
-msgid "Mirror all posts from twitter that are no replies or retweets"
+#: twitter.php:354
+msgid "Mirror all posts from twitter that are no replies"
msgstr ""
-#: twitter.php:217
-msgid "Shortening method that optimizes the tweet"
+#: twitter.php:357
+msgid "Import the remote timeline"
msgstr ""
-#: twitter.php:221
-msgid "Send linked #-tags and @-names to Twitter"
+#: twitter.php:360
+msgid "Automatically create contacts"
msgstr ""
-#: twitter.php:226
-msgid "Clear OAuth configuration"
+#: twitter.php:619
+msgid "Twitter post failed. Queued for retry."
msgstr ""
-#: twitter.php:550
+#: twitter.php:634
msgid "Settings updated."
msgstr ""
-#: twitter.php:558
+#: twitter.php:644
msgid "Consumer key"
msgstr ""
-#: twitter.php:559
+#: twitter.php:645
msgid "Consumer secret"
msgstr ""
-
-#: twitter.php:560
-msgid "Name of the Twitter Application"
-msgstr ""
-
-#: twitter.php:560
-msgid "set this to avoid mirroring postings from ~friendica back to ~friendica"
-msgstr ""
$a->strings["Twitter settings updated."] = "La configuració de Twitter actualitzada.";\r
$a->strings["Twitter Posting Settings"] = "Configuració d'Enviaments per a Twitter";\r
$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "No s'ha pogut emparellar cap clau \"consumer key\" per a Twitter. Si us plau, poseu-vos en contacte amb l'administrador del lloc.";\r
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "En aquesta instància Friendica el plugin Twitter va ser habilitat, però encara no ha connectat el compte al seu compte de Twitter. Per a això feu clic al botó de sota per obtenir un PIN de Twitter que ha de copiar a la casella de sota i enviar el formulari. Només els missatges <strong> públics </strong> es publicaran a Twitter.";\r
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "En aquesta instància Friendica el addon Twitter va ser habilitat, però encara no ha connectat el compte al seu compte de Twitter. Per a això feu clic al botó de sota per obtenir un PIN de Twitter que ha de copiar a la casella de sota i enviar el formulari. Només els missatges <strong> públics </strong> es publicaran a Twitter.";\r
$a->strings["Log in with Twitter"] = "Accedeixi com en Twitter";\r
$a->strings["Copy the PIN from Twitter here"] = "Copieu el codi PIN de Twitter aquí";\r
$a->strings["Submit"] = "Enviar";\r
#: twitter.php:264
msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
+"At this Friendica instance the Twitter addon was enabled but you have not "
"yet connected your account to your Twitter account. To do so click the "
"button below to get a PIN from Twitter which you have to copy into the input"
" box below and submit the form. Only your <strong>public</strong> posts will"
" be posted to Twitter."
-msgstr "Na této Friendica instanci je sice povolen Twitter plugin, ale vy jste si ještě nenastavili svůj Twitter účet. Svůj účet si můžete nastavit kliknutím na tlačítko níže k získání PINu z Vašeho Twitteru, který si zkopírujte do níže uvedeného vstupního pole a odešlete formulář. Pouze vaše <strong>veřejné</strong> příspěvky budou zaslány na Twitter."
+msgstr "Na této Friendica instanci je sice povolen Twitter addon, ale vy jste si ještě nenastavili svůj Twitter účet. Svůj účet si můžete nastavit kliknutím na tlačítko níže k získání PINu z Vašeho Twitteru, který si zkopírujte do níže uvedeného vstupního pole a odešlete formulář. Pouze vaše <strong>veřejné</strong> příspěvky budou zaslány na Twitter."
#: twitter.php:265
msgid "Log in with Twitter"
$a->strings["Twitter settings updated."] = "Nastavení Twitteru aktualizováno.";
$a->strings["Twitter Import/Export/Mirror"] = "Twitter Import/Export/Zrcadlení";
$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Nenalezen žádný spotřebitelský páru klíčů pro Twitter. Obraťte se na administrátora webu.";
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Na této Friendica instanci je sice povolen Twitter plugin, ale vy jste si ještě nenastavili svůj Twitter účet. Svůj účet si můžete nastavit kliknutím na tlačítko níže k získání PINu z Vašeho Twitteru, který si zkopírujte do níže uvedeného vstupního pole a odešlete formulář. Pouze vaše <strong>veřejné</strong> příspěvky budou zaslány na Twitter.";
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Na této Friendica instanci je sice povolen Twitter addon, ale vy jste si ještě nenastavili svůj Twitter účet. Svůj účet si můžete nastavit kliknutím na tlačítko níže k získání PINu z Vašeho Twitteru, který si zkopírujte do níže uvedeného vstupního pole a odešlete formulář. Pouze vaše <strong>veřejné</strong> příspěvky budou zaslány na Twitter.";
$a->strings["Log in with Twitter"] = "Přihlásit se s Twitter";
$a->strings["Copy the PIN from Twitter here"] = "Zkopírujte sem PIN z Twitteru";
$a->strings["Save Settings"] = "Uložit Nastavení";
#
#
# Translators:
-# bavatar <tobias.diekershoff@gmx.net>, 2014
+# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2014-2015
+# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 14:45+0200\n"
-"PO-Revision-Date: 2014-09-06 11:55+0000\n"
-"Last-Translator: bavatar <tobias.diekershoff@gmx.net>\n"
-"Language-Team: German (http://www.transifex.com/projects/p/friendica/language/de/)\n"
+"POT-Creation-Date: 2018-02-08 07:07+0100\n"
+"PO-Revision-Date: 2018-02-10 17:41+0000\n"
+"Last-Translator: Tobias Diekershoff <tobias.diekershoff@gmx.net>\n"
+"Language-Team: German (http://www.transifex.com/Friendica/friendica/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: twitter.php:146
+#: twitter.php:193
msgid "Post to Twitter"
-msgstr "An Twitter senden"
+msgstr "Auf Twitter veröffentlichen"
-#: twitter.php:203
+#: twitter.php:234
+msgid ""
+"You submitted an empty PIN, please Sign In with Twitter again to get a new "
+"one."
+msgstr "Du hast keine PIN übertragen. Bitte melde dich erneut bei Twitter and um eine neue PIN zu erhalten."
+
+#: twitter.php:261
msgid "Twitter settings updated."
msgstr "Twitter Einstellungen aktualisiert."
-#: twitter.php:233 twitter.php:237
+#: twitter.php:291 twitter.php:295
msgid "Twitter Import/Export/Mirror"
msgstr "Twitter Import/Export/Spiegeln"
-#: twitter.php:245
+#: twitter.php:302
msgid ""
"No consumer key pair for Twitter found. Please contact your site "
"administrator."
msgstr "Kein Consumer Schlüsselpaar für Twitter gefunden. Bitte wende dich an den Administrator der Seite."
-#: twitter.php:264
+#: twitter.php:314
msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
+"At this Friendica instance the Twitter addon was enabled but you have not "
"yet connected your account to your Twitter account. To do so click the "
"button below to get a PIN from Twitter which you have to copy into the input"
" box below and submit the form. Only your <strong>public</strong> posts will"
" be posted to Twitter."
-msgstr "Auf diesem Friendica-Server wurde das Twitter-Plugin aktiviert, aber du hast deinen Account noch nicht mit deinem Twitter-Account verbunden. Klicke dazu auf die Schaltfläche unten. Du erhältst dann eine PIN von Twitter, die du dann in das Eingabefeld unten einfügst. Denk daran, den Senden-Knopf zu drücken! Nur <strong>öffentliche</strong> Beiträge werden bei Twitter veröffentlicht."
+msgstr "Auf diesem Friendica-Server wurde das Twitter-Addon aktiviert, aber du hast deinen Account noch nicht mit deinem Twitter-Account verbunden. Klicke dazu auf die Schaltfläche unten. Du erhältst dann eine PIN von Twitter, die du dann in das Eingabefeld unten einfügst. Denk daran, den Senden-Knopf zu drücken! Nur <strong>öffentliche</strong> Beiträge werden bei Twitter veröffentlicht."
-#: twitter.php:265
+#: twitter.php:315
msgid "Log in with Twitter"
msgstr "bei Twitter anmelden"
-#: twitter.php:267
+#: twitter.php:317
msgid "Copy the PIN from Twitter here"
msgstr "Kopiere die Twitter-PIN hier her"
-#: twitter.php:272 twitter.php:311 twitter.php:569
+#: twitter.php:322 twitter.php:364 twitter.php:642
msgid "Save Settings"
msgstr "Einstellungen speichern"
-#: twitter.php:281
+#: twitter.php:334
msgid "Currently connected to: "
msgstr "Momentan verbunden mit: "
-#: twitter.php:282
+#: twitter.php:335
+msgid "Disconnect"
+msgstr "Trennen"
+
+#: twitter.php:345
+msgid "Allow posting to Twitter"
+msgstr "Veröffentlichung bei Twitter erlauben"
+
+#: twitter.php:345
msgid ""
"If enabled all your <strong>public</strong> postings can be posted to the "
"associated Twitter account. You can choose to do so by default (here) or for"
" every posting separately in the posting options when writing the entry."
msgstr "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen Twitter Konto veröffentlicht werden. Du kannst dies (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen."
-#: twitter.php:284
+#: twitter.php:348
msgid ""
-"<strong>Note</strong>: Due your privacy settings (<em>Hide your profile "
+"<strong>Note</strong>: Due to your privacy settings (<em>Hide your profile "
"details from unknown viewers?</em>) the link potentially included in public "
"postings relayed to Twitter will lead the visitor to a blank page informing "
"the visitor that the access to your profile has been restricted."
msgstr "<strong>Hinweis</strong>: Aufgrund deiner Privatsphären-Einstellungen (<em>Profil-Details vor unbekannten Betrachtern verbergen?</em>) wird der Link, der eventuell an an deinen Twitter Account angehängt wird, um auf den original Artikel zu verweisen, den Betrachter auf eine leere Seite führen, die ihn darüber informiert, dass der Zugriff eingeschränkt wurde."
-#: twitter.php:287
-msgid "Allow posting to Twitter"
-msgstr "Veröffentlichung bei Twitter erlauben"
-
-#: twitter.php:290
+#: twitter.php:351
msgid "Send public postings to Twitter by default"
msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei Twitter"
-#: twitter.php:294
+#: twitter.php:354
msgid "Mirror all posts from twitter that are no replies"
msgstr "Spiegle alle Beiträge von Twitter die keine Antworten oder wiederholten Nachrichten sind"
-#: twitter.php:299
+#: twitter.php:357
msgid "Import the remote timeline"
msgstr "Importiere die entfernte Zeitleiste"
-#: twitter.php:303
+#: twitter.php:360
msgid "Automatically create contacts"
msgstr "Automatisch Kontakte anlegen"
-#: twitter.php:308
-msgid "Clear OAuth configuration"
-msgstr "OAuth Konfiguration löschen"
-
-#: twitter.php:539
+#: twitter.php:619
msgid "Twitter post failed. Queued for retry."
msgstr "Twitter post failed. Queued for retry."
-#: twitter.php:563
+#: twitter.php:634
msgid "Settings updated."
msgstr "Einstellungen aktualisiert."
-#: twitter.php:571
+#: twitter.php:644
msgid "Consumer key"
msgstr "Consumer Key"
-#: twitter.php:572
+#: twitter.php:645
msgid "Consumer secret"
msgstr "Consumer Secret"
-
-#: twitter.php:573
-msgid "Name of the Twitter Application"
-msgstr "Name der Twitter Anwendung"
-
-#: twitter.php:573
-msgid ""
-"set this to avoid mirroring postings from ~friendica back to ~friendica"
-msgstr "Setze dies um eine Spiegelung von ~friendica zu ~friendica zu vermeiden"
return ($n != 1);;
}}
;
-$a->strings["Post to Twitter"] = "An Twitter senden";
+$a->strings["Post to Twitter"] = "Auf Twitter veröffentlichen";
+$a->strings["You submitted an empty PIN, please Sign In with Twitter again to get a new one."] = "Du hast keine PIN übertragen. Bitte melde dich erneut bei Twitter and um eine neue PIN zu erhalten.";
$a->strings["Twitter settings updated."] = "Twitter Einstellungen aktualisiert.";
$a->strings["Twitter Import/Export/Mirror"] = "Twitter Import/Export/Spiegeln";
$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Kein Consumer Schlüsselpaar für Twitter gefunden. Bitte wende dich an den Administrator der Seite.";
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Auf diesem Friendica-Server wurde das Twitter-Plugin aktiviert, aber du hast deinen Account noch nicht mit deinem Twitter-Account verbunden. Klicke dazu auf die Schaltfläche unten. Du erhältst dann eine PIN von Twitter, die du dann in das Eingabefeld unten einfügst. Denk daran, den Senden-Knopf zu drücken! Nur <strong>öffentliche</strong> Beiträge werden bei Twitter veröffentlicht.";
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Auf diesem Friendica-Server wurde das Twitter-Addon aktiviert, aber du hast deinen Account noch nicht mit deinem Twitter-Account verbunden. Klicke dazu auf die Schaltfläche unten. Du erhältst dann eine PIN von Twitter, die du dann in das Eingabefeld unten einfügst. Denk daran, den Senden-Knopf zu drücken! Nur <strong>öffentliche</strong> Beiträge werden bei Twitter veröffentlicht.";
$a->strings["Log in with Twitter"] = "bei Twitter anmelden";
$a->strings["Copy the PIN from Twitter here"] = "Kopiere die Twitter-PIN hier her";
$a->strings["Save Settings"] = "Einstellungen speichern";
$a->strings["Currently connected to: "] = "Momentan verbunden mit: ";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen Twitter Konto veröffentlicht werden. Du kannst dies (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen.";
-$a->strings["<strong>Note</strong>: Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "<strong>Hinweis</strong>: Aufgrund deiner Privatsphären-Einstellungen (<em>Profil-Details vor unbekannten Betrachtern verbergen?</em>) wird der Link, der eventuell an an deinen Twitter Account angehängt wird, um auf den original Artikel zu verweisen, den Betrachter auf eine leere Seite führen, die ihn darüber informiert, dass der Zugriff eingeschränkt wurde.";
+$a->strings["Disconnect"] = "Trennen";
$a->strings["Allow posting to Twitter"] = "Veröffentlichung bei Twitter erlauben";
+$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen Twitter Konto veröffentlicht werden. Du kannst dies (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen.";
+$a->strings["<strong>Note</strong>: Due to your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "<strong>Hinweis</strong>: Aufgrund deiner Privatsphären-Einstellungen (<em>Profil-Details vor unbekannten Betrachtern verbergen?</em>) wird der Link, der eventuell an an deinen Twitter Account angehängt wird, um auf den original Artikel zu verweisen, den Betrachter auf eine leere Seite führen, die ihn darüber informiert, dass der Zugriff eingeschränkt wurde.";
$a->strings["Send public postings to Twitter by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei Twitter";
$a->strings["Mirror all posts from twitter that are no replies"] = "Spiegle alle Beiträge von Twitter die keine Antworten oder wiederholten Nachrichten sind";
$a->strings["Import the remote timeline"] = "Importiere die entfernte Zeitleiste";
$a->strings["Automatically create contacts"] = "Automatisch Kontakte anlegen";
-$a->strings["Clear OAuth configuration"] = "OAuth Konfiguration löschen";
$a->strings["Twitter post failed. Queued for retry."] = "Twitter post failed. Queued for retry.";
$a->strings["Settings updated."] = "Einstellungen aktualisiert.";
$a->strings["Consumer key"] = "Consumer Key";
$a->strings["Consumer secret"] = "Consumer Secret";
-$a->strings["Name of the Twitter Application"] = "Name der Twitter Anwendung";
-$a->strings["set this to avoid mirroring postings from ~friendica back to ~friendica"] = "Setze dies um eine Spiegelung von ~friendica zu ~friendica zu vermeiden";
$a->strings["Twitter settings updated."] = "Ĝisdatigis Twitter agordojn.";\r
$a->strings["Twitter Posting Settings"] = "Agordoj por afiŝi ĉe Twitter";\r
$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Ne trovis klientajn ŝlosilojn por Twitter. Bonvolu kontakti vian retejan administranton.";\r
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Je ĉi tiu Friendica retejo, la Twitter kromprogramo jam estas ŝaltita, sed via konto anokoraŭ ne estas konektita kun via Twitter konto. Por fari tion, klaku la supran butonon por atingi nombrokodon de Twitter, kion vi kopiu en la supran eniga ĉelo, kaj sendu la formularon. Nur viaj <strong>publikaj</strong> afiŝoj estas plusendota al Twitter. ";\r
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Je ĉi tiu Friendica retejo, la Twitter kromprogramo jam estas ŝaltita, sed via konto anokoraŭ ne estas konektita kun via Twitter konto. Por fari tion, klaku la supran butonon por atingi nombrokodon de Twitter, kion vi kopiu en la supran eniga ĉelo, kaj sendu la formularon. Nur viaj <strong>publikaj</strong> afiŝoj estas plusendota al Twitter. ";\r
$a->strings["Log in with Twitter"] = "Ensaluti kun Twitter";\r
$a->strings["Copy the PIN from Twitter here"] = "Alglui la PIN de Twitter ĉi tie";\r
$a->strings["Submit"] = "Sendi";\r
#: twitter.php:183
msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
+"At this Friendica instance the Twitter addon was enabled but you have not "
"yet connected your account to your Twitter account. To do so click the "
"button below to get a PIN from Twitter which you have to copy into the input"
" box below and submit the form. Only your <strong>public</strong> posts will"
" be posted to Twitter."
-msgstr "En esta petición de Friendica el plugin de Twitter estaba activo pero usted no ha conectado aún su cuenta con la cuenta de Twitter. Para hacerlo click en el botón de abajo para obtener un PIN desde Twitter que tiene que copiar en la caja de texto de abajo y enviar el formulario. Sólo sus entradas <strong>públicas</strong> serán posteadas en Twitter"
+msgstr "En esta petición de Friendica el addon de Twitter estaba activo pero usted no ha conectado aún su cuenta con la cuenta de Twitter. Para hacerlo click en el botón de abajo para obtener un PIN desde Twitter que tiene que copiar en la caja de texto de abajo y enviar el formulario. Sólo sus entradas <strong>públicas</strong> serán posteadas en Twitter"
#: twitter.php:184
msgid "Log in with Twitter"
$a->strings["Twitter settings updated."] = "Ajustes de Twitter actualizados.";
$a->strings["Twitter Posting Settings"] = "Ajustes de publicación de Twitter";
$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "No hay par de claves para encuentro de Twitter.";
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "En esta petición de Friendica el plugin de Twitter estaba activo pero usted no ha conectado aún su cuenta con la cuenta de Twitter. Para hacerlo click en el botón de abajo para obtener un PIN desde Twitter que tiene que copiar en la caja de texto de abajo y enviar el formulario. Sólo sus entradas <strong>públicas</strong> serán posteadas en Twitter";
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "En esta petición de Friendica el addon de Twitter estaba activo pero usted no ha conectado aún su cuenta con la cuenta de Twitter. Para hacerlo click en el botón de abajo para obtener un PIN desde Twitter que tiene que copiar en la caja de texto de abajo y enviar el formulario. Sólo sus entradas <strong>públicas</strong> serán posteadas en Twitter";
$a->strings["Log in with Twitter"] = "Iniciar sesión con Twitter";
$a->strings["Copy the PIN from Twitter here"] = "Copie el PIN de Twitter aquí";
$a->strings["Submit"] = "Enviar";
#: twitter.php:183
msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
+"At this Friendica instance the Twitter addon was enabled but you have not "
"yet connected your account to your Twitter account. To do so click the "
"button below to get a PIN from Twitter which you have to copy into the input"
" box below and submit the form. Only your <strong>public</strong> posts will"
$a->strings["Twitter settings updated."] = "Paramètres Twitter mis à jour.";
$a->strings["Twitter Posting Settings"] = "Paramètres Twitter de publication";
$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "";
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "";
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "";
$a->strings["Log in with Twitter"] = "Se connecter avec Twitter";
$a->strings["Copy the PIN from Twitter here"] = "Copier le PIN de Twitter ici";
$a->strings["Submit"] = "Soumettre";
$a->strings["Twitter settings updated."] = "Stillingar Twitter uppfærðar.";\r
$a->strings["Twitter Posting Settings"] = "Twitter færslu stillingar";\r
$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Ekkert notenda lykils par fyrir Twitter fundið. Hafðu samband við kerfisstjórann.";\r
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "";\r
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "";\r
$a->strings["Log in with Twitter"] = "Innskrá með Twitter";\r
$a->strings["Copy the PIN from Twitter here"] = "Afrita PIN frá Twitter hingað";\r
$a->strings["Submit"] = "Senda inn";\r
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:29+0000\n"
+"POT-Creation-Date: 2018-02-08 07:07+0100\n"
+"PO-Revision-Date: 2018-03-19 13:09+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: twitter.php:77
+#: twitter.php:193
msgid "Post to Twitter"
msgstr "Invia a Twitter"
-#: twitter.php:129
+#: twitter.php:234
+msgid ""
+"You submitted an empty PIN, please Sign In with Twitter again to get a new "
+"one."
+msgstr "Hai inserito un PIN vuoto, autenticati con Twitter nuovamente per averne uno nuovo."
+
+#: twitter.php:261
msgid "Twitter settings updated."
msgstr "Impostazioni di Twitter aggiornate."
-#: twitter.php:157
-msgid "Twitter Posting Settings"
-msgstr "Impostazioni di invio a Twitter"
+#: twitter.php:291 twitter.php:295
+msgid "Twitter Import/Export/Mirror"
+msgstr "Importa/Esporta/Clona Twitter"
-#: twitter.php:164
+#: twitter.php:302
msgid ""
"No consumer key pair for Twitter found. Please contact your site "
"administrator."
msgstr "Nessuna coppia di chiavi per Twitter trovata. Contatta l'amministratore del sito."
-#: twitter.php:183
+#: twitter.php:314
msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
+"At this Friendica instance the Twitter addon was enabled but you have not "
"yet connected your account to your Twitter account. To do so click the "
"button below to get a PIN from Twitter which you have to copy into the input"
" box below and submit the form. Only your <strong>public</strong> posts will"
" be posted to Twitter."
-msgstr "Il plugin Twitter è abilitato ma non hai ancora collegato i tuoi account Friendica e Twitter. Per farlo, clicca il bottone qui sotto per ricevere un PIN da Twitter che dovrai copiare nel campo qui sotto. Solo i tuoi post <strong>pubblici</strong> saranno inviati a Twitter."
+msgstr "Il componente aggiuntivo Twitter è abilitato ma non hai ancora collegato i tuoi account Friendica e Twitter. Per farlo, clicca il bottone qui sotto per ricevere un PIN da Twitter che dovrai copiare nel campo qui sotto. Solo i tuoi post <strong>pubblici</strong> saranno inviati a Twitter."
-#: twitter.php:184
+#: twitter.php:315
msgid "Log in with Twitter"
msgstr "Accedi con Twitter"
-#: twitter.php:186
+#: twitter.php:317
msgid "Copy the PIN from Twitter here"
msgstr "Copia il PIN da Twitter qui"
-#: twitter.php:191 twitter.php:229 twitter.php:556
-msgid "Submit"
-msgstr "Invia"
+#: twitter.php:322 twitter.php:364 twitter.php:642
+msgid "Save Settings"
+msgstr "Salva Impostazioni"
-#: twitter.php:200
+#: twitter.php:334
msgid "Currently connected to: "
msgstr "Al momento connesso con:"
-#: twitter.php:201
+#: twitter.php:335
+msgid "Disconnect"
+msgstr "Disconnetti"
+
+#: twitter.php:345
+msgid "Allow posting to Twitter"
+msgstr "Permetti l'invio a Twitter"
+
+#: twitter.php:345
msgid ""
"If enabled all your <strong>public</strong> postings can be posted to the "
"associated Twitter account. You can choose to do so by default (here) or for"
" every posting separately in the posting options when writing the entry."
msgstr "Se abilitato tutti i tuoi messaggi <strong>pubblici</strong> possono essere inviati all'account Twitter associato. Puoi scegliere di farlo sempre (qui) o ogni volta che invii, nelle impostazioni di privacy del messaggio."
-#: twitter.php:203
+#: twitter.php:348
msgid ""
-"<strong>Note</strong>: Due your privacy settings (<em>Hide your profile "
+"<strong>Note</strong>: Due to your privacy settings (<em>Hide your profile "
"details from unknown viewers?</em>) the link potentially included in public "
"postings relayed to Twitter will lead the visitor to a blank page informing "
"the visitor that the access to your profile has been restricted."
-msgstr "<strong>Nota</strong>: A causa delle tue impostazioni di privacy(<em>Nascondi i dettagli del tuo profilo ai visitatori sconosciuti?</em>) il link potenzialmente incluse nei messaggi pubblici inviati a Twitter porterà i visitatori a una pagina bianca con una nota che li informa che l'accesso al tuo profilo è stato limitato."
+msgstr "<strong>Nota</strong>: A causa delle tue impostazioni di privacy(<em>Nascondi i dettagli del tuo profilo ai visitatori sconosciuti?</em>) il link potenzialmente incluso nei messaggi pubblici inviati a Twitter porterà i visitatori a una pagina bianca con una nota che li informa che l'accesso al tuo profilo è stato limitato."
-#: twitter.php:206
-msgid "Allow posting to Twitter"
-msgstr "Permetti l'invio a Twitter"
-
-#: twitter.php:209
+#: twitter.php:351
msgid "Send public postings to Twitter by default"
msgstr "Invia sempre i messaggi pubblici a Twitter"
-#: twitter.php:213
-msgid "Mirror all posts from twitter that are no replies or retweets"
-msgstr "Clona tutti i messaggi da Twitter che non sono risposte or retweet"
+#: twitter.php:354
+msgid "Mirror all posts from twitter that are no replies"
+msgstr "Clona tutti i messaggi da Twitter che non sono risposte"
-#: twitter.php:217
-msgid "Shortening method that optimizes the tweet"
-msgstr "Metodo di accorciatura che ottimizza i tweet"
+#: twitter.php:357
+msgid "Import the remote timeline"
+msgstr "Importa la timeline remota"
-#: twitter.php:221
-msgid "Send linked #-tags and @-names to Twitter"
-msgstr "Invia i link dei #tag e dei @nomi a Twitter"
+#: twitter.php:360
+msgid "Automatically create contacts"
+msgstr "Crea automaticamente i contatti"
-#: twitter.php:226
-msgid "Clear OAuth configuration"
-msgstr "Rimuovi la configurazione OAuth"
+#: twitter.php:619
+msgid "Twitter post failed. Queued for retry."
+msgstr "Invio a Twitter fallito. In coda per riprovare."
-#: twitter.php:550
+#: twitter.php:634
msgid "Settings updated."
msgstr "Impostazioni aggiornate."
-#: twitter.php:558
+#: twitter.php:644
msgid "Consumer key"
msgstr "Consumer key"
-#: twitter.php:559
+#: twitter.php:645
msgid "Consumer secret"
msgstr "Consumer secret"
-
-#: twitter.php:560
-msgid "Name of the Twitter Application"
-msgstr "Nome dell'applicazione Twitter"
-
-#: twitter.php:560
-msgid ""
-"set this to avoid mirroring postings from ~friendica back to ~friendica"
-msgstr "imposta questo per evitare di clonare i messaggi da Friendica nuovamente in Friendica"
}}
;
$a->strings["Post to Twitter"] = "Invia a Twitter";
+$a->strings["You submitted an empty PIN, please Sign In with Twitter again to get a new one."] = "Hai inserito un PIN vuoto, autenticati con Twitter nuovamente per averne uno nuovo.";
$a->strings["Twitter settings updated."] = "Impostazioni di Twitter aggiornate.";
-$a->strings["Twitter Posting Settings"] = "Impostazioni di invio a Twitter";
+$a->strings["Twitter Import/Export/Mirror"] = "Importa/Esporta/Clona Twitter";
$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Nessuna coppia di chiavi per Twitter trovata. Contatta l'amministratore del sito.";
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Il plugin Twitter è abilitato ma non hai ancora collegato i tuoi account Friendica e Twitter. Per farlo, clicca il bottone qui sotto per ricevere un PIN da Twitter che dovrai copiare nel campo qui sotto. Solo i tuoi post <strong>pubblici</strong> saranno inviati a Twitter.";
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Il componente aggiuntivo Twitter è abilitato ma non hai ancora collegato i tuoi account Friendica e Twitter. Per farlo, clicca il bottone qui sotto per ricevere un PIN da Twitter che dovrai copiare nel campo qui sotto. Solo i tuoi post <strong>pubblici</strong> saranno inviati a Twitter.";
$a->strings["Log in with Twitter"] = "Accedi con Twitter";
$a->strings["Copy the PIN from Twitter here"] = "Copia il PIN da Twitter qui";
-$a->strings["Submit"] = "Invia";
+$a->strings["Save Settings"] = "Salva Impostazioni";
$a->strings["Currently connected to: "] = "Al momento connesso con:";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Se abilitato tutti i tuoi messaggi <strong>pubblici</strong> possono essere inviati all'account Twitter associato. Puoi scegliere di farlo sempre (qui) o ogni volta che invii, nelle impostazioni di privacy del messaggio.";
-$a->strings["<strong>Note</strong>: Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "<strong>Nota</strong>: A causa delle tue impostazioni di privacy(<em>Nascondi i dettagli del tuo profilo ai visitatori sconosciuti?</em>) il link potenzialmente incluse nei messaggi pubblici inviati a Twitter porterà i visitatori a una pagina bianca con una nota che li informa che l'accesso al tuo profilo è stato limitato.";
+$a->strings["Disconnect"] = "Disconnetti";
$a->strings["Allow posting to Twitter"] = "Permetti l'invio a Twitter";
+$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Se abilitato tutti i tuoi messaggi <strong>pubblici</strong> possono essere inviati all'account Twitter associato. Puoi scegliere di farlo sempre (qui) o ogni volta che invii, nelle impostazioni di privacy del messaggio.";
+$a->strings["<strong>Note</strong>: Due to your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "<strong>Nota</strong>: A causa delle tue impostazioni di privacy(<em>Nascondi i dettagli del tuo profilo ai visitatori sconosciuti?</em>) il link potenzialmente incluso nei messaggi pubblici inviati a Twitter porterà i visitatori a una pagina bianca con una nota che li informa che l'accesso al tuo profilo è stato limitato.";
$a->strings["Send public postings to Twitter by default"] = "Invia sempre i messaggi pubblici a Twitter";
-$a->strings["Mirror all posts from twitter that are no replies or retweets"] = "Clona tutti i messaggi da Twitter che non sono risposte or retweet";
-$a->strings["Shortening method that optimizes the tweet"] = "Metodo di accorciatura che ottimizza i tweet";
-$a->strings["Send linked #-tags and @-names to Twitter"] = "Invia i link dei #tag e dei @nomi a Twitter";
-$a->strings["Clear OAuth configuration"] = "Rimuovi la configurazione OAuth";
+$a->strings["Mirror all posts from twitter that are no replies"] = "Clona tutti i messaggi da Twitter che non sono risposte";
+$a->strings["Import the remote timeline"] = "Importa la timeline remota";
+$a->strings["Automatically create contacts"] = "Crea automaticamente i contatti";
+$a->strings["Twitter post failed. Queued for retry."] = "Invio a Twitter fallito. In coda per riprovare.";
$a->strings["Settings updated."] = "Impostazioni aggiornate.";
$a->strings["Consumer key"] = "Consumer key";
$a->strings["Consumer secret"] = "Consumer secret";
-$a->strings["Name of the Twitter Application"] = "Nome dell'applicazione Twitter";
-$a->strings["set this to avoid mirroring postings from ~friendica back to ~friendica"] = "imposta questo per evitare di clonare i messaggi da Friendica nuovamente in Friendica";
$a->strings["Twitter settings updated."] = "Twitter-innstilinger oppdatert.";\r
$a->strings["Twitter Posting Settings"] = "Innstillinger for posting til Twitter";\r
$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Ingen \"consumer key pair\" for Twitter funnet. Vennligst kontakt stedets administrator.";\r
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Ved denne Friendica-forekomsten er Twitter-tillegget aktivert, men du har ennå ikke tilkoblet din konto til din Twitter-konto. For å gjøre det, klikk på knappen nedenfor for å få en PIN-kode fra Twitter som du må kopiere inn i feltet nedenfor og sende inn skjemaet. Bare dine <strong>offentlige</strong> innlegg vil bli lagt inn på Twitter. ";\r
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Ved denne Friendica-forekomsten er Twitter-tillegget aktivert, men du har ennå ikke tilkoblet din konto til din Twitter-konto. For å gjøre det, klikk på knappen nedenfor for å få en PIN-kode fra Twitter som du må kopiere inn i feltet nedenfor og sende inn skjemaet. Bare dine <strong>offentlige</strong> innlegg vil bli lagt inn på Twitter. ";\r
$a->strings["Log in with Twitter"] = "Logg inn via Twitter";\r
$a->strings["Copy the PIN from Twitter here"] = "Kopier PIN-kode fra Twitter hit";\r
$a->strings["Submit"] = "Lagre";\r
$a->strings["Twitter settings updated."] = "Zaktualizowano ustawienia Twittera.";\r
$a->strings["Twitter Posting Settings"] = "Ustawienia wpisów z Twittera";\r
$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Nie znaleziono pary dla Twittera. Proszę skontaktować się z admininstratorem strony.";\r
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "";\r
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "";\r
$a->strings["Log in with Twitter"] = "Zaloguj się przez Twitter";\r
$a->strings["Copy the PIN from Twitter here"] = "Skopiuj tutaj PIN z Twittera";\r
$a->strings["Submit"] = "Potwierdź";\r
#: twitter.php:183
msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
+"At this Friendica instance the Twitter addon was enabled but you have not "
"yet connected your account to your Twitter account. To do so click the "
"button below to get a PIN from Twitter which you have to copy into the input"
" box below and submit the form. Only your <strong>public</strong> posts will"
$a->strings["Twitter settings updated."] = "As configurações do Twitter foram atualizadas.";
$a->strings["Twitter Posting Settings"] = "Configurações de publicação no Twitter";
$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Não foi encontrado nenhum par de \"consumer keys\" para o Twitter. Por favor, entre em contato com a administração do site.";
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "O plug-in do Twitter está habilitado nesta instância do Friendica, mas você ainda não conectou sua conta aqui à sua conta no Twitter. Para fazer isso, clique no botão abaixo. Você vai receber um código de verificação do Twitter. Copie-o para o campo abaixo e envie o formulário. Apenas os seus posts <strong>públicos</strong> serão publicados no Twitter.";
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "O plug-in do Twitter está habilitado nesta instância do Friendica, mas você ainda não conectou sua conta aqui à sua conta no Twitter. Para fazer isso, clique no botão abaixo. Você vai receber um código de verificação do Twitter. Copie-o para o campo abaixo e envie o formulário. Apenas os seus posts <strong>públicos</strong> serão publicados no Twitter.";
$a->strings["Log in with Twitter"] = "Entrar com o Twitter";
$a->strings["Copy the PIN from Twitter here"] = "Cole o código de verificação do Twitter aqui";
$a->strings["Submit"] = "Enviar";
#: twitter.php:264
msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
+"At this Friendica instance the Twitter addon was enabled but you have not "
"yet connected your account to your Twitter account. To do so click the "
"button below to get a PIN from Twitter which you have to copy into the input"
" box below and submit the form. Only your <strong>public</strong> posts will"
$a->strings["Twitter settings updated."] = "Configurările Twitter au fost actualizate.";
$a->strings["Twitter Import/Export/Mirror"] = "Import/Export/Clonare Twitter";
$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Nici o pereche de chei de utilizator pentru Twitter nu a fost găsită. Vă rugăm să vă contactați administratorul de site.";
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Pe această sesiune Friendica, modulul Twitter era activat, dar încă nu v-ați conectat contul la profilul dvs. Twitter. Pentru aceasta apăsați pe butonul de mai jos pentru a obține un PIN de pe Twitter pe care va trebui să îl copiați în caseta de introducere mai jos şi trimiteți formularul. Numai postările dumneavoastră <strong>publice</strong> vor fi postate pe Twitter.";
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Pe această sesiune Friendica, modulul Twitter era activat, dar încă nu v-ați conectat contul la profilul dvs. Twitter. Pentru aceasta apăsați pe butonul de mai jos pentru a obține un PIN de pe Twitter pe care va trebui să îl copiați în caseta de introducere mai jos şi trimiteți formularul. Numai postările dumneavoastră <strong>publice</strong> vor fi postate pe Twitter.";
$a->strings["Log in with Twitter"] = "Autentificare prin Twitter";
$a->strings["Copy the PIN from Twitter here"] = "Copiați aici PIN-ul de la Twitter";
$a->strings["Save Settings"] = "Salvare Configurări";
#: twitter.php:183
msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
+"At this Friendica instance the Twitter addon was enabled but you have not "
"yet connected your account to your Twitter account. To do so click the "
"button below to get a PIN from Twitter which you have to copy into the input"
" box below and submit the form. Only your <strong>public</strong> posts will"
$a->strings["Twitter settings updated."] = "Настройки Twitter обновлены.";
$a->strings["Twitter Posting Settings"] = "Настройка отправки сообщений в Twitter";
$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Не найдено пары потребительских ключей для Twitter. Пожалуйста, обратитесь к администратору сайта.";
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Чтобы подключиться к Twitter аккаунту, нажмите на кнопку ниже, чтобы получить код безопасности от Twitter, который нужно скопировать в поле ввода ниже, и отправить форму. Только ваши <strong>публичные сообщения</strong> будут отправляться на Twitter.";
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Чтобы подключиться к Twitter аккаунту, нажмите на кнопку ниже, чтобы получить код безопасности от Twitter, который нужно скопировать в поле ввода ниже, и отправить форму. Только ваши <strong>публичные сообщения</strong> будут отправляться на Twitter.";
$a->strings["Log in with Twitter"] = "Войдите через Twitter";
$a->strings["Copy the PIN from Twitter here"] = "Скопируйте PIN с Twitter сюда";
$a->strings["Submit"] = "Подтвердить";
$a->strings["Post to Twitter"] = "Lägg in på Twitter";\r
$a->strings["Twitter Posting Settings"] = "Inställningar för inlägg på Twitter";\r
$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "No consumer key pair for Twitter found. Please contact your site administrator.";\r
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter.";\r
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter.";\r
$a->strings["Copy the PIN from Twitter here"] = "Ange PIN-koden från Twitter här";\r
$a->strings["Submit"] = "Spara";\r
$a->strings["Currently connected to: "] = "Ansluten till: ";\r
$a->strings["Twitter settings updated."] = "Twitter设置更新了。";\r
$a->strings["Twitter Posting Settings"] = "Twitter发送设置";\r
$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "找不到Twitter的消费钥匙双。请联系您的网页行政人员。";\r
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "在这个Friendica网站使Twitter插件可用的可您还没有把您的账户和您Twitter账户连通。为这做点击下边的按钮得到密码从Twitter您要粘贴在下边的输入框和提交。只您的<strong>公开</strong>文章被发送到Twitter。";\r
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "在这个Friendica网站使Twitter插件可用的可您还没有把您的账户和您Twitter账户连通。为这做点击下边的按钮得到密码从Twitter您要粘贴在下边的输入框和提交。只您的<strong>公开</strong>文章被发送到Twitter。";\r
$a->strings["Log in with Twitter"] = "用Twitter登记";\r
$a->strings["Copy the PIN from Twitter here"] = "复制Twitter密码这儿";\r
$a->strings["Submit"] = "提交";\r
/**
* Name: Twitter Connector
* Description: Bidirectional (posting, relaying and reading) connector for Twitter.
- * Version: 1.0.4
+ * Version: 1.1.0
* Author: Tobias Diekershoff <https://f.diekershoff.de/profile/tobias>
* Author: Michael Vogel <https://pirati.ca/profile/heluecht>
+ * Maintainer: Hypolite Petovan <https://friendica.mrpetovan.com/profile/hypolite>
*
- * Copyright (c) 2011-2013 Tobias Diekershoff, Michael Vogel
+ * Copyright (c) 2011-2013 Tobias Diekershoff, Michael Vogel, Hypolite Petovan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
-
-/* Twitter Plugin for Friendica
+/* Twitter Addon for Friendica
*
* Author: Tobias Diekershoff
* tobias.diekershoff@gmx.net
* License:3-clause BSD license
*
* Configuration:
- * To use this plugin you need a OAuth Consumer key pair (key & secret)
+ * To use this addon you need a OAuth Consumer key pair (key & secret)
* you can get it from Twitter at https://twitter.com/apps
*
* Register your Friendica site as "Client" application with "Read & Write" access
* $a->config['twitter']['consumerkey'] = 'your consumer_key here';
* $a->config['twitter']['consumersecret'] = 'your consumer_secret here';
*
- * To activate the plugin itself add it to the $a->config['system']['addon']
+ * To activate the addon itself add it to the $a->config['system']['addon']
* setting. After this, your user can configure their Twitter account settings
- * from "Settings -> Plugin Settings".
+ * from "Settings -> Addon Settings".
*
- * Requirements: PHP5, curl [Slinky library]
+ * Requirements: PHP5, curl
*/
-require_once('include/enotify.php');
-require_once("include/socgraph.php");
+use Abraham\TwitterOAuth\TwitterOAuth;
+use Friendica\App;
+use Friendica\Content\OEmbed;
+use Friendica\Content\Text\BBCode;
+use Friendica\Content\Text\Plaintext;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Core\Worker;
+use Friendica\Model\GContact;
+use Friendica\Model\Group;
+use Friendica\Model\Item;
+use Friendica\Model\Photo;
+use Friendica\Model\Queue;
+use Friendica\Model\User;
+use Friendica\Object\Image;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Network;
+
+require_once 'boot.php';
+require_once 'include/dba.php';
+require_once 'include/enotify.php';
+require_once 'include/text.php';
+
+require_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
define('TWITTER_DEFAULT_POLL_INTERVAL', 5); // given in minutes
function twitter_install() {
// we need some hooks, for the configuration and for sending tweets
- register_hook('connector_settings', 'addon/twitter/twitter.php', 'twitter_settings');
- register_hook('connector_settings_post', 'addon/twitter/twitter.php', 'twitter_settings_post');
- register_hook('post_local', 'addon/twitter/twitter.php', 'twitter_post_local');
- register_hook('notifier_normal', 'addon/twitter/twitter.php', 'twitter_post_hook');
- register_hook('jot_networks', 'addon/twitter/twitter.php', 'twitter_jot_nets');
- register_hook('cron', 'addon/twitter/twitter.php', 'twitter_cron');
- register_hook('queue_predeliver', 'addon/twitter/twitter.php', 'twitter_queue_hook');
- register_hook('follow', 'addon/twitter/twitter.php', 'twitter_follow');
- register_hook('expire', 'addon/twitter/twitter.php', 'twitter_expire');
- register_hook('prepare_body', 'addon/twitter/twitter.php', 'twitter_prepare_body');
- register_hook('check_item_notification','addon/twitter/twitter.php', 'twitter_check_item_notification');
+ Addon::registerHook('connector_settings', 'addon/twitter/twitter.php', 'twitter_settings');
+ Addon::registerHook('connector_settings_post', 'addon/twitter/twitter.php', 'twitter_settings_post');
+ Addon::registerHook('post_local', 'addon/twitter/twitter.php', 'twitter_post_local');
+ Addon::registerHook('notifier_normal', 'addon/twitter/twitter.php', 'twitter_post_hook');
+ Addon::registerHook('jot_networks', 'addon/twitter/twitter.php', 'twitter_jot_nets');
+ Addon::registerHook('cron', 'addon/twitter/twitter.php', 'twitter_cron');
+ Addon::registerHook('queue_predeliver', 'addon/twitter/twitter.php', 'twitter_queue_hook');
+ Addon::registerHook('follow', 'addon/twitter/twitter.php', 'twitter_follow');
+ Addon::registerHook('expire', 'addon/twitter/twitter.php', 'twitter_expire');
+ Addon::registerHook('prepare_body', 'addon/twitter/twitter.php', 'twitter_prepare_body');
+ Addon::registerHook('check_item_notification', 'addon/twitter/twitter.php', 'twitter_check_item_notification');
logger("installed twitter");
}
-
-function twitter_uninstall() {
- unregister_hook('connector_settings', 'addon/twitter/twitter.php', 'twitter_settings');
- unregister_hook('connector_settings_post', 'addon/twitter/twitter.php', 'twitter_settings_post');
- unregister_hook('post_local', 'addon/twitter/twitter.php', 'twitter_post_local');
- unregister_hook('notifier_normal', 'addon/twitter/twitter.php', 'twitter_post_hook');
- unregister_hook('jot_networks', 'addon/twitter/twitter.php', 'twitter_jot_nets');
- unregister_hook('cron', 'addon/twitter/twitter.php', 'twitter_cron');
- unregister_hook('queue_predeliver', 'addon/twitter/twitter.php', 'twitter_queue_hook');
- unregister_hook('follow', 'addon/twitter/twitter.php', 'twitter_follow');
- unregister_hook('expire', 'addon/twitter/twitter.php', 'twitter_expire');
- unregister_hook('prepare_body', 'addon/twitter/twitter.php', 'twitter_prepare_body');
- unregister_hook('check_item_notification','addon/twitter/twitter.php', 'twitter_check_item_notification');
+function twitter_uninstall()
+{
+ Addon::unregisterHook('connector_settings', 'addon/twitter/twitter.php', 'twitter_settings');
+ Addon::unregisterHook('connector_settings_post', 'addon/twitter/twitter.php', 'twitter_settings_post');
+ Addon::unregisterHook('post_local', 'addon/twitter/twitter.php', 'twitter_post_local');
+ Addon::unregisterHook('notifier_normal', 'addon/twitter/twitter.php', 'twitter_post_hook');
+ Addon::unregisterHook('jot_networks', 'addon/twitter/twitter.php', 'twitter_jot_nets');
+ Addon::unregisterHook('cron', 'addon/twitter/twitter.php', 'twitter_cron');
+ Addon::unregisterHook('queue_predeliver', 'addon/twitter/twitter.php', 'twitter_queue_hook');
+ Addon::unregisterHook('follow', 'addon/twitter/twitter.php', 'twitter_follow');
+ Addon::unregisterHook('expire', 'addon/twitter/twitter.php', 'twitter_expire');
+ Addon::unregisterHook('prepare_body', 'addon/twitter/twitter.php', 'twitter_prepare_body');
+ Addon::unregisterHook('check_item_notification', 'addon/twitter/twitter.php', 'twitter_check_item_notification');
// old setting - remove only
- unregister_hook('post_local_end', 'addon/twitter/twitter.php', 'twitter_post_hook');
- unregister_hook('plugin_settings', 'addon/twitter/twitter.php', 'twitter_settings');
- unregister_hook('plugin_settings_post', 'addon/twitter/twitter.php', 'twitter_settings_post');
-
+ Addon::unregisterHook('post_local_end', 'addon/twitter/twitter.php', 'twitter_post_hook');
+ Addon::unregisterHook('addon_settings', 'addon/twitter/twitter.php', 'twitter_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/twitter/twitter.php', 'twitter_settings_post');
}
function twitter_check_item_notification($a, &$notification_data) {
$uid = $a->user["uid"];
- $ckey = get_config('twitter', 'consumerkey');
- $csecret = get_config('twitter', 'consumersecret');
- $otoken = get_pconfig($uid, 'twitter', 'oauthtoken');
- $osecret = get_pconfig($uid, 'twitter', 'oauthsecret');
-
- require_once("addon/twitter/codebird.php");
-
- $cb = \Codebird\Codebird::getInstance();
- $cb->setConsumerKey($ckey, $csecret);
- $cb->setToken($otoken, $osecret);
+ $ckey = Config::get('twitter', 'consumerkey');
+ $csecret = Config::get('twitter', 'consumersecret');
+ $otoken = PConfig::get($uid, 'twitter', 'oauthtoken');
+ $osecret = PConfig::get($uid, 'twitter', 'oauthsecret');
- $parameters = array();
- $parameters["screen_name"] = $nickname;
+ // If the addon is not configured (general or for this user) quit here
+ if (empty($ckey) || empty($csecret) || empty($otoken) || empty($osecret)) {
+ $contact = false;
+ return;
+ }
- $user = $cb->friendships_create($parameters);
+ $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
+ $connection->post('friendships/create', ['screen_name' => $nickname]);
twitter_fetchuser($a, $uid, $nickname);
$tw_defpost = get_pconfig(local_user(),'twitter','post_by_default');
$selected = ((intval($tw_defpost) == 1) ? ' checked="checked" ' : '');
$b .= '<div class="profile-jot-net"><input type="checkbox" name="twitter_enable"' . $selected . ' value="1" /> '
- . t('Post to Twitter') . '</div>';
+ . L10n::t('Post to Twitter') . '</div>';
}
}
if(! local_user())
return;
// don't check twitter settings if twitter submit button is not clicked
- if (!x($_POST,'twitter-submit'))
+ if (empty($_POST['twitter-disconnect']) && empty($_POST['twitter-submit'])) {
return;
- if (isset($_POST['twitter-disconnect'])) {
- /***
+ if (!empty($_POST['twitter-disconnect'])) {
+ /* * *
* if the twitter-disconnect checkbox is set, clear the OAuth key/secret pair
* from the user configuration
*/
del_pconfig(local_user(), 'twitter', 'create_user');
del_pconfig(local_user(), 'twitter', 'own_id');
} else {
- if (isset($_POST['twitter-pin'])) {
- // if the user supplied us with a PIN from Twitter, let the magic of OAuth happen
- logger('got a Twitter PIN');
- require_once('library/twitteroauth.php');
- $ckey = get_config('twitter', 'consumerkey');
- $csecret = get_config('twitter', 'consumersecret');
- // the token and secret for which the PIN was generated were hidden in the settings
- // form as token and token2, we need a new connection to Twitter using these token
- // and secret to request a Access Token with the PIN
- $connection = new TwitterOAuth($ckey, $csecret, $_POST['twitter-token'], $_POST['twitter-token2']);
- $token = $connection->getAccessToken( $_POST['twitter-pin'] );
- // ok, now that we have the Access Token, save them in the user config
- set_pconfig(local_user(),'twitter', 'oauthtoken', $token['oauth_token']);
- set_pconfig(local_user(),'twitter', 'oauthsecret', $token['oauth_token_secret']);
- set_pconfig(local_user(),'twitter', 'post', 1);
- // reload the Addon Settings page, if we don't do it see Bug #42
- goaway($a->get_baseurl().'/settings/connectors');
- } else {
- // if no PIN is supplied in the POST variables, the user has changed the setting
- // to post a tweet for every new __public__ posting to the wall
- set_pconfig(local_user(),'twitter','post',intval($_POST['twitter-enable']));
- set_pconfig(local_user(),'twitter','post_by_default',intval($_POST['twitter-default']));
- set_pconfig(local_user(), 'twitter', 'mirror_posts', intval($_POST['twitter-mirror']));
- set_pconfig(local_user(), 'twitter', 'import', intval($_POST['twitter-import']));
- set_pconfig(local_user(), 'twitter', 'create_user', intval($_POST['twitter-create_user']));
-
- if (!intval($_POST['twitter-mirror']))
- del_pconfig(local_user(),'twitter','lastid');
-
- info(t('Twitter settings updated.') . EOL);
- }}
+ if (isset($_POST['twitter-pin'])) {
+ // if the user supplied us with a PIN from Twitter, let the magic of OAuth happen
+ logger('got a Twitter PIN');
+ $ckey = Config::get('twitter', 'consumerkey');
+ $csecret = Config::get('twitter', 'consumersecret');
+ // the token and secret for which the PIN was generated were hidden in the settings
+ // form as token and token2, we need a new connection to Twitter using these token
+ // and secret to request a Access Token with the PIN
+ try {
+ if (empty($_POST['twitter-pin'])) {
+ throw new Exception(L10n::t('You submitted an empty PIN, please Sign In with Twitter again to get a new one.'));
+ }
+
+ $connection = new TwitterOAuth($ckey, $csecret, $_POST['twitter-token'], $_POST['twitter-token2']);
+ $token = $connection->oauth("oauth/access_token", ["oauth_verifier" => $_POST['twitter-pin']]);
+ // ok, now that we have the Access Token, save them in the user config
+ PConfig::set(local_user(), 'twitter', 'oauthtoken', $token['oauth_token']);
+ PConfig::set(local_user(), 'twitter', 'oauthsecret', $token['oauth_token_secret']);
+ PConfig::set(local_user(), 'twitter', 'post', 1);
+ } catch(Exception $e) {
+ info($e->getMessage());
+ }
+ // reload the Addon Settings page, if we don't do it see Bug #42
+ goaway('settings/connectors');
+ } else {
+ // if no PIN is supplied in the POST variables, the user has changed the setting
+ // to post a tweet for every new __public__ posting to the wall
+ PConfig::set(local_user(), 'twitter', 'post', intval($_POST['twitter-enable']));
+ PConfig::set(local_user(), 'twitter', 'post_by_default', intval($_POST['twitter-default']));
+ PConfig::set(local_user(), 'twitter', 'mirror_posts', intval($_POST['twitter-mirror']));
+ PConfig::set(local_user(), 'twitter', 'import', intval($_POST['twitter-import']));
+ PConfig::set(local_user(), 'twitter', 'create_user', intval($_POST['twitter-create_user']));
+
+ if (!intval($_POST['twitter-mirror'])) {
+ PConfig::delete(local_user(), 'twitter', 'lastid');
+ }
+
+ info(L10n::t('Twitter settings updated.') . EOL);
+ }
+ }
}
function twitter_settings(&$a,&$s) {
if(! local_user())
* 2) If no OAuthtoken & stuff is present, generate button to get some
* 3) Checkbox for "Send public notices (140 chars only)
*/
- $ckey = get_config('twitter', 'consumerkey' );
- $csecret = get_config('twitter', 'consumersecret' );
- $otoken = get_pconfig(local_user(), 'twitter', 'oauthtoken' );
- $osecret = get_pconfig(local_user(), 'twitter', 'oauthsecret' );
- $enabled = get_pconfig(local_user(), 'twitter', 'post');
- $checked = (($enabled) ? ' checked="checked" ' : '');
- $defenabled = get_pconfig(local_user(),'twitter','post_by_default');
- $defchecked = (($defenabled) ? ' checked="checked" ' : '');
- $mirrorenabled = get_pconfig(local_user(),'twitter','mirror_posts');
- $mirrorchecked = (($mirrorenabled) ? ' checked="checked" ' : '');
- $importenabled = get_pconfig(local_user(),'twitter','import');
- $importchecked = (($importenabled) ? ' checked="checked" ' : '');
- $create_userenabled = get_pconfig(local_user(),'twitter','create_user');
- $create_userchecked = (($create_userenabled) ? ' checked="checked" ' : '');
+ $ckey = Config::get('twitter', 'consumerkey');
+ $csecret = Config::get('twitter', 'consumersecret');
+ $otoken = PConfig::get(local_user(), 'twitter', 'oauthtoken');
+ $osecret = PConfig::get(local_user(), 'twitter', 'oauthsecret');
+
+ $enabled = intval(PConfig::get(local_user(), 'twitter', 'post'));
+ $defenabled = intval(PConfig::get(local_user(), 'twitter', 'post_by_default'));
+ $mirrorenabled = intval(PConfig::get(local_user(), 'twitter', 'mirror_posts'));
+ $importenabled = intval(PConfig::get(local_user(), 'twitter', 'import'));
+ $create_userenabled = intval(PConfig::get(local_user(), 'twitter', 'create_user'));
$css = (($enabled) ? '' : '-disabled');
$s .= '<span id="settings_twitter_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_twitter_expanded\'); openClose(\'settings_twitter_inflated\');">';
- $s .= '<img class="connector'.$css.'" src="images/twitter.png" /><h3 class="connector">'. t('Twitter Import/Export/Mirror').'</h3>';
+ $s .= '<img class="connector' . $css . '" src="images/twitter.png" /><h3 class="connector">' . L10n::t('Twitter Import/Export/Mirror') . '</h3>';
$s .= '</span>';
$s .= '<div id="settings_twitter_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_twitter_expanded\'); openClose(\'settings_twitter_inflated\');">';
- $s .= '<img class="connector'.$css.'" src="images/twitter.png" /><h3 class="connector">'. t('Twitter Import/Export/Mirror').'</h3>';
+ $s .= '<img class="connector' . $css . '" src="images/twitter.png" /><h3 class="connector">' . L10n::t('Twitter Import/Export/Mirror') . '</h3>';
$s .= '</span>';
- if ( (!$ckey) && (!$csecret) ) {
- /***
- * no global consumer keys
+ if ((!$ckey) && (!$csecret)) {
+ /* no global consumer keys
* display warning and skip personal config
*/
- $s .= '<p>'. t('No consumer key pair for Twitter found. Please contact your site administrator.') .'</p>';
+ $s .= '<p>' . L10n::t('No consumer key pair for Twitter found. Please contact your site administrator.') . '</p>';
} else {
- /***
- * ok we have a consumer key pair now look into the OAuth stuff
- */
- if ( (!$otoken) && (!$osecret) ) {
- /***
- * the user has not yet connected the account to twitter...
+ // ok we have a consumer key pair now look into the OAuth stuff
+ if ((!$otoken) && (!$osecret)) {
+ /* the user has not yet connected the account to twitter...
* get a temporary OAuth key/secret pair and display a button with
* which the user can request a PIN to connect the account to a
* account at Twitter.
*/
- require_once('library/twitteroauth.php');
$connection = new TwitterOAuth($ckey, $csecret);
- $request_token = $connection->getRequestToken();
- $token = $request_token['oauth_token'];
- /***
- * make some nice form
- */
- $s .= '<p>'. t('At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter.') .'</p>';
- $s .= '<a href="'.$connection->getAuthorizeURL($token).'" target="_twitter"><img src="addon/twitter/lighter.png" alt="'.t('Log in with Twitter').'"></a>';
+ $result = $connection->oauth('oauth/request_token', ['oauth_callback' => 'oob']);
+
+ $s .= '<p>' . L10n::t('At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter.') . '</p>';
+ $s .= '<a href="' . $connection->url('oauth/authorize', ['oauth_token' => $result['oauth_token']]) . '" target="_twitter"><img src="addon/twitter/lighter.png" alt="' . L10n::t('Log in with Twitter') . '"></a>';
$s .= '<div id="twitter-pin-wrapper">';
- $s .= '<label id="twitter-pin-label" for="twitter-pin">'. t('Copy the PIN from Twitter here') .'</label>';
+ $s .= '<label id="twitter-pin-label" for="twitter-pin">' . L10n::t('Copy the PIN from Twitter here') . '</label>';
$s .= '<input id="twitter-pin" type="text" name="twitter-pin" />';
- $s .= '<input id="twitter-token" type="hidden" name="twitter-token" value="'.$token.'" />';
- $s .= '<input id="twitter-token2" type="hidden" name="twitter-token2" value="'.$request_token['oauth_token_secret'].'" />';
- $s .= '</div><div class="clear"></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="twitter-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
+ $s .= '<input id="twitter-token" type="hidden" name="twitter-token" value="' . $result['oauth_token'] . '" />';
+ $s .= '<input id="twitter-token2" type="hidden" name="twitter-token2" value="' . $result['oauth_token_secret'] . '" />';
+ $s .= '</div><div class="clear"></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="twitter-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
} else {
/***
* we have an OAuth key / secret pair for the user
* so let's give a chance to disable the postings to Twitter
*/
- require_once('library/twitteroauth.php');
- $connection = new TwitterOAuth($ckey,$csecret,$otoken,$osecret);
+ $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
$details = $connection->get('account/verify_credentials');
$s .= '<div id="twitter-info" ><img id="twitter-avatar" src="'.$details->profile_image_url.'" /><p id="twitter-info-block">'. t('Currently connected to: ') .'<a href="https://twitter.com/'.$details->screen_name.'" target="_twitter">'.$details->screen_name.'</a><br /><em>'.$details->description.'</em></p></div>';
$s .= '<p>'. t('If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry.') .'</p>';
$s .= '<input id="twitter-default" type="checkbox" name="twitter-default" value="1" ' . $defchecked . '/>';
$s .= '<div class="clear"></div>';
- $s .= '<label id="twitter-mirror-label" for="twitter-mirror">'.t('Mirror all posts from twitter that are no replies').'</label>';
- $s .= '<input id="twitter-mirror" type="checkbox" name="twitter-mirror" value="1" '. $mirrorchecked . '/>';
+ $field_checkbox = get_markup_template('field_checkbox.tpl');
+
+ $s .= '<div id="twitter-info" >
+ <p>' . L10n::t('Currently connected to: ') . '<a href="https://twitter.com/' . $details->screen_name . '" target="_twitter">' . $details->screen_name . '</a>
+ <button type="submit" name="twitter-disconnect" value="1">' . L10n::t('Disconnect') . '</button>
+ </p>
+ <p id="twitter-info-block">
+ <a href="https://twitter.com/' . $details->screen_name . '" target="_twitter"><img id="twitter-avatar" src="' . $details->profile_image_url . '" /></a>
+ <em>' . $details->description . '</em>
+ </p>
+ </div>';
$s .= '<div class="clear"></div>';
$s .= '</div>';
- $s .= '<label id="twitter-import-label" for="twitter-import">'.t('Import the remote timeline').'</label>';
- $s .= '<input id="twitter-import" type="checkbox" name="twitter-import" value="1" '. $importchecked . '/>';
- $s .= '<div class="clear"></div>';
+ $s .= replace_macros($field_checkbox, [
+ '$field' => ['twitter-enable', L10n::t('Allow posting to Twitter'), $enabled, L10n::t('If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry.')]
+ ]);
+ if ($a->user['hidewall']) {
+ $s .= '<p>' . L10n::t('<strong>Note</strong>: Due to your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted.') . '</p>';
+ }
+ $s .= replace_macros($field_checkbox, [
+ '$field' => ['twitter-default', L10n::t('Send public postings to Twitter by default'), $defenabled, '']
+ ]);
+ $s .= replace_macros($field_checkbox, [
+ '$field' => ['twitter-mirror', L10n::t('Mirror all posts from twitter that are no replies'), $mirrorenabled, '']
+ ]);
+ $s .= replace_macros($field_checkbox, [
+ '$field' => ['twitter-import', L10n::t('Import the remote timeline'), $importenabled, '']
+ ]);
+ $s .= replace_macros($field_checkbox, [
+ '$field' => ['twitter-create_user', L10n::t('Automatically create contacts'), $create_userenabled, '']
+ ]);
$s .= '<label id="twitter-create_user-label" for="twitter-create_user">'.t('Automatically create contacts').'</label>';
$s .= '<input id="twitter-create_user" type="checkbox" name="twitter-create_user" value="1" '. $create_userchecked . '/>';
$s .= '<div class="clear"></div>';
-
- $s .= '<div id="twitter-disconnect-wrapper">';
- $s .= '<label id="twitter-disconnect-label" for="twitter-disconnect">'. t('Clear OAuth configuration') .'</label>';
- $s .= '<input id="twitter-disconnect" type="checkbox" name="twitter-disconnect" value="1" />';
- $s .= '</div><div class="clear"></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="twitter-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="twitter-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
}
}
$s .= '</div><div class="clear"></div>';
function twitter_action($a, $uid, $pid, $action) {
- $ckey = get_config('twitter', 'consumerkey');
- $csecret = get_config('twitter', 'consumersecret');
- $otoken = get_pconfig($uid, 'twitter', 'oauthtoken');
- $osecret = get_pconfig($uid, 'twitter', 'oauthsecret');
-
- require_once("addon/twitter/codebird.php");
-
- $cb = \Codebird\Codebird::getInstance();
- $cb->setConsumerKey($ckey, $csecret);
- $cb->setToken($otoken, $osecret);
+ $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
$post = array('id' => $pid);
switch ($action) {
case "delete":
- // To-Do: $result = $cb->statuses_destroy($post);
+ // To-Do: $result = $connection->post('statuses/destroy', $post);
break;
case "like":
- $result = $cb->favorites_create($post);
+ $result = $connection->post('favorites/create', $post);
break;
case "unlike":
- $result = $cb->favorites_destroy($post);
+ $result = $connection->post('favorites/destroy', $post);
break;
}
logger("twitter_action '".$action."' send, result: " . print_r($result, true), LOGGER_DEBUG);
}
-function twitter_post_hook(&$a,&$b) {
-
- /**
- * Post to Twitter
- */
-
- require_once("include/network.php");
-
- if (!get_pconfig($b["uid"],'twitter','import')) {
- if($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited']))
- return;
+function twitter_post_hook(App $a, &$b)
+{
+ // Post to Twitter
+ if (!PConfig::get($b["uid"], 'twitter', 'import')
+ && ($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited']))) {
+ return;
}
if($b['parent'] != $b['id']) {
logger("twitter_post_hook: parameter ".print_r($b, true), LOGGER_DATA);
// Looking if its a reply to a twitter post
- if ((substr($b["parent-uri"], 0, 9) != "twitter::") && (substr($b["extid"], 0, 9) != "twitter::") && (substr($b["thr-parent"], 0, 9) != "twitter::")) {
- logger("twitter_post_hook: no twitter post ".$b["parent"]);
+ if ((substr($b["parent-uri"], 0, 9) != "twitter::")
+ && (substr($b["extid"], 0, 9) != "twitter::")
+ && (substr($b["thr-parent"], 0, 9) != "twitter::"))
+ {
+ logger("twitter_post_hook: no twitter post " . $b["parent"]);
return;
}
if (($b['verb'] == ACTIVITY_POST) && $b['deleted'])
twitter_action($a, $b["uid"], substr($orig_post["uri"], 9), "delete");
- if($b['verb'] == ACTIVITY_LIKE) {
- logger("twitter_post_hook: parameter 2 ".substr($b["thr-parent"], 9), LOGGER_DEBUG);
- if ($b['deleted'])
+ if ($b['verb'] == ACTIVITY_LIKE) {
+ logger("twitter_post_hook: parameter 2 " . substr($b["thr-parent"], 9), LOGGER_DEBUG);
+ if ($b['deleted']) {
twitter_action($a, $b["uid"], substr($b["thr-parent"], 9), "unlike");
- else
+ } else {
twitter_action($a, $b["uid"], substr($b["thr-parent"], 9), "like");
+ }
+
return;
}
if (twitter_is_retweet($a, $b['uid'], $b['body']))
return;
- require_once('library/twitteroauth.php');
- require_once('include/bbcode.php');
- $tweet = new TwitterOAuth($ckey,$csecret,$otoken,$osecret);
+ $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
- $max_char = 140;
- require_once("include/plaintext.php");
- $msgarr = plaintext($a, $b, $max_char, true, 8);
+ $max_char = 280;
+ $msgarr = BBCode::toPlaintext($b, $max_char, true, 8);
$msg = $msgarr["text"];
- if (($msg == "") && isset($msgarr["title"]))
- $msg = shortenmsg($msgarr["title"], $max_char - 50);
+ if (($msg == "") && isset($msgarr["title"])) {
+ $msg = Plaintext::shorten($msgarr["title"], $max_char - 50);
+ }
$image = "";
$image = $msgarr["image"];
// and now tweet it :-)
- if(strlen($msg) && ($image != "")) {
- $img_str = fetch_url($image);
-
- $tempfile = tempnam(get_temppath(), "cache");
- file_put_contents($tempfile, $img_str);
+ if (strlen($msg) && ($image != "")) {
+ $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
+ $media = $connection->upload('media/upload', ['media' => $image]);
- // Twitter had changed something so that the old library doesn't work anymore
- // so we are using a new library for twitter
- // To-Do:
- // Switching completely to this library with all functions
- require_once("addon/twitter/codebird.php");
-
- $cb = \Codebird\Codebird::getInstance();
- $cb->setConsumerKey($ckey, $csecret);
- $cb->setToken($otoken, $osecret);
-
- $post = array('status' => $msg, 'media[]' => $tempfile);
+ $post = ['status' => $msg, 'media_ids' => $media->media_id_string];
if ($iscomment)
$post["in_reply_to_status_id"] = substr($orig_post["uri"], 9);
- $result = $cb->statuses_updateWithMedia($post);
- unlink($tempfile);
+ $result = $connection->post('statuses/update', $post);
logger('twitter_post_with_media send, result: ' . print_r($result, true), LOGGER_DEBUG);
$msg .= " ".$image;
$image = "";
} elseif ($iscomment) {
- logger('twitter_post: Update extid '.$result->id_str." for post id ".$b['id']);
- q("UPDATE `item` SET `extid` = '%s', `body` = '%s' WHERE `id` = %d",
- dbesc("twitter::".$result->id_str),
- dbesc($result->text),
- intval($b['id'])
- );
+ logger('twitter_post: Update extid ' . $result->id_str . " for post id " . $b['id']);
+ Item::update(['extid' => "twitter::" . $result->id_str, 'body' => $result->text], ['id' => $b['id']]);
}
}
- if(strlen($msg) && ($image == "")) {
+ if (strlen($msg) && ($image == "")) {
+// -----------------
+ $max_char = 280;
+ $msgarr = BBCode::toPlaintext($b, $max_char, true, 8);
+ $msg = $msgarr["text"];
+
+ if (($msg == "") && isset($msgarr["title"])) {
+ $msg = Plaintext::shorten($msgarr["title"], $max_char - 50);
+ }
+
+ if (isset($msgarr["url"])) {
+ $msg .= "\n" . $msgarr["url"];
+ }
+// -----------------
$url = 'statuses/update';
$post = array('status' => $msg);
if ($iscomment)
$post["in_reply_to_status_id"] = substr($orig_post["uri"], 9);
- $result = $tweet->post($url, $post);
+ $result = $connection->post($url, $post);
logger('twitter_post send, result: ' . print_r($result, true), LOGGER_DEBUG);
if ($result->source)
if (count($r))
$a->contact = $r[0]["id"];
- $s = serialize(array('url' => $url, 'item' => $b['id'], 'post' => $post));
- require_once('include/queue_fn.php');
- add_to_queue($a->contact,NETWORK_TWITTER,$s);
- notice(t('Twitter post failed. Queued for retry.').EOL);
+ $s = serialize(['url' => $url, 'item' => $b['id'], 'post' => $post]);
+
+ Queue::add($a->contact, NETWORK_TWITTER, $s);
+ notice(L10n::t('Twitter post failed. Queued for retry.') . EOL);
} elseif ($iscomment) {
- logger('twitter_post: Update extid '.$result->id_str." for post id ".$b['id']);
- q("UPDATE `item` SET `extid` = '%s' WHERE `id` = %d",
- dbesc("twitter::".$result->id_str),
- intval($b['id'])
- );
- //q("UPDATE `item` SET `extid` = '%s', `body` = '%s' WHERE `id` = %d",
- // dbesc("twitter::".$result->id_str),
- // dbesc($result->text),
- // intval($b['id'])
- //);
+ logger('twitter_post: Update extid ' . $result->id_str . " for post id " . $b['id']);
+ Item::update(['extid' => "twitter::" . $result->id_str], ['id' => $b['id']]);
}
}
}
}
-function twitter_plugin_admin_post(&$a){
- $consumerkey = ((x($_POST,'consumerkey')) ? notags(trim($_POST['consumerkey'])) : '');
- $consumersecret = ((x($_POST,'consumersecret')) ? notags(trim($_POST['consumersecret'])): '');
- $applicationname = ((x($_POST, 'applicationname')) ? notags(trim($_POST['applicationname'])):'');
- set_config('twitter','consumerkey',$consumerkey);
- set_config('twitter','consumersecret',$consumersecret);
- //set_config('twitter','application_name',$applicationname);
- info( t('Settings updated.'). EOL );
+function twitter_addon_admin_post(App $a)
+{
+ $consumerkey = x($_POST, 'consumerkey') ? notags(trim($_POST['consumerkey'])) : '';
+ $consumersecret = x($_POST, 'consumersecret') ? notags(trim($_POST['consumersecret'])) : '';
+ Config::set('twitter', 'consumerkey', $consumerkey);
+ Config::set('twitter', 'consumersecret', $consumersecret);
+ info(L10n::t('Settings updated.') . EOL);
}
function twitter_plugin_admin(&$a, &$o){
$t = get_markup_template( "admin.tpl", "addon/twitter/" );
- $o = replace_macros($t, array(
- '$submit' => t('Save Settings'),
- // name, label, value, help, [extra values]
- '$consumerkey' => array('consumerkey', t('Consumer key'), get_config('twitter', 'consumerkey' ), ''),
- '$consumersecret' => array('consumersecret', t('Consumer secret'), get_config('twitter', 'consumersecret' ), ''),
- //'$applicationname' => array('applicationname', t('Name of the Twitter Application'), get_config('twitter','application_name'),t('Set this to the exact name you gave the app on twitter.com/apps to avoid mirroring postings from ~friendica back to ~friendica'))
- ));
+function twitter_addon_admin(App $a, &$o)
+{
+ $t = get_markup_template("admin.tpl", "addon/twitter/");
+
+ $o = replace_macros($t, [
+ '$submit' => L10n::t('Save Settings'),
+ // name, label, value, help, [extra values]
+ '$consumerkey' => ['consumerkey', L10n::t('Consumer key'), Config::get('twitter', 'consumerkey'), ''],
+ '$consumersecret' => ['consumersecret', L10n::t('Consumer secret'), Config::get('twitter', 'consumersecret'), ''],
+ ]);
}
function twitter_cron($a,$b) {
}
}
- $abandon_days = intval(get_config('system','account_abandon_days'));
- if ($abandon_days < 1)
+ $abandon_days = intval(Config::get('system', 'account_abandon_days'));
+ if ($abandon_days < 1) {
$abandon_days = 0;
+ }
- $abandon_limit = date("Y-m-d H:i:s", time() - $abandon_days * 86400);
+ $abandon_limit = date(DateTimeFormat::MYSQL, time() - $abandon_days * 86400);
$r = q("SELECT * FROM `pconfig` WHERE `cat` = 'twitter' AND `k` = 'import' AND `v` = '1'");
if(count($r)) {
logger('twitter_expire: expire_start');
$r = q("SELECT * FROM `pconfig` WHERE `cat` = 'twitter' AND `k` = 'import' AND `v` = '1' ORDER BY RAND()");
- if(count($r)) {
- foreach($r as $rr) {
- logger('twitter_expire: user '.$rr['uid']);
- item_expire($rr['uid'], $days, NETWORK_TWITTER, true);
+ if (count($r)) {
+ foreach ($r as $rr) {
+ logger('twitter_expire: user ' . $rr['uid']);
+ Item::expire($rr['uid'], $days, NETWORK_TWITTER, true);
}
}
return;
if ($b["preview"]) {
- $max_char = 140;
- require_once("include/plaintext.php");
+ $max_char = 280;
$item = $b["item"];
$item["plink"] = $a->get_baseurl()."/display/".$a->user["nickname"]."/".$item["parent"];
$item["body"] = $nickname." ".$item["body"];
}
-
- $msgarr = plaintext($a, $item, $max_char, true, 8);
+ $msgarr = BBCode::toPlaintext($item, $max_char, true, 8);
$msg = $msgarr["text"];
if (isset($msgarr["url"]) && ($msgarr["type"] != "photo"))
// We don't support nested shares, so we mustn't show quotes as shares on retweets
$item = twitter_createpost($a, $uid, $post->retweeted_status, array('id' => 0), false, false, true);
- $datarray['body'] = "\n".share_header($item['author-name'], $item['author-link'], $item['author-avatar'], "",
- $item['created'], $item['plink']);
+ $datarray['body'] = "\n" . share_header(
+ $item['author-name'],
+ $item['author-link'],
+ $item['author-avatar'],
+ "",
+ $item['created'],
+ $item['plink']
+ );
$datarray['body'] .= $item['body'].'[/share]';
} else {
require_once('include/items.php');
require_once('mod/share.php');
- require_once('library/twitteroauth.php');
- $connection = new TwitterOAuth($ckey,$csecret,$otoken,$osecret);
+ $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
$parameters = array("exclude_replies" => true, "trim_user" => false, "contributor_details" => true, "include_rts" => true, "tweet_mode" => "extended");
if(! count($qi))
return;
- require_once('include/queue_fn.php');
-
- foreach($qi as $x) {
- if($x['network'] !== NETWORK_TWITTER)
+ foreach ($qi as $x) {
+ if ($x['network'] !== NETWORK_TWITTER) {
continue;
logger('twitter_queue: run');
$z = unserialize($x['content']);
- require_once("addon/twitter/codebird.php");
-
- $cb = \Codebird\Codebird::getInstance();
- $cb->setConsumerKey($ckey, $csecret);
- $cb->setToken($otoken, $osecret);
-
- if ($z['url'] == "statuses/update")
- $result = $cb->statuses_update($z['post']);
+ $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
+ $result = $connection->post($z['url'], $z['post']);
logger('twitter_queue: post result: ' . print_r($result, true), LOGGER_DEBUG);
logger('twitter_queue: Send to Twitter failed: "' . print_r($result->errors, true) . '"');
else {
$success = true;
- remove_queue_item($x['id']);
+ Queue::removeItem($x['id']);
}
} else
logger("twitter_queue: Error getting tokens for user ".$user['uid']);
if (!$success) {
logger('twitter_queue: delayed');
- update_queue_time($x['id']);
+ Queue::updateTime($x['id']);
}
}
}
"addr" => $contact->screen_name."@twitter.com", "generation" => 2));
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `alias` = '%s' LIMIT 1",
- intval($uid), dbesc("twitter::".$contact->id_str));
+ intval($uid),
+ dbesc("twitter::" . $contact->id_str));
if(!count($r) && !$create_user)
return(0);
`location`, `about`, `writable`, `blocked`, `readonly`, `pending`)
VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', %d, 0, 0, 0)",
intval($uid),
- dbesc(datetime_convert()),
- dbesc("https://twitter.com/".$contact->screen_name),
- dbesc(normalise_link("https://twitter.com/".$contact->screen_name)),
+ dbesc(DateTimeFormat::utcNow()),
+ dbesc("https://twitter.com/" . $contact->screen_name),
+ dbesc(normalise_link("https://twitter.com/" . $contact->screen_name)),
dbesc($contact->screen_name."@twitter.com"),
dbesc("twitter::".$contact->id_str),
dbesc(''),
dbesc($photos[0]),
dbesc($photos[1]),
dbesc($photos[2]),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
+ dbesc(DateTimeFormat::utcNow()),
+ dbesc(DateTimeFormat::utcNow()),
+ dbesc(DateTimeFormat::utcNow()),
intval($contact_id)
);
}
} else {
// update profile photos once every two weeks as we have no notification of when they change.
-
- //$update_photo = (($r[0]['avatar-date'] < datetime_convert('','','now -2 days')) ? true : false);
- $update_photo = ($r[0]['avatar-date'] < datetime_convert('','','now -12 hours'));
+ //$update_photo = (($r[0]['avatar-date'] < DateTimeFormat::convert('now -2 days', '', '', )) ? true : false);
+ $update_photo = ($r[0]['avatar-date'] < DateTimeFormat::utc('now -12 hours'));
// check that we have all the photos, this has been known to fail on occasion
dbesc($photos[0]),
dbesc($photos[1]),
dbesc($photos[2]),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
+ dbesc(DateTimeFormat::utcNow()),
+ dbesc(DateTimeFormat::utcNow()),
+ dbesc(DateTimeFormat::utcNow()),
dbesc("https://twitter.com/".$contact->screen_name),
dbesc(normalise_link("https://twitter.com/".$contact->screen_name)),
dbesc($contact->screen_name."@twitter.com"),
return($r[0]["id"]);
}
-function twitter_fetchuser($a, $uid, $screen_name = "", $user_id = "") {
- $ckey = get_config('twitter', 'consumerkey');
- $csecret = get_config('twitter', 'consumersecret');
- $otoken = get_pconfig($uid, 'twitter', 'oauthtoken');
- $osecret = get_pconfig($uid, 'twitter', 'oauthsecret');
-
- require_once("addon/twitter/codebird.php");
-
- $cb = \Codebird\Codebird::getInstance();
- $cb->setConsumerKey($ckey, $csecret);
- $cb->setToken($otoken, $osecret);
+function twitter_fetchuser(App $a, $uid, $screen_name = "", $user_id = "")
+{
+ $ckey = Config::get('twitter', 'consumerkey');
+ $csecret = Config::get('twitter', 'consumersecret');
+ $otoken = PConfig::get($uid, 'twitter', 'oauthtoken');
+ $osecret = PConfig::get($uid, 'twitter', 'oauthsecret');
$r = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
intval($uid));
$parameters["user_id"] = $user_id;
// Fetching user data
- $user = $cb->users_show($parameters);
+ $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
+ $user = $connection->get('users/show', $parameters);
if (!is_object($user))
return;
return $contact_id;
}
-function twitter_expand_entities($a, $body, $item, $no_tags = false, $picture) {
- require_once("include/oembed.php");
- require_once("include/network.php");
+function twitter_expand_entities(App $a, $body, $item, $picture)
+{
+ $plain = $body;
- $tags = "";
+ $tags_arr = [];
- $plain = $body;
+ foreach ($item->entities->hashtags AS $hashtag) {
+ $url = "#[url=" . $a->get_baseurl() . "/search?tag=" . rawurlencode($hashtag->text) . "]" . $hashtag->text . "[/url]";
+ $tags_arr["#" . $hashtag->text] = $url;
+ $body = str_replace("#" . $hashtag->text, $url, $body);
+ }
+
+ foreach ($item->entities->user_mentions AS $mention) {
+ $url = "@[url=https://twitter.com/" . rawurlencode($mention->screen_name) . "]" . $mention->screen_name . "[/url]";
+ $tags_arr["@" . $mention->screen_name] = $url;
+ $body = str_replace("@" . $mention->screen_name, $url, $body);
+ }
if (isset($item->entities->urls)) {
$type = "";
$footerlink = "";
$footer = "";
- foreach ($item->entities->urls AS $url) {
-
+ foreach ($item->entities->urls as $url) {
$plain = str_replace($url->url, '', $plain);
if ($url->url && $url->expanded_url && $url->display_url) {
-
- $expanded_url = original_url($url->expanded_url);
+ $expanded_url = Network::finalUrl($url->expanded_url);
$oembed_data = oembed_fetch_url($expanded_url);
"[url=".$expanded_url."][img]".$oembed_data->url."[/img][/url]",
$body);
//$dontincludemedia = true;
- } elseif ($oembed_data->type != "link")
- $body = str_replace($url->url,
- "[url=".$expanded_url."]".$expanded_url."[/url]",
- $body);
- else {
- $img_str = fetch_url($expanded_url, true, $redirects, 4);
+ } elseif ($oembed_data->type != "link") {
+ $body = str_replace($url->url, "[url=" . $expanded_url . "]" . $expanded_url . "[/url]", $body);
+ } else {
+ $img_str = Network::fetchUrl($expanded_url, true, $redirects, 4);
$tempfile = tempnam(get_temppath(), "cache");
file_put_contents($tempfile, $img_str);
$body .= "\n\n[img]".$picture."[/img]\n";
elseif (($footer == "") && ($picture == ""))
$body = add_page_info_to_body($body);
-
- if ($no_tags)
- return array("body" => $body, "tags" => "", "plain" => $plain);
-
- $tags_arr = array();
-
- foreach ($item->entities->hashtags AS $hashtag) {
- $url = "#[url=".$a->get_baseurl()."/search?tag=".rawurlencode($hashtag->text)."]".$hashtag->text."[/url]";
- $tags_arr["#".$hashtag->text] = $url;
- $body = str_replace("#".$hashtag->text, $url, $body);
}
+ }
- foreach ($item->entities->user_mentions AS $mention) {
- $url = "@[url=https://twitter.com/".rawurlencode($mention->screen_name)."]".$mention->screen_name."[/url]";
- $tags_arr["@".$mention->screen_name] = $url;
- $body = str_replace("@".$mention->screen_name, $url, $body);
- }
+ // it seems as if the entities aren't always covering all mentions. So the rest will be checked here
+ $tags = get_tags($body);
- // it seems as if the entities aren't always covering all mentions. So the rest will be checked here
- $tags = get_tags($body);
+ if (count($tags)) {
+ foreach ($tags as $tag) {
+ if (strstr(trim($tag), " ")) {
+ continue;
+ }
- if(count($tags)) {
- foreach($tags as $tag) {
- if (strstr(trim($tag), " "))
+ if (strpos($tag, '#') === 0) {
+ if (strpos($tag, '[url=')) {
continue;
- if(strpos($tag,'#') === 0) {
- if(strpos($tag,'[url='))
- continue;
-
- // don't link tags that are already embedded in links
-
- if(preg_match('/\[(.*?)' . preg_quote($tag,'/') . '(.*?)\]/',$body))
- continue;
- if(preg_match('/\[(.*?)\]\((.*?)' . preg_quote($tag,'/') . '(.*?)\)/',$body))
- continue;
+ // don't link tags that are already embedded in links
+ if (preg_match('/\[(.*?)' . preg_quote($tag, '/') . '(.*?)\]/', $body)) {
+ continue;
+ }
+ if (preg_match('/\[(.*?)\]\((.*?)' . preg_quote($tag, '/') . '(.*?)\)/', $body)) {
+ continue;
+ }
- $basetag = str_replace('_',' ',substr($tag,1));
- $url = '#[url='.$a->get_baseurl().'/search?tag='.rawurlencode($basetag).']'.$basetag.'[/url]';
- $body = str_replace($tag,$url,$body);
- $tags_arr["#".$basetag] = $url;
+ $basetag = str_replace('_', ' ', substr($tag, 1));
+ $url = '#[url=' . $a->get_baseurl() . '/search?tag=' . rawurlencode($basetag) . ']' . $basetag . '[/url]';
+ $body = str_replace($tag, $url, $body);
+ $tags_arr["#" . $basetag] = $url;
+ } elseif (strpos($tag, '@') === 0) {
+ if (strpos($tag, '[url=')) {
continue;
- } elseif(strpos($tag,'@') === 0) {
- if(strpos($tag,'[url='))
- continue;
-
- $basetag = substr($tag,1);
- $url = '@[url=https://twitter.com/'.rawurlencode($basetag).']'.$basetag.'[/url]';
- $body = str_replace($tag,$url,$body);
- $tags_arr["@".$basetag] = $url;
}
+
+ $basetag = substr($tag, 1);
+ $url = '@[url=https://twitter.com/' . rawurlencode($basetag) . ']' . $basetag . '[/url]';
+ $body = str_replace($tag, $url, $body);
+ $tags_arr["@" . $basetag] = $url;
}
}
+ }
+ $tags = implode($tags_arr, ",");
- $tags = implode($tags_arr, ",");
-
- }
- return array("body" => $body, "tags" => $tags, "plain" => $plain);
+ return ["body" => $body, "tags" => $tags, "plain" => $plain];
}
/**
* @param object $post Twitter object with the post
* @param array $postarray Array of the item that is about to be posted
*
- * @return $picture string Returns a a single picture string if it isn't a media post
+ * @return $picture string Image URL or empty string
*/
function twitter_media_entities($post, &$postarray) {
// Don't import our own comments
$r = q("SELECT * FROM `item` WHERE `extid` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($postarray['uri']),
- intval($uid)
- );
+ dbesc($postarray['uri']),
+ intval($uid)
+ );
if (count($r)) {
logger("Item with extid ".$postarray['uri']." found.", LOGGER_DEBUG);
$parent = "twitter::".$post->in_reply_to_status_id_str;
$r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($parent),
- intval($uid)
- );
+ dbesc($parent),
+ intval($uid)
+ );
if (count($r)) {
$postarray['thr-parent'] = $r[0]["uri"];
$postarray['parent-uri'] = $r[0]["parent-uri"];
$postarray['object-type'] = ACTIVITY_OBJ_COMMENT;
} else {
$r = q("SELECT * FROM `item` WHERE `extid` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($parent),
- intval($uid)
- );
+ dbesc($parent),
+ intval($uid)
+ );
if (count($r)) {
$postarray['thr-parent'] = $r[0]['uri'];
$postarray['parent-uri'] = $r[0]['parent-uri'];
// Search for media links
$picture = twitter_media_entities($post, $postarray);
- $converted = twitter_expand_entities($a, $postarray['body'], $post, false, $picture);
+ $converted = twitter_expand_entities($a, $postarray['body'], $post, $picture);
$postarray['body'] = $converted["body"];
$postarray['tag'] = $converted["tags"];
- $postarray['created'] = datetime_convert('UTC','UTC',$post->created_at);
- $postarray['edited'] = datetime_convert('UTC','UTC',$post->created_at);
+ $postarray['created'] = DateTimeFormat::utc($post->created_at);
+ $postarray['edited'] = DateTimeFormat::utc($post->created_at);
$statustext = $converted["plain"];
$postarray['body'] = $statustext;
- $postarray['body'] .= "\n".share_header($quoted['author-name'], $quoted['author-link'], $quoted['author-avatar'], "",
- $quoted['created'], $quoted['plink']);
+ $postarray['body'] .= "\n" . share_header(
+ $quoted['author-name'],
+ $quoted['author-link'],
+ $quoted['author-avatar'],
+ "",
+ $quoted['created'],
+ $quoted['plink']
+ );
$postarray['body'] .= $quoted['body'].'[/share]';
}
// this whole function doesn't seem to work. Needs complete check
$user = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` LIMIT 1",
- intval($uid)
- );
+ intval($uid)
+ );
if(!count($user))
return;
return;
$own_user = q("SELECT * FROM `contact` WHERE `uid` = %d AND `alias` = '%s' LIMIT 1",
- intval($uid),
- dbesc("twitter::".$own_id)
- );
+ intval($uid),
+ dbesc("twitter::".$own_id)
+ );
if(!count($own_user))
return;
return;
$myconv = q("SELECT `author-link`, `author-avatar`, `parent` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `parent` != 0 AND `deleted` = 0",
- dbesc($postarray['parent-uri']),
- intval($uid)
- );
-
- if(count($myconv)) {
+ dbesc($postarray['parent-uri']),
+ intval($uid)
+ );
foreach($myconv as $conv) {
// now if we find a match, it means we're in this conversation
notification(array(
'type' => NOTIFY_COMMENT,
'notify_flags' => $user[0]['notify-flags'],
- 'language' => $user[0]['language'],
- 'to_name' => $user[0]['username'],
- 'to_email' => $user[0]['email'],
- 'uid' => $user[0]['uid'],
- 'item' => $postarray,
- 'link' => $a->get_baseurl().'/display/'.urlencode(get_item_guid($top_item)),
- 'source_name' => $postarray['author-name'],
- 'source_link' => $postarray['author-link'],
+ 'language' => $user[0]['language'],
+ 'to_name' => $user[0]['username'],
+ 'to_email' => $user[0]['email'],
+ 'uid' => $user[0]['uid'],
+ 'item' => $postarray,
+ 'link' => $a->get_baseurl() . '/display/' . urlencode(Item::getGuidById($top_item)),
+ 'source_name' => $postarray['author-name'],
+ 'source_link' => $postarray['author-link'],
'source_photo' => $postarray['author-avatar'],
'verb' => ACTIVITY_POST,
'otype' => 'item',
}
$r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc("twitter::".$post->id_str),
- intval($uid)
- );
+ dbesc("twitter::".$post->id_str),
+ intval($uid)
+ );
if (count($r))
break;
foreach ($posts as $post) {
$postarray = twitter_createpost($a, $uid, $post, $self, false, false, false);
- if (trim($postarray['body']) == "")
+ if (trim($postarray['body']) == "") {
continue;
+ }
- $item = item_store($postarray);
+ $item = Item::insert($postarray);
$postarray["id"] = $item;
logger('twitter_fetchparentpost: User '.$self["nick"].' posted parent timeline item '.$item);
if ($application_name == "")
$application_name = $a->get_hostname();
- require_once('library/twitteroauth.php');
- require_once('include/items.php');
+ require_once 'include/items.php';
$connection = new TwitterOAuth($ckey,$csecret,$otoken,$osecret);
if (trim($postarray['body']) == "")
continue;
- $item = item_store($postarray);
+ $item = Item::insert($postarray);
$postarray["id"] = $item;
logger('twitter_fetchhometimeline: User '.$self["nick"].' posted home timeline item '.$item);
if (trim($postarray['body']) == "")
continue;
- $item = item_store($postarray);
+ $item = Item::insert($postarray);
$postarray["id"] = $item;
if ($item && function_exists("check_item_notification"))
$item = $r[0]['id'];
$parent_id = $r[0]['parent'];
}
- } else
+ } else {
$parent_id = $postarray['parent'];
+ }
if (($item != 0) && !function_exists("check_item_notification")) {
require_once('include/enotify.php');
'to_email' => $u[0]['email'],
'uid' => $u[0]['uid'],
'item' => $postarray,
- 'link' => $a->get_baseurl().'/display/'.urlencode(get_item_guid($item)),
+ 'link' => $a->get_baseurl() . '/display/' . urlencode(Item::getGuidById($item)),
'source_name' => $postarray['author-name'],
'source_link' => $postarray['author-link'],
'source_photo' => $postarray['author-avatar'],
$contact_id = 0;
if ($own_id == "") {
- require_once('library/twitteroauth.php');
-
- $connection = new TwitterOAuth($ckey,$csecret,$otoken,$osecret);
+ $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
// Fetching user data
$user = $connection->get('account/verify_credentials');
$otoken = get_pconfig($uid, 'twitter', 'oauthtoken');
$osecret = get_pconfig($uid, 'twitter', 'oauthsecret');
- require_once('library/twitteroauth.php');
- $connection = new TwitterOAuth($ckey,$csecret,$otoken,$osecret);
-
- $result = $connection->post('statuses/retweet/'.$id);
+ $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
+ $result = $connection->post('statuses/retweet/' . $id);
logger('twitter_is_retweet: result '.print_r($result, true), LOGGER_DEBUG);
<?php
+
use Friendica\Core\Config;
-function twitter_sync_run($argv, $argc) {
+function twitter_sync_run($argv, $argc)
+{
global $a;
- require_once("addon/twitter/twitter.php");
+ require_once 'addon/twitter/twitter.php';
if (function_exists('sys_getloadavg')) {
$load = sys_getloadavg();
twitter_fetchhometimeline($a, $uid);
}
}
-?>
--- /dev/null
+.DS_Store
+composer.lock
+vendor
+env
--- /dev/null
+language: php
+dist: trusty
+php:
+ - '5.6'
+ - '7.0'
+ - '7.1'
+ - hhvm
+sudo: false
+before_script:
+ - composer self-update
+ - composer install --prefer-source --no-interaction
+script:
+ - vendor/bin/phpunit
--- /dev/null
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at abraham@abrah.am. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/
--- /dev/null
+Copyright (c) 2009 Abraham Williams - http://abrah.am - abraham@abrah.am
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
--- /dev/null
+<span itemprop="name">TwitterOAuth</span> [![Build Status](https://img.shields.io/travis/abraham/twitteroauth.svg)](https://travis-ci.org/abraham/twitteroauth) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/abraham/twitteroauth/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/abraham/twitteroauth/?branch=master) [![Issues Count](https://img.shields.io/github/issues/abraham/twitteroauth.svg)](https://github.com/abraham/twitteroauth/issues) [![Latest Version](https://img.shields.io/packagist/v/abraham/twitteroauth.svg)](https://packagist.org/packages/abraham/twitteroauth)
+------------
+
+<p itemprop="description">The most popular PHP library for Twitter's OAuth REST API.</p>
+
+See documentation at https://twitteroauth.com.
+
+PHP versions [listed](https://secure.php.net/supported-versions.php) as "active support" or "security fixes only" are supported.
+
+<img src="https://raw.githubusercontent.com/abraham/twitteroauth-demo/master/images/twitter-logo-blue.png" itemprop="image" alt="Twitter bird" width="200px">
--- /dev/null
+<?php
+
+/**
+ * Use to autoload needed classes without Composer.
+ *
+ * @param string $class The fully-qualified class name.
+ * @return void
+ */
+spl_autoload_register(function ($class) {
+
+ // project-specific namespace prefix
+ $prefix = 'Abraham\\TwitterOAuth\\';
+
+ // base directory for the namespace prefix
+ $base_dir = __DIR__ . '/src/';
+
+ // does the class use the namespace prefix?
+ $len = strlen($prefix);
+ if (strncmp($prefix, $class, $len) !== 0) {
+ // no, move to the next registered autoloader
+ return;
+ }
+
+ // get the relative class name
+ $relative_class = substr($class, $len);
+
+ // replace the namespace prefix with the base directory, replace namespace
+ // separators with directory separators in the relative class name, append
+ // with .php
+ $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
+
+ // if the file exists, require it
+ if (file_exists($file)) {
+ require $file;
+ }
+});
--- /dev/null
+{
+ "name": "abraham/twitteroauth",
+ "type": "library",
+ "description": "The most popular PHP library for use with the Twitter OAuth REST API.",
+ "keywords": ["twitter", "api", "oauth", "rest", "social", "twitter api", "twitter oauth"],
+ "license": "MIT",
+ "homepage": "https://twitteroauth.com",
+ "authors": [
+ {
+ "name": "Abraham Williams",
+ "email": "abraham@abrah.am",
+ "homepage": "https://abrah.am",
+ "role": "Developer"
+ }
+ ],
+ "support": {
+ "source": "https://github.com/abraham/twitteroauth",
+ "issues": "https://github.com/abraham/twitteroauth/issues"
+ },
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "ext-curl": "*"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~5.7",
+ "squizlabs/php_codesniffer": "~3.0",
+ "phpmd/phpmd": "~2.6"
+ },
+ "autoload": {
+ "psr-4": {
+ "Abraham\\TwitterOAuth\\": "src"
+ }
+ }
+}
--- /dev/null
+<?xml version="1.0"?>
+<ruleset name="My first PHPMD rule set"
+ xmlns="http://pmd.sf.net/ruleset/1.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
+ xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
+ <description>Keep TwitterOAuth source code clean.</description>
+
+ <!-- <rule ref="rulesets/cleancode.xml" /> -->
+ <rule ref="rulesets/codesize.xml" />
+ <rule ref="rulesets/controversial.xml" />
+ <rule ref="rulesets/design.xml" />
+ <rule ref="rulesets/naming.xml" />
+ <rule ref="rulesets/unusedcode.xml" />
+</ruleset>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit
+ colors="true"
+ bootstrap="tests/bootstrap.php">
+
+ <testsuites>
+ <testsuite name="TwitterOAuth Test Suite">
+ <directory>./tests/</directory>
+ </testsuite>
+ </testsuites>
+</phpunit>
--- /dev/null
+<?php
+
+namespace Abraham\TwitterOAuth;
+
+/**
+ * Handle setting and storing config for TwitterOAuth.
+ *
+ * @author Abraham Williams <abraham@abrah.am>
+ */
+class Config
+{
+ /** @var int How long to wait for a response from the API */
+ protected $timeout = 5;
+ /** @var int how long to wait while connecting to the API */
+ protected $connectionTimeout = 5;
+ /**
+ * Decode JSON Response as associative Array
+ *
+ * @see http://php.net/manual/en/function.json-decode.php
+ *
+ * @var bool
+ */
+ protected $decodeJsonAsArray = false;
+ /** @var string User-Agent header */
+ protected $userAgent = 'TwitterOAuth (+https://twitteroauth.com)';
+ /** @var array Store proxy connection details */
+ protected $proxy = [];
+
+ /** @var bool Whether to encode the curl requests with gzip or not */
+ protected $gzipEncoding = true;
+
+ /** @var integer Size for Chunked Uploads */
+ protected $chunkSize = 250000; // 0.25 MegaByte
+
+ /**
+ * Set the connection and response timeouts.
+ *
+ * @param int $connectionTimeout
+ * @param int $timeout
+ */
+ public function setTimeouts($connectionTimeout, $timeout)
+ {
+ $this->connectionTimeout = (int)$connectionTimeout;
+ $this->timeout = (int)$timeout;
+ }
+
+ /**
+ * @param bool $value
+ */
+ public function setDecodeJsonAsArray($value)
+ {
+ $this->decodeJsonAsArray = (bool)$value;
+ }
+
+ /**
+ * @param string $userAgent
+ */
+ public function setUserAgent($userAgent)
+ {
+ $this->userAgent = (string)$userAgent;
+ }
+
+ /**
+ * @param array $proxy
+ */
+ public function setProxy(array $proxy)
+ {
+ $this->proxy = $proxy;
+ }
+
+ /**
+ * Whether to encode the curl requests with gzip or not.
+ *
+ * @param boolean $gzipEncoding
+ */
+ public function setGzipEncoding($gzipEncoding)
+ {
+ $this->gzipEncoding = (bool)$gzipEncoding;
+ }
+
+ /**
+ * Set the size of each part of file for chunked media upload.
+ *
+ * @param int $value
+ */
+ public function setChunkSize($value)
+ {
+ $this->chunkSize = (int)$value;
+ }
+}
--- /dev/null
+<?php
+/**
+ * The MIT License
+ * Copyright (c) 2007 Andy Smith
+ */
+namespace Abraham\TwitterOAuth;
+
+class Consumer
+{
+ /** @var string */
+ public $key;
+ /** @var string */
+ public $secret;
+ /** @var string|null */
+ public $callbackUrl;
+
+ /**
+ * @param string $key
+ * @param string $secret
+ * @param null $callbackUrl
+ */
+ public function __construct($key, $secret, $callbackUrl = null)
+ {
+ $this->key = $key;
+ $this->secret = $secret;
+ $this->callbackUrl = $callbackUrl;
+ }
+
+ /**
+ * @return string
+ */
+ public function __toString()
+ {
+ return "Consumer[key=$this->key,secret=$this->secret]";
+ }
+}
--- /dev/null
+<?php
+/**
+ * The MIT License
+ * Copyright (c) 2007 Andy Smith
+ */
+namespace Abraham\TwitterOAuth;
+
+/**
+ * The HMAC-SHA1 signature method uses the HMAC-SHA1 signature algorithm as defined in [RFC2104]
+ * where the Signature Base String is the text and the key is the concatenated values (each first
+ * encoded per Parameter Encoding) of the Consumer Secret and Token Secret, separated by an '&'
+ * character (ASCII code 38) even if empty.
+ * - Chapter 9.2 ("HMAC-SHA1")
+ */
+class HmacSha1 extends SignatureMethod
+{
+ /**
+ * {@inheritDoc}
+ */
+ public function getName()
+ {
+ return "HMAC-SHA1";
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function buildSignature(Request $request, Consumer $consumer, Token $token = null)
+ {
+ $signatureBase = $request->getSignatureBaseString();
+
+ $parts = [$consumer->secret, null !== $token ? $token->secret : ""];
+
+ $parts = Util::urlencodeRfc3986($parts);
+ $key = implode('&', $parts);
+
+ return base64_encode(hash_hmac('sha1', $signatureBase, $key, true));
+ }
+}
--- /dev/null
+<?php
+/**
+ * The MIT License
+ * Copyright (c) 2007 Andy Smith
+ */
+namespace Abraham\TwitterOAuth;
+
+class Request
+{
+ protected $parameters;
+ protected $httpMethod;
+ protected $httpUrl;
+ public static $version = '1.0';
+
+ /**
+ * Constructor
+ *
+ * @param string $httpMethod
+ * @param string $httpUrl
+ * @param array|null $parameters
+ */
+ public function __construct($httpMethod, $httpUrl, array $parameters = [])
+ {
+ $parameters = array_merge(Util::parseParameters(parse_url($httpUrl, PHP_URL_QUERY)), $parameters);
+ $this->parameters = $parameters;
+ $this->httpMethod = $httpMethod;
+ $this->httpUrl = $httpUrl;
+ }
+
+ /**
+ * pretty much a helper function to set up the request
+ *
+ * @param Consumer $consumer
+ * @param Token $token
+ * @param string $httpMethod
+ * @param string $httpUrl
+ * @param array $parameters
+ *
+ * @return Request
+ */
+ public static function fromConsumerAndToken(
+ Consumer $consumer,
+ Token $token = null,
+ $httpMethod,
+ $httpUrl,
+ array $parameters = []
+ ) {
+ $defaults = [
+ "oauth_version" => Request::$version,
+ "oauth_nonce" => Request::generateNonce(),
+ "oauth_timestamp" => time(),
+ "oauth_consumer_key" => $consumer->key
+ ];
+ if (null !== $token) {
+ $defaults['oauth_token'] = $token->key;
+ }
+
+ $parameters = array_merge($defaults, $parameters);
+
+ return new Request($httpMethod, $httpUrl, $parameters);
+ }
+
+ /**
+ * @param string $name
+ * @param string $value
+ */
+ public function setParameter($name, $value)
+ {
+ $this->parameters[$name] = $value;
+ }
+
+ /**
+ * @param $name
+ *
+ * @return string|null
+ */
+ public function getParameter($name)
+ {
+ return isset($this->parameters[$name]) ? $this->parameters[$name] : null;
+ }
+
+ /**
+ * @return array
+ */
+ public function getParameters()
+ {
+ return $this->parameters;
+ }
+
+ /**
+ * @param $name
+ */
+ public function removeParameter($name)
+ {
+ unset($this->parameters[$name]);
+ }
+
+ /**
+ * The request parameters, sorted and concatenated into a normalized string.
+ *
+ * @return string
+ */
+ public function getSignableParameters()
+ {
+ // Grab all parameters
+ $params = $this->parameters;
+
+ // Remove oauth_signature if present
+ // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.")
+ if (isset($params['oauth_signature'])) {
+ unset($params['oauth_signature']);
+ }
+
+ return Util::buildHttpQuery($params);
+ }
+
+ /**
+ * Returns the base string of this request
+ *
+ * The base string defined as the method, the url
+ * and the parameters (normalized), each urlencoded
+ * and the concated with &.
+ *
+ * @return string
+ */
+ public function getSignatureBaseString()
+ {
+ $parts = [
+ $this->getNormalizedHttpMethod(),
+ $this->getNormalizedHttpUrl(),
+ $this->getSignableParameters()
+ ];
+
+ $parts = Util::urlencodeRfc3986($parts);
+
+ return implode('&', $parts);
+ }
+
+ /**
+ * Returns the HTTP Method in uppercase
+ *
+ * @return string
+ */
+ public function getNormalizedHttpMethod()
+ {
+ return strtoupper($this->httpMethod);
+ }
+
+ /**
+ * parses the url and rebuilds it to be
+ * scheme://host/path
+ *
+ * @return string
+ */
+ public function getNormalizedHttpUrl()
+ {
+ $parts = parse_url($this->httpUrl);
+
+ $scheme = $parts['scheme'];
+ $host = strtolower($parts['host']);
+ $path = $parts['path'];
+
+ return "$scheme://$host$path";
+ }
+
+ /**
+ * Builds a url usable for a GET request
+ *
+ * @return string
+ */
+ public function toUrl()
+ {
+ $postData = $this->toPostdata();
+ $out = $this->getNormalizedHttpUrl();
+ if ($postData) {
+ $out .= '?' . $postData;
+ }
+ return $out;
+ }
+
+ /**
+ * Builds the data one would send in a POST request
+ *
+ * @return string
+ */
+ public function toPostdata()
+ {
+ return Util::buildHttpQuery($this->parameters);
+ }
+
+ /**
+ * Builds the Authorization: header
+ *
+ * @return string
+ * @throws TwitterOAuthException
+ */
+ public function toHeader()
+ {
+ $first = true;
+ $out = 'Authorization: OAuth';
+ foreach ($this->parameters as $k => $v) {
+ if (substr($k, 0, 5) != "oauth") {
+ continue;
+ }
+ if (is_array($v)) {
+ throw new TwitterOAuthException('Arrays not supported in headers');
+ }
+ $out .= ($first) ? ' ' : ', ';
+ $out .= Util::urlencodeRfc3986($k) . '="' . Util::urlencodeRfc3986($v) . '"';
+ $first = false;
+ }
+ return $out;
+ }
+
+ /**
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->toUrl();
+ }
+
+ /**
+ * @param SignatureMethod $signatureMethod
+ * @param Consumer $consumer
+ * @param Token $token
+ */
+ public function signRequest(SignatureMethod $signatureMethod, Consumer $consumer, Token $token = null)
+ {
+ $this->setParameter("oauth_signature_method", $signatureMethod->getName());
+ $signature = $this->buildSignature($signatureMethod, $consumer, $token);
+ $this->setParameter("oauth_signature", $signature);
+ }
+
+ /**
+ * @param SignatureMethod $signatureMethod
+ * @param Consumer $consumer
+ * @param Token $token
+ *
+ * @return string
+ */
+ public function buildSignature(SignatureMethod $signatureMethod, Consumer $consumer, Token $token = null)
+ {
+ return $signatureMethod->buildSignature($this, $consumer, $token);
+ }
+
+ /**
+ * @return string
+ */
+ public static function generateNonce()
+ {
+ return md5(microtime() . mt_rand());
+ }
+}
--- /dev/null
+<?php
+
+namespace Abraham\TwitterOAuth;
+
+/**
+ * The result of the most recent API request.
+ *
+ * @author Abraham Williams <abraham@abrah.am>
+ */
+class Response
+{
+ /** @var string|null API path from the most recent request */
+ private $apiPath;
+ /** @var int HTTP status code from the most recent request */
+ private $httpCode = 0;
+ /** @var array HTTP headers from the most recent request */
+ private $headers = [];
+ /** @var array|object Response body from the most recent request */
+ private $body = [];
+ /** @var array HTTP headers from the most recent request that start with X */
+ private $xHeaders = [];
+
+ /**
+ * @param string $apiPath
+ */
+ public function setApiPath($apiPath)
+ {
+ $this->apiPath = $apiPath;
+ }
+
+ /**
+ * @return string|null
+ */
+ public function getApiPath()
+ {
+ return $this->apiPath;
+ }
+
+ /**
+ * @param array|object $body
+ */
+ public function setBody($body)
+ {
+ $this->body = $body;
+ }
+
+ /**
+ * @return array|object|string
+ */
+ public function getBody()
+ {
+ return $this->body;
+ }
+
+ /**
+ * @param int $httpCode
+ */
+ public function setHttpCode($httpCode)
+ {
+ $this->httpCode = $httpCode;
+ }
+
+ /**
+ * @return int
+ */
+ public function getHttpCode()
+ {
+ return $this->httpCode;
+ }
+
+ /**
+ * @param array $headers
+ */
+ public function setHeaders(array $headers)
+ {
+ foreach ($headers as $key => $value) {
+ if (substr($key, 0, 1) == 'x') {
+ $this->xHeaders[$key] = $value;
+ }
+ }
+ $this->headers = $headers;
+ }
+
+ /**
+ * @return array
+ */
+ public function getsHeaders()
+ {
+ return $this->headers;
+ }
+
+ /**
+ * @param array $xHeaders
+ */
+ public function setXHeaders(array $xHeaders = [])
+ {
+ $this->xHeaders = $xHeaders;
+ }
+
+ /**
+ * @return array
+ */
+ public function getXHeaders()
+ {
+ return $this->xHeaders;
+ }
+}
--- /dev/null
+<?php
+/**
+ * The MIT License
+ * Copyright (c) 2007 Andy Smith
+ */
+namespace Abraham\TwitterOAuth;
+
+/**
+ * A class for implementing a Signature Method
+ * See section 9 ("Signing Requests") in the spec
+ */
+abstract class SignatureMethod
+{
+ /**
+ * Needs to return the name of the Signature Method (ie HMAC-SHA1)
+ *
+ * @return string
+ */
+ abstract public function getName();
+
+ /**
+ * Build up the signature
+ * NOTE: The output of this function MUST NOT be urlencoded.
+ * the encoding is handled in OAuthRequest when the final
+ * request is serialized
+ *
+ * @param Request $request
+ * @param Consumer $consumer
+ * @param Token $token
+ *
+ * @return string
+ */
+ abstract public function buildSignature(Request $request, Consumer $consumer, Token $token = null);
+
+ /**
+ * Verifies that a given signature is correct
+ *
+ * @param Request $request
+ * @param Consumer $consumer
+ * @param Token $token
+ * @param string $signature
+ *
+ * @return bool
+ */
+ public function checkSignature(Request $request, Consumer $consumer, Token $token, $signature)
+ {
+ $built = $this->buildSignature($request, $consumer, $token);
+
+ // Check for zero length, although unlikely here
+ if (strlen($built) == 0 || strlen($signature) == 0) {
+ return false;
+ }
+
+ if (strlen($built) != strlen($signature)) {
+ return false;
+ }
+
+ // Avoid a timing leak with a (hopefully) time insensitive compare
+ $result = 0;
+ for ($i = 0; $i < strlen($signature); $i++) {
+ $result |= ord($built{$i}) ^ ord($signature{$i});
+ }
+
+ return $result == 0;
+ }
+}
--- /dev/null
+<?php
+/**
+ * The MIT License
+ * Copyright (c) 2007 Andy Smith
+ */
+namespace Abraham\TwitterOAuth;
+
+class Token
+{
+ /** @var string */
+ public $key;
+ /** @var string */
+ public $secret;
+
+ /**
+ * @param string $key The OAuth Token
+ * @param string $secret The OAuth Token Secret
+ */
+ public function __construct($key, $secret)
+ {
+ $this->key = $key;
+ $this->secret = $secret;
+ }
+
+ /**
+ * Generates the basic string serialization of a token that a server
+ * would respond to request_token and access_token calls with
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf("oauth_token=%s&oauth_token_secret=%s",
+ Util::urlencodeRfc3986($this->key),
+ Util::urlencodeRfc3986($this->secret)
+ );
+ }
+}
--- /dev/null
+<?php
+/**
+ * The most popular PHP library for use with the Twitter OAuth REST API.
+ *
+ * @license MIT
+ */
+namespace Abraham\TwitterOAuth;
+
+use Abraham\TwitterOAuth\Util\JsonDecoder;
+
+/**
+ * TwitterOAuth class for interacting with the Twitter API.
+ *
+ * @author Abraham Williams <abraham@abrah.am>
+ */
+class TwitterOAuth extends Config
+{
+ const API_VERSION = '1.1';
+ const API_HOST = 'https://api.twitter.com';
+ const UPLOAD_HOST = 'https://upload.twitter.com';
+
+ /** @var Response details about the result of the last request */
+ private $response;
+ /** @var string|null Application bearer token */
+ private $bearer;
+ /** @var Consumer Twitter application details */
+ private $consumer;
+ /** @var Token|null User access token details */
+ private $token;
+ /** @var HmacSha1 OAuth 1 signature type used by Twitter */
+ private $signatureMethod;
+
+ /**
+ * Constructor
+ *
+ * @param string $consumerKey The Application Consumer Key
+ * @param string $consumerSecret The Application Consumer Secret
+ * @param string|null $oauthToken The Client Token (optional)
+ * @param string|null $oauthTokenSecret The Client Token Secret (optional)
+ */
+ public function __construct($consumerKey, $consumerSecret, $oauthToken = null, $oauthTokenSecret = null)
+ {
+ $this->resetLastResponse();
+ $this->signatureMethod = new HmacSha1();
+ $this->consumer = new Consumer($consumerKey, $consumerSecret);
+ if (!empty($oauthToken) && !empty($oauthTokenSecret)) {
+ $this->token = new Token($oauthToken, $oauthTokenSecret);
+ }
+ if (empty($oauthToken) && !empty($oauthTokenSecret)) {
+ $this->bearer = $oauthTokenSecret;
+ }
+ }
+
+ /**
+ * @param string $oauthToken
+ * @param string $oauthTokenSecret
+ */
+ public function setOauthToken($oauthToken, $oauthTokenSecret)
+ {
+ $this->token = new Token($oauthToken, $oauthTokenSecret);
+ }
+
+ /**
+ * @return string|null
+ */
+ public function getLastApiPath()
+ {
+ return $this->response->getApiPath();
+ }
+
+ /**
+ * @return int
+ */
+ public function getLastHttpCode()
+ {
+ return $this->response->getHttpCode();
+ }
+
+ /**
+ * @return array
+ */
+ public function getLastXHeaders()
+ {
+ return $this->response->getXHeaders();
+ }
+
+ /**
+ * @return array|object|null
+ */
+ public function getLastBody()
+ {
+ return $this->response->getBody();
+ }
+
+ /**
+ * Resets the last response cache.
+ */
+ public function resetLastResponse()
+ {
+ $this->response = new Response();
+ }
+
+ /**
+ * Make URLs for user browser navigation.
+ *
+ * @param string $path
+ * @param array $parameters
+ *
+ * @return string
+ */
+ public function url($path, array $parameters)
+ {
+ $this->resetLastResponse();
+ $this->response->setApiPath($path);
+ $query = http_build_query($parameters);
+ return sprintf('%s/%s?%s', self::API_HOST, $path, $query);
+ }
+
+ /**
+ * Make /oauth/* requests to the API.
+ *
+ * @param string $path
+ * @param array $parameters
+ *
+ * @return array
+ * @throws TwitterOAuthException
+ */
+ public function oauth($path, array $parameters = [])
+ {
+ $response = [];
+ $this->resetLastResponse();
+ $this->response->setApiPath($path);
+ $url = sprintf('%s/%s', self::API_HOST, $path);
+ $result = $this->oAuthRequest($url, 'POST', $parameters);
+
+ if ($this->getLastHttpCode() != 200) {
+ throw new TwitterOAuthException($result);
+ }
+
+ parse_str($result, $response);
+ $this->response->setBody($response);
+
+ return $response;
+ }
+
+ /**
+ * Make /oauth2/* requests to the API.
+ *
+ * @param string $path
+ * @param array $parameters
+ *
+ * @return array|object
+ */
+ public function oauth2($path, array $parameters = [])
+ {
+ $method = 'POST';
+ $this->resetLastResponse();
+ $this->response->setApiPath($path);
+ $url = sprintf('%s/%s', self::API_HOST, $path);
+ $request = Request::fromConsumerAndToken($this->consumer, $this->token, $method, $url, $parameters);
+ $authorization = 'Authorization: Basic ' . $this->encodeAppAuthorization($this->consumer);
+ $result = $this->request($request->getNormalizedHttpUrl(), $method, $authorization, $parameters);
+ $response = JsonDecoder::decode($result, $this->decodeJsonAsArray);
+ $this->response->setBody($response);
+ return $response;
+ }
+
+ /**
+ * Make GET requests to the API.
+ *
+ * @param string $path
+ * @param array $parameters
+ *
+ * @return array|object
+ */
+ public function get($path, array $parameters = [])
+ {
+ return $this->http('GET', self::API_HOST, $path, $parameters);
+ }
+
+ /**
+ * Make POST requests to the API.
+ *
+ * @param string $path
+ * @param array $parameters
+ *
+ * @return array|object
+ */
+ public function post($path, array $parameters = [])
+ {
+ return $this->http('POST', self::API_HOST, $path, $parameters);
+ }
+
+ /**
+ * Make DELETE requests to the API.
+ *
+ * @param string $path
+ * @param array $parameters
+ *
+ * @return array|object
+ */
+ public function delete($path, array $parameters = [])
+ {
+ return $this->http('DELETE', self::API_HOST, $path, $parameters);
+ }
+
+ /**
+ * Make PUT requests to the API.
+ *
+ * @param string $path
+ * @param array $parameters
+ *
+ * @return array|object
+ */
+ public function put($path, array $parameters = [])
+ {
+ return $this->http('PUT', self::API_HOST, $path, $parameters);
+ }
+
+ /**
+ * Upload media to upload.twitter.com.
+ *
+ * @param string $path
+ * @param array $parameters
+ * @param boolean $chunked
+ *
+ * @return array|object
+ */
+ public function upload($path, array $parameters = [], $chunked = false)
+ {
+ if ($chunked) {
+ return $this->uploadMediaChunked($path, $parameters);
+ } else {
+ return $this->uploadMediaNotChunked($path, $parameters);
+ }
+ }
+
+ /**
+ * Private method to upload media (not chunked) to upload.twitter.com.
+ *
+ * @param string $path
+ * @param array $parameters
+ *
+ * @return array|object
+ */
+ private function uploadMediaNotChunked($path, array $parameters)
+ {
+ $file = file_get_contents($parameters['media']);
+ $base = base64_encode($file);
+ $parameters['media'] = $base;
+ return $this->http('POST', self::UPLOAD_HOST, $path, $parameters);
+ }
+
+ /**
+ * Private method to upload media (chunked) to upload.twitter.com.
+ *
+ * @param string $path
+ * @param array $parameters
+ *
+ * @return array|object
+ */
+ private function uploadMediaChunked($path, array $parameters)
+ {
+ $init = $this->http('POST', self::UPLOAD_HOST, $path, $this->mediaInitParameters($parameters));
+ // Append
+ $segmentIndex = 0;
+ $media = fopen($parameters['media'], 'rb');
+ while (!feof($media))
+ {
+ $this->http('POST', self::UPLOAD_HOST, 'media/upload', [
+ 'command' => 'APPEND',
+ 'media_id' => $init->media_id_string,
+ 'segment_index' => $segmentIndex++,
+ 'media_data' => base64_encode(fread($media, $this->chunkSize))
+ ]);
+ }
+ fclose($media);
+ // Finalize
+ $finalize = $this->http('POST', self::UPLOAD_HOST, 'media/upload', [
+ 'command' => 'FINALIZE',
+ 'media_id' => $init->media_id_string
+ ]);
+ return $finalize;
+ }
+
+ /**
+ * Private method to get params for upload media chunked init.
+ * Twitter docs: https://dev.twitter.com/rest/reference/post/media/upload-init.html
+ *
+ * @param array $parameters
+ *
+ * @return array
+ */
+ private function mediaInitParameters(array $parameters)
+ {
+ $return = [
+ 'command' => 'INIT',
+ 'media_type' => $parameters['media_type'],
+ 'total_bytes' => filesize($parameters['media'])
+ ];
+ if (isset($parameters['additional_owners'])) {
+ $return['additional_owners'] = $parameters['additional_owners'];
+ }
+ if (isset($parameters['media_category'])) {
+ $return['media_category'] = $parameters['media_category'];
+ }
+ return $return;
+ }
+
+ /**
+ * @param string $method
+ * @param string $host
+ * @param string $path
+ * @param array $parameters
+ *
+ * @return array|object
+ */
+ private function http($method, $host, $path, array $parameters)
+ {
+ $this->resetLastResponse();
+ $url = sprintf('%s/%s/%s.json', $host, self::API_VERSION, $path);
+ $this->response->setApiPath($path);
+ $result = $this->oAuthRequest($url, $method, $parameters);
+ $response = JsonDecoder::decode($result, $this->decodeJsonAsArray);
+ $this->response->setBody($response);
+ return $response;
+ }
+
+ /**
+ * Format and sign an OAuth / API request
+ *
+ * @param string $url
+ * @param string $method
+ * @param array $parameters
+ *
+ * @return string
+ * @throws TwitterOAuthException
+ */
+ private function oAuthRequest($url, $method, array $parameters)
+ {
+ $request = Request::fromConsumerAndToken($this->consumer, $this->token, $method, $url, $parameters);
+ if (array_key_exists('oauth_callback', $parameters)) {
+ // Twitter doesn't like oauth_callback as a parameter.
+ unset($parameters['oauth_callback']);
+ }
+ if ($this->bearer === null) {
+ $request->signRequest($this->signatureMethod, $this->consumer, $this->token);
+ $authorization = $request->toHeader();
+ if (array_key_exists('oauth_verifier', $parameters)) {
+ // Twitter doesn't always work with oauth in the body and in the header
+ // and it's already included in the $authorization header
+ unset($parameters['oauth_verifier']);
+ }
+ } else {
+ $authorization = 'Authorization: Bearer ' . $this->bearer;
+ }
+ return $this->request($request->getNormalizedHttpUrl(), $method, $authorization, $parameters);
+ }
+
+ /**
+ * Set Curl options.
+ *
+ * @return array
+ */
+ private function curlOptions()
+ {
+ $options = [
+ // CURLOPT_VERBOSE => true,
+ CURLOPT_CONNECTTIMEOUT => $this->connectionTimeout,
+ CURLOPT_HEADER => true,
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_SSL_VERIFYHOST => 2,
+ CURLOPT_SSL_VERIFYPEER => true,
+ CURLOPT_TIMEOUT => $this->timeout,
+ CURLOPT_USERAGENT => $this->userAgent,
+ ];
+
+ if ($this->useCAFile()) {
+ $options[CURLOPT_CAINFO] = __DIR__ . DIRECTORY_SEPARATOR . 'cacert.pem';
+ }
+
+ if($this->gzipEncoding) {
+ $options[CURLOPT_ENCODING] = 'gzip';
+ }
+
+ if (!empty($this->proxy)) {
+ $options[CURLOPT_PROXY] = $this->proxy['CURLOPT_PROXY'];
+ $options[CURLOPT_PROXYUSERPWD] = $this->proxy['CURLOPT_PROXYUSERPWD'];
+ $options[CURLOPT_PROXYPORT] = $this->proxy['CURLOPT_PROXYPORT'];
+ $options[CURLOPT_PROXYAUTH] = CURLAUTH_BASIC;
+ $options[CURLOPT_PROXYTYPE] = CURLPROXY_HTTP;
+ }
+
+ return $options;
+ }
+
+ /**
+ * Make an HTTP request
+ *
+ * @param string $url
+ * @param string $method
+ * @param string $authorization
+ * @param array $postfields
+ *
+ * @return string
+ * @throws TwitterOAuthException
+ */
+ private function request($url, $method, $authorization, array $postfields)
+ {
+ $options = $this->curlOptions($url, $authorization);
+ $options[CURLOPT_URL] = $url;
+ $options[CURLOPT_HTTPHEADER] = ['Accept: application/json', $authorization, 'Expect:'];
+
+ switch ($method) {
+ case 'GET':
+ break;
+ case 'POST':
+ $options[CURLOPT_POST] = true;
+ $options[CURLOPT_POSTFIELDS] = Util::buildHttpQuery($postfields);
+ break;
+ case 'DELETE':
+ $options[CURLOPT_CUSTOMREQUEST] = 'DELETE';
+ break;
+ case 'PUT':
+ $options[CURLOPT_CUSTOMREQUEST] = 'PUT';
+ break;
+ }
+
+ if (in_array($method, ['GET', 'PUT', 'DELETE']) && !empty($postfields)) {
+ $options[CURLOPT_URL] .= '?' . Util::buildHttpQuery($postfields);
+ }
+
+
+ $curlHandle = curl_init();
+ curl_setopt_array($curlHandle, $options);
+ $response = curl_exec($curlHandle);
+
+ // Throw exceptions on cURL errors.
+ if (curl_errno($curlHandle) > 0) {
+ throw new TwitterOAuthException(curl_error($curlHandle), curl_errno($curlHandle));
+ }
+
+ $this->response->setHttpCode(curl_getinfo($curlHandle, CURLINFO_HTTP_CODE));
+ $parts = explode("\r\n\r\n", $response);
+ $responseBody = array_pop($parts);
+ $responseHeader = array_pop($parts);
+ $this->response->setHeaders($this->parseHeaders($responseHeader));
+
+ curl_close($curlHandle);
+
+ return $responseBody;
+ }
+
+ /**
+ * Get the header info to store.
+ *
+ * @param string $header
+ *
+ * @return array
+ */
+ private function parseHeaders($header)
+ {
+ $headers = [];
+ foreach (explode("\r\n", $header) as $line) {
+ if (strpos($line, ':') !== false) {
+ list ($key, $value) = explode(': ', $line);
+ $key = str_replace('-', '_', strtolower($key));
+ $headers[$key] = trim($value);
+ }
+ }
+ return $headers;
+ }
+
+ /**
+ * Encode application authorization header with base64.
+ *
+ * @param Consumer $consumer
+ *
+ * @return string
+ */
+ private function encodeAppAuthorization(Consumer $consumer)
+ {
+ $key = rawurlencode($consumer->key);
+ $secret = rawurlencode($consumer->secret);
+ return base64_encode($key . ':' . $secret);
+ }
+
+ /**
+ * Is the code running from a Phar module.
+ *
+ * @return boolean
+ */
+ private function pharRunning()
+ {
+ return class_exists('Phar') && \Phar::running(false) !== '';
+ }
+
+ /**
+ * Use included CA file instead of OS provided list.
+ *
+ * @return boolean
+ */
+ private function useCAFile()
+ {
+ /* Use CACert file when not in a PHAR file. */
+ return !$this->pharRunning();
+ }
+}
--- /dev/null
+<?php
+
+namespace Abraham\TwitterOAuth;
+
+/**
+ * @author Abraham Williams <abraham@abrah.am>
+ */
+class TwitterOAuthException extends \Exception
+{
+}
--- /dev/null
+<?php
+/**
+ * The MIT License
+ * Copyright (c) 2007 Andy Smith
+ */
+namespace Abraham\TwitterOAuth;
+
+class Util
+{
+ /**
+ * @param $input
+ *
+ * @return array|mixed|string
+ */
+ public static function urlencodeRfc3986($input)
+ {
+ $output = '';
+ if (is_array($input)) {
+ $output = array_map([__NAMESPACE__ . '\Util', 'urlencodeRfc3986'], $input);
+ } elseif (is_scalar($input)) {
+ $output = rawurlencode($input);
+ }
+ return $output;
+ }
+
+ /**
+ * @param string $string
+ *
+ * @return string
+ */
+ public static function urldecodeRfc3986($string)
+ {
+ return urldecode($string);
+ }
+
+ /**
+ * This function takes a input like a=b&a=c&d=e and returns the parsed
+ * parameters like this
+ * array('a' => array('b','c'), 'd' => 'e')
+ *
+ * @param string $input
+ *
+ * @return array
+ */
+ public static function parseParameters($input)
+ {
+ if (!is_string($input)) {
+ return [];
+ }
+
+ $pairs = explode('&', $input);
+
+ $parameters = [];
+ foreach ($pairs as $pair) {
+ $split = explode('=', $pair, 2);
+ $parameter = Util::urldecodeRfc3986($split[0]);
+ $value = isset($split[1]) ? Util::urldecodeRfc3986($split[1]) : '';
+
+ if (isset($parameters[$parameter])) {
+ // We have already recieved parameter(s) with this name, so add to the list
+ // of parameters with this name
+
+ if (is_scalar($parameters[$parameter])) {
+ // This is the first duplicate, so transform scalar (string) into an array
+ // so we can add the duplicates
+ $parameters[$parameter] = [$parameters[$parameter]];
+ }
+
+ $parameters[$parameter][] = $value;
+ } else {
+ $parameters[$parameter] = $value;
+ }
+ }
+ return $parameters;
+ }
+
+ /**
+ * @param array $params
+ *
+ * @return string
+ */
+ public static function buildHttpQuery(array $params)
+ {
+ if (empty($params)) {
+ return '';
+ }
+
+ // Urlencode both keys and values
+ $keys = Util::urlencodeRfc3986(array_keys($params));
+ $values = Util::urlencodeRfc3986(array_values($params));
+ $params = array_combine($keys, $values);
+
+ // Parameters are sorted by name, using lexicographical byte value ordering.
+ // Ref: Spec: 9.1.1 (1)
+ uksort($params, 'strcmp');
+
+ $pairs = [];
+ foreach ($params as $parameter => $value) {
+ if (is_array($value)) {
+ // If two or more parameters share the same name, they are sorted by their value
+ // Ref: Spec: 9.1.1 (1)
+ // June 12th, 2010 - changed to sort because of issue 164 by hidetaka
+ sort($value, SORT_STRING);
+ foreach ($value as $duplicateValue) {
+ $pairs[] = $parameter . '=' . $duplicateValue;
+ }
+ } else {
+ $pairs[] = $parameter . '=' . $value;
+ }
+ }
+ // For each parameter, the name is separated from the corresponding value by an '=' character (ASCII code 61)
+ // Each name-value pair is separated by an '&' character (ASCII code 38)
+ return implode('&', $pairs);
+ }
+}
--- /dev/null
+<?php
+
+namespace Abraham\TwitterOAuth\Util;
+
+/**
+ * @author louis <louis@systemli.org>
+ */
+class JsonDecoder
+{
+ /**
+ * Decodes a JSON string to stdObject or associative array
+ *
+ * @param string $string
+ * @param bool $asArray
+ *
+ * @return array|object
+ */
+ public static function decode($string, $asArray)
+ {
+ if (version_compare(PHP_VERSION, '5.4.0', '>=') && !(defined('JSON_C_VERSION') && PHP_INT_SIZE > 4)) {
+ return json_decode($string, $asArray, 512, JSON_BIGINT_AS_STRING);
+ }
+
+ return json_decode($string, $asArray);
+ }
+}
--- /dev/null
+##
+## Bundle of CA Root Certificates
+##
+## Certificate data from Mozilla as of: Wed Jan 18 04:12:05 2017 GMT
+##
+## This is a bundle of X.509 certificates of public Certificate Authorities
+## (CA). These were automatically extracted from Mozilla's root certificates
+## file (certdata.txt). This file can be found in the mozilla source tree:
+## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt
+##
+## It contains the certificates in PEM format and therefore
+## can be directly used with curl / libcurl / php_curl, or with
+## an Apache+mod_ssl webserver for SSL client authentication.
+## Just configure this file as the SSLCACertificateFile.
+##
+## Conversion done with mk-ca-bundle.pl version 1.27.
+## SHA256: dffa79e6aa993f558e82884abf7bb54bf440ab66ee91d82a27a627f6f2a4ace4
+##
+
+
+GlobalSign Root CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
+GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
+b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
+BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
+VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
+DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
+THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
+Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
+c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
+gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
+AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
+Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
+j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
+hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
+X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
+ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
+s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
+S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
+TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
+ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
+FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
+YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
+BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
+9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
+01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
+9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority - G3
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
+dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
+EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
+cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
+EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
+055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
+ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
+j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
+xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
+t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
+-----END CERTIFICATE-----
+
+Entrust.net Premium 2048 Secure Server CA
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
+ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
+bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
+BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
+NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
+d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
+MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
+ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
+Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
+hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
+nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
+VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
+KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
+T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
+zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
+J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
+nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
+-----END CERTIFICATE-----
+
+Baltimore CyberTrust Root
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
+ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
+ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
+SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
+dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
+uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
+UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
+G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
+XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
+l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
+VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
+BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
+cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
+hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
+Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
+RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+
+AddTrust Low-Value Services Root
+================================
+-----BEGIN CERTIFICATE-----
+MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
+cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
+CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
+ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
+54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
+oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
+Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
+GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
+HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
+AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
+RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
+HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
+ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
+iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
+eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
+mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
+ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
+-----END CERTIFICATE-----
+
+AddTrust External Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
+VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
+NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
+cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
+Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
+Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
+aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
+2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
+7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
+VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
+VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
+IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
+j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
+e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
+G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
+
+AddTrust Public Services Root
+=============================
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
+cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
+BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
+dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
+nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
+d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
+Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
+HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
+A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
+A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
+JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
+GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
+Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
+EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
+-----END CERTIFICATE-----
+
+AddTrust Qualified Certificates Root
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
+cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
+CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
+IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
+64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
+KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
+L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
+wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
+MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
+BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
+azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
+ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
+GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
+dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
+RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
+iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
+BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
+b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
+A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
+MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
+MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
+Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
+dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
+A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
+Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
+j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
+rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
+MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
+hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
+Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
+v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
+W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
+tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+
+GeoTrust Global CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
+Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
+MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
+LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
+BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
+8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
+T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
+vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
+DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
+zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
+d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
+mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
+XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
+Mw==
+-----END CERTIFICATE-----
+
+GeoTrust Global CA 2
+====================
+-----BEGIN CERTIFICATE-----
+MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
+MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
+LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
+NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
+LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
+Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
+HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
+K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
+srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
+ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
+OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
+x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
+H4z1Ir+rzoPz4iIprn2DQKi6bA==
+-----END CERTIFICATE-----
+
+GeoTrust Universal CA
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
+MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
+Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
+JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
+RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
+7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
+8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
+qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
+Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
+Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
+KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
+ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
+XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
+hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
+aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
+qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
+oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
+xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
+KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
+DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
+xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
+p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
+P/rmMuGNG2+k5o7Y+SlIis5z/iw=
+-----END CERTIFICATE-----
+
+GeoTrust Universal CA 2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
+MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
+SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
+DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
+j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
+JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
+QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
+WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
+20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
+ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
+SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
+8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
+BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
+dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
+4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
+A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
+Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
+pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
+FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
+gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
+X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
+-----END CERTIFICATE-----
+
+Visa eCommerce Root
+===================
+-----BEGIN CERTIFICATE-----
+MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
+EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
+QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
+WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
+VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
+bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
+F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
+RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
+TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
+/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
+GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
+MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
+CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
+YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
+zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
+YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
+398znM/jra6O1I7mT1GvFpLgXPYHDw==
+-----END CERTIFICATE-----
+
+Certum Root CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
+ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
+Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
+by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
+wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
+kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
+89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
+Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
+NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
+hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
+GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
+GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
+0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
+qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
+-----END CERTIFICATE-----
+
+Comodo AAA Services root
+========================
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
+MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
+c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
+BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
+C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
+i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
+Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
+Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
+Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
+BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
+cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
+LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
+7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
+8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
+12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+
+Comodo Secure Services root
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
+MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
+Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
+BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
+9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
+rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
+oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
+p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
+FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
+gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
+YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
+aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
+4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
+Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
+DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
+pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
+RR3B7Hzs/Sk=
+-----END CERTIFICATE-----
+
+Comodo Trusted Services root
+============================
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
+MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
+bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
+IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
+3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
+/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
+juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
+ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
+DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
+ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
+cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
+uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
+pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
+BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
+R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
+9y5Xt5hwXsjEeLBi
+-----END CERTIFICATE-----
+
+QuoVadis Root CA
+================
+-----BEGIN CERTIFICATE-----
+MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
+ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
+MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
+cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
+EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
+J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
+F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
+YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
+AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
+PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
+ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
+MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
+YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
+ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
+Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
+Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
+BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
+FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
+tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
+fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
+LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
+gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
+5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
+5nrQNiOKSnQ2+Q==
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 2
+==================
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
+ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
+XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
+lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
+lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
+lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
+66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
+wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
+D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
+BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
+J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
+DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
+a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
+ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
+Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
+UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
+VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
+IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
+WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
+f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
+4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
+VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 3
+==================
+-----BEGIN CERTIFICATE-----
+MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
+OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
+DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
+KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
+DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
+BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
+p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
+nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
+MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
+Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
+uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
+BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
+YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
+aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
+BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
+VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
+ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
+AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
+qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
+hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
+POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
+Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
+8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
+bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
+g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
+vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
+qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
+-----END CERTIFICATE-----
+
+Security Communication Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
+8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
+DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
+5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
+DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
+JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
+0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
+mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
+s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
+6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
+FL39vmwLAw==
+-----END CERTIFICATE-----
+
+Sonera Class 2 Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
+U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
+NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
+IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
+/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
+dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
+f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
+tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
+nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
+XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
+0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
+cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
+Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
+EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
+llpwrN9M
+-----END CERTIFICATE-----
+
+UTN USERFirst Hardware Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
+BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
+OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
+eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
+ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
+wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
+tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
+i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
+Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
+gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
+lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
+UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
+BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
+//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
+XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
+lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
+iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
+nfhmqA==
+-----END CERTIFICATE-----
+
+Camerfirma Chambers of Commerce Root
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
+QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
+ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
+NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
+cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
+MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
+AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
+xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
+NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
+DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
+d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
+EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
+cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
+AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
+bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
+VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
+aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
+fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
+L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
+UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
+ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
+erfutGWaIZDgqtCYvDi1czyL+Nw=
+-----END CERTIFICATE-----
+
+Camerfirma Global Chambersign Root
+==================================
+-----BEGIN CERTIFICATE-----
+MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
+QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
+ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
+NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
+YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
+MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
+ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
+1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
+by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
+6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
+8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
+BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
+aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
+Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
+aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
+ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
+bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
+PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
+gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
+PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
+IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
+t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
+-----END CERTIFICATE-----
+
+XRamp Global CA Root
+====================
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
+BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
+dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
+HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
+U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
+IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
+foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
+zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
+AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
+xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
+oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
+AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
+/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
+nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
+8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
+-----END CERTIFICATE-----
+
+Go Daddy Class 2 CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
+VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
+A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
+RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
+ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
+2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
+qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
+YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
+vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
+BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
+atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
+MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
+A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
+PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
+I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
+Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
+vZ8=
+-----END CERTIFICATE-----
+
+Starfield Class 2 CA
+====================
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
+U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
+MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
+A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
+SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
+bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
+JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
+epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
+F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
+MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
+hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
+bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
+afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
+PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
+KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
+QBFGmh95DmK/D5fs4C8fF5Q=
+-----END CERTIFICATE-----
+
+StartCom Certification Authority
+================================
+-----BEGIN CERTIFICATE-----
+MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
+ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
+NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
+LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
+U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
+ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
+o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
+Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
+eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
+2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
+6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
+osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
+untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
+UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
+37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
+FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
+Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
+YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
+AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
+Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
+U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
+LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
+cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
+dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
+AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
+3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
+vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
+fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
+fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
+EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
+yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
+1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
+lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
+g14=
+-----END CERTIFICATE-----
+
+Taiwan GRCA
+===========
+-----BEGIN CERTIFICATE-----
+MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
+EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
+DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
+dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
+w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
+BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
+1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
+htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
+J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
+Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
+B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
+O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
+lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
+HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
+09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
+TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
+Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
+Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
+D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
+DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
+Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
+7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
+CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
+-----END CERTIFICATE-----
+
+Swisscom Root CA 1
+==================
+-----BEGIN CERTIFICATE-----
+MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG
+EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
+dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4
+MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
+aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC
+IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM
+MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF
+NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe
+AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC
+b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn
+7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN
+cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp
+WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5
+haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY
+MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
+HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
+BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9
+MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn
+jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ
+MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H
+VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl
+vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl
+OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3
+1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq
+nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy
+x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW
+NY6E0F/6MBr1mmz0DlP5OlvRHA==
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
+IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
+MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
+ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
+9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
+UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
+/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
+oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
+GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
+66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
+hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
+EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
+SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
+8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+
+DigiCert Global Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
+HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
+MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
+dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
+TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
+BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
+4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
+7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
+o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
+8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
+BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
+EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
+tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
+UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+
+DigiCert High Assurance EV Root CA
+==================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
+KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
+MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
+MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
+Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
+Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
+OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
+MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
+NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
+h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
+Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
+JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
+V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
+myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
+mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
+-----END CERTIFICATE-----
+
+Certplus Class 2 Primary CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
+BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
+OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
+dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
+5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
+Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
+YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
+e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
+CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
+YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
+L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
+P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
+TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
+7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
+//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
+l7+ijrRU
+-----END CERTIFICATE-----
+
+DST Root CA X3
+==============
+-----BEGIN CERTIFICATE-----
+MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
+ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
+DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
+cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
+rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
+UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
+xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
+utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
+MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
+dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
+GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
+RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
+fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
+-----END CERTIFICATE-----
+
+DST ACES CA X6
+==============
+-----BEGIN CERTIFICATE-----
+MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
+MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
+MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
+CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
+DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
+pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
+GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
+MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
+Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
+dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
+CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
+5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
+Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
+nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
+vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
+oKfN5XozNmr6mis=
+-----END CERTIFICATE-----
+
+SwissSign Gold CA - G2
+======================
+-----BEGIN CERTIFICATE-----
+MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
+EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
+MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
+c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
+t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
+jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
+vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
+ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
+AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
+jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
+peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
+7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
+GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
+OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
+L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
+5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
+44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
+Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
+Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
+mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
+vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
+KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
+NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
+viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
+-----END CERTIFICATE-----
+
+SwissSign Silver CA - G2
+========================
+-----BEGIN CERTIFICATE-----
+MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
+BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
+DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
+aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
+9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
+N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
+6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
+MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
+qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
+FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
+ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
+celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
+CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
+tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
+cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
+4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
+kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
+3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
+/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
+DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
+e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
+WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
+DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
+DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
+CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
+cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
+b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
+nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
+RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
+tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
+hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
+Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
+NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
+Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
+1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
+-----END CERTIFICATE-----
+
+thawte Primary Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
+MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
+SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
+KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
+FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
+oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
+1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
+q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
+aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
+afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
+VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
+AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
+uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
+xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
+jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
+z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
+-----END CERTIFICATE-----
+
+VeriSign Class 3 Public Primary Certification Authority - G5
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
+IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
+biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
+dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
+j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
+Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
+Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
+fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
+BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
+Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
+SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
+KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
+Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
+ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
+-----END CERTIFICATE-----
+
+SecureTrust CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
+dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
+BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
+OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
+DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
+GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
+01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
+ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
+aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
+SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
+mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
+nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
+-----END CERTIFICATE-----
+
+Secure Global CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
+bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
+MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
+Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
+YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
+bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
+8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
+HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
+0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
+oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
+MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
+CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
+3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
+-----END CERTIFICATE-----
+
+COMODO Certification Authority
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
+BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
+A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
+dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
+MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
+T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
+xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
+4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
+1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
+rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
+b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
+AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
+OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
+IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
+-----END CERTIFICATE-----
+
+Network Solutions Certificate Authority
+=======================================
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
+EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
+IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
+MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
+jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
+aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
+crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
+/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
+AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
+bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
+A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
+4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
+GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
+ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
+-----END CERTIFICATE-----
+
+WellsSecure Public Root Certificate Authority
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
+F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
+NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
+MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
+bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
+VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
+iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
+i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
+bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
+K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
+AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
+cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
+lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
+i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
+GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
+K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
+bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
+qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
+E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
+tylv2G0xffX8oRAHh84vWdw+WNs=
+-----END CERTIFICATE-----
+
+COMODO ECC Certification Authority
+==================================
+-----BEGIN CERTIFICATE-----
+MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
+R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
+ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
+GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
+b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
+4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
+wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
+FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
+U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
+-----END CERTIFICATE-----
+
+Security Communication EV RootCA1
+=================================
+-----BEGIN CERTIFICATE-----
+MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
+dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
+BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
+Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
+/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
+WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
+ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
+bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
+9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
+SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
+iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
+Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
+mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
+T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GA CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
+BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
+A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
+bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
+VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
+IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
+IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
+Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
+Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
+d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
+/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
+LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
+MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
+hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
+okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
+-----END CERTIFICATE-----
+
+Microsec e-Szigno Root CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
+BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
+EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
+MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
+dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
+GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
+d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
+oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
+QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
+PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
+MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
+IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
+VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
+LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
+dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
+AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
+4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
+AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
+egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
+Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
+PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
+c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
+cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
+IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
+WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
+MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
+MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
+Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
+HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
+nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
+aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
+86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
+yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
+S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
+-----END CERTIFICATE-----
+
+Certigna
+========
+-----BEGIN CERTIFICATE-----
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
+EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
+MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
+Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
+XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
+GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
+ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
+DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
+Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
+tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
+BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
+SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
+hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
+PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
+1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
+-----END CERTIFICATE-----
+
+Deutsche Telekom Root CA 2
+==========================
+-----BEGIN CERTIFICATE-----
+MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
+RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
+A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
+MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
+A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
+b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
+bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
+KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
+AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
+Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
+jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
+HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
+E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
+zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
+rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
+dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
+Cm26OWMohpLzGITY+9HPBVZkVw==
+-----END CERTIFICATE-----
+
+Cybertrust Global Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
+ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
+MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
+ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
+0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
+AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
+89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
+8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
+MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
+A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
+lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
+5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
+hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
+X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
+WL1WMRJOEcgh4LMRkWXbtKaIOM5V
+-----END CERTIFICATE-----
+
+ePKI Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
+EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
+Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
+MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
+MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
+IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
+lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
+qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
+12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
+WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
+lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
+vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
+Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
+MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
+ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
+1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
+KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
+xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
+NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
+GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
+xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
+gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
+sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
+BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
+-----END CERTIFICATE-----
+
+T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3
+=============================================================================================================================
+-----BEGIN CERTIFICATE-----
+MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
+DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
+aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
+b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
+BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
+S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
+MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
+IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
+n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
+IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
+dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
+cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
+Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
+xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
+6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
+hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
+BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
+N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
+y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
+LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
+dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
+-----END CERTIFICATE-----
+
+certSIGN ROOT CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
+VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
+Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
+CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
+JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
+rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
+ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
+0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
+AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
+Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
+AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
+SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
+x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
+vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
+TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
+-----END CERTIFICATE-----
+
+CNNIC ROOT
+==========
+-----BEGIN CERTIFICATE-----
+MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
+ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
+OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
+o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
+VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
+VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
+czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
+y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
+wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
+lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
+Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
+O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
+BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
+G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
+mxE=
+-----END CERTIFICATE-----
+
+ApplicationCA - Japanese Government
+===================================
+-----BEGIN CERTIFICATE-----
+MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
+SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
+MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
+cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
+fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
+wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
+jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
+nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
+WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
+BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
+vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
+o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
+/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
+io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
+dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
+rosot4LKGAfmt1t06SAZf7IbiVQ=
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority - G3
+=============================================
+-----BEGIN CERTIFICATE-----
+MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
+BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
+IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
+NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
+YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
+LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
+K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
+c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
+IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
+dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
+2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
+cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
+Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
+AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
+t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
+-----END CERTIFICATE-----
+
+thawte Primary Root CA - G2
+===========================
+-----BEGIN CERTIFICATE-----
+MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
+VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
+IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
+Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
+MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
+b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
+IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
+LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
+8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
+mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
+G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
+rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
+-----END CERTIFICATE-----
+
+thawte Primary Root CA - G3
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
+ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
+d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
+VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
+A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
+P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
+7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
+vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
+KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
+A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
+t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
+8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
+er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority - G2
+=============================================
+-----BEGIN CERTIFICATE-----
+MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
+Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
+OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
+MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
+b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
+BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
+KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
+VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
+EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
+ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
+npaqBA+K
+-----END CERTIFICATE-----
+
+VeriSign Universal Root Certification Authority
+===============================================
+-----BEGIN CERTIFICATE-----
+MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
+IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
+IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
+1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
+MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
+9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
+AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
+tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
+CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
+a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
+DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
+Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
+Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
+P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
+wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
+mJO37M2CYfE45k+XmCpajQ==
+-----END CERTIFICATE-----
+
+VeriSign Class 3 Public Primary Certification Authority - G4
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
+VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
+b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
+ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
+cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
+b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
+Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
+rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
+HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
+Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
+A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
+AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
+-----END CERTIFICATE-----
+
+NetLock Arany (Class Gold) Főtanúsítvány
+========================================
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
+A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
+dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
+cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
+MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
+ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
+c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
+0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
+/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
+H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
+fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
+neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
+qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
+YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
+bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
+NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
+dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
+-----END CERTIFICATE-----
+
+Staat der Nederlanden Root CA - G2
+==================================
+-----BEGIN CERTIFICATE-----
+MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
+TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
+ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
+5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
+vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
+CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
+e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
+OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
+CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
+48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
+trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
+qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
+AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
+ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
+A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
++51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
+f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
+kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
+CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
+URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
+CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
+oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
+IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
+66+KAQ==
+-----END CERTIFICATE-----
+
+Hongkong Post Root CA 1
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
+DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
+NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
+IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
+ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
+auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
+qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
+V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
+HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
+h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
+l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
+IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
+T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
+c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
+-----END CERTIFICATE-----
+
+SecureSign RootCA11
+===================
+-----BEGIN CERTIFICATE-----
+MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
+SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
+b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
+KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
+cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
+TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
+wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
+g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
+O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
+bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
+t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
+OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
+bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
+Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
+y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
+lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
+-----END CERTIFICATE-----
+
+ACEDICOM Root
+=============
+-----BEGIN CERTIFICATE-----
+MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD
+T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4
+MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG
+A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk
+WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD
+YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew
+MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb
+m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk
+HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT
+xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2
+3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9
+2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq
+TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz
+4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU
+9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
+bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg
+aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP
+eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk
+zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1
+ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI
+KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq
+nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE
+I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp
+MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o
+tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==
+-----END CERTIFICATE-----
+
+Microsec e-Szigno Root CA 2009
+==============================
+-----BEGIN CERTIFICATE-----
+MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
+MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
+c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
+dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
+BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
+U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
+fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
+0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
+pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
+1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
+AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
+QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
+FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
+lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
+I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
+tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
+yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
+LXpUq3DDfSJlgnCW
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R3
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
+iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
+0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
+rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
+OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
+xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
+lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
+EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
+bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
+YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
+kpeDMdmztcpHWD9f
+-----END CERTIFICATE-----
+
+Autoridad de Certificacion Firmaprofesional CIF A62634068
+=========================================================
+-----BEGIN CERTIFICATE-----
+MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
+BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
+MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
+QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
+NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
+Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
+B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
+7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
+ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
+plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
+MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
+LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
+bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
+vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
+EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
+DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
+cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
+bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
+ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
+51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
+R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
+T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
+Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
+osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
+crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
+saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
+KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
+6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
+-----END CERTIFICATE-----
+
+Izenpe.com
+==========
+-----BEGIN CERTIFICATE-----
+MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
+EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
+MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
+QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
+03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
+ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
+PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
+OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
+F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
+0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
+leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
+AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
+SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
+NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
+MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
+BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
+Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
+kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
+hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
+g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
+aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
+nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
+ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
+Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
+WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
+-----END CERTIFICATE-----
+
+Chambers of Commerce Root - 2008
+================================
+-----BEGIN CERTIFICATE-----
+MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
+MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
+bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
+QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
+Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
+ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
+EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
+cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
+XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
+h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
+ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
+NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
+D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
+lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
+0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
+ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
+EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
+G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
+BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
+bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
+bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
+CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
+AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
+wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
+3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
+RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
+M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
+YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
+9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
+zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
+nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
+OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
+-----END CERTIFICATE-----
+
+Global Chambersign Root - 2008
+==============================
+-----BEGIN CERTIFICATE-----
+MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
+MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
+bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
+QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
+NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
+Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
+QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
+aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
+VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
+XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
+ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
+/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
+TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
+H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
+Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
+HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
+wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
+AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
+BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
+BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
+aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
+aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
+1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
+dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
+/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
+ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
+dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
+9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
+foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
+qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
+P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
+c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
+09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
+-----END CERTIFICATE-----
+
+Go Daddy Root Certificate Authority - G2
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
+MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
+A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
+9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
+fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
+NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
+BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
+vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
+5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
+N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
+-----END CERTIFICATE-----
+
+Starfield Root Certificate Authority - G2
+=========================================
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
+eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
+DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
+VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
+dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
+W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
+bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
+N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
+ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
+JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
+TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
+4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
+F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
+c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
+-----END CERTIFICATE-----
+
+Starfield Services Root Certificate Authority - G2
+==================================================
+-----BEGIN CERTIFICATE-----
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
+IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
+BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
+dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
+h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
+hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
+LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
+rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
+SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
+E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
+xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
+YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
+-----END CERTIFICATE-----
+
+AffirmTrust Commercial
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
+MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
+DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
+C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
+BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
+MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
+HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
+hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
+qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
+0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
+sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
+-----END CERTIFICATE-----
+
+AffirmTrust Networking
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
+MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
+Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
+dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
+/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
+h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
+HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
+UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
+12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
+WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
+/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
+-----END CERTIFICATE-----
+
+AffirmTrust Premium
+===================
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
+OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
+dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
+BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
+5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
+GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
+p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
+S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
+6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
+/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
+MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
+6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
+L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
+BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
+IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
+g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
+zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
+-----END CERTIFICATE-----
+
+AffirmTrust Premium ECC
+=======================
+-----BEGIN CERTIFICATE-----
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
+BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
+MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
+cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
+N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
+BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
+BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
+57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
+eQ==
+-----END CERTIFICATE-----
+
+Certum Trusted Network CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
+ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
+MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
+ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
+l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
+J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
+fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
+cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
+Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
+DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
+jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
+mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
+Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
+03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
+-----END CERTIFICATE-----
+
+Certinomis - Autorité Racine
+============================
+-----BEGIN CERTIFICATE-----
+MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
+Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
+LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG
+A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw
+JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa
+wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly
+Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw
+2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N
+jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q
+c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC
+lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb
+xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g
+530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna
+4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
+A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
+KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x
+WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva
+R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40
+nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B
+CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv
+JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE
+qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b
+WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE
+wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/
+vgt2Fl43N+bYdJeimUV5
+-----END CERTIFICATE-----
+
+TWCA Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
+VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
+EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
+IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
+QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
+oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
+4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
+y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
+9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
+mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
+QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
+T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
+Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
+-----END CERTIFICATE-----
+
+Security Communication RootCA2
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
+dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
+SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
+aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
+3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
+spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
+EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
+QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
+CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
+u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
+3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
+tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
+mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
+-----END CERTIFICATE-----
+
+EC-ACC
+======
+-----BEGIN CERTIFICATE-----
+MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
+BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
+ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
+VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
+CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
+BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
+MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
+SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
+Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
+cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
+w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
+ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
+HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
+E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
+0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
+VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
+Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
+dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
+lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
+Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
+l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
+E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
+5EI=
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions RootCA 2011
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
+O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
+aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
+IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
+AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
+IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
+IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
+1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
+71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
+8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
+3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
+MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
+MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
+b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
+XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
+TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
+/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
+7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
+-----END CERTIFICATE-----
+
+Actalis Authentication Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
+BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
+AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
+MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
+IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
+IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
+wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
+by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
+zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
+YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
+oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
+EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
+hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
+EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
+jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
+iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
+ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
+WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
+JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
+K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
+Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
+4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
+2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
+lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
+OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
+vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
+-----END CERTIFICATE-----
+
+Trustis FPS Root CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
+EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
+IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
+BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
+RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
+H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
+cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
+o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
+AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
+BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
+GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
+yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
+8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
+l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
+iB6XzCGcKQENZetX2fNXlrtIzYE=
+-----END CERTIFICATE-----
+
+StartCom Certification Authority
+================================
+-----BEGIN CERTIFICATE-----
+MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
+ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
+NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
+LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
+U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
+ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
+o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
+Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
+eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
+2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
+6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
+osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
+untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
+UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
+37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
+VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ
+Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0
+dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu
+c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv
+bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0
+aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0
+aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
+L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG
+cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5
+fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm
+N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN
+Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T
+tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX
+e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA
+2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs
+HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
+JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib
+D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=
+-----END CERTIFICATE-----
+
+StartCom Certification Authority G2
+===================================
+-----BEGIN CERTIFICATE-----
+MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE
+ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O
+o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG
+4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi
+Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul
+Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs
+O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H
+vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L
+nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS
+FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa
+z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ
+KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
+2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk
+J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+
+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG
+/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc
+nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld
+blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc
+l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm
+7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm
+obp573PYtlNXLfbQ4ddI
+-----END CERTIFICATE-----
+
+Buypass Class 2 Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X
+DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
+eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1
+g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn
+9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b
+/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU
+CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff
+awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI
+zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn
+Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX
+Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs
+M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
+AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
+A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI
+osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S
+aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd
+DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD
+LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0
+oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC
+wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS
+CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN
+rJgWVqA=
+-----END CERTIFICATE-----
+
+Buypass Class 3 Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X
+DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
+eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH
+sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR
+5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh
+7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ
+ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH
+2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV
+/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ
+RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA
+Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq
+j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
+AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
+cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G
+uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG
+Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8
+ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2
+KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz
+6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug
+UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe
+eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi
+Cp/HuZc=
+-----END CERTIFICATE-----
+
+T-TeleSec GlobalRoot Class 3
+============================
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
+IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
+cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
+MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
+dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
+ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
+9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
+NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
+iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
+0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
+AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
+fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
+ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
+P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
+e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
+-----END CERTIFICATE-----
+
+EE Certification Centre Root CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
+EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
+dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
+MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
+UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
+ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
+TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
+rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
+93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
+P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
+MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
+BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
+xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
+lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
+uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
+3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
+dcGWxZ0=
+-----END CERTIFICATE-----
+
+TURKTRUST Certificate Services Provider Root 2007
+=================================================
+-----BEGIN CERTIFICATE-----
+MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
+MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
+QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X
+DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl
+a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN
+BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
+bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N
+YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv
+KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya
+KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT
+rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC
+AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s
+Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
+aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO
+Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb
+BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK
+poRq0Tl9
+-----END CERTIFICATE-----
+
+D-TRUST Root Class 3 CA 2 2009
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
+Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
+LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
+ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
+BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
+KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
+p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
+AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
+4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
+eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
+MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
+PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
+OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
+2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
+o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
+dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
+X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
+-----END CERTIFICATE-----
+
+D-TRUST Root Class 3 CA 2 EV 2009
+=================================
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
+OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
+OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
+egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
+zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
+7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
+sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
+11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
+cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
+ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
+MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
+b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
+c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
+PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
+nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
+ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
+NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
+w9y4AyHqnxbxLFS1
+-----END CERTIFICATE-----
+
+PSCProcert
+==========
+-----BEGIN CERTIFICATE-----
+MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk
+ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ
+MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz
+dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl
+cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw
+IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw
+MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w
+DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD
+ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp
+Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC
+wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA
+3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh
+RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO
+EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2
+0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH
+0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU
+td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw
+Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp
+r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/
+AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz
+Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId
+xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp
+ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH
+EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h
+Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k
+ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG
+9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG
+MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG
+LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52
+ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy
+YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v
+Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o
+dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq
+T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN
+g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q
+uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1
+n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn
+FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo
+5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq
+3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5
+poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y
+eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km
+-----END CERTIFICATE-----
+
+China Internet Network Information Center EV Certificates Root
+==============================================================
+-----BEGIN CERTIFICATE-----
+MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV
+BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D
+aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg
+Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG
+A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM
+PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl
+cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y
+jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV
+98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H
+klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23
+KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC
+7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD
+glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5
+0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM
+7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws
+ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0
+5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8=
+-----END CERTIFICATE-----
+
+Swisscom Root CA 2
+==================
+-----BEGIN CERTIFICATE-----
+MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG
+EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
+dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2
+MjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
+aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC
+IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM
+LgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo
+ysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ
+wDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH
+Wrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a
+SgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS
+NLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab
+mbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY
+Ypqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3
+qPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
+HQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O
+BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu
+MA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO
+v2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ
+82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz
+o9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs
+a0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx
+OQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW
+mA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o
++sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC
+rvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX
+5OfNeOI5wSsSnqaeG8XmDtkx2Q==
+-----END CERTIFICATE-----
+
+Swisscom Root EV CA 2
+=====================
+-----BEGIN CERTIFICATE-----
+MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE
+BhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl
+cnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN
+MzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT
+HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg
+Q0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz
+o3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy
+Xhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti
+GZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li
+qG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH
+Za0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG
+alNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa
+m3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox
+bPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi
+xzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/
+BAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED
+MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB
+bkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL
+j6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU
+wp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7
+XwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH
+59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/
+23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq
+J3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA
+HmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi
+uMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW
+l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc=
+-----END CERTIFICATE-----
+
+CA Disig Root R1
+================
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw
+EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
+ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx
+EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
+c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy
+3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8
+u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2
+m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk
+CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa
+YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6
+vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL
+LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX
+ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is
+XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ
+04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR
+xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B
+LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM
+CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb
+VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85
+YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS
+ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix
+lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N
+UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ
+a7+h89n07eLw4+1knj0vllJPgFOL
+-----END CERTIFICATE-----
+
+CA Disig Root R2
+================
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw
+EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
+ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx
+EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
+c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC
+w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia
+xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7
+A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S
+GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV
+g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa
+5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE
+koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A
+Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i
+Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u
+Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
+tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV
+sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je
+dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8
+1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx
+mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01
+utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0
+sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg
+UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV
+7+ZtsH8tZ/3zbBt1RqPlShfppNcL
+-----END CERTIFICATE-----
+
+ACCVRAIZ1
+=========
+-----BEGIN CERTIFICATE-----
+MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
+SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
+MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
+UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
+jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
+RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
+aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
+0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
+WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
+8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
+5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
+9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
+Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
+Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
+Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
+VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
+Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
+QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
+AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
+YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
+AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
+IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
+aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
+dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
+MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
+hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
+R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
+YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
+nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
+TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
+sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
+I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
+Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
+3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
+EfbRD0tVNEYqi4Y7
+-----END CERTIFICATE-----
+
+TWCA Global Root CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT
+CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD
+QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK
+EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg
+Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C
+nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV
+r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR
+Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV
+tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W
+KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99
+sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p
+yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn
+kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI
+zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g
+cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
+LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M
+8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg
+/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg
+lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP
+A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m
+i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8
+EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3
+zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=
+-----END CERTIFICATE-----
+
+TeliaSonera Root CA v1
+======================
+-----BEGIN CERTIFICATE-----
+MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE
+CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4
+MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW
+VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+
+6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA
+3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k
+B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn
+Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH
+oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3
+F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ
+oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7
+gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc
+TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB
+AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW
+DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm
+zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
+0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW
+pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV
+G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc
+c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT
+JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2
+qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6
+Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems
+WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
+-----END CERTIFICATE-----
+
+E-Tugra Certification Authority
+===============================
+-----BEGIN CERTIFICATE-----
+MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w
+DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls
+ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
+ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw
+NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx
+QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl
+cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD
+DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd
+hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K
+CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g
+ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ
+BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0
+E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz
+rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq
+jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
+rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5
+dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB
+/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG
+MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK
+kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO
+XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807
+VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo
+a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc
+dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV
+KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT
+Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0
+8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G
+C7TbO6Orb1wdtn7os4I07QZcJA==
+-----END CERTIFICATE-----
+
+T-TeleSec GlobalRoot Class 2
+============================
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
+IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
+cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx
+MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
+dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
+ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ
+SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F
+vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970
+2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV
+WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy
+YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4
+r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf
+vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR
+3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
+9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==
+-----END CERTIFICATE-----
+
+Atos TrustedRoot 2011
+=====================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU
+cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4
+MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG
+A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV
+hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr
+54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+
+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320
+HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR
+z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R
+l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ
+bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
+CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h
+k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh
+TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9
+61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G
+3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 1 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE
+PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm
+PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6
+Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN
+ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l
+g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV
+7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX
+9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f
+iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg
+t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI
+hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC
+MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3
+GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct
+Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP
++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh
+3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa
+wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6
+O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0
+FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV
+hMJKzRwuJIczYOXD
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 2 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh
+ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY
+NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t
+oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o
+MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l
+V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo
+L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ
+sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD
+6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh
+lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI
+hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
+AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K
+pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9
+x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz
+dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X
+U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw
+mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD
+zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN
+JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr
+O3jtZsSOeWmD3n+M
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 3 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286
+IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL
+Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe
+6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3
+I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U
+VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7
+5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi
+Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM
+dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt
+rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI
+hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
+KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS
+t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ
+TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du
+DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib
+Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD
+hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX
+0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW
+dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2
+PpxxVJkES/1Y+Zj0
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root G2
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
+IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw
+MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
+ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH
+35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq
+bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw
+VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP
+YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn
+lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO
+w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv
+0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz
+d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW
+hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M
+jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
+IhNzbM8m9Yop5w==
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root G3
+===========================
+-----BEGIN CERTIFICATE-----
+MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD
+VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
+MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ
+BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb
+RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs
+KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF
+UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy
+YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy
+1vUhZscv6pZjamVFkpUBtA==
+-----END CERTIFICATE-----
+
+DigiCert Global Root G2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
+HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx
+MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
+dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ
+kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO
+3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV
+BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM
+UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB
+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu
+5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr
+F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U
+WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH
+QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/
+iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
+MrY=
+-----END CERTIFICATE-----
+
+DigiCert Global Root G3
+=======================
+-----BEGIN CERTIFICATE-----
+MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD
+VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw
+MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
+aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C
+AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O
+YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP
+BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp
+Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y
+3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34
+VOKa5Vt8sycX
+-----END CERTIFICATE-----
+
+DigiCert Trusted Root G4
+========================
+-----BEGIN CERTIFICATE-----
+MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw
+HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
+MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp
+pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o
+k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa
+vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY
+QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6
+MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm
+mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7
+f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH
+dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8
+oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
+DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
+ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY
+ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr
+yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy
+7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah
+ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN
+5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb
+/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa
+5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK
+G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP
+82Z+
+-----END CERTIFICATE-----
+
+WoSign
+======
+-----BEGIN CERTIFICATE-----
+MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG
+EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g
+QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ
+BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
+vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO
+CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX
+2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5
+KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR
++ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez
+EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk
+lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2
+8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY
+yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C
+AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R
+8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1
+LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq
+T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj
+y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC
+2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes
+5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/
+EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh
+mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx
+kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi
+kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w==
+-----END CERTIFICATE-----
+
+WoSign China
+============
+-----BEGIN CERTIFICATE-----
+MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG
+EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv
+geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD
+VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k
+8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5
+uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85
+dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5
+Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy
+b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc
+76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m
++Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6
+yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX
+GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA
+A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6
+yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY
+r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115
+j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A
+kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97
+qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y
+jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB
+ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv
+T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO
+kI26oQ==
+-----END CERTIFICATE-----
+
+COMODO RSA Certification Authority
+==================================
+-----BEGIN CERTIFICATE-----
+MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE
+BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
+A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC
+R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
+ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn
+dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ
+FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+
+5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG
+x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX
+2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL
+OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3
+sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C
+GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5
+WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
+FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
+DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt
+rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+
+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg
+tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW
+sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp
+pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA
+zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq
+ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52
+7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I
+LaZRfyHBNVOFBkpdn627G190
+-----END CERTIFICATE-----
+
+USERTrust RSA Certification Authority
+=====================================
+-----BEGIN CERTIFICATE-----
+MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE
+BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK
+ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE
+BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK
+ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz
+0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j
+Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn
+RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O
++T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq
+/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE
+Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM
+lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8
+yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+
+eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
+BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW
+FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ
+7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ
+Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM
+8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi
+FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi
+yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c
+J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw
+sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx
+Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9
+-----END CERTIFICATE-----
+
+USERTrust ECC Certification Authority
+=====================================
+-----BEGIN CERTIFICATE-----
+MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC
+VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC
+VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2
+0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez
+nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV
+HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB
+HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu
+9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
+-----END CERTIFICATE-----
+
+GlobalSign ECC Root CA - R4
+===========================
+-----BEGIN CERTIFICATE-----
+MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl
+OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P
+AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV
+MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF
+JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=
+-----END CERTIFICATE-----
+
+GlobalSign ECC Root CA - R5
+===========================
+-----BEGIN CERTIFICATE-----
+MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6
+SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS
+h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
+BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx
+uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
+yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
+-----END CERTIFICATE-----
+
+Staat der Nederlanden Root CA - G3
+==================================
+-----BEGIN CERTIFICATE-----
+MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC
+TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
+ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y
+olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t
+x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy
+EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K
+Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur
+mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5
+1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp
+07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo
+FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE
+41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB
+AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu
+yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD
+U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq
+KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1
+v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA
+8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b
+8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r
+mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq
+1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI
+JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV
+tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk=
+-----END CERTIFICATE-----
+
+Staat der Nederlanden EV Root CA
+================================
+-----BEGIN CERTIFICATE-----
+MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M
+MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl
+cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk
+SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW
+O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r
+0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8
+Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV
+XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr
+08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV
+0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd
+74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx
+fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa
+ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
+eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu
+c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq
+5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN
+b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN
+f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi
+5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4
+WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK
+DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy
+eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==
+-----END CERTIFICATE-----
+
+IdenTrust Commercial Root CA 1
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG
+EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS
+b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES
+MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB
+IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld
+hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/
+mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi
+1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C
+XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl
+3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy
+NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV
+WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg
+xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix
+uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI
+hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
+6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg
+ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt
+ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV
+YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX
+feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro
+kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe
+2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz
+Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R
+cGzM7vRX+Bi6hG6H
+-----END CERTIFICATE-----
+
+IdenTrust Public Sector Root CA 1
+=================================
+-----BEGIN CERTIFICATE-----
+MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG
+EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv
+ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV
+UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS
+b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy
+P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6
+Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI
+rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf
+qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS
+mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn
+ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh
+LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v
+iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL
+4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B
+Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw
+DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
+t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A
+mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt
+GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt
+m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx
+NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4
+Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI
+ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC
+ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ
+3Wl9af0AVqW3rLatt8o+Ae+c
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority - G2
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV
+BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy
+bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug
+b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw
+HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT
+DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx
+OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s
+eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP
+/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz
+HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU
+s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y
+TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx
+AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6
+0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z
+iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
+Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi
+nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+
+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO
+e4pIb4tF9g==
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority - EC1
+==========================================
+-----BEGIN CERTIFICATE-----
+MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx
+FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn
+YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl
+ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw
+FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs
+LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg
+dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
+IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy
+AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef
+9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h
+vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8
+kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
+-----END CERTIFICATE-----
+
+CFCA EV ROOT
+============
+-----BEGIN CERTIFICATE-----
+MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE
+CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB
+IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw
+MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD
+DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV
+BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD
+7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN
+uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW
+ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7
+xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f
+py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K
+gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol
+hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ
+tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf
+BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
+/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
+ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q
+ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua
+4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG
+E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX
+BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn
+aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy
+PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX
+kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C
+ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
+-----END CERTIFICATE-----
+
+TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5
+====================================================
+-----BEGIN CERTIFICATE-----
+MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN
+BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
+bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg
+RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw
+ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w
+SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE
+n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp
+ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537
+jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m
+ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP
+9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV
+4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH
+HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
+hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo
+BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq
+URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl
+lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8
+B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU=
+-----END CERTIFICATE-----
+
+TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6
+====================================================
+-----BEGIN CERTIFICATE-----
+MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G
+A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
+acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5
+MDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL
+BgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf
+aSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm
+aWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a
+2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED
+wnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb
+HH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV
++DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT
+9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
+9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R
+fdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy
+o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW
+hvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1
+O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw==
+-----END CERTIFICATE-----
+
+Certinomis - Root CA
+====================
+-----BEGIN CERTIFICATE-----
+MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
+Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg
+LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx
+EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD
+ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos
+P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo
+d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap
+z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00
+8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x
+RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE
+6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t
+FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV
+PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH
+i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj
+YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I
+6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF
+AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV
+WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw
+Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX
+lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ
+y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9
+Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng
+DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi
+I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM
+cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr
+hkIGuUE=
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GB CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG
+EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
+ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw
+MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD
+VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds
+b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX
+scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP
+rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk
+9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o
+Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg
+GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI
+hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD
+dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0
+VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui
+HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
+Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
+-----END CERTIFICATE-----
+
+Certification Authority of WoSign G2
+====================================
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG
+EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx
+CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai
+XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du
+W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9
+5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK
+v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI
+hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY
+P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3
+TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu
++sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+
+7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg=
+-----END CERTIFICATE-----
+
+CA WoSign ECC Root
+==================
+-----BEGIN CERTIFICATE-----
+MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD
+TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v
+dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK
+ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI
+zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU
+t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw
+QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R
+MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0
+Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu
+a/GRspBl9JrmkO5K
+-----END CERTIFICATE-----
+
+SZAFIR ROOT CA2
+===============
+-----BEGIN CERTIFICATE-----
+MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG
+A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV
+BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ
+BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD
+VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q
+qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK
+DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE
+2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ
+ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi
+ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
+AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC
+AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5
+O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67
+oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul
+4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6
++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
+-----END CERTIFICATE-----
+
+Certum Trusted Network CA 2
+===========================
+-----BEGIN CERTIFICATE-----
+MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE
+BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1
+bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y
+ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ
+TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB
+IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9
+7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o
+CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b
+Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p
+uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130
+GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ
+9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB
+Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye
+hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM
+BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI
+hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW
+Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA
+L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo
+clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM
+pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb
+w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo
+J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm
+ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX
+is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7
+zAYspsbiDrW5viSP
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions RootCA 2015
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT
+BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0
+aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
+YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx
+MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg
+QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV
+BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw
+MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv
+bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh
+iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+
+6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd
+FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr
+i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F
+GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2
+fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu
+iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
+Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI
+hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+
+D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM
+d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y
+d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn
+82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb
+davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F
+Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt
+J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa
+JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q
+p/UsQu0yrbYhnr68
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions ECC RootCA 2015
+===========================================================
+-----BEGIN CERTIFICATE-----
+MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0
+aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
+cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
+aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw
+MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj
+IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD
+VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290
+Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP
+dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK
+Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
+BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA
+GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn
+dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
+-----END CERTIFICATE-----
+
+Certplus Root CA G1
+===================
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUAMD4xCzAJBgNV
+BAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTAe
+Fw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhD
+ZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHN
+r49aiZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt6kuJPKNx
+Qv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP0FG7Yn2ksYyy/yARujVj
+BYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTv
+LRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDEEW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2
+z4QTd28n6v+WZxcIbekN1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc
+4nBvCGrch2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCTmehd
+4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV4EJQeIQEQWGw9CEj
+jy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPOWftwenMGE9nTdDckQQoRb5fc5+R+
+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0G
+A1UdDgQWBBSowcCbkahDFXxdBie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHY
+lwuBsTANBgkqhkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh
+66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7/SMNkPX0XtPG
+YX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BSS7CTKtQ+FjPlnsZlFT5kOwQ/
+2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F
+6ALEUz65noe8zDUa3qHpimOHZR4RKttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilX
+CNQ314cnrUlZp5GrRHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWe
+tUNy6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEVV/xuZDDC
+VRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5g4VCXA9DO2pJNdWY9BW/
++mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl++O/QmueD6i9a5jc2NvLi6Td11n0bt3+
+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo=
+-----END CERTIFICATE-----
+
+Certplus Root CA G2
+===================
+-----BEGIN CERTIFICATE-----
+MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4xCzAJBgNVBAYT
+AkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjAeFw0x
+NDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0
+cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IA
+BM0PW1aC3/BFGtat93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uN
+Am8xIk0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0PAQH/BAQD
+AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMB8GA1Ud
+IwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqGSM49BAMDA2gAMGUCMHD+sAvZ94OX7PNV
+HdTcswYO/jOYnYs5kGuUIe22113WTNchp+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjl
+vPl5adytRSv3tjFzzAalU5ORGpOucGpnutee5WEaXw==
+-----END CERTIFICATE-----
+
+OpenTrust Root CA G1
+====================
+-----BEGIN CERTIFICATE-----
+MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUAMEAxCzAJBgNV
+BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcx
+MB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM
+CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEB
+AQUAA4ICDwAwggIKAoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7fa
+Yp6bwiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX/uMftk87
+ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR077F9jAHiOH3BX2pfJLKO
+YheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGPuY4zbGneWK2gDqdkVBFpRGZPTBKnjix9
+xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLxp2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO
+9z0M+Yo0FMT7MzUj8czxKselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq
+3ywgsNw2TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+WG+Oi
+n6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPwvFEVVJSmdz7QdFG9
+URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYYEQRVzXR7z2FwefR7LFxckvzluFqr
+TJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUl0YhVyE12jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/Px
+N3DlCPaTKbYwDQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E
+PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kfgLMtMrpkZ2Cv
+uVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbSFXJfLkur1J1juONI5f6ELlgK
+n0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLh
+X4SPgPL0DTatdrOjteFkdjpY3H1PXlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80
+nR14SohWZ25g/4/Ii+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcm
+GS3tTAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L9109S5zvE/
+bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/KyPu1svf0OnWZzsD2097+o
+4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJAwSQiumPv+i2tCqjI40cHLI5kqiPAlxA
+OXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj1oxx
+-----END CERTIFICATE-----
+
+OpenTrust Root CA G2
+====================
+-----BEGIN CERTIFICATE-----
+MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUAMEAxCzAJBgNV
+BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcy
+MB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM
+CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEB
+AQUAA4ICDwAwggIKAoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+
+Ntmh/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78eCbY2albz
+4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/61UWY0jUJ9gNDlP7ZvyCV
+eYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fEFY8ElggGQgT4hNYdvJGmQr5J1WqIP7wt
+UdGejeBSzFfdNTVY27SPJIjki9/ca1TSgSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz
+3GIZ38i1MH/1PCZ1Eb3XG7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj
+3CzMpSZyYhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaHvGOz
+9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4t/bQWVyJ98LVtZR0
+0dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/gh7PU3+06yzbXfZqfUAkBXKJOAGT
+y3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUajn6QiL35okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59
+M4PLuG53hq8wDQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz
+Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0nXGEL8pZ0keI
+mUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qTRmTFAHneIWv2V6CG1wZy7HBG
+S4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpTwm+bREx50B1ws9efAvSyB7DH5fitIw6mVskp
+EndI2S9G/Tvw/HRwkqWOOAgfZDC2t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ
+6e18CL13zSdkzJTaTkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97kr
+gCf2o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU3jg9CcCo
+SmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eAiN1nE28daCSLT7d0geX0
+YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14fWKGVyasvc0rQLW6aWQ9VGHgtPFGml4vm
+u7JwqkwR3v98KzfUetF3NI/n+UL3PIEMS1IK
+-----END CERTIFICATE-----
+
+OpenTrust Root CA G3
+====================
+-----BEGIN CERTIFICATE-----
+MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAxCzAJBgNVBAYT
+AkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEczMB4X
+DTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9w
+ZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAARK7liuTcpm3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5B
+ta1doYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4GA1UdDwEB
+/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAf
+BgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAKBggqhkjOPQQDAwNpADBmAjEAj6jcnboM
+BBf6Fek9LykBl7+BFjNAk2z8+e2AcG+qj9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta
+3U1fJAuwACEl74+nBCZx4nxp5V2a+EEfOzmTk51V6s2N8fvB
+-----END CERTIFICATE-----
+
+ISRG Root X1
+============
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE
+BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD
+EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG
+EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT
+DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r
+Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1
+3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K
+b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN
+Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ
+4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf
+1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu
+hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH
+usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r
+OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G
+A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY
+9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV
+0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt
+hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw
+TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx
+e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA
+JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD
+YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n
+JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ
+m+kXQ99b21/+jh5Xos1AnX5iItreGCc=
+-----END CERTIFICATE-----
+
+AC RAIZ FNMT-RCM
+================
+-----BEGIN CERTIFICATE-----
+MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT
+AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw
+MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD
+TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
+ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf
+qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr
+btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL
+j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou
+08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw
+WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT
+tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ
+47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC
+ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa
+i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
+FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o
+dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD
+nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s
+D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ
+j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT
+Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW
++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7
+Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d
+8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm
+5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG
+rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM=
+-----END CERTIFICATE-----
+
+Amazon Root CA 1
+================
+-----BEGIN CERTIFICATE-----
+MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD
+VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1
+MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
+bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH
+FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ
+gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t
+dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce
+VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3
+DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM
+CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy
+8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa
+2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2
+xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5
+-----END CERTIFICATE-----
+
+Amazon Root CA 2
+================
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD
+VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1
+MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
+bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
+ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4
+kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp
+N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9
+AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd
+fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx
+kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS
+btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0
+Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN
+c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+
+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw
+DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA
+A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE
+YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW
+xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ
+gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW
+aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV
+Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3
+KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi
+JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw=
+-----END CERTIFICATE-----
+
+Amazon Root CA 3
+================
+-----BEGIN CERTIFICATE-----
+MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG
+EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy
+NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
+MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB
+f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr
+Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43
+rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc
+eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==
+-----END CERTIFICATE-----
+
+Amazon Root CA 4
+================
+-----BEGIN CERTIFICATE-----
+MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG
+EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy
+NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
+MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN
+/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri
+83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
+HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA
+MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1
+AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==
+-----END CERTIFICATE-----
+
+LuxTrust Global Root 2
+======================
+-----BEGIN CERTIFICATE-----
+MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQELBQAwRjELMAkG
+A1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNVBAMMFkx1eFRydXN0IEdsb2Jh
+bCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUwMzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEW
+MBQGA1UECgwNTHV4VHJ1c3QgUy5BLjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCC
+AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wm
+Kb3FibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTemhfY7RBi2
+xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1EMShduxq3sVs35a0VkBC
+wGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsnXpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm
+1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkm
+FRseTJIpgp7VkoGSQXAZ96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niF
+wpN6cj5mj5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4gDEa/
+a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+8kPREd8vZS9kzl8U
+ubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2jX5t/Lax5Gw5CMZdjpPuKadUiDTSQ
+MC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmHhFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB
+/zBCBgNVHSAEOzA5MDcGByuBKwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5
+Lmx1eHRydXN0Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT
++Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQELBQADggIBAGoZ
+FO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9BzZAcg4atmpZ1gDlaCDdLnIN
+H2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTOjFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW
+7MM3LGVYvlcAGvI1+ut7MV3CwRI9loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIu
+ZY+kt9J/Z93I055cqqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWA
+VWe+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/JEAdemrR
+TxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKrezrnK+T+Tb/mjuuqlPpmt
+/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQfLSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc
+7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31I
+iyBMz2TWuJdGsE7RKlY6oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr
+-----END CERTIFICATE-----
--- /dev/null
+<?php
+
+namespace Abraham\TwitterOAuth\Tests;
+
+use Abraham\TwitterOAuth\SignatureMethod;
+
+abstract class AbstractSignatureMethodTest extends \PHPUnit_Framework_TestCase
+{
+ protected $name;
+
+ /**
+ * @return SignatureMethod
+ */
+ abstract public function getClass();
+
+ abstract protected function signatureDataProvider();
+
+ public function testGetName()
+ {
+ $this->assertEquals($this->name, $this->getClass()->getName());
+ }
+
+ /**
+ * @dataProvider signatureDataProvider
+ */
+ public function testBuildSignature($expected, $request, $consumer, $token)
+ {
+ $this->assertEquals($expected, $this->getClass()->buildSignature($request, $consumer, $token));
+ }
+
+ protected function getRequest()
+ {
+ return $this->getMockBuilder('Abraham\TwitterOAuth\Request')
+ ->disableOriginalConstructor()
+ ->getMock();
+ }
+
+ protected function getConsumer($key = null, $secret = null, $callbackUrl = null)
+ {
+ return $this->getMockBuilder('Abraham\TwitterOAuth\Consumer')
+ ->setConstructorArgs([$key, $secret, $callbackUrl])
+ ->getMock();
+ }
+
+ protected function getToken($key = null, $secret = null)
+ {
+ return $this->getMockBuilder('Abraham\TwitterOAuth\Token')
+ ->setConstructorArgs([$key, $secret])
+ ->getMock();
+ }
+}
--- /dev/null
+<?php
+
+namespace Abraham\TwitterOAuth\Tests;
+
+use Abraham\TwitterOAuth\Consumer;
+
+class ConsumerTest extends \PHPUnit_Framework_TestCase {
+ public function testToString()
+ {
+ $key = uniqid();
+ $secret = uniqid();
+ $consumer = new Consumer($key, $secret);
+
+ $this->assertEquals("Consumer[key=$key,secret=$secret]", $consumer->__toString());
+ }
+}
\ No newline at end of file
--- /dev/null
+<?php
+
+namespace Abraham\TwitterOAuth\Tests;
+
+use Abraham\TwitterOAuth\HmacSha1;
+
+class HmacSha1Test extends AbstractSignatureMethodTest
+{
+ protected $name = 'HMAC-SHA1';
+
+ public function getClass()
+ {
+ return new HmacSha1();
+ }
+
+ public function signatureDataProvider()
+ {
+ return [
+ ['5CoEcoq7XoKFjwYCieQvuzadeUA=', $this->getRequest(), $this->getConsumer(), $this->getToken()],
+ [
+ 'EBw0gHngam3BTx8kfPfNNSyKem4=',
+ $this->getRequest(),
+ $this->getConsumer('key', 'secret'),
+ $this->getToken()
+ ],
+ [
+ 'kDsHFZzws2a5M6cAQjfpdNBo+v8=',
+ $this->getRequest(),
+ $this->getConsumer('key', 'secret'),
+ $this->getToken('key', 'secret')
+ ],
+ ['EBw0gHngam3BTx8kfPfNNSyKem4=', $this->getRequest(), $this->getConsumer('key', 'secret'), null],
+ ];
+ }
+}
\ No newline at end of file
--- /dev/null
+<?php
+
+namespace Abraham\TwitterOAuth\Tests;
+
+use Abraham\TwitterOAuth\Token;
+
+class TokenTest extends \PHPUnit_Framework_TestCase {
+ /**
+ * @dataProvider tokenProvider
+ */
+ public function testToString($expected, $key, $secret)
+ {
+ $token = new Token($key, $secret);
+
+ $this->assertEquals($expected, $token->__toString());
+ }
+
+ public function tokenProvider()
+ {
+ return [
+ ['oauth_token=key&oauth_token_secret=secret', 'key', 'secret'],
+ ['oauth_token=key%2Bkey&oauth_token_secret=secret', 'key+key', 'secret'],
+ ['oauth_token=key~key&oauth_token_secret=secret', 'key~key', 'secret'],
+ ];
+ }
+}
\ No newline at end of file
--- /dev/null
+<?php
+/**
+ * WARNING: Running these tests will post and delete through the actual Twitter account.
+ */
+namespace Abraham\TwitterOAuth\Test;
+
+use Abraham\TwitterOAuth\TwitterOAuth;
+
+class TwitterOAuthTest extends \PHPUnit_Framework_TestCase
+{
+ /** @var TwitterOAuth */
+ protected $twitter;
+
+ protected function setUp()
+ {
+ $this->twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
+ }
+
+ public function testBuildClient()
+ {
+ $this->assertObjectHasAttribute('consumer', $this->twitter);
+ $this->assertObjectHasAttribute('token', $this->twitter);
+ }
+
+ public function testSetOauthToken()
+ {
+ $twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
+ $twitter->setOauthToken(ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
+ $this->assertObjectHasAttribute('consumer', $twitter);
+ $this->assertObjectHasAttribute('token', $twitter);
+ $twitter->get('friendships/show', ['target_screen_name' => 'twitterapi']);
+ $this->assertEquals(200, $twitter->getLastHttpCode());
+ }
+
+ public function testOauth2Token()
+ {
+ $twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
+ $result = $twitter->oauth2('oauth2/token', ['grant_type' => 'client_credentials']);
+ $this->assertEquals(200, $twitter->getLastHttpCode());
+ $this->assertObjectHasAttribute('token_type', $result);
+ $this->assertObjectHasAttribute('access_token', $result);
+ $this->assertEquals('bearer', $result->token_type);
+ return $result;
+ }
+
+ /**
+ * @depends testOauth2Token
+ */
+ public function testBearerToken($accessToken)
+ {
+ $twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, null, $accessToken->access_token);
+ $result = $twitter->get('statuses/user_timeline', ['screen_name' => 'twitterapi']);
+ if ($twitter->getLastHttpCode() !== 200) {
+ $this->assertEquals('foo', substr($accessToken->access_token, 0, 75));
+ $this->assertEquals('foo', print_r($result, true));
+ }
+ $this->assertEquals(200, $twitter->getLastHttpCode());
+ return $accessToken;
+ }
+
+ // This causes issues for parallel run tests.
+ // /**
+ // * @depends testBearerToken
+ // */
+ // public function testOauth2TokenInvalidate($accessToken)
+ // {
+ // $twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
+ // // HACK: access_token is already urlencoded but gets urlencoded again breaking the invalidate request.
+ // $result = $twitter->oauth2(
+ // 'oauth2/invalidate_token',
+ // array('access_token' => urldecode($accessToken->access_token))
+ // );
+ // $this->assertEquals(200, $twitter->getLastHttpCode());
+ // $this->assertObjectHasAttribute('access_token', $result);
+ // return $result;
+ // }
+
+ public function testOauthRequestToken()
+ {
+ $twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
+ $result = $twitter->oauth('oauth/request_token', ['oauth_callback' => OAUTH_CALLBACK]);
+ $this->assertEquals(200, $twitter->getLastHttpCode());
+ $this->assertArrayHasKey('oauth_token', $result);
+ $this->assertArrayHasKey('oauth_token_secret', $result);
+ $this->assertArrayHasKey('oauth_callback_confirmed', $result);
+ $this->assertEquals('true', $result['oauth_callback_confirmed']);
+ return $result;
+ }
+
+ /**
+ * @expectedException \Abraham\TwitterOAuth\TwitterOAuthException
+ * @expectedExceptionMessage Could not authenticate you
+ */
+ public function testOauthRequestTokenException()
+ {
+ $twitter = new TwitterOAuth('CONSUMER_KEY', 'CONSUMER_SECRET');
+ $result = $twitter->oauth('oauth/request_token', ['oauth_callback' => OAUTH_CALLBACK]);
+ return $result;
+ }
+
+ /**
+ * @expectedException \Abraham\TwitterOAuth\TwitterOAuthException
+ * @expectedExceptionMessage Invalid oauth_verifier parameter
+ * @depends testOauthRequestToken
+ */
+ public function testOauthAccessTokenTokenException(array $requestToken)
+ {
+ // Can't test this without a browser logging into Twitter so check for the correct error instead.
+ $twitter = new TwitterOAuth(
+ CONSUMER_KEY,
+ CONSUMER_SECRET,
+ $requestToken['oauth_token'],
+ $requestToken['oauth_token_secret']
+ );
+ $twitter->oauth("oauth/access_token", ["oauth_verifier" => "fake_oauth_verifier"]);
+ }
+
+ public function testUrl()
+ {
+ $url = $this->twitter->url('oauth/authorize', ['foo' => 'bar', 'baz' => 'qux']);
+ $this->assertEquals('https://api.twitter.com/oauth/authorize?foo=bar&baz=qux', $url);
+ }
+
+ public function testGetAccountVerifyCredentials()
+ {
+ // Include entities boolean added to test parameter value cohearsion
+ $this->twitter->get('account/verify_credentials', ["include_entities" => false]);
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ }
+
+ // BUG: testing is too unreliable for now
+ // public function testSetProxy()
+ // {
+ // $this->twitter->setProxy(array(
+ // 'CURLOPT_PROXY' => PROXY,
+ // 'CURLOPT_PROXYUSERPWD' => PROXYUSERPWD,
+ // 'CURLOPT_PROXYPORT' => PROXYPORT,
+ // ));
+ // $this->twitter->setTimeouts(60, 60);
+ // $result = $this->twitter->get('account/verify_credentials');
+ // $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ // $this->assertObjectHasAttribute('id', $result);
+ // }
+
+ public function testGetStatusesMentionsTimeline()
+ {
+ $this->twitter->get('statuses/mentions_timeline');
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ }
+
+ public function testGetSearchTweets()
+ {
+ $result = $this->twitter->get('search/tweets', ['q' => 'twitter']);
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ return $result->statuses;
+ }
+
+ /**
+ * @depends testGetSearchTweets
+ */
+ public function testGetSearchTweetsWithMaxId($statuses)
+ {
+ $maxId = array_pop($statuses)->id_str;
+ $this->twitter->get('search/tweets', ['q' => 'twitter', 'max_id' => $maxId]);
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ }
+
+ public function testPostFavoritesCreate()
+ {
+ $result = $this->twitter->post('favorites/create', ['id' => '6242973112']);
+ if ($this->twitter->getLastHttpCode() == 403) {
+ // Status already favorited
+ $this->assertEquals(139, $result->errors[0]->code);
+ } else {
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ }
+ }
+
+ /**
+ * @depends testPostFavoritesCreate
+ */
+ public function testPostFavoritesDestroy()
+ {
+ $this->twitter->post('favorites/destroy', ['id' => '6242973112']);
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ }
+
+ public function testPostStatusesUpdateWithMedia()
+ {
+ $this->twitter->setTimeouts(60, 30);
+ // Image source https://www.flickr.com/photos/titrans/8548825587/
+ $file_path = __DIR__ . '/kitten.jpg';
+ $result = $this->twitter->upload('media/upload', ['media' => $file_path]);
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ $this->assertObjectHasAttribute('media_id_string', $result);
+ $parameters = ['status' => 'Hello World ' . time(), 'media_ids' => $result->media_id_string];
+ $result = $this->twitter->post('statuses/update', $parameters);
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ if ($this->twitter->getLastHttpCode() == 200) {
+ $result = $this->twitter->post('statuses/destroy/' . $result->id_str);
+ }
+ return $result;
+ }
+
+ public function testPostStatusesUpdateWithMediaChunked()
+ {
+ $this->twitter->setTimeouts(60, 30);
+ // Video source http://www.sample-videos.com/
+ $file_path = __DIR__ . '/video.mp4';
+ $result = $this->twitter->upload('media/upload', ['media' => $file_path, 'media_type' => 'video/mp4'], true);
+ $this->assertEquals(201, $this->twitter->getLastHttpCode());
+ $this->assertObjectHasAttribute('media_id_string', $result);
+ $parameters = ['status' => 'Hello World ' . time(), 'media_ids' => $result->media_id_string];
+ $result = $this->twitter->post('statuses/update', $parameters);
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ if ($this->twitter->getLastHttpCode() == 200) {
+ $result = $this->twitter->post('statuses/destroy/' . $result->id_str);
+ }
+ return $result;
+ }
+
+ public function testPostStatusesUpdateUtf8()
+ {
+ $result = $this->twitter->post('statuses/update', ['status' => 'xこんにちは世界 ' . time()]);
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ return $result;
+ }
+
+ /**
+ * @depends testPostStatusesUpdateUtf8
+ */
+ public function testPostStatusesDestroy($status)
+ {
+ $this->twitter->post('statuses/destroy/' . $status->id_str);
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ }
+
+ public function testLastResult()
+ {
+ $this->twitter->get('search/tweets', ['q' => 'twitter']);
+ $this->assertEquals('search/tweets', $this->twitter->getLastApiPath());
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ $this->assertObjectHasAttribute('statuses', $this->twitter->getLastBody());
+ }
+
+ /**
+ * @depends testLastResult
+ */
+ public function testResetLastResponse()
+ {
+ $this->twitter->resetLastResponse();
+ $this->assertEquals('', $this->twitter->getLastApiPath());
+ $this->assertEquals(0, $this->twitter->getLastHttpCode());
+ $this->assertEquals([], $this->twitter->getLastBody());
+ }
+}
--- /dev/null
+<?php
+
+namespace Abraham\TwitterOAuth\Tests;
+
+use Abraham\TwitterOAuth\Util\JsonDecoder;
+
+class JsonDecoderTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @dataProvider jsonProvider
+ */
+ public function testDecode($input, $asArray, $expected)
+ {
+ $this->assertEquals($expected, JsonDecoder::decode($input, $asArray));
+ }
+
+ public function jsonProvider()
+ {
+ return [
+ ['[]', true, []],
+ ['[1,2,3]', true, [1, 2, 3]],
+ ['[{"id": 556179961825226750}]', true, [['id' => 556179961825226750]]],
+ ['[]', false, []],
+ ['[1,2,3]', false, [1, 2, 3]],
+ [
+ '[{"id": 556179961825226750}]',
+ false,
+ [
+ $this->getClass(function ($object) {
+ $object->id = 556179961825226750;
+ return $object;
+ })
+ ]
+ ],
+
+ ];
+ }
+
+ /**
+ * @param callable $callable
+ *
+ * @return stdClass
+ */
+ private function getClass(\Closure $callable)
+ {
+ $object = new \stdClass();
+
+ return $callable($object);
+ }
+}
--- /dev/null
+<?php
+
+require __DIR__ . '/../vendor/autoload.php';
+
+define('CONSUMER_KEY', getenv('TEST_CONSUMER_KEY'));
+define('CONSUMER_SECRET', getenv('TEST_CONSUMER_SECRET'));
+define('ACCESS_TOKEN', getenv('TEST_ACCESS_TOKEN'));
+define('ACCESS_TOKEN_SECRET', getenv('TEST_ACCESS_TOKEN_SECRET'));
+define('OAUTH_CALLBACK', getenv('TEST_OAUTH_CALLBACK'));
+define('PROXY', getenv('TEST_CURLOPT_PROXY'));
+define('PROXYUSERPWD', getenv('TEST_CURLOPT_PROXYUSERPWD'));
+define('PROXYPORT', getenv('TEST_CURLOPT_PROXYPORT'));
--- /dev/null
+# WARNING: Running the tests will perform live actions as the Twitter account.
+# Set all values, move to `env`, run `source tests/env` and `phpunit` to start testing.
+
+# To run the tests you must register Twitter application at https://app.twitter.com/.
+export TEST_CONSUMER_KEY=
+export TEST_CONSUMER_SECRET=
+export TEST_ACCESS_TOKEN=
+export TEST_ACCESS_TOKEN_SECRET=
+export TEST_OAUTH_CALLBACK=
+# You can find proxies for testing at http://proxylist.hidemyass.com/.
+export TEST_CURLOPT_PROXY=
+export TEST_CURLOPT_PROXYUSERPWD=
+export TEST_CURLOPT_PROXYPORT=
--- /dev/null
+<?php
+
+// autoload.php @generated by Composer
+
+require_once __DIR__ . '/composer/autoload_real.php';
+
+return ComposerAutoloaderInitd051a3fd38373f38066f9a7f62be4c25::getLoader();
--- /dev/null
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ * Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
+ *
+ * $loader = new \Composer\Autoload\ClassLoader();
+ *
+ * // register classes with namespaces
+ * $loader->add('Symfony\Component', __DIR__.'/component');
+ * $loader->add('Symfony', __DIR__.'/framework');
+ *
+ * // activate the autoloader
+ * $loader->register();
+ *
+ * // to enable searching the include path (eg. for PEAR packages)
+ * $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @see http://www.php-fig.org/psr/psr-0/
+ * @see http://www.php-fig.org/psr/psr-4/
+ */
+class ClassLoader
+{
+ // PSR-4
+ private $prefixLengthsPsr4 = array();
+ private $prefixDirsPsr4 = array();
+ private $fallbackDirsPsr4 = array();
+
+ // PSR-0
+ private $prefixesPsr0 = array();
+ private $fallbackDirsPsr0 = array();
+
+ private $useIncludePath = false;
+ private $classMap = array();
+ private $classMapAuthoritative = false;
+ private $missingClasses = array();
+ private $apcuPrefix;
+
+ public function getPrefixes()
+ {
+ if (!empty($this->prefixesPsr0)) {
+ return call_user_func_array('array_merge', $this->prefixesPsr0);
+ }
+
+ return array();
+ }
+
+ public function getPrefixesPsr4()
+ {
+ return $this->prefixDirsPsr4;
+ }
+
+ public function getFallbackDirs()
+ {
+ return $this->fallbackDirsPsr0;
+ }
+
+ public function getFallbackDirsPsr4()
+ {
+ return $this->fallbackDirsPsr4;
+ }
+
+ public function getClassMap()
+ {
+ return $this->classMap;
+ }
+
+ /**
+ * @param array $classMap Class to filename map
+ */
+ public function addClassMap(array $classMap)
+ {
+ if ($this->classMap) {
+ $this->classMap = array_merge($this->classMap, $classMap);
+ } else {
+ $this->classMap = $classMap;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix, either
+ * appending or prepending to the ones previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param array|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
+ */
+ public function add($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ if ($prepend) {
+ $this->fallbackDirsPsr0 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr0
+ );
+ } else {
+ $this->fallbackDirsPsr0 = array_merge(
+ $this->fallbackDirsPsr0,
+ (array) $paths
+ );
+ }
+
+ return;
+ }
+
+ $first = $prefix[0];
+ if (!isset($this->prefixesPsr0[$first][$prefix])) {
+ $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+ return;
+ }
+ if ($prepend) {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixesPsr0[$first][$prefix]
+ );
+ } else {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ $this->prefixesPsr0[$first][$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace, either
+ * appending or prepending to the ones previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param array|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function addPsr4($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ // Register directories for the root namespace.
+ if ($prepend) {
+ $this->fallbackDirsPsr4 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr4
+ );
+ } else {
+ $this->fallbackDirsPsr4 = array_merge(
+ $this->fallbackDirsPsr4,
+ (array) $paths
+ );
+ }
+ } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+ // Register directories for a new namespace.
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ } elseif ($prepend) {
+ // Prepend directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixDirsPsr4[$prefix]
+ );
+ } else {
+ // Append directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ $this->prefixDirsPsr4[$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix,
+ * replacing any others previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param array|string $paths The PSR-0 base directories
+ */
+ public function set($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr0 = (array) $paths;
+ } else {
+ $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace,
+ * replacing any others previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param array|string $paths The PSR-4 base directories
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function setPsr4($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr4 = (array) $paths;
+ } else {
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Turns on searching the include path for class files.
+ *
+ * @param bool $useIncludePath
+ */
+ public function setUseIncludePath($useIncludePath)
+ {
+ $this->useIncludePath = $useIncludePath;
+ }
+
+ /**
+ * Can be used to check if the autoloader uses the include path to check
+ * for classes.
+ *
+ * @return bool
+ */
+ public function getUseIncludePath()
+ {
+ return $this->useIncludePath;
+ }
+
+ /**
+ * Turns off searching the prefix and fallback directories for classes
+ * that have not been registered with the class map.
+ *
+ * @param bool $classMapAuthoritative
+ */
+ public function setClassMapAuthoritative($classMapAuthoritative)
+ {
+ $this->classMapAuthoritative = $classMapAuthoritative;
+ }
+
+ /**
+ * Should class lookup fail if not found in the current class map?
+ *
+ * @return bool
+ */
+ public function isClassMapAuthoritative()
+ {
+ return $this->classMapAuthoritative;
+ }
+
+ /**
+ * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
+ *
+ * @param string|null $apcuPrefix
+ */
+ public function setApcuPrefix($apcuPrefix)
+ {
+ $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;
+ }
+
+ /**
+ * The APCu prefix in use, or null if APCu caching is not enabled.
+ *
+ * @return string|null
+ */
+ public function getApcuPrefix()
+ {
+ return $this->apcuPrefix;
+ }
+
+ /**
+ * Registers this instance as an autoloader.
+ *
+ * @param bool $prepend Whether to prepend the autoloader or not
+ */
+ public function register($prepend = false)
+ {
+ spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+ }
+
+ /**
+ * Unregisters this instance as an autoloader.
+ */
+ public function unregister()
+ {
+ spl_autoload_unregister(array($this, 'loadClass'));
+ }
+
+ /**
+ * Loads the given class or interface.
+ *
+ * @param string $class The name of the class
+ * @return bool|null True if loaded, null otherwise
+ */
+ public function loadClass($class)
+ {
+ if ($file = $this->findFile($class)) {
+ includeFile($file);
+
+ return true;
+ }
+ }
+
+ /**
+ * Finds the path to the file where the class is defined.
+ *
+ * @param string $class The name of the class
+ *
+ * @return string|false The path if found, false otherwise
+ */
+ public function findFile($class)
+ {
+ // class map lookup
+ if (isset($this->classMap[$class])) {
+ return $this->classMap[$class];
+ }
+ if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
+ return false;
+ }
+ if (null !== $this->apcuPrefix) {
+ $file = apcu_fetch($this->apcuPrefix.$class, $hit);
+ if ($hit) {
+ return $file;
+ }
+ }
+
+ $file = $this->findFileWithExtension($class, '.php');
+
+ // Search for Hack files if we are running on HHVM
+ if (false === $file && defined('HHVM_VERSION')) {
+ $file = $this->findFileWithExtension($class, '.hh');
+ }
+
+ if (null !== $this->apcuPrefix) {
+ apcu_add($this->apcuPrefix.$class, $file);
+ }
+
+ if (false === $file) {
+ // Remember that this class does not exist.
+ $this->missingClasses[$class] = true;
+ }
+
+ return $file;
+ }
+
+ private function findFileWithExtension($class, $ext)
+ {
+ // PSR-4 lookup
+ $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
+
+ $first = $class[0];
+ if (isset($this->prefixLengthsPsr4[$first])) {
+ $subPath = $class;
+ while (false !== $lastPos = strrpos($subPath, '\\')) {
+ $subPath = substr($subPath, 0, $lastPos);
+ $search = $subPath.'\\';
+ if (isset($this->prefixDirsPsr4[$search])) {
+ $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
+ foreach ($this->prefixDirsPsr4[$search] as $dir) {
+ if (file_exists($file = $dir . $pathEnd)) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-4 fallback dirs
+ foreach ($this->fallbackDirsPsr4 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 lookup
+ if (false !== $pos = strrpos($class, '\\')) {
+ // namespaced class name
+ $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+ . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+ } else {
+ // PEAR-like class name
+ $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+ }
+
+ if (isset($this->prefixesPsr0[$first])) {
+ foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+ if (0 === strpos($class, $prefix)) {
+ foreach ($dirs as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-0 fallback dirs
+ foreach ($this->fallbackDirsPsr0 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 include paths.
+ if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+ return $file;
+ }
+
+ return false;
+ }
+}
+
+/**
+ * Scope isolated include.
+ *
+ * Prevents access to $this/self from included files.
+ */
+function includeFile($file)
+{
+ include $file;
+}
--- /dev/null
+
+Copyright (c) Nils Adermann, Jordi Boggiano
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
--- /dev/null
+<?php
+
+// autoload_classmap.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+);
--- /dev/null
+<?php
+
+// autoload_namespaces.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+);
--- /dev/null
+<?php
+
+// autoload_psr4.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+ 'Abraham\\TwitterOAuth\\' => array($vendorDir . '/abraham/twitteroauth/src'),
+);
--- /dev/null
+<?php
+
+// autoload_real.php @generated by Composer
+
+class ComposerAutoloaderInitd051a3fd38373f38066f9a7f62be4c25
+{
+ private static $loader;
+
+ public static function loadClassLoader($class)
+ {
+ if ('Composer\Autoload\ClassLoader' === $class) {
+ require __DIR__ . '/ClassLoader.php';
+ }
+ }
+
+ public static function getLoader()
+ {
+ if (null !== self::$loader) {
+ return self::$loader;
+ }
+
+ spl_autoload_register(array('ComposerAutoloaderInitd051a3fd38373f38066f9a7f62be4c25', 'loadClassLoader'), true, true);
+ self::$loader = $loader = new \Composer\Autoload\ClassLoader();
+ spl_autoload_unregister(array('ComposerAutoloaderInitd051a3fd38373f38066f9a7f62be4c25', 'loadClassLoader'));
+
+ $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
+ if ($useStaticLoader) {
+ require_once __DIR__ . '/autoload_static.php';
+
+ call_user_func(\Composer\Autoload\ComposerStaticInitd051a3fd38373f38066f9a7f62be4c25::getInitializer($loader));
+ } else {
+ $map = require __DIR__ . '/autoload_namespaces.php';
+ foreach ($map as $namespace => $path) {
+ $loader->set($namespace, $path);
+ }
+
+ $map = require __DIR__ . '/autoload_psr4.php';
+ foreach ($map as $namespace => $path) {
+ $loader->setPsr4($namespace, $path);
+ }
+
+ $classMap = require __DIR__ . '/autoload_classmap.php';
+ if ($classMap) {
+ $loader->addClassMap($classMap);
+ }
+ }
+
+ $loader->register(true);
+
+ return $loader;
+ }
+}
--- /dev/null
+<?php
+
+// autoload_static.php @generated by Composer
+
+namespace Composer\Autoload;
+
+class ComposerStaticInitd051a3fd38373f38066f9a7f62be4c25
+{
+ public static $prefixLengthsPsr4 = array (
+ 'A' =>
+ array (
+ 'Abraham\\TwitterOAuth\\' => 21,
+ ),
+ );
+
+ public static $prefixDirsPsr4 = array (
+ 'Abraham\\TwitterOAuth\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/abraham/twitteroauth/src',
+ ),
+ );
+
+ public static function getInitializer(ClassLoader $loader)
+ {
+ return \Closure::bind(function () use ($loader) {
+ $loader->prefixLengthsPsr4 = ComposerStaticInitd051a3fd38373f38066f9a7f62be4c25::$prefixLengthsPsr4;
+ $loader->prefixDirsPsr4 = ComposerStaticInitd051a3fd38373f38066f9a7f62be4c25::$prefixDirsPsr4;
+
+ }, null, ClassLoader::class);
+ }
+}
--- /dev/null
+[
+ {
+ "name": "abraham/twitteroauth",
+ "version": "0.7.4",
+ "version_normalized": "0.7.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/abraham/twitteroauth.git",
+ "reference": "c6f9e692552dd037b2324ed0dfa28a4e60875acf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/abraham/twitteroauth/zipball/c6f9e692552dd037b2324ed0dfa28a4e60875acf",
+ "reference": "c6f9e692552dd037b2324ed0dfa28a4e60875acf",
+ "shasum": ""
+ },
+ "require": {
+ "ext-curl": "*",
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "phpmd/phpmd": "~2.6",
+ "phpunit/phpunit": "~5.7",
+ "squizlabs/php_codesniffer": "~3.0"
+ },
+ "time": "2017-06-30T22:02:01+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Abraham\\TwitterOAuth\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Abraham Williams",
+ "email": "abraham@abrah.am",
+ "homepage": "https://abrah.am",
+ "role": "Developer"
+ }
+ ],
+ "description": "The most popular PHP library for use with the Twitter OAuth REST API.",
+ "homepage": "https://twitteroauth.com",
+ "keywords": [
+ "Twitter API",
+ "Twitter oAuth",
+ "api",
+ "oauth",
+ "rest",
+ "social",
+ "twitter"
+ ]
+ }
+]
* Version: 1.0
* Author: Michael Vogel <http://pirati.ca/profile/heluecht>
*/
-
-require_once 'include/Smilies.php';
+use Friendica\Core\Addon;
+use Friendica\Content\Smilies;
function unicode_smilies_install() {
- register_hook('smilie', 'addon/unicode_smilies/unicode_smilies.php', 'unicode_smilies_smilies');
+ Addon::registerHook('smilie', 'addon/unicode_smilies/unicode_smilies.php', 'unicode_smilies_smilies');
}
function unicode_smilies_uninstall() {
- unregister_hook('smilie', 'addon/unicode_smilies/unicode_smilies.php', 'unicode_smilies_smilies');
+ Addon::unregisterHook('smilie', 'addon/unicode_smilies/unicode_smilies.php', 'unicode_smilies_smilies');
}
function unicode_smilies_smilies(&$a,&$b) {
--- /dev/null
+# ADDON viewsrc
+# Copyright (C)
+# This file is distributed under the same license as the Friendica viewsrc addon package.
+#
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-02-27 05:01-0500\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: fabrixxm <fabrix.xm@gmail.com>, 2018\n"
+"Language-Team: Italian (https://www.transifex.com/Friendica/teams/12172/it/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: it\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: viewsrc.php:39
+msgid "View Source"
+msgstr "Vedi Sorgente"
-<?php\r
-\r
-$a->strings["View Source"] = "Vedi sorgente";\r
+<?php
+
+if(! function_exists("string_plural_select_it")) {
+function string_plural_select_it($n){
+ return ($n != 1);;
+}}
+;
+$a->strings["View Source"] = "Vedi Sorgente";
<?php
-
-
/**
* Name: viewsrc
* Description: Add "View Source" link to item context
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*
*/
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
function viewsrc_install() {
- register_hook('item_photo_menu', 'addon/viewsrc/viewsrc.php', 'viewsrc_item_photo_menu');
- register_hook('page_end', 'addon/viewsrc/viewsrc.php', 'viewsrc_page_end');
+ Addon::registerHook('item_photo_menu', 'addon/viewsrc/viewsrc.php', 'viewsrc_item_photo_menu');
+ Addon::registerHook('page_end', 'addon/viewsrc/viewsrc.php', 'viewsrc_page_end');
}
function viewsrc_uninstall() {
- unregister_hook('item_photo_menu', 'addon/viewsrc/viewsrc.php', 'viewsrc_item_photo_menu');
- unregister_hook('page_end', 'addon/viewsrc/viewsrc.php', 'viewsrc_page_end');
+ Addon::unregisterHook('item_photo_menu', 'addon/viewsrc/viewsrc.php', 'viewsrc_item_photo_menu');
+ Addon::unregisterHook('page_end', 'addon/viewsrc/viewsrc.php', 'viewsrc_page_end');
}
EOS;
}
-function viewsrc_item_photo_menu(&$a,&$b) {
- if(!local_user())
+function viewsrc_item_photo_menu(&$a, &$b)
+{
+ if (!local_user()) {
return;
+ }
if (local_user() != $b['item']['uid']) {
$r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `guid` = '%s'",
intval(local_user()), dbesc($b['item']['guid']));
- if (!$r)
+ if (!$r) {
return;
+ }
$item_id = $r[0]['id'];
-
- } else
+ } else {
$item_id = $b['item']['id'];
+ }
- $b['menu'] = array_merge( array( t('View Source') => $a->get_baseurl() . '/viewsrc/'. $item_id), $b['menu']);
+ $b['menu'] = array_merge([L10n::t('View Source') => $a->get_baseurl() . '/viewsrc/'. $item_id], $b['menu']);
//if((! local_user()) || (local_user() != $b['item']['uid']))
// return;
- //$b['menu'] = array_merge( array( t('View Source') => $a->get_baseurl() . '/viewsrc/'. $b['item']['id']), $b['menu']);
-
+ //$b['menu'] = array_merge(array(L10n::t('View Source') => $a->get_baseurl() . '/viewsrc/'. $b['item']['id']), $b['menu']);
}
-WebRTC Plugin
+WebRTC Addon
=============
This is a quick and dirty addon to add a [webrtc][1] website as an app. As webrtc
-advances so rapidly there is s a chance this plugin will be obsolete. Webrtc is
+advances so rapidly there is s a chance this addon will be obsolete. Webrtc is
a new video and audio conferencing tool that is browser to browser
communication, no need to download specific software for just conferencing.
There are many different webrtc instances and because of the technology it is
wants to talk to who, the actual transfer of the audio and video is directly
between the participants.
-If you would like to try this plugin please download one of the following
+If you would like to try this addon please download one of the following
either Chrome/Chromium 25 or higher or Firefox 21 or higher. Then test it by
visiting a known webrtc instance (i.e. [live.mayfirst.org](https://live.mayfirst.org)) create a
room, you should be asked to share your camera and microphone (firefox will let
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-06-23 14:45+0200\n"
-"PO-Revision-Date: 2014-09-10 14:50+0000\n"
+"PO-Revision-Date: 2017-09-20 06:09+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
* Author: Stephen Mahood <https://friends.mayfirst.org/profile/marxistvegan>
* Author: Tobias Diekershoff <https://f.diekershoff.de/profile/tobias>
*/
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
function webrtc_install() {
- register_hook('app_menu', 'addon/webrtc/webrtc.php', 'webrtc_app_menu');
+ Addon::registerHook('app_menu', 'addon/webrtc/webrtc.php', 'webrtc_app_menu');
}
function webrtc_uninstall() {
- unregister_hook('app_menu', 'addon/webrtc/webrtc.php', 'webrtc_app_menu');
+ Addon::unregisterHook('app_menu', 'addon/webrtc/webrtc.php', 'webrtc_app_menu');
}
function webrtc_app_menu($a,&$b) {
- $b['app_menu'][] = '<div class="app-title"><a href="webrtc">' . t('WebRTC Videochat') . '</a></div>';
+ $b['app_menu'][] = '<div class="app-title"><a href="webrtc">' . L10n::t('WebRTC Videochat') . '</a></div>';
}
-function webrtc_plugin_admin (&$a, &$o) {
+function webrtc_addon_admin (&$a, &$o) {
$t = get_markup_template( "admin.tpl", "addon/webrtc/" );
- $o = replace_macros( $t, array(
- '$submit' => t('Save Settings'),
- '$webrtcurl' => array('webrtcurl', t('WebRTC Base URL'), get_config('webrtc','webrtcurl' ), t('Page your users will create a WebRTC chat room on. For example you could use https://live.mayfirst.org .')),
- ));
+ $o = replace_macros( $t, [
+ '$submit' => L10n::t('Save Settings'),
+ '$webrtcurl' => ['webrtcurl', L10n::t('WebRTC Base URL'), Config::get('webrtc','webrtcurl' ), L10n::t('Page your users will create a WebRTC chat room on. For example you could use https://live.mayfirst.org .')],
+ ]);
}
-function webrtc_plugin_admin_post (&$a) {
+function webrtc_addon_admin_post (&$a) {
$url = ((x($_POST, 'webrtcurl')) ? notags(trim($_POST['webrtcurl'])) : '');
- set_config('webrtc', 'webrtcurl', $url);
- info( t('Settings updated.'). EOL);
+ Config::set('webrtc', 'webrtcurl', $url);
+ info(L10n::t('Settings updated.'). EOL);
}
function webrtc_module() {
$webrtcurl = get_config('webrtc','webrtcurl');
/* embedd the landing page in an iframe */
- $o .= '<h2>'.t('Video Chat').'</h2>';
- $o .= '<p>'.t('WebRTC is a video and audio conferencing tool that works with Firefox (version 21 and above) and Chrome/Chromium (version 25 and above). Just create a new chat room and send the link to someone you want to chat with.').'</p>';
+ $o .= '<h2>'.L10n::t('Video Chat').'</h2>';
+ $o .= '<p>'.L10n::t('WebRTC is a video and audio conferencing tool that works with Firefox (version 21 and above) and Chrome/Chromium (version 25 and above). Just create a new chat room and send the link to someone you want to chat with.').'</p>';
if ($webrtcurl == '') {
- $o .= '<p>'.t('Please contact your friendica admin and send a reminder to configure the WebRTC addon.').'</p>';
+ $o .= '<p>'.L10n::t('Please contact your friendica admin and send a reminder to configure the WebRTC addon.').'</p>';
} else {
$o .= '<iframe src="'.$webrtcurl.'" width="600px" height="600px"></iframe>';
}
msgstr ""
#: widgets.php:124
-msgid "Plugin Settings"
+msgid "Addon Settings"
msgstr ""
#: widget_friendheader.php:40
$a->strings["Generate new key"] = "Generar nova clau";\r
$a->strings["Widgets key"] = "Ginys clau";\r
$a->strings["Widgets available"] = "Ginys disponibles";\r
-$a->strings["Plugin Settings"] = "Ajustos de Plugin";\r
+$a->strings["Addon Settings"] = "Ajustos de Addon";\r
$a->strings["Get added to this list!"] = "S'afegeixen a aquesta llista!";\r
$a->strings["Generate new key"] = "Generovat nové klíče";\r
$a->strings["Widgets key"] = "Widgety klíč";\r
$a->strings["Widgets available"] = "Widgety k dispozici";\r
-$a->strings["Plugin Settings"] = "Nastavení doplňku";\r
+$a->strings["Addon Settings"] = "Nastavení doplňku";\r
$a->strings["Get added to this list!"] = "Nechte se přidat do tohoto listu!";\r
$a->strings["Generate new key"] = "Neuen Schlüssel erstellen";\r
$a->strings["Widgets key"] = "Widgets Schlüssel";\r
$a->strings["Widgets available"] = "Verfügbare Widgets";\r
-$a->strings["Plugin Settings"] = "Plugin-Einstellungen";\r
+$a->strings["Addon Settings"] = "Addon-Einstellungen";\r
$a->strings["Get added to this list!"] = "Werde Mitglied dieser Liste";\r
$a->strings["Generate new key"] = "Generi novan ĉifroŝlosilon";\r
$a->strings["Widgets key"] = "Ŝlosilo por fenestraĵoj";\r
$a->strings["Widgets available"] = "Disponeblaj fenestraĵoj";\r
-$a->strings["Plugin Settings"] = "Kromprogramoagordoj";\r
+$a->strings["Addon Settings"] = "Kromprogramoagordoj";\r
$a->strings["Get added to this list!"] = "Iĝu membro de ĉi tiu listo!";\r
$a->strings["Generate new key"] = "Generar clave nueva";\r
$a->strings["Widgets key"] = "Clave de aplicaciones";\r
$a->strings["Widgets available"] = "Aplicaciones disponibles";\r
-$a->strings["Plugin Settings"] = "Configuración de los módulos";\r
+$a->strings["Addon Settings"] = "Configuración de los módulos";\r
$a->strings["Get added to this list!"] = "¡Añadido a la lista!";\r
$a->strings["Generate new key"] = "Générer une nouvelle clé";\r
$a->strings["Widgets key"] = "Clé des widgets";\r
$a->strings["Widgets available"] = "Widgets disponibles";\r
-$a->strings["Plugin Settings"] = "Extensions";\r
+$a->strings["Addon Settings"] = "Extensions";\r
$a->strings["Get added to this list!"] = "Ajoutez-vous à cette liste!";\r
$a->strings["Generate new key"] = "Búa til nýjan lykil";\r
$a->strings["Widgets key"] = "Lykill smáforrits ";\r
$a->strings["Widgets available"] = "Smáforrit til";\r
-$a->strings["Plugin Settings"] = "Eininga stillingar";\r
+$a->strings["Addon Settings"] = "Eininga stillingar";\r
$a->strings["Get added to this list!"] = "Láta bæta þér við þennan lista!";\r
$a->strings["Generate new key"] = "Genera una nuova chiave";\r
$a->strings["Widgets key"] = "Chiave Widget";\r
$a->strings["Widgets available"] = "Widget disponibili";\r
-$a->strings["Plugin Settings"] = "Impostazioni plugin";\r
+$a->strings["Addon Settings"] = "Impostazioni addon";\r
$a->strings["Get added to this list!"] = "Aggiungiti a questa lista!";\r
$a->strings["Generate new key"] = "Lag ny nøkkel";\r
$a->strings["Widgets key"] = "Nøkkel til småprogrammer";\r
$a->strings["Widgets available"] = "Småprogrammer er tilgjengelige";\r
-$a->strings["Plugin Settings"] = "Tilleggsinnstillinger";\r
+$a->strings["Addon Settings"] = "Tilleggsinnstillinger";\r
$a->strings["Get added to this list!"] = "";\r
$a->strings["Generate new key"] = "Stwórz nowy klucz";\r
$a->strings["Widgets key"] = "";\r
$a->strings["Widgets available"] = "Widgety są dostępne";\r
-$a->strings["Plugin Settings"] = "Ustawienia wtyczki";\r
+$a->strings["Addon Settings"] = "Ustawienia wtyczki";\r
$a->strings["Get added to this list!"] = "Zostań dodany do listy!";\r
$a->strings["Generate new key"] = "Gerar nova chave";\r
$a->strings["Widgets key"] = "Chave de widgets";\r
$a->strings["Widgets available"] = "Widgets disponíveis";\r
-$a->strings["Plugin Settings"] = "Configurações do plugin";\r
+$a->strings["Addon Settings"] = "Configurações do addon";\r
$a->strings["Get added to this list!"] = "";\r
$a->strings["Generate new key"] = "Сгенерировать новый ключ";\r
$a->strings["Widgets key"] = "Ключ виджетов";\r
$a->strings["Widgets available"] = "Виджеты доступны";\r
-$a->strings["Plugin Settings"] = "Настройки плагина";\r
+$a->strings["Addon Settings"] = "Настройки плагина";\r
$a->strings["Get added to this list!"] = "";\r
<?php\r
\r
-$a->strings["Plugin Settings"] = "Inställningar för insticksprogram";\r
+$a->strings["Addon Settings"] = "Inställningar för insticksprogram";\r
$a->strings["Generate new key"] = "造成新钥匙";\r
$a->strings["Widgets key"] = "小窗口钥匙";\r
$a->strings["Widgets available"] = "可用的小窗口";\r
-$a->strings["Plugin Settings"] = "插件设置";\r
+$a->strings["Addon Settings"] = "插件设置";\r
$a->strings["Get added to this list!"] = "被在这个单子加入!";\r
<?php
-function friendheader_widget_name() {
+use Friendica\Core\L10n;
+
+function friendheader_widget_name()
+{
return "Shows friends as a bar";
}
-function friendheader_widget_help() {
+function friendheader_widget_help()
+{
return "";
}
-function friendheader_widget_args(){
- return Array();
+function friendheader_widget_args()
+{
+ return [];
}
-function friendheader_widget_size(){
- return Array('780px','140px');
+function friendheader_widget_size()
+{
+ return ['780px','140px'];
}
-function friendheader_widget_content(&$a, $conf){
-
- $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `user`.* FROM `profile`
+function friendheader_widget_content(&$a, $conf)
+{
+ $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `user`.* FROM `profile`
LEFT JOIN `user` ON `profile`.`uid` = `user`.`uid`
WHERE `user`.`uid` = %s AND `profile`.`is-default` = 1 LIMIT 1",
- intval($conf['uid'])
+ intval($conf['uid'])
);
- if(!count($r)) return;
+ if (!count($r)) {
+ return;
+ }
+
$a->profile = $r[0];
$o = "";
</style>";
$o .= _abs_url(contact_block());
- $o .= "<a href='".$a->get_baseurl().'/profile/'.$a->profile['nickname']."' target=new>". t('Get added to this list!') ."</a>";
-
+ $o .= "<a href='".$a->get_baseurl().'/profile/'.$a->profile['nickname']."' target=new>". L10n::t('Get added to this list!') ."</a>";
+
return $o;
}
<?php
-function friends_widget_name() {
+use Friendica\Core\L10n;
+
+function friends_widget_name()
+{
return "Shows profile contacts";
}
-function friends_widget_help() {
+
+function friends_widget_help()
+{
return "";
}
-function friends_widget_args(){
- return Array();
+function friends_widget_args()
+{
+ return [];
}
-function friends_widget_size(){
- return Array('100%','200px');
+function friends_widget_size()
+{
+ return ['100%', '200px'];
}
-function friends_widget_content(&$a, $conf){
-
- $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `user`.* FROM `profile`
+function friends_widget_content(&$a, $conf)
+{
+ $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `user`.* FROM `profile`
LEFT JOIN `user` ON `profile`.`uid` = `user`.`uid`
WHERE `user`.`uid` = %s AND `profile`.`is-default` = 1 LIMIT 1",
- intval($conf['uid'])
+ intval($conf['uid'])
);
- if(!count($r)) return;
+
+ if (!count($r)) {
+ return;
+ }
+
$a->profile = $r[0];
$o = "";
</style>";
$o .= _abs_url(contact_block());
- $o .= "<a href='".$a->get_baseurl().'/profile/'.$a->profile['nickname']."'>". t('Connect on Friendica!') ."</a>";
+ $o .= "<a href='".$a->get_baseurl().'/profile/'.$a->profile['nickname']."'>". L10n::t('Connect on Friendica!') ."</a>";
return $o;
}
<?php
+use Friendica\Core\L10n;
+
function like_widget_name() {
return "Shows likes";
}
$t = get_markup_template("widget_like.tpl", "addon/widgets/");
$o .= replace_macros($t, array(
'$like' => $likes,
- '$strlike' => sprintf( tt("%d person likes this", "%d people like this", $likes), $likes),
-
+ '$strlike' => L10n::tt("%d person likes this", "%d people like this", $likes),
+
'$dislike' => $dislikes,
- '$strdislike'=> sprintf( tt("%d person doesn't like this", "%d people don't like this", $dislikes), $dislikes),
-
+ '$strdislike'=> L10n::tt("%d person doesn't like this", "%d people don't like this", $dislikes),
+
'$baseurl' => $a->get_baseurl(),
));
* Version: 1.0
* Author: Fabio Comuni <http://kirgroup.com/profile/fabrix/>
*/
-
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+
function widgets_install() {
- register_hook('plugin_settings', 'addon/widgets/widgets.php', 'widgets_settings');
- register_hook('plugin_settings_post', 'addon/widgets/widgets.php', 'widgets_settings_post');
+ Addon::registerHook('addon_settings', 'addon/widgets/widgets.php', 'widgets_settings');
+ Addon::registerHook('addon_settings_post', 'addon/widgets/widgets.php', 'widgets_settings_post');
logger("installed widgets");
}
function widgets_uninstall() {
- unregister_hook('plugin_settings', 'addon/widgets/widgets.php', 'widgets_settings');
- unregister_hook('plugin_settings_post', 'addon/widgets/widgets.php', 'widgets_settings_post');
+ Addon::unregisterHook('addon_settings', 'addon/widgets/widgets.php', 'widgets_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/widgets/widgets.php', 'widgets_settings_post');
}
# $t = file_get_contents( dirname(__file__). "/settings.tpl" );
$t = get_markup_template("settings.tpl", "addon/widgets/");
- $o .= replace_macros($t, array(
- '$submit' => t('Generate new key'),
+ $o .= replace_macros($t, [
+ '$submit' => L10n::t('Generate new key'),
'$baseurl' => $a->get_baseurl(),
'$title' => "Widgets",
- '$label' => t('Widgets key'),
+ '$label' => L10n::t('Widgets key'),
'$key' => $key,
- '$widgets_h' => t('Widgets available'),
+ '$widgets_h' => L10n::t('Widgets available'),
'$widgets' => $widgets,
));
if (isset($_GET['p']) && local_user()==$conf['uid'] ) {
$o .= "<style>.f9k_widget { float: left;border:1px solid black; }</style>";
$o .= "<h1>Preview Widget</h1>";
- $o .= '<a href="'.$a->get_baseurl().'/settings/addon">'. t("Plugin Settings") .'</a>';
+ $o .= '<a href="'.$a->get_baseurl().'/settings/addon">'. L10n::t("Addon Settings") .'</a>';
$o .= "<h4>".call_user_func($a->argv[1].'_widget_name')."</h4>";
$o .= call_user_func($a->argv[1].'_widget_help');
return $o;
- }
-
- }
-
+ }
+ }
+
echo $o;
killme();
}
-
-
-
-
-?>
msgstr ""
#: windowsphonepush.php:117
-msgid "Enable WindowsPhonePush Plugin"
+msgid "Enable WindowsPhonePush Addon"
msgstr ""
#: windowsphonepush.php:122
msgstr "WindowsPhonePush Einstellungen"
#: windowsphonepush.php:117
-msgid "Enable WindowsPhonePush Plugin"
-msgstr "Aktiviere WindowsPhonePush Plugin"
+msgid "Enable WindowsPhonePush Addon"
+msgstr "Aktiviere WindowsPhonePush Addon"
#: windowsphonepush.php:122
msgid "Push text of new item"
;
$a->strings["WindowsPhonePush settings updated."] = "WindowsPhonePush Einstellungen aktualisiert.";
$a->strings["WindowsPhonePush Settings"] = "WindowsPhonePush Einstellungen";
-$a->strings["Enable WindowsPhonePush Plugin"] = "Aktiviere WindowsPhonePush Plugin";
+$a->strings["Enable WindowsPhonePush Addon"] = "Aktiviere WindowsPhonePush Addon";
$a->strings["Push text of new item"] = "Text senden";
$a->strings["Save Settings"] = "Einstellungen speichern";
msgstr "Ajustes de WindowsPhonePush"
#: windowsphonepush.php:117
-msgid "Enable WindowsPhonePush Plugin"
-msgstr "Habilitar Plugin de WindowsPhonePush"
+msgid "Enable WindowsPhonePush Addon"
+msgstr "Habilitar Addon de WindowsPhonePush"
#: windowsphonepush.php:122
msgid "Push text of new item"
;
$a->strings["WindowsPhonePush settings updated."] = "Ajustes de WindowsPhonePush actualizados.";
$a->strings["WindowsPhonePush Settings"] = "Ajustes de WindowsPhonePush";
-$a->strings["Enable WindowsPhonePush Plugin"] = "Habilitar Plugin de WindowsPhonePush";
+$a->strings["Enable WindowsPhonePush Addon"] = "Habilitar Addon de WindowsPhonePush";
$a->strings["Push text of new item"] = "Empujar texto de nuevo objeto";
$a->strings["Save Settings"] = "Guardar Ajustes";
msgstr "Paramètres WindowsPhonePush"
#: windowsphonepush.php:117
-msgid "Enable WindowsPhonePush Plugin"
+msgid "Enable WindowsPhonePush Addon"
msgstr "Activer le greffon WindowsPhonePush"
#: windowsphonepush.php:122
;
$a->strings["WindowsPhonePush settings updated."] = "Paramètres WindowsPhonePush mis à jour";
$a->strings["WindowsPhonePush Settings"] = "Paramètres WindowsPhonePush";
-$a->strings["Enable WindowsPhonePush Plugin"] = "Activer le greffon WindowsPhonePush";
+$a->strings["Enable WindowsPhonePush Addon"] = "Activer le greffon WindowsPhonePush";
$a->strings["Push text of new item"] = "Pousse le texte du nouvel élément";
$a->strings["Save Settings"] = "Sauvegarde des paramètres";
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014
+# fabrixxm <fabrix.xm@gmail.com>, 2014,2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-10-26 15:02+0100\n"
-"PO-Revision-Date: 2014-10-31 13:46+0000\n"
+"PO-Revision-Date: 2018-03-19 13:26+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
msgstr "Impostazioni WindowsPhonePush"
#: windowsphonepush.php:117
-msgid "Enable WindowsPhonePush Plugin"
-msgstr "Abilita plugin WindowsPhonePush"
+msgid "Enable WindowsPhonePush Addon"
+msgstr "Abilita componente aggiuntivo WindowsPhonePush"
#: windowsphonepush.php:122
msgid "Push text of new item"
;
$a->strings["WindowsPhonePush settings updated."] = "Impostazioni WindowsPhonePush aggiornate.";
$a->strings["WindowsPhonePush Settings"] = "Impostazioni WindowsPhonePush";
-$a->strings["Enable WindowsPhonePush Plugin"] = "Abilita plugin WindowsPhonePush";
+$a->strings["Enable WindowsPhonePush Addon"] = "Abilita componente aggiuntivo WindowsPhonePush";
$a->strings["Push text of new item"] = "Notifica il testo dei nuovi elementi";
$a->strings["Save Settings"] = "Salva Impostazioni";
msgstr "Configurare WindowsPhonePush"
#: windowsphonepush.php:117
-msgid "Enable WindowsPhonePush Plugin"
-msgstr "Activare Plugin WindowsPhonePush"
+msgid "Enable WindowsPhonePush Addon"
+msgstr "Activare Addon WindowsPhonePush"
#: windowsphonepush.php:122
msgid "Push text of new item"
;
$a->strings["WindowsPhonePush settings updated."] = "Configurări WindowsPhonePush actualizate.";
$a->strings["WindowsPhonePush Settings"] = "Configurare WindowsPhonePush";
-$a->strings["Enable WindowsPhonePush Plugin"] = "Activare Plugin WindowsPhonePush";
+$a->strings["Enable WindowsPhonePush Addon"] = "Activare Addon WindowsPhonePush";
$a->strings["Push text of new item"] = "Tastează textul noului element";
$a->strings["Save Settings"] = "Salvare Configurări";
* Pre-requisite: Windows Phone mobile device (at least WP 7.0)
* Friendica mobile app on Windows Phone
*
- * When plugin is installed, the system calls the plugin
+ * When addon is installed, the system calls the addon
* name_install() function, located in 'addon/name/name.php',
* where 'name' is the name of the addon.
* If the addon is removed from the configuration list, the
* count only unseen elements which are not type=activity (likes and dislikes not seen as new elements)
*/
-
-function windowsphonepush_install() {
-
- /**
- *
- * Our plugin will attach in three places.
- * The first is within cron - so the push notifications will be
+use Friendica\App;
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Model\User;
+
+function windowsphonepush_install()
+{
+ /* Our addon will attach in three places.
+ * The first is within cron - so the push notifications will be
* sent every 10 minutes (or whatever is set in crontab).
*
*/
+ Addon::registerHook('cron', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_cron');
- register_hook('cron', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_cron');
-
- /**
- *
- * Then we'll attach into the plugin settings page, and also the
+ /* Then we'll attach into the addon settings page, and also the
* settings post hook so that we can create and update
- * user preferences. User shall be able to activate the plugin and
+ * user preferences. User shall be able to activate the addon and
* define whether he allows pushing first characters of item text
*
*/
-
- register_hook('plugin_settings', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_settings');
- register_hook('plugin_settings_post', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_settings_post');
+ Addon::registerHook('addon_settings', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_settings');
+ Addon::registerHook('addon_settings_post', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_settings_post');
logger("installed windowsphonepush");
}
* during install. Don't delete data in table `pconfig`.
*
*/
-
- unregister_hook('cron', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_cron');
- unregister_hook('plugin_settings', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_settings');
- unregister_hook('plugin_settings_post', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_settings_post');
+ Addon::unregisterHook('cron', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_cron');
+ Addon::unregisterHook('addon_settings', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_settings_post');
logger("removed windowsphonepush");
}
set_pconfig(local_user(),'windowsphonepush','senditemtext',intval($_POST['windowsphonepush-senditemtext']));
- info( t('WindowsPhonePush settings updated.') . EOL);
+ info(L10n::t('WindowsPhonePush settings updated.') . EOL);
}
-
-/**
- *
- * Called from the Plugin Setting form.
+/* Called from the Addon Setting form.
* Add our own settings info to the page.
*
*/
/* Add some HTML to the existing form */
$s .= '<div class="settings-block">';
- $s .= '<h3>' . t('WindowsPhonePush Settings') . '</h3>';
+ $s .= '<h3>' . L10n::t('WindowsPhonePush Settings') . '</h3>';
$s .= '<div id="windowsphonepush-enable-wrapper">';
- $s .= '<label id="windowsphonepush-enable-label" for="windowsphonepush-enable-chk">' . t('Enable WindowsPhonePush Plugin') . '</label>';
+ $s .= '<label id="windowsphonepush-enable-label" for="windowsphonepush-enable-chk">' . L10n::t('Enable WindowsPhonePush Addon') . '</label>';
$s .= '<input id="windowsphonepush-enable-chk" type="checkbox" name="windowsphonepush" value="1" ' . $checked_enabled . '/>';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="windowsphonepush-senditemtext-wrapper">';
- $s .= '<label id="windowsphonepush-senditemtext-label" for="windowsphonepush-senditemtext-chk">' . t('Push text of new item') . '</label>';
+ $s .= '<label id="windowsphonepush-senditemtext-label" for="windowsphonepush-senditemtext-chk">' . L10n::t('Push text of new item') . '</label>';
$s .= '<input id="windowsphonepush-senditemtext-chk" type="checkbox" name="windowsphonepush-senditemtext" value="1" ' . $checked_senditemtext . '/>';
$s .= '</div><div class="clear"></div>';
- /* provide a submit button - enable und senditemtext can be changed by the user*/
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="windowsphonepush-submit" name="windowsphonepush-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div><div class="clear"></div>';
+ /* provide a submit button - enable und senditemtext can be changed by the user */
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="windowsphonepush-submit" name="windowsphonepush-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div><div class="clear"></div>';
/* provide further read-only information concerning the addon (useful for */
$s .= '<div id="windowsphonepush-device_url-wrapper">';
}
-
-/**
- *
- * Cron function used to regularly check all users on the server with active windowsphonepushplugin and send
+/* Cron function used to regularly check all users on the server with active windowsphonepushaddon and send
* notifications to the Microsoft servers and consequently to the Windows Phone device
*
*/
-
-function windowsphonepush_cron() {
- // retrieve all UID's for which the plugin windowsphonepush is enabled and loop through every user
+function windowsphonepush_cron()
+{
+ // retrieve all UID's for which the addon windowsphonepush is enabled and loop through every user
$r = q("SELECT * FROM `pconfig` WHERE `cat` = 'windowsphonepush' AND `k` = 'enable' AND `v` = 1");
if(count($r)) {
foreach($r as $rr) {
// pushing only possible if device_url (the URI on Microsoft server) is available or not "NA" (which will be sent
// by app if user has switched the server setting in app - sending blank not possible as this would return an update error)
- if ( ( $device_url == "" ) || ( $device_url == "NA" ) ) {
- // no Device-URL for the user availabe, but plugin is enabled --> write info to Logger
+ if (( $device_url == "" ) || ( $device_url == "NA" )) {
+ // no Device-URL for the user availabe, but addon is enabled --> write info to Logger
logger("WARN: windowsphonepush is enable for user " . $rr['uid'] . ", but no Device-URL is specified for the user.");
} else {
// retrieve the number of unseen items and the id of the latest one (if there are more than
$body = $item[0]['body'];
if (substr($body, 0, 4) == "[url")
$body = "URL/Image ...";
- else {
- require_once('include/bbcode.php');
+ } else {
require_once("include/html2plain.php");
- $body = bbcode($body, false, false, 2, true);
+
+ $body = BBCode::convert($body, false, 2, true);
$body = html2plain($body, 0);
$body = ((strlen($body) > 137) ? substr($body, 0, 137) . "..." : $body);
}
return "Not Authenticated";
}
- // no updating if user hasn't enabled the plugin
- $enable = get_pconfig(local_user(), 'windowsphonepush', 'enable');
- if(! $enable) {
+ // no updating if user hasn't enabled the addon
+ $enable = PConfig::get(local_user(), 'windowsphonepush', 'enable');
+ if (!$enable) {
return "Plug-in not enabled";
}
return "Not Authenticated";
}
- // no updating if user hasn't enabled the plugin
- $enable = get_pconfig(local_user(), 'windowsphonepush', 'enable');
- if(! $enable) {
+ // no updating if user hasn't enabled the addon
+ $enable = PConfig::get(local_user(), 'windowsphonepush', 'enable');
+ if (!$enable) {
return "Plug-in not enabled";
}
die('This api requires login');
}
- require_once('include/security.php');
- authenticate_success($record); $_SESSION["allow_api"] = true;
- call_hooks('logged_in', $a->user);
+ require_once 'include/security.php';
+ authenticate_success($record);
+ $_SESSION["allow_api"] = true;
+ Addon::callHooks('logged_in', $a->user);
}
msgstr ""
#: wppost.php:87
-msgid "Enable WordPress Post Plugin"
+msgid "Enable WordPress Post Addon"
msgstr ""
#: wppost.php:92
\r
$a->strings["Post to Wordpress"] = "Publica-ho al Wordpress";\r
$a->strings["WordPress Post Settings"] = "Configuració d'enviaments a WordPress";\r
-$a->strings["Enable WordPress Post Plugin"] = "Habilitar Configuració d'Enviaments a WordPress";\r
+$a->strings["Enable WordPress Post Addon"] = "Habilitar Configuració d'Enviaments a WordPress";\r
$a->strings["WordPress username"] = "Nom d'usuari de WordPress";\r
$a->strings["WordPress password"] = "Contrasenya de WordPress";\r
$a->strings["WordPress API URL"] = "WordPress API URL";\r
msgstr "Wordpress Export"
#: wppost.php:86
-msgid "Enable WordPress Post Plugin"
+msgid "Enable WordPress Post Addon"
msgstr "Povolit rozšíření na WordPress"
#: wppost.php:91
;
$a->strings["Post to Wordpress"] = "Příspěvky do WordPress";
$a->strings["Wordpress Export"] = "Wordpress Export";
-$a->strings["Enable WordPress Post Plugin"] = "Povolit rozšíření na WordPress";
+$a->strings["Enable WordPress Post Addon"] = "Povolit rozšíření na WordPress";
$a->strings["WordPress username"] = "WordPress uživatelské jméno";
$a->strings["WordPress password"] = "WordPress heslo";
$a->strings["WordPress API URL"] = "URL adresa API WordPress";
msgstr "Wordpress Export"
#: wppost.php:87
-msgid "Enable WordPress Post Plugin"
-msgstr "WordPress Plugin aktivieren"
+msgid "Enable WordPress Post Addon"
+msgstr "WordPress Addon aktivieren"
#: wppost.php:92
msgid "WordPress username"
;
$a->strings["Post to Wordpress"] = "Bei WordPress veröffentlichen";
$a->strings["Wordpress Export"] = "Wordpress Export";
-$a->strings["Enable WordPress Post Plugin"] = "WordPress Plugin aktivieren";
+$a->strings["Enable WordPress Post Addon"] = "WordPress Addon aktivieren";
$a->strings["WordPress username"] = "WordPress-Benutzername";
$a->strings["WordPress password"] = "WordPress-Passwort";
$a->strings["WordPress API URL"] = "WordPress-API-URL";
\r
$a->strings["Post to Wordpress"] = "Afiŝi al Wordpress";\r
$a->strings["WordPress Post Settings"] = "Agordoj por WordPress afiŝojn";\r
-$a->strings["Enable WordPress Post Plugin"] = "Ŝalti la Wordpress-afiŝo kromprogramon";\r
+$a->strings["Enable WordPress Post Addon"] = "Ŝalti la Wordpress-afiŝo kromprogramon";\r
$a->strings["WordPress username"] = "WordPress salutnomo";\r
$a->strings["WordPress password"] = "WordPress pasvorto";\r
$a->strings["WordPress API URL"] = "Wordpress API URL adreso";\r
msgstr "Exportar a Wordpress"
#: wppost.php:87
-msgid "Enable WordPress Post Plugin"
-msgstr "Habilitar Plugin de publicación de WordPress"
+msgid "Enable WordPress Post Addon"
+msgstr "Habilitar Addon de publicación de WordPress"
#: wppost.php:92
msgid "WordPress username"
;
$a->strings["Post to Wordpress"] = "Publicar en Wordpress";
$a->strings["Wordpress Export"] = "Exportar a Wordpress";
-$a->strings["Enable WordPress Post Plugin"] = "Habilitar Plugin de publicación de WordPress";
+$a->strings["Enable WordPress Post Addon"] = "Habilitar Addon de publicación de WordPress";
$a->strings["WordPress username"] = "Nombre de usuario de WordPress";
$a->strings["WordPress password"] = "Contraseña de WordPress";
$a->strings["WordPress API URL"] = "URL de API de WordPress";
\r
$a->strings["Post to Wordpress"] = "Poster sur WordPress";\r
$a->strings["WordPress Post Settings"] = "Réglages WordPress";\r
-$a->strings["Enable WordPress Post Plugin"] = "Activer l'extension WordPress";\r
+$a->strings["Enable WordPress Post Addon"] = "Activer l'extension WordPress";\r
$a->strings["WordPress username"] = "Utilisateur WordPress";\r
$a->strings["WordPress password"] = "Mot de passe WordPress";\r
$a->strings["WordPress API URL"] = "URL de l'API WordPress";\r
\r
$a->strings["Post to Wordpress"] = "Senda færslu á Wordpress";\r
$a->strings["WordPress Post Settings"] = "Wordpress Post stillingar";\r
-$a->strings["Enable WordPress Post Plugin"] = "Kveikja á WordPress Post viðbót";\r
+$a->strings["Enable WordPress Post Addon"] = "Kveikja á WordPress Post viðbót";\r
$a->strings["WordPress username"] = "Wordpress aðgangsorð";\r
$a->strings["WordPress password"] = "Wordpress aðgagnsorð";\r
$a->strings["WordPress API URL"] = "Slóð á Wordpress API";\r
#
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2017-2018
msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-01-24 21:06+0100\n"
-"PO-Revision-Date: 2017-02-10 08:18+0000\n"
+"PO-Revision-Date: 2018-03-19 13:26+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
#: wppost.php:80 wppost.php:84
msgid "Wordpress Export"
-msgstr ""
+msgstr "Esporta a Wordpress"
#: wppost.php:87
-msgid "Enable WordPress Post Plugin"
-msgstr "Abilita il plugin di invio a Wordpress"
+msgid "Enable WordPress Post Addon"
+msgstr "Abilita il componente aggiuntivo di invio a Wordpress"
#: wppost.php:92
msgid "WordPress username"
msgid ""
"Text for the backlink, e.g. Read the original post and comment stream on "
"Friendica."
-msgstr ""
+msgstr "Testo per il backlink, p.e. Leggi il post originale e i commenti su Friendica."
#: wppost.php:121
msgid "Don't post messages that are too short"
-msgstr ""
+msgstr "Non inviare messaggi troppo corti"
#: wppost.php:127
msgid "Save Settings"
-msgstr ""
+msgstr "Salva Impostazioni"
#: wppost.php:206
msgid "Read the original post and comment stream on Friendica"
-msgstr ""
+msgstr "Leggi il messaggio originale e i commenti su Friendica"
#: wppost.php:269
msgid "Post from Friendica"
}}
;
$a->strings["Post to Wordpress"] = "Invia a Wordpress";
-$a->strings["Wordpress Export"] = "";
-$a->strings["Enable WordPress Post Plugin"] = "Abilita il plugin di invio a Wordpress";
+$a->strings["Wordpress Export"] = "Esporta a Wordpress";
+$a->strings["Enable WordPress Post Addon"] = "Abilita il componente aggiuntivo di invio a Wordpress";
$a->strings["WordPress username"] = "Nome utente Wordpress";
$a->strings["WordPress password"] = "Password Wordpress";
$a->strings["WordPress API URL"] = "Indirizzo API Wordpress";
$a->strings["Post to WordPress by default"] = "Invia sempre a Wordpress";
$a->strings["Provide a backlink to the Friendica post"] = "Inserisci un link al messaggio originale su Friendica";
-$a->strings["Text for the backlink, e.g. Read the original post and comment stream on Friendica."] = "";
-$a->strings["Don't post messages that are too short"] = "";
-$a->strings["Save Settings"] = "";
-$a->strings["Read the original post and comment stream on Friendica"] = "";
+$a->strings["Text for the backlink, e.g. Read the original post and comment stream on Friendica."] = "Testo per il backlink, p.e. Leggi il post originale e i commenti su Friendica.";
+$a->strings["Don't post messages that are too short"] = "Non inviare messaggi troppo corti";
+$a->strings["Save Settings"] = "Salva Impostazioni";
+$a->strings["Read the original post and comment stream on Friendica"] = "Leggi il messaggio originale e i commenti su Friendica";
$a->strings["Post from Friendica"] = "Messaggio da Friendica";
\r
$a->strings["Post to Wordpress"] = "";\r
$a->strings["WordPress Post Settings"] = "";\r
-$a->strings["Enable WordPress Post Plugin"] = "";\r
+$a->strings["Enable WordPress Post Addon"] = "";\r
$a->strings["WordPress username"] = "";\r
$a->strings["WordPress password"] = "";\r
$a->strings["WordPress API URL"] = "";\r
\r
$a->strings["Post to Wordpress"] = "Opublikuj na Wordpress";\r
$a->strings["WordPress Post Settings"] = "Ustawienia wpisów WorldPress";\r
-$a->strings["Enable WordPress Post Plugin"] = "Włącz plugin wpisów WorldPress";\r
+$a->strings["Enable WordPress Post Addon"] = "Włącz addon wpisów WorldPress";\r
$a->strings["WordPress username"] = "nazwa użytkownika WordPress";\r
$a->strings["WordPress password"] = "hasło WordPress";\r
$a->strings["WordPress API URL"] = "WordPress API URL";\r
msgstr "Configurações de publicação no WordPress"
#: wppost.php:78
-msgid "Enable WordPress Post Plugin"
+msgid "Enable WordPress Post Addon"
msgstr "Habilitar plug-in para publicar no WordPress"
#: wppost.php:83
;
$a->strings["Post to Wordpress"] = "Publicar no Wordpress";
$a->strings["WordPress Post Settings"] = "Configurações de publicação no WordPress";
-$a->strings["Enable WordPress Post Plugin"] = "Habilitar plug-in para publicar no WordPress";
+$a->strings["Enable WordPress Post Addon"] = "Habilitar plug-in para publicar no WordPress";
$a->strings["WordPress username"] = "Nome de usuário no WordPress";
$a->strings["WordPress password"] = "Senha do WordPress";
$a->strings["WordPress API URL"] = "";
msgstr "Export pe Wordpress"
#: wppost.php:86
-msgid "Enable WordPress Post Plugin"
+msgid "Enable WordPress Post Addon"
msgstr "Activare Modul Postare pe Wordpress"
#: wppost.php:91
;
$a->strings["Post to Wordpress"] = "Postați pe Wordpress";
$a->strings["Wordpress Export"] = "Export pe Wordpress";
-$a->strings["Enable WordPress Post Plugin"] = "Activare Modul Postare pe Wordpress";
+$a->strings["Enable WordPress Post Addon"] = "Activare Modul Postare pe Wordpress";
$a->strings["WordPress username"] = "Utilizator WordPress ";
$a->strings["WordPress password"] = "Parolă WordPress ";
$a->strings["WordPress API URL"] = "URL Cheie API WordPress";
\r
$a->strings["Post to Wordpress"] = "Сообщение для Wordpress";\r
$a->strings["WordPress Post Settings"] = "Настройки сообщений для Wordpress";\r
-$a->strings["Enable WordPress Post Plugin"] = "Включить WordPress плагин сообщений";\r
+$a->strings["Enable WordPress Post Addon"] = "Включить WordPress плагин сообщений";\r
$a->strings["WordPress username"] = "WordPress Имя пользователя";\r
$a->strings["WordPress password"] = "WordPress паролъ";\r
$a->strings["WordPress API URL"] = "WordPress API URL";\r
\r
$a->strings["Post to Wordpress"] = "发送到Wordpress";\r
$a->strings["WordPress Post Settings"] = "Wordpress发送设置";\r
-$a->strings["Enable WordPress Post Plugin"] = "使Wordpress发送插件可用";\r
+$a->strings["Enable WordPress Post Addon"] = "使Wordpress发送插件可用";\r
$a->strings["WordPress username"] = "Wordpress用户名";\r
$a->strings["WordPress password"] = "Wordpress密码";\r
$a->strings["WordPress API URL"] = "WordPress API URL";\r
<?php
-
/**
* Name: WordPress Post Connector
* Description: Post to WordPress (or anything else which uses blogger XMLRPC API)
* Version: 1.1
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*/
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Util\Network;
function wppost_install() {
- register_hook('post_local', 'addon/wppost/wppost.php', 'wppost_post_local');
- register_hook('notifier_normal', 'addon/wppost/wppost.php', 'wppost_send');
- register_hook('jot_networks', 'addon/wppost/wppost.php', 'wppost_jot_nets');
- register_hook('connector_settings', 'addon/wppost/wppost.php', 'wppost_settings');
- register_hook('connector_settings_post', 'addon/wppost/wppost.php', 'wppost_settings_post');
+ Addon::registerHook('post_local', 'addon/wppost/wppost.php', 'wppost_post_local');
+ Addon::registerHook('notifier_normal', 'addon/wppost/wppost.php', 'wppost_send');
+ Addon::registerHook('jot_networks', 'addon/wppost/wppost.php', 'wppost_jot_nets');
+ Addon::registerHook('connector_settings', 'addon/wppost/wppost.php', 'wppost_settings');
+ Addon::registerHook('connector_settings_post', 'addon/wppost/wppost.php', 'wppost_settings_post');
}
function wppost_uninstall() {
- unregister_hook('post_local', 'addon/wppost/wppost.php', 'wppost_post_local');
- unregister_hook('notifier_normal', 'addon/wppost/wppost.php', 'wppost_send');
- unregister_hook('jot_networks', 'addon/wppost/wppost.php', 'wppost_jot_nets');
- unregister_hook('connector_settings', 'addon/wppost/wppost.php', 'wppost_settings');
- unregister_hook('connector_settings_post', 'addon/wppost/wppost.php', 'wppost_settings_post');
+ Addon::unregisterHook('post_local', 'addon/wppost/wppost.php', 'wppost_post_local');
+ Addon::unregisterHook('notifier_normal', 'addon/wppost/wppost.php', 'wppost_send');
+ Addon::unregisterHook('jot_networks', 'addon/wppost/wppost.php', 'wppost_jot_nets');
+ Addon::unregisterHook('connector_settings', 'addon/wppost/wppost.php', 'wppost_settings');
+ Addon::unregisterHook('connector_settings_post', 'addon/wppost/wppost.php', 'wppost_settings_post');
// obsolete - remove
- unregister_hook('post_local_end', 'addon/wppost/wppost.php', 'wppost_send');
- unregister_hook('plugin_settings', 'addon/wppost/wppost.php', 'wppost_settings');
- unregister_hook('plugin_settings_post', 'addon/wppost/wppost.php', 'wppost_settings_post');
+ Addon::unregisterHook('post_local_end', 'addon/wppost/wppost.php', 'wppost_send');
+ Addon::unregisterHook('addon_settings', 'addon/wppost/wppost.php', 'wppost_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/wppost/wppost.php', 'wppost_settings_post');
}
$wp_defpost = get_pconfig(local_user(),'wppost','post_by_default');
$selected = ((intval($wp_defpost) == 1) ? ' checked="checked" ' : '');
$b .= '<div class="profile-jot-net"><input type="checkbox" name="wppost_enable" ' . $selected . ' value="1" /> '
- . t('Post to Wordpress') . '</div>';
+ . L10n::t('Post to Wordpress') . '</div>';
}
}
/* Add some HTML to the existing form */
$s .= '<span id="settings_wppost_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_wppost_expanded\'); openClose(\'settings_wppost_inflated\');">';
- $s .= '<img class="connector'.$css.'" src="images/wordpress.png" /><h3 class="connector">'. t('Wordpress Export').'</h3>';
+ $s .= '<img class="connector'.$css.'" src="images/wordpress.png" /><h3 class="connector">'. L10n::t('Wordpress Export').'</h3>';
$s .= '</span>';
$s .= '<div id="settings_wppost_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_wppost_expanded\'); openClose(\'settings_wppost_inflated\');">';
- $s .= '<img class="connector'.$css.'" src="images/wordpress.png" /><h3 class="connector">'. t('Wordpress Export').'</h3>';
+ $s .= '<img class="connector'.$css.'" src="images/wordpress.png" /><h3 class="connector">'. L10n::t('Wordpress Export').'</h3>';
$s .= '</span>';
$s .= '<div id="wppost-enable-wrapper">';
- $s .= '<label id="wppost-enable-label" for="wppost-checkbox">' . t('Enable WordPress Post Plugin') . '</label>';
+ $s .= '<label id="wppost-enable-label" for="wppost-checkbox">' . L10n::t('Enable WordPress Post Addon') . '</label>';
$s .= '<input id="wppost-checkbox" type="checkbox" name="wppost" value="1" ' . $checked . '/>';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="wppost-username-wrapper">';
- $s .= '<label id="wppost-username-label" for="wppost-username">' . t('WordPress username') . '</label>';
+ $s .= '<label id="wppost-username-label" for="wppost-username">' . L10n::t('WordPress username') . '</label>';
$s .= '<input id="wppost-username" type="text" name="wp_username" value="' . $wp_username . '" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="wppost-password-wrapper">';
- $s .= '<label id="wppost-password-label" for="wppost-password">' . t('WordPress password') . '</label>';
+ $s .= '<label id="wppost-password-label" for="wppost-password">' . L10n::t('WordPress password') . '</label>';
$s .= '<input id="wppost-password" type="password" name="wp_password" value="' . $wp_password . '" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="wppost-blog-wrapper">';
- $s .= '<label id="wppost-blog-label" for="wppost-blog">' . t('WordPress API URL') . '</label>';
+ $s .= '<label id="wppost-blog-label" for="wppost-blog">' . L10n::t('WordPress API URL') . '</label>';
$s .= '<input id="wppost-blog" type="text" name="wp_blog" value="' . $wp_blog . '" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="wppost-bydefault-wrapper">';
- $s .= '<label id="wppost-bydefault-label" for="wppost-bydefault">' . t('Post to WordPress by default') . '</label>';
+ $s .= '<label id="wppost-bydefault-label" for="wppost-bydefault">' . L10n::t('Post to WordPress by default') . '</label>';
$s .= '<input id="wppost-bydefault" type="checkbox" name="wp_bydefault" value="1" ' . $def_checked . '/>';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="wppost-backlink-wrapper">';
- $s .= '<label id="wppost-backlink-label" for="wppost-backlink">' . t('Provide a backlink to the Friendica post') . '</label>';
+ $s .= '<label id="wppost-backlink-label" for="wppost-backlink">' . L10n::t('Provide a backlink to the Friendica post') . '</label>';
$s .= '<input id="wppost-backlink" type="checkbox" name="wp_backlink" value="1" ' . $back_checked . '/>';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="wppost-backlinktext-wrapper">';
- $s .= '<label id="wppost-backlinktext-label" for="wp_backlink_text">' . t('Text for the backlink, e.g. Read the original post and comment stream on Friendica.') . '</label>';
+ $s .= '<label id="wppost-backlinktext-label" for="wp_backlink_text">' . L10n::t('Text for the backlink, e.g. Read the original post and comment stream on Friendica.') . '</label>';
$s .= '<input id="wppost-backlinktext" type="text" name="wp_backlink_text" value="'. $wp_backlink_text.'" ' . $wp_backlink_text . '/>';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="wppost-shortcheck-wrapper">';
- $s .= '<label id="wppost-shortcheck-label" for="wppost-shortcheck">' . t("Don't post messages that are too short") . '</label>';
+ $s .= '<label id="wppost-shortcheck-label" for="wppost-shortcheck">' . L10n::t("Don't post messages that are too short") . '</label>';
$s .= '<input id="wppost-shortcheck" type="checkbox" name="wp_shortcheck" value="1" '.$shortcheck_checked.'/>';
$s .= '</div><div class="clear"></div>';
/* provide a submit button */
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="wppost-submit" name="wppost-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="wppost-submit" name="wppost-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
set_pconfig(local_user(),'wppost','backlink',trim($_POST['wp_backlink']));
set_pconfig(local_user(),'wppost','shortcheck',trim($_POST['wp_shortcheck']));
$wp_backlink_text = notags(trim($_POST['wp_backlink_text']));
- $wp_backlink_text = bbcode($wp_backlink_text, false, false, 8);
+ $wp_backlink_text = BBCode::convert($wp_backlink_text, false, 8);
$wp_backlink_text = html2plain($wp_backlink_text, 0, true);
set_pconfig(local_user(),'wppost','wp_backlink_text', $wp_backlink_text);
$wp_blog = get_pconfig($b['uid'],'wppost','wp_blog');
$wp_backlink_text = get_pconfig($b['uid'],'wppost','wp_backlink_text');
if ($wp_backlink_text == '') {
- $wp_backlink_text = t('Read the original post and comment stream on Friendica');
+ $wp_backlink_text = L10n::t('Read the original post and comment stream on Friendica');
}
- if($wp_username && $wp_password && $wp_blog) {
-
- require_once('include/bbcode.php');
- require_once('include/html2plain.php');
- require_once('include/plaintext.php');
+ if ($wp_username && $wp_password && $wp_blog) {
+ require_once 'include/html2plain.php';
$wptitle = trim($b['title']);
- if (intval(get_pconfig($b['uid'],'wppost','shortcheck'))) {
+ if (intval(PConfig::get($b['uid'], 'wppost', 'shortcheck'))) {
// Checking, if its a post that is worth a blog post
$postentry = false;
- $siteinfo = get_attached_data($b["body"]);
+ $siteinfo = BBCode::getAttachedData($b["body"]);
// Is it a link to an aricle, a video or a photo?
if (isset($siteinfo["type"])) {
// If the title is empty then try to guess
if ($wptitle == '') {
// Fetch information about the post
- $siteinfo = get_attached_data($b["body"]);
+ $siteinfo = BBCode::getAttachedData($b["body"]);
if (isset($siteinfo["title"])) {
$wptitle = $siteinfo["title"];
}
// Remove the share element before fetching the first line
$title = trim(preg_replace("/\[share.*?\](.*?)\[\/share\]/ism","\n$1\n",$b['body']));
- $title = html2plain(bbcode($title, false, false), 0, true)."\n";
+ $title = html2plain(BBCode::convert($title, false), 0, true)."\n";
$pos = strpos($title, "\n");
$trailer = "";
if (($pos == 0) || ($pos > 100)) {
}
}
- $title = '<title>' . (($wptitle) ? $wptitle : t('Post from Friendica')) . '</title>';
- $post = bbcode($b['body'], false, false, 4);
+ $title = '<title>' . (($wptitle) ? $wptitle : L10n::t('Post from Friendica')) . '</title>';
+ $post = BBCode::convert($b['body'], false, 4);
// If a link goes to youtube then remove the stuff around it. Wordpress detects youtube links and embeds it
$post = preg_replace('/<a.*?href="(https?:\/\/www.youtube.com\/.*?)".*?>(.*?)<\/a>/ism',"\n$1\n",$post);
logger('wppost: data: ' . $xml, LOGGER_DATA);
- if($wp_blog !== 'test') {
- $x = post_url($wp_blog,$xml);
+ if ($wp_blog !== 'test') {
+ $x = Network::post($wp_blog, $xml);
}
logger('posted to wordpress: ' . (($x) ? $x : ''), LOGGER_DEBUG);
-
}
}
`django-conversejs <https://pypi.python.org/pypi/django-conversejs>`_ is an app that makes it easer to integrate *Converse.js* into Django.
`django-xmpp <https://github.com/fpytloun/django-xmpp>`_ adds XMPP chat integration with converse.js by letting Ejabberd authenticate against your Django site.
* `Roundcube <http://roundcube.net>`_:
- `roundcube-converse.js-xmpp-plugin <https://github.com/priyadi/roundcube-converse.js-xmpp-plugin>`_ is a plugin for Roundcube Webmail.
+ `roundcube-converse.js-xmpp-plugin <https://github.com/priyadi/roundcube-converse.js-xmpp-plugin>`_ is an addon for Roundcube Webmail.
* `Wordpress <http://wordpress.org>`_:
`ConverseJS <http://wordpress.org/plugins/conversejs>`_
* `Patternslib <http://patternslib.com>`_:
* @license almond 0.3.1 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.
* Available via the MIT or new BSD license.
* see: http://github.com/jrburke/almond for details
- */\r
-\r
+ */
+
/*!
* jQuery JavaScript Library v1.11.0
* http://jquery.com/
* http://jquery.org/license
*
* Date: 2014-01-23T21:02Z
- */\r
-\r
+ */
+
/*!
* Sizzle CSS Selector Engine v1.10.16
* http://sizzlejs.com/
* http://jquery.org/license
*
* Date: 2014-01-13
- */\r
-\r
-// Underscore.js 1.8.3\r
-// http://underscorejs.org\r
-// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r
-// Underscore may be freely distributed under the MIT license.\r
-\r
+ */
+
+// Underscore.js 1.8.3
+// http://underscorejs.org
+// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+// Underscore may be freely distributed under the MIT license.
+
/**
* @license RequireJS text 2.0.14 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved.
* Available via the MIT or new BSD license.
* see: http://github.com/requirejs/text for details
- */\r
-\r
-// RequireJS UnderscoreJS template plugin\r
-// http://github.com/jfparadis/requirejs-tpl\r
-//\r
-// An alternative to http://github.com/ZeeAgency/requirejs-tpl\r
-//\r
-// Using UnderscoreJS micro-templates at http://underscorejs.org/#template\r
-// Using and RequireJS text.js at http://requirejs.org/docs/api.html#text\r
-// @author JF Paradis\r
-// @version 0.0.2\r
-//\r
-// Released under the MIT license\r
-//\r
-// Usage:\r
-// require(['backbone', 'tpl!mytemplate'], function (Backbone, mytemplate) {\r
-// return Backbone.View.extend({\r
-// initialize: function(){\r
-// this.render();\r
-// },\r
-// render: function(){\r
-// this.$el.html(mytemplate({message: 'hello'}));\r
-// });\r
-// });\r
-//\r
-// Configuration: (optional)\r
-// require.config({\r
-// tpl: {\r
-// extension: '.tpl' // default = '.html'\r
-// }\r
-// });\r
-\r
+ */
+
+// RequireJS UnderscoreJS template addon
+// http://github.com/jfparadis/requirejs-tpl
+//
+// An alternative to http://github.com/ZeeAgency/requirejs-tpl
+//
+// Using UnderscoreJS micro-templates at http://underscorejs.org/#template
+// Using and RequireJS text.js at http://requirejs.org/docs/api.html#text
+// @author JF Paradis
+// @version 0.0.2
+//
+// Released under the MIT license
+//
+// Usage:
+// require(['backbone', 'tpl!mytemplate'], function (Backbone, mytemplate) {
+// return Backbone.View.extend({
+// initialize: function(){
+// this.render();
+// },
+// render: function(){
+// this.$el.html(mytemplate({message: 'hello'}));
+// });
+// });
+//
+// Configuration: (optional)
+// require.config({
+// tpl: {
+// extension: '.tpl' // default = '.html'
+// }
+// });
+
/*
jed.js
v0.5.0beta
gettext.js back in 2008. I was able to vet a lot of my ideas
against his. I also made sure Jed passed against his tests
in order to offer easy upgrades -- jsgettext.berlios.de
-*/\r
-\r
-// Underscore 1.3.0 was used to port and is licensed\r
-\r
+*/
+
+// Underscore 1.3.0 was used to port and is licensed
+
/**
sprintf() for JavaScript 0.7-beta1
http://www.diveintojavascript.com/projects/javascript-sprintf
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */\r
-\r
+ */
+
/*!
* jQuery Browser Plugin 0.0.8
* https://github.com/gabceb/jquery-browser-plugin
* Released under the MIT license
*
* Date: 05-07-2015
- */\r
-\r
+ */
+
/*
CryptoJS v3.1.2
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
-*/\r
-\r
+*/
+
/*!
* EventEmitter v4.2.3 - git.io/ee
* Oliver Caldwell
* MIT license
* @preserve
- */\r
-\r
+ */
+
/*!
otr.js v0.2.12 - 2014-04-15
This file is concatenated for the browser.
Please see: https://github.com/arlolra/otr
-*/\r
-\r
-//! moment.js\r
-//! version : 2.10.6\r
-//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\r
-//! license : MIT\r
-//! momentjs.com\r
-\r
+*/
+
+//! moment.js
+//! version : 2.10.6
+//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
+//! license : MIT
+//! momentjs.com
+
/*
* A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
* in FIPS PUB 180-1
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
* Distributed under the BSD License
* See http://pajhome.org.uk/crypt/md5 for details.
- */\r
-\r
+ */
+
/*
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
* Digest Algorithm, as defined in RFC 1321.
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
* Distributed under the BSD License
* See http://pajhome.org.uk/crypt/md5 for more info.
- */\r
-\r
+ */
+
/*
This program is distributed under the terms of the MIT license.
Please see the LICENSE file for details.
Copyright 2006-2008, OGG, LLC
-*/\r
-\r
+*/
+
/*
Copyright 2010, François de Metz <francois@2metz.fr>
-*/\r
-\r
+*/
+
/*
* Based on Ping Strophejs plugins (https://github.com/metajack/strophejs-plugins/tree/master/ping)
-* This plugin is distributed under the terms of the MIT licence.
+* This addon is distributed under the terms of the MIT licence.
* Please see the LICENCE file for details.
*
* Copyright (c) Markus Kohlhase, 2010
* Refactored by Pavel Lang, 2011
-*/\r
-\r
-// (c) 2010-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r
-// Backbone may be freely distributed under the MIT license.\r
-// For all details and documentation:\r
-// http://backbonejs.org\r
-\r
+*/
+
+// (c) 2010-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+// Backbone may be freely distributed under the MIT license.
+// For all details and documentation:
+// http://backbonejs.org
+
/*!
* Backbone.Overview
*
* Copyright (c) 2014, JC Brand <jc@opkode.com>
* Licensed under the Mozilla Public License (MPL)
- */\r
-\r
+ */
+
/*!
* typeahead.js 0.10.5
* https://github.com/twitter/typeahead.js
* Copyright 2013-2014 Twitter, Inc. and other contributors; Licensed MIT
- */\r
-\r
-// Converse.js (A browser based XMPP chat client)\r
-// http://conversejs.org\r
-//\r
-// Copyright (c) 2012-2015, Jan-Carel Brand <jc@opkode.com>\r
-// Licensed under the Mozilla Public License (MPLv2)\r
-//\r
-\r
+ */
+
+// Converse.js (A browser based XMPP chat client)
+// http://conversejs.org
+//
+// Copyright (c) 2012-2015, Jan-Carel Brand <jc@opkode.com>
+// Licensed under the Mozilla Public License (MPLv2)
+//
+
var requirejs,require,define;(function(e){function h(e,t){return f.call(e,t)}function p(e,t){var n,r,i,s,o,a,f,l,h,p,d,v=t&&t.split("/"),m=u.map,g=m&&m["*"]||{};if(e&&e.charAt(0)===".")if(t){e=e.split("/"),o=e.length-1,u.nodeIdCompat&&c.test(e[o])&&(e[o]=e[o].replace(c,"")),e=v.slice(0,v.length-1).concat(e);for(h=0;h<e.length;h+=1){d=e[h];if(d===".")e.splice(h,1),h-=1;else if(d===".."){if(h===1&&(e[2]===".."||e[0]===".."))break;h>0&&(e.splice(h-1,2),h-=2)}}e=e.join("/")}else e.indexOf("./")===0&&(e=e.substring(2));if((v||g)&&m){n=e.split("/");for(h=n.length;h>0;h-=1){r=n.slice(0,h).join("/");if(v)for(p=v.length;p>0;p-=1){i=m[v.slice(0,p).join("/")];if(i){i=i[r];if(i){s=i,a=h;break}}}if(s)break;!f&&g&&g[r]&&(f=g[r],l=h)}!s&&f&&(s=f,a=l),s&&(n.splice(0,a,s),e=n.join("/"))}return e}function d(t,r){return function(){var i=l.call(arguments,0);return typeof i[0]!="string"&&i.length===1&&i.push(null),n.apply(e,i.concat([t,r]))}}function v(e){return function(t){return p(t,e)}}function m(e){return function(t){s[e]=t}}function g(n){if(h(o,n)){var r=o[n];delete o[n],a[n]=!0,t.apply(e,r)}if(!h(s,n)&&!h(a,n))throw new Error("No "+n);return s[n]}function y(e){var t,n=e?e.indexOf("!"):-1;return n>-1&&(t=e.substring(0,n),e=e.substring(n+1,e.length)),[t,e]}function b(e){return function(){return u&&u.config&&u.config[e]||{}}}var t,n,r,i,s={},o={},u={},a={},f=Object.prototype.hasOwnProperty,l=[].slice,c=/\.js$/;r=function(e,t){var n,r=y(e),i=r[0];return e=r[1],i&&(i=p(i,t),n=g(i)),i?n&&n.normalize?e=n.normalize(e,v(t)):e=p(e,t):(e=p(e,t),r=y(e),i=r[0],e=r[1],i&&(n=g(i))),{f:i?i+"!"+e:e,n:e,pr:i,p:n}},i={require:function(e){return d(e)},exports:function(e){var t=s[e];return typeof t!="undefined"?t:s[e]={}},module:function(e){return{id:e,uri:"",exports:s[e],config:b(e)}}},t=function(t,n,u,f){var l,c,p,v,y,b=[],w=typeof u,E;f=f||t;if(w==="undefined"||w==="function"){n=!n.length&&u.length?["require","exports","module"]:n;for(y=0;y<n.length;y+=1){v=r(n[y],f),c=v.f;if(c==="require")b[y]=i.require(t);else if(c==="exports")b[y]=i.exports(t),E=!0;else if(c==="module")l=b[y]=i.module(t);else if(h(s,c)||h(o,c)||h(a,c))b[y]=g(c);else{if(!v.p)throw new Error(t+" missing "+c);v.p.load(v.n,d(f,!0),m(c),{}),b[y]=s[c]}}p=u?u.apply(s[t],b):undefined;if(t)if(l&&l.exports!==e&&l.exports!==s[t])s[t]=l.exports;else if(p!==e||!E)s[t]=p}else t&&(s[t]=u)},requirejs=require=n=function(s,o,a,f,l){if(typeof s=="string")return i[s]?i[s](o):g(r(s,o).f);if(!s.splice){u=s,u.deps&&n(u.deps,u.callback);if(!o)return;o.splice?(s=o,o=a,a=null):s=e}return o=o||function(){},typeof a=="function"&&(a=f,f=l),f?t(e,s,o,a):setTimeout(function(){t(e,s,o,a)},4),n},n.config=function(e){return n(e)},requirejs._defined=s,define=function(e,t,n){if(typeof e!="string")throw new Error("See almond README: incorrect module build, no module name");t.splice||(n=t,t=[]),!h(s,e)&&!h(o,e)&&(o[e]=[e,t,n])},define.amd={jQuery:!0}})(),define("components/almond/almond.js",function(){}),function(e,t){typeof module=="object"&&typeof module.exports=="object"?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}(typeof window!="undefined"?window:this,function(e,t){function y(e){var t=e.length,n=p.type(e);return n==="function"||p.isWindow(e)?!1:e.nodeType===1&&t?!0:n==="array"||t===0||typeof t=="number"&&t>0&&t-1 in e}function x(e,t,n){if(p.isFunction(t))return p.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return p.grep(e,function(e){return e===t!==n});if(typeof t=="string"){if(S.test(t))return p.filter(t,e,n);t=p.filter(t,e)}return p.grep(e,function(e){return p.inArray(e,t)>=0!==n})}function O(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function D(e){var t=_[e]={};return p.each(e.match(M)||[],function(e,n){t[n]=!0}),t}function H(){N.addEventListener?(N.removeEventListener("DOMContentLoaded",B,!1),e.removeEventListener("load",B,!1)):(N.detachEvent("onreadystatechange",B),e.detachEvent("onload",B))}function B(){if(N.addEventListener||event.type==="load"||N.readyState==="complete")H(),p.ready()}function R(e,t,n){if(n===undefined&&e.nodeType===1){var r="data-"+t.replace(q,"-$1").toLowerCase();n=e.getAttribute(r);if(typeof n=="string"){try{n=n==="true"?!0:n==="false"?!1:n==="null"?null:+n+""===n?+n:I.test(n)?p.parseJSON(n):n}catch(i){}p.data(e,t,n)}else n=undefined}return n}function U(e){var t;for(t in e){if(t==="data"&&p.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function z(e,t,r,i){if(!p.acceptData(e))return;var s,o,u=p.expando,a=e.nodeType,f=a?p.cache:e,l=a?e[u]:e[u]&&u;if((!l||!f[l]||!i&&!f[l].data)&&r===undefined&&typeof t=="string")return;l||(a?l=e[u]=n.pop()||p.guid++:l=u),f[l]||(f[l]=a?{}:{toJSON:p.noop});if(typeof t=="object"||typeof t=="function")i?f[l]=p.extend(f[l],t):f[l].data=p.extend(f[l].data,t);return o=f[l],i||(o.data||(o.data={}),o=o.data),r!==undefined&&(o[p.camelCase(t)]=r),typeof t=="string"?(s=o[t],s==null&&(s=o[p.camelCase(t)])):s=o,s}function W(e,t,n){if(!p.acceptData(e))return;var r,i,s=e.nodeType,o=s?p.cache:e,u=s?e[p.expando]:p.expando;if(!o[u])return;if(t){r=n?o[u]:o[u].data;if(r){p.isArray(t)?t=t.concat(p.map(t,p.camelCase)):t in r?t=[t]:(t=p.camelCase(t),t in r?t=[t]:t=t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!U(r):!p.isEmptyObject(r))return}}if(!n){delete o[u].data;if(!U(o[u]))return}s?p.cleanData([e],!0):c.deleteExpando||o!=o.window?delete o[u]:o[u]=null}function tt(){return!0}function nt(){return!1}function rt(){try{return N.activeElement}catch(e){}}function it(e){var t=st.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Et(e,t){var n,r,i=0,s=typeof e.getElementsByTagName!==j?e.getElementsByTagName(t||"*"):typeof e.querySelectorAll!==j?e.querySelectorAll(t||"*"):undefined;if(!s)for(s=[],n=e.childNodes||e;(r=n[i])!=null;i++)!t||p.nodeName(r,t)?s.push(r):p.merge(s,Et(r,t));return t===undefined||t&&p.nodeName(e,t)?p.merge([e],s):s}function St(e){K.test(e.type)&&(e.defaultChecked=e.checked)}function xt(e,t){return p.nodeName(e,"table")&&p.nodeName(t.nodeType!==11?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Tt(e){return e.type=(p.find.attr(e,"type")!==null)+"/"+e.type,e}function Nt(e){var t=mt.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Ct(e,t){var n,r=0;for(;(n=e[r])!=null;r++)p._data(n,"globalEval",!t||p._data(t[r],"globalEval"))}function kt(e,t){if(t.nodeType!==1||!p.hasData(e))return;var n,r,i,s=p._data(e),o=p._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r<i;r++)p.event.add(t,n,u[n][r])}o.data&&(o.data=p.extend({},o.data))}function Lt(e,t){var n,r,i;if(t.nodeType!==1)return;n=t.nodeName.toLowerCase();if(!c.noCloneEvent&&t[p.expando]){i=p._data(t);for(r in i.events)p.removeEvent(t,r,i.handle);t.removeAttribute(p.expando)}if(n==="script"&&t.text!==e.text)Tt(t).text=e.text,Nt(t);else if(n==="object")t.parentNode&&(t.outerHTML=e.outerHTML),c.html5Clone&&e.innerHTML&&!p.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML);else if(n==="input"&&K.test(e.type))t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value);else if(n==="option")t.defaultSelected=t.selected=e.defaultSelected;else if(n==="input"||n==="textarea")t.defaultValue=e.defaultValue}function Mt(t,n){var r=p(n.createElement(t)).appendTo(n.body),i=e.getDefaultComputedStyle?e.getDefaultComputedStyle(r[0]).display:p.css(r[0],"display");return r.detach(),i}function _t(e){var t=N,n=Ot[e];if(!n){n=Mt(e,t);if(n==="none"||!n)At=(At||p("<iframe frameborder='0' width='0' height='0'/>")).appendTo(t.documentElement),t=(At[0].contentWindow||At[0].contentDocument).document,t.write(),t.close(),n=Mt(e,t),At.detach();Ot[e]=n}return n}function Ft(e,t){return{get:function(){var n=e();if(n==null)return;if(n){delete this.get;return}return(this.get=t).apply(this,arguments)}}}function $t(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Vt.length;while(i--){t=Vt[i]+n;if(t in e)return t}return r}function Jt(e,t){var n,r,i,s=[],o=0,u=e.length;for(;o<u;o++){r=e[o];if(!r.style)continue;s[o]=p._data(r,"olddisplay"),n=r.style.display,t?(!s[o]&&n==="none"&&(r.style.display=""),r.style.display===""&&$(r)&&(s[o]=p._data(r,"olddisplay",_t(r.nodeName)))):s[o]||(i=$(r),(n&&n!=="none"||!i)&&p._data(r,"olddisplay",i?n:p.css(r,"display")))}for(o=0;o<u;o++){r=e[o];if(!r.style)continue;if(!t||r.style.display==="none"||r.style.display==="")r.style.display=t?s[o]||"":"none"}return e}function Kt(e,t,n){var r=Ut.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function Qt(e,t,n,r,i){var s=n===(r?"border":"content")?4:t==="width"?1:0,o=0;for(;s<4;s+=2)n==="margin"&&(o+=p.css(e,n+V[s],!0,i)),r?(n==="content"&&(o-=p.css(e,"padding"+V[s],!0,i)),n!=="margin"&&(o-=p.css(e,"border"+V[s]+"Width",!0,i))):(o+=p.css(e,"padding"+V[s],!0,i),n!=="padding"&&(o+=p.css(e,"border"+V[s]+"Width",!0,i)));return o}function Gt(e,t,n){var r=!0,i=t==="width"?e.offsetWidth:e.offsetHeight,s=Ht(e),o=c.boxSizing()&&p.css(e,"boxSizing",!1,s)==="border-box";if(i<=0||i==null){i=Bt(e,t,s);if(i<0||i==null)i=e.style[t];if(Pt.test(i))return i;r=o&&(c.boxSizingReliable()||i===e.style[t]),i=parseFloat(i)||0}return i+Qt(e,t,n||(o?"border":"content"),r,s)+"px"}function Yt(e,t,n,r,i){return new Yt.prototype.init(e,t,n,r,i)}function un(){return setTimeout(function(){Zt=undefined}),Zt=p.now()}function an(e,t){var n,r={height:e},i=0;t=t?1:0;for(;i<4;i+=2-t)n=V[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function fn(e,t,n){var r,i=(on[t]||[]).concat(on["*"]),s=0,o=i.length;for(;s<o;s++)if(r=i[s].call(n,t,e))return r}function ln(e,t,n){var r,i,s,o,u,a,f,l,h=this,d={},v=e.style,m=e.nodeType&&$(e),g=p._data(e,"fxshow");n.queue||(u=p._queueHooks(e,"fx"),u.unqueued==null&&(u.unqueued=0,a=u.empty.fire,u.empty.fire=function(){u.unqueued||a()}),u.unqueued++,h.always(function(){h.always(function(){u.unqueued--,p.queue(e,"fx").length||u.empty.fire()})})),e.nodeType===1&&("height"in t||"width"in t)&&(n.overflow=[v.overflow,v.overflowX,v.overflowY],f=p.css(e,"display"),l=_t(e.nodeName),f==="none"&&(f=l),f==="inline"&&p.css(e,"float")==="none"&&(!c.inlineBlockNeedsLayout||l==="inline"?v.display="inline-block":v.zoom=1)),n.overflow&&(v.overflow="hidden",c.shrinkWrapBlocks()||h.always(function(){v.overflow=n.overflow[0],v.overflowX=n.overflow[1],v.overflowY=n.overflow[2]}));for(r in t){i=t[r];if(tn.exec(i)){delete t[r],s=s||i==="toggle";if(i===(m?"hide":"show")){if(i!=="show"||!g||g[r]===undefined)continue;m=!0}d[r]=g&&g[r]||p.style(e,r)}}if(!p.isEmptyObject(d)){g?"hidden"in g&&(m=g.hidden):g=p._data(e,"fxshow",{}),s&&(g.hidden=!m),m?p(e).show():h.done(function(){p(e).hide()}),h.done(function(){var t;p._removeData(e,"fxshow");for(t in d)p.style(e,t,d[t])});for(r in d)o=fn(m?g[r]:0,r,h),r in g||(g[r]=o.start,m&&(o.end=o.start,o.start=r==="width"||r==="height"?1:0))}}function cn(e,t){var n,r,i,s,o;for(n in e){r=p.camelCase(n),i=t[r],s=e[n],p.isArray(s)&&(i=s[1],s=e[n]=s[0]),n!==r&&(e[r]=s,delete e[n]),o=p.cssHooks[r];if(o&&"expand"in o){s=o.expand(s),delete e[r];for(n in s)n in e||(e[n]=s[n],t[n]=i)}else t[r]=i}}function hn(e,t,n){var r,i,s=0,o=sn.length,u=p.Deferred().always(function(){delete a.elem}),a=function(){if(i)return!1;var t=Zt||un(),n=Math.max(0,f.startTime+f.duration-t),r=n/f.duration||0,s=1-r,o=0,a=f.tweens.length;for(;o<a;o++)f.tweens[o].run(s);return u.notifyWith(e,[f,s,n]),s<1&&a?n:(u.resolveWith(e,[f]),!1)},f=u.promise({elem:e,props:p.extend({},t),opts:p.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Zt||un(),duration:n.duration,tweens:[],createTween:function(t,n){var r=p.Tween(e,f.opts,t,n,f.opts.specialEasing[t]||f.opts.easing);return f.tweens.push(r),r},stop:function(t){var n=0,r=t?f.tweens.length:0;if(i)return this;i=!0;for(;n<r;n++)f.tweens[n].run(1);return t?u.resolveWith(e,[f,t]):u.rejectWith(e,[f,t]),this}}),l=f.props;cn(l,f.opts.specialEasing);for(;s<o;s++){r=sn[s].call(f,e,l,f.opts);if(r)return r}return p.map(l,fn,f),p.isFunction(f.opts.start)&&f.opts.start.call(e,f),p.fx.timer(p.extend(a,{elem:e,anim:f,queue:f.opts.queue})),f.progress(f.opts.progress).done(f.opts.done,f.opts.complete).fail(f.opts.fail).always(f.opts.always)}function In(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i=0,s=t.toLowerCase().match(M)||[];if(p.isFunction(n))while(r=s[i++])r.charAt(0)==="+"?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,t,n,r){function o(u){var a;return i[u]=!0,p.each(e[u]||[],function(e,u){var f=u(t,n,r);if(typeof f=="string"&&!s&&!i[f])return t.dataTypes.unshift(f),o(f),!1;if(s)return!(a=f)}),a}var i={},s=e===Bn;return o(t.dataTypes[0])||!i["*"]&&o("*")}function Rn(e,t){var n,r,i=p.ajaxSettings.flatOptions||{};for(r in t)t[r]!==undefined&&((i[r]?e:n||(n={}))[r]=t[r]);return n&&p.extend(!0,e,n),e}function Un(e,t,n){var r,i,s,o,u=e.contents,a=e.dataTypes;while(a[0]==="*")a.shift(),i===undefined&&(i=e.mimeType||t.getResponseHeader("Content-Type"));if(i)for(o in u)if(u[o]&&u[o].test(i)){a.unshift(o);break}if(a[0]in n)s=a[0];else{for(o in n){if(!a[0]||e.converters[o+" "+a[0]]){s=o;break}r||(r=o)}s=s||r}if(s)return s!==a[0]&&a.unshift(s),n[s]}function zn(e,t,n,r){var i,s,o,u,a,f={},l=e.dataTypes.slice();if(l[1])for(o in e.converters)f[o.toLowerCase()]=e.converters[o];s=l.shift();while(s){e.responseFields[s]&&(n[e.responseFields[s]]=t),!a&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),a=s,s=l.shift();if(s)if(s==="*")s=a;else if(a!=="*"&&a!==s){o=f[a+" "+s]||f["* "+s];if(!o)for(i in f){u=i.split(" ");if(u[1]===s){o=f[a+" "+u[0]]||f["* "+u[0]];if(o){o===!0?o=f[i]:f[i]!==!0&&(s=u[0],l.unshift(u[1]));break}}}if(o!==!0)if(o&&e["throws"])t=o(t);else try{t=o(t)}catch(c){return{state:"parsererror",error:o?c:"No conversion from "+a+" to "+s}}}}return{state:"success",data:t}}function Kn(e,t,n,r){var i;if(p.isArray(t))p.each(t,function(t,i){n||Xn.test(e)?r(e,i):Kn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&p.type(t)==="object")for(i in t)Kn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Zn(){try{return new e.XMLHttpRequest}catch(t){}}function er(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function sr(e){return p.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:!1}var n=[],r=n.slice,i=n.concat,s=n.push,o=n.indexOf,u={},a=u.toString,f=u.hasOwnProperty,l="".trim,c={},h="1.11.0",p=function(e,t){return new p.fn.init(e,t)},d=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,v=/^-ms-/,m=/-([\da-z])/gi,g=function(e,t){return t.toUpperCase()};p.fn=p.prototype={jquery:h,constructor:p,selector:"",length:0,toArray:function(){return r.call(this)},get:function(e){return e!=null?e<0?this[e+this.length]:this[e]:r.call(this)},pushStack:function(e){var t=p.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return p.each(this,e,t)},map:function(e){return this.pushStack(p.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(r.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:s,sort:n.sort,splice:n.splice},p.extend=p.fn.extend=function(){var e,t,n,r,i,s,o=arguments[0]||{},u=1,a=arguments.length,f=!1;typeof o=="boolean"&&(f=o,o=arguments[u]||{},u++),typeof o!="object"&&!p.isFunction(o)&&(o={}),u===a&&(o=this,u--);for(;u<a;u++)if((i=arguments[u])!=null)for(r in i){e=o[r],n=i[r];if(o===n)continue;f&&n&&(p.isPlainObject(n)||(t=p.isArray(n)))?(t?(t=!1,s=e&&p.isArray(e)?e:[]):s=e&&p.isPlainObject(e)?e:{},o[r]=p.extend(f,s,n)):n!==undefined&&(o[r]=n)}return o},p.extend({expando:"jQuery"+(h+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return p.type(e)==="function"},isArray:Array.isArray||function(e){return p.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return e-parseFloat(e)>=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||p.type(e)!=="object"||e.nodeType||p.isWindow(e))return!1;try{if(e.constructor&&!f.call(e,"constructor")&&!f.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(c.ownLast)for(t in e)return f.call(e,t);for(t in e);return t===undefined||f.call(e,t)},type:function(e){return e==null?e+"":typeof e=="object"||typeof e=="function"?u[a.call(e)]||"object":typeof e},globalEval:function(t){t&&p.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(v,"ms-").replace(m,g)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,s=e.length,o=y(e);if(n)if(o)for(;i<s;i++){r=t.apply(e[i],n);if(r===!1)break}else for(i in e){r=t.apply(e[i],n);if(r===!1)break}else if(o)for(;i<s;i++){r=t.call(e[i],i,e[i]);if(r===!1)break}else for(i in e){r=t.call(e[i],i,e[i]);if(r===!1)break}return e},trim:l&&!l.call(" ")?function(e){return e==null?"":l.call(e)}:function(e){return e==null?"":(e+"").replace(d,"")},makeArray:function(e,t){var n=t||[];return e!=null&&(y(Object(e))?p.merge(n,typeof e=="string"?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(o)return o.call(t,e,n);r=t.length,n=n?n<0?Math.max(0,r+n):n:0;for(;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,t){var n=+t.length,r=0,i=e.length;while(r<n)e[i++]=t[r++];if(n!==n)while(t[r]!==undefined)e[i++]=t[r++];return e.length=i,e},grep:function(e,t,n){var r,i=[],s=0,o=e.length,u=!n;for(;s<o;s++)r=!t(e[s],s),r!==u&&i.push(e[s]);return i},map:function(e,t,n){var r,s=0,o=e.length,u=y(e),a=[];if(u)for(;s<o;s++)r=t(e[s],s,n),r!=null&&a.push(r);else for(s in e)r=t(e[s],s,n),r!=null&&a.push(r);return i.apply([],a)},guid:1,proxy:function(e,t){var n,i,s;return typeof t=="string"&&(s=e[t],t=e,e=s),p.isFunction(e)?(n=r.call(arguments,2),i=function(){return e.apply(t||this,n.concat(r.call(arguments)))},i.guid=e.guid=e.guid||p.guid++,i):undefined},now:function(){return+(new Date)},support:c}),p.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){u["[object "+t+"]"]=t.toLowerCase()});var b=function(e){function rt(e,t,r,i){var s,o,u,a,f,h,v,m,w,E;(t?t.ownerDocument||t:b)!==c&&l(t),t=t||c,r=r||[];if(!e||typeof e!="string")return r;if((a=t.nodeType)!==1&&a!==9)return[];if(p&&!i){if(s=G.exec(e))if(u=s[1]){if(a===9){o=t.getElementById(u);if(!o||!o.parentNode)return r;if(o.id===u)return r.push(o),r}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(u))&&g(t,o)&&o.id===u)return r.push(o),r}else{if(s[2])return _.apply(r,t.getElementsByTagName(e)),r;if((u=s[3])&&n.getElementsByClassName&&t.getElementsByClassName)return _.apply(r,t.getElementsByClassName(u)),r}if(n.qsa&&(!d||!d.test(e))){m=v=y,w=t,E=a===9&&e;if(a===1&&t.nodeName.toLowerCase()!=="object"){h=dt(e),(v=t.getAttribute("id"))?m=v.replace(Z,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",f=h.length;while(f--)h[f]=m+vt(h[f]);w=Y.test(e)&&ht(t.parentNode)||t,E=h.join(",")}if(E)try{return _.apply(r,w.querySelectorAll(E)),r}catch(S){}finally{v||t.removeAttribute("id")}}}return xt(e.replace(R,"$1"),t,r,i)}function it(){function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}var e=[];return t}function st(e){return e[y]=!0,e}function ot(e){var t=c.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ut(e,t){var n=e.split("|"),i=e.length;while(i--)r.attrHandle[n[i]]=t}function at(e,t){var n=t&&e,r=n&&e.nodeType===1&&t.nodeType===1&&(~t.sourceIndex||k)-(~e.sourceIndex||k);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function ct(e){return st(function(t){return t=+t,st(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ht(e){return e&&typeof e.getElementsByTagName!==C&&e}function pt(){}function dt(e,t){var n,i,s,o,u,a,f,l=x[e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=r.preFilter;while(u){if(!n||(i=U.exec(u)))i&&(u=u.slice(i[0].length)||u),a.push(s=[]);n=!1;if(i=z.exec(u))n=i.shift(),s.push({value:n,type:i[0].replace(R," ")}),u=u.slice(n.length);for(o in r.filter)(i=$[o].exec(u))&&(!f[o]||(i=f[o](i)))&&(n=i.shift(),s.push({value:n,type:o,matches:i}),u=u.slice(n.length));if(!n)break}return t?u.length:u?rt.error(e):x(e,a).slice(0)}function vt(e){var t=0,n=e.length,r="";for(;t<n;t++)r+=e[t].value;return r}function mt(e,t,n){var r=t.dir,i=n&&r==="parentNode",s=E++;return t.first?function(t,n,s){while(t=t[r])if(t.nodeType===1||i)return e(t,n,s)}:function(t,n,o){var u,a,f=[w,s];if(o){while(t=t[r])if(t.nodeType===1||i)if(e(t,n,o))return!0}else while(t=t[r])if(t.nodeType===1||i){a=t[y]||(t[y]={});if((u=a[r])&&u[0]===w&&u[1]===s)return f[2]=u[2];a[r]=f;if(f[2]=e(t,n,o))return!0}}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function yt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u<a;u++)if(s=e[u])if(!n||n(s,r,i))o.push(s),f&&t.push(u);return o}function bt(e,t,n,r,i,s){return r&&!r[y]&&(r=bt(r)),i&&!i[y]&&(i=bt(i,s)),st(function(s,o,u,a){var f,l,c,h=[],p=[],d=o.length,v=s||St(t||"*",u.nodeType?[u]:u,[]),m=e&&(s||!t)?yt(v,h,e,u,a):v,g=n?i||(s?e:d||r)?[]:o:m;n&&n(m,g,u,a);if(r){f=yt(g,p),r(f,[],u,a),l=f.length;while(l--)if(c=f[l])g[p[l]]=!(m[p[l]]=c)}if(s){if(i||e){if(i){f=[],l=g.length;while(l--)(c=g[l])&&f.push(m[l]=c);i(null,g=[],f,a)}l=g.length;while(l--)(c=g[l])&&(f=i?P.call(s,c):h[l])>-1&&(s[f]=!(o[f]=c))}}else g=yt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):_.apply(o,g)})}function wt(e){var t,n,i,s=e.length,o=r.relative[e[0].type],a=o||r.relative[" "],f=o?1:0,l=mt(function(e){return e===t},a,!0),c=mt(function(e){return P.call(t,e)>-1},a,!0),h=[function(e,n,r){return!o&&(r||n!==u)||((t=n).nodeType?l(e,n,r):c(e,n,r))}];for(;f<s;f++)if(n=r.relative[e[f].type])h=[mt(gt(h),n)];else{n=r.filter[e[f].type].apply(null,e[f].matches);if(n[y]){i=++f;for(;i<s;i++)if(r.relative[e[i].type])break;return bt(f>1&>(h),f>1&&vt(e.slice(0,f-1).concat({value:e[f-2].type===" "?"*":""})).replace(R,"$1"),n,f<i&&wt(e.slice(f,i)),i<s&&wt(e=e.slice(i)),i<s&&vt(e))}h.push(n)}return gt(h)}function Et(e,t){var n=t.length>0,i=e.length>0,s=function(s,o,a,f,l){var h,p,d,v=0,m="0",g=s&&[],y=[],b=u,E=s||i&&r.find.TAG("*",l),S=w+=b==null?1:Math.random()||.1,x=E.length;l&&(u=o!==c&&o);for(;m!==x&&(h=E[m])!=null;m++){if(i&&h){p=0;while(d=e[p++])if(d(h,o,a)){f.push(h);break}l&&(w=S)}n&&((h=!d&&h)&&v--,s&&g.push(h))}v+=m;if(n&&m!==v){p=0;while(d=t[p++])d(g,y,o,a);if(s){if(v>0)while(m--)!g[m]&&!y[m]&&(y[m]=O.call(f));y=yt(y)}_.apply(f,y),l&&!s&&y.length>0&&v+t.length>1&&rt.uniqueSort(f)}return l&&(w=S,u=b),g};return n?st(s):s}function St(e,t,n){var r=0,i=t.length;for(;r<i;r++)rt(e,t[r],n);return n}function xt(e,t,i,s){var u,a,f,l,c,h=dt(e);if(!s&&h.length===1){a=h[0]=h[0].slice(0);if(a.length>2&&(f=a[0]).type==="ID"&&n.getById&&t.nodeType===9&&p&&r.relative[a[1].type]){t=(r.find.ID(f.matches[0].replace(et,tt),t)||[])[0];if(!t)return i;e=e.slice(a.shift().value.length)}u=$.needsContext.test(e)?0:a.length;while(u--){f=a[u];if(r.relative[l=f.type])break;if(c=r.find[l])if(s=c(f.matches[0].replace(et,tt),Y.test(a[0].type)&&ht(t.parentNode)||t)){a.splice(u,1),e=s.length&&vt(a);if(!e)return _.apply(i,s),i;break}}}return o(e,h)(s,t,!p,i,Y.test(e)&&ht(t.parentNode)||t),i}var t,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y="sizzle"+ -(new Date),b=e.document,w=0,E=0,S=it(),x=it(),T=it(),N=function(e,t){return e===t&&(f=!0),0},C=typeof undefined,k=1<<31,L={}.hasOwnProperty,A=[],O=A.pop,M=A.push,_=A.push,D=A.slice,P=A.indexOf||function(e){var t=0,n=this.length;for(;t<n;t++)if(this[t]===e)return t;return-1},H="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",B="[\\x20\\t\\r\\n\\f]",j="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",F=j.replace("w","w#"),I="\\["+B+"*("+j+")"+B+"*(?:([*^$|!~]?=)"+B+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+F+")|)|)"+B+"*\\]",q=":("+j+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+I.replace(3,8)+")*)|.*)\\)|)",R=new RegExp("^"+B+"+|((?:^|[^\\\\])(?:\\\\.)*)"+B+"+$","g"),U=new RegExp("^"+B+"*,"+B+"*"),z=new RegExp("^"+B+"*([>+~]|"+B+")"+B+"*"),W=new RegExp("="+B+"*([^\\]'\"]*?)"+B+"*\\]","g"),X=new RegExp(q),V=new RegExp("^"+F+"$"),$={ID:new RegExp("^#("+j+")"),CLASS:new RegExp("^\\.("+j+")"),TAG:new RegExp("^("+j.replace("w","w*")+")"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+B+"*(even|odd|(([+-]|)(\\d*)n|)"+B+"*(?:([+-]|)"+B+"*(\\d+)|))"+B+"*\\)|)","i"),bool:new RegExp("^(?:"+H+")$","i"),needsContext:new RegExp("^"+B+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+B+"*((?:-\\d)?\\d*)"+B+"*\\)|)(?=[^-]|$)","i")},J=/^(?:input|select|textarea|button)$/i,K=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,G=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Y=/[+~]/,Z=/'|\\/g,et=new RegExp("\\\\([\\da-f]{1,6}"+B+"?|("+B+")|.)","ig"),tt=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,r&1023|56320)};try{_.apply(A=D.call(b.childNodes),b.childNodes),A[b.childNodes.length].nodeType}catch(nt){_={apply:A.length?function(e,t){M.apply(e,D.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}n=rt.support={},s=rt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},l=rt.setDocument=function(e){var t,i=e?e.ownerDocument||e:b,o=i.defaultView;if(i===c||i.nodeType!==9||!i.documentElement)return c;c=i,h=i.documentElement,p=!s(i),o&&o!==o.top&&(o.addEventListener?o.addEventListener("unload",function(){l()},!1):o.attachEvent&&o.attachEvent("onunload",function(){l()})),n.attributes=ot(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ot(function(e){return e.appendChild(i.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(i.getElementsByClassName)&&ot(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",e.getElementsByClassName("i").length===2}),n.getById=ot(function(e){return h.appendChild(e).id=y,!i.getElementsByName||!i.getElementsByName(y).length}),n.getById?(r.find.ID=function(e,t){if(typeof t.getElementById!==C&&p){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},r.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(delete r.find.ID,r.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==C&&e.getAttributeNode("id");return n&&n.value===t}}),r.find.TAG=n.getElementsByTagName?function(e,t){if(typeof t.getElementsByTagName!==C)return t.getElementsByTagName(e)}:function(e,t){var n,r=[],i=0,s=t.getElementsByTagName(e);if(e==="*"){while(n=s[i++])n.nodeType===1&&r.push(n);return r}return s},r.find.CLASS=n.getElementsByClassName&&function(e,t){if(typeof t.getElementsByClassName!==C&&p)return t.getElementsByClassName(e)},v=[],d=[];if(n.qsa=Q.test(i.querySelectorAll))ot(function(e){e.innerHTML="<select t=''><option selected=''></option></select>",e.querySelectorAll("[t^='']").length&&d.push("[*^$]="+B+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||d.push("\\["+B+"*(?:value|"+H+")"),e.querySelectorAll(":checked").length||d.push(":checked")}),ot(function(e){var t=i.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&d.push("name"+B+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||d.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),d.push(",.*:")});return(n.matchesSelector=Q.test(m=h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ot(function(e){n.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),v.push("!=",q)}),d=d.length&&new RegExp(d.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),g=t||Q.test(h.contains)?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!r&&r.nodeType===1&&!!(n.contains?n.contains(r):e.compareDocumentPosition&&e.compareDocumentPosition(r)&16)}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},N=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r?r:(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,r&1||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===i||e.ownerDocument===b&&g(b,e)?-1:t===i||t.ownerDocument===b&&g(b,t)?1:a?P.call(a,e)-P.call(a,t):0:r&4?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,s=e.parentNode,o=t.parentNode,u=[e],l=[t];if(!s||!o)return e===i?-1:t===i?1:s?-1:o?1:a?P.call(a,e)-P.call(a,t):0;if(s===o)return at(e,t);n=e;while(n=n.parentNode)u.unshift(n);n=t;while(n=n.parentNode)l.unshift(n);while(u[r]===l[r])r++;return r?at(u[r],l[r]):u[r]===b?-1:l[r]===b?1:0},i},rt.matches=function(e,t){return rt(e,null,null,t)},rt.matchesSelector=function(e,t){(e.ownerDocument||e)!==c&&l(e),t=t.replace(W,"='$1']");if(n.matchesSelector&&p&&(!v||!v.test(t))&&(!d||!d.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&e.document.nodeType!==11)return r}catch(i){}return rt(t,c,null,[e]).length>0},rt.contains=function(e,t){return(e.ownerDocument||e)!==c&&l(e),g(e,t)},rt.attr=function(e,t){(e.ownerDocument||e)!==c&&l(e);var i=r.attrHandle[t.toLowerCase()],s=i&&L.call(r.attrHandle,t.toLowerCase())?i(e,t,!p):undefined;return s!==undefined?s:n.attributes||!p?e.getAttribute(t):(s=e.getAttributeNode(t))&&s.specified?s.value:null},rt.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},rt.uniqueSort=function(e){var t,r=[],i=0,s=0;f=!n.detectDuplicates,a=!n.sortStable&&e.slice(0),e.sort(N);if(f){while(t=e[s++])t===e[s]&&(i=r.push(s));while(i--)e.splice(r[i],1)}return a=null,e},i=rt.getText=function(e){var t,n="",r=0,s=e.nodeType;if(!s)while(t=e[r++])n+=i(t);else if(s===1||s===9||s===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(s===3||s===4)return e.nodeValue;return n},r=rt.selectors={cacheLength:50,createPseudo:st,match:$,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1].slice(0,3)==="nth"?(e[3]||rt.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(e[3]==="even"||e[3]==="odd")),e[5]=+(e[7]+e[8]||e[3]==="odd")):e[3]&&rt.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return $.CHILD.test(e[0])?null:(e[3]&&e[4]!==undefined?e[2]=e[4]:n&&X.test(n)&&(t=dt(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(et,tt).toLowerCase();return e==="*"?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=S[e+" "];return t||(t=new RegExp("(^|"+B+")"+e+"("+B+"|$)"))&&S(e,function(e){return t.test(typeof e.className=="string"&&e.className||typeof e.getAttribute!==C&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=rt.attr(r,e);return i==null?t==="!=":t?(i+="",t==="="?i===n:t==="!="?i!==n:t==="^="?n&&i.indexOf(n)===0:t==="*="?n&&i.indexOf(n)>-1:t==="$="?n&&i.slice(-n.length)===n:t==="~="?(" "+i+" ").indexOf(n)>-1:t==="|="?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var s=e.slice(0,3)!=="nth",o=e.slice(-4)!=="last",u=t==="of-type";return r===1&&i===0?function(e){return!!e.parentNode}:function(t,n,a){var f,l,c,h,p,d,v=s!==o?"nextSibling":"previousSibling",m=t.parentNode,g=u&&t.nodeName.toLowerCase(),b=!a&&!u;if(m){if(s){while(v){c=t;while(c=c[v])if(u?c.nodeName.toLowerCase()===g:c.nodeType===1)return!1;d=v=e==="only"&&!d&&"nextSibling"}return!0}d=[o?m.firstChild:m.lastChild];if(o&&b){l=m[y]||(m[y]={}),f=l[e]||[],p=f[0]===w&&f[1],h=f[0]===w&&f[2],c=p&&m.childNodes[p];while(c=++p&&c&&c[v]||(h=p=0)||d.pop())if(c.nodeType===1&&++h&&c===t){l[e]=[w,p,h];break}}else if(b&&(f=(t[y]||(t[y]={}))[e])&&f[0]===w)h=f[1];else while(c=++p&&c&&c[v]||(h=p=0)||d.pop())if((u?c.nodeName.toLowerCase()===g:c.nodeType===1)&&++h){b&&((c[y]||(c[y]={}))[e]=[w,h]);if(c===t)break}return h-=i,h===r||h%r===0&&h/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||rt.error("unsupported pseudo: "+e);return i[y]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?st(function(e,n){var r,s=i(e,t),o=s.length;while(o--)r=P.call(e,s[o]),e[r]=!(n[r]=s[o])}):function(e){return i(e,0,n)}):i}},pseudos:{not:st(function(e){var t=[],n=[],r=o(e.replace(R,"$1"));return r[y]?st(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:st(function(e){return function(t){return rt(e,t).length>0}}),contains:st(function(e){return function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:st(function(e){return V.test(e||"")||rt.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=p?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||n.indexOf(e+"-")===0;while((t=t.parentNode)&&t.nodeType===1);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===c.activeElement&&(!c.hasFocus||c.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return K.test(e.nodeName)},input:function(e){return J.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},text:function(e){var t;return e.nodeName.toLowerCase()==="input"&&e.type==="text"&&((t=e.getAttribute("type"))==null||t.toLowerCase()==="text")},first:ct(function(){return[0]}),last:ct(function(e,t){return[t-1]}),eq:ct(function(e,t,n){return[n<0?n+t:n]}),even:ct(function(e,t){var n=0;for(;n<t;n+=2)e.push(n);return e}),odd:ct(function(e,t){var n=1;for(;n<t;n+=2)e.push(n);return e}),lt:ct(function(e,t,n){var r=n<0?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ct(function(e,t,n){var r=n<0?n+t:n;for(;++r<t;)e.push(r);return e})}},r.pseudos.nth=r.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})r.pseudos[t]=ft(t);for(t in{submit:!0,reset:!0})r.pseudos[t]=lt(t);return pt.prototype=r.filters=r.pseudos,r.setFilters=new pt,o=rt.compile=function(e,t){var n,r=[],i=[],s=T[e+" "];if(!s){t||(t=dt(e)),n=t.length;while(n--)s=wt(t[n]),s[y]?r.push(s):i.push(s);s=T(e,Et(i,r))}return s},n.sortStable=y.split("").sort(N).join("")===y,n.detectDuplicates=!!f,l(),n.sortDetached=ot(function(e){return e.compareDocumentPosition(c.createElement("div"))&1}),ot(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild.getAttribute("href")==="#"})||ut("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,t.toLowerCase()==="type"?1:2)}),(!n.attributes||!ot(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),e.firstChild.getAttribute("value")===""}))&&ut("value",function(e,t,n){if(!n&&e.nodeName.toLowerCase()==="input")return e.defaultValue}),ot(function(e){return e.getAttribute("disabled")==null})||ut(H,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),rt}(e);p.find=b,p.expr=b.selectors,p.expr[":"]=p.expr.pseudos,p.unique=b.uniqueSort,p.text=b.getText,p.isXMLDoc=b.isXML,p.contains=b.contains;var w=p.expr.match.needsContext,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^.[^:#\[\.,]*$/;p.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),t.length===1&&r.nodeType===1?p.find.matchesSelector(r,e)?[r]:[]:p.find.matches(e,p.grep(t,function(e){return e.nodeType===1}))},p.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if(typeof e!="string")return this.pushStack(p(e).filter(function(){for(t=0;t<i;t++)if(p.contains(r[t],this))return!0}));for(t=0;t<i;t++)p.find(e,r[t],n);return n=this.pushStack(i>1?p.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(x(this,e||[],!1))},not:function(e){return this.pushStack(x(this,e||[],!0))},is:function(e){return!!x(this,typeof e=="string"&&w.test(e)?p(e):e||[],!1).length}});var T,N=e.document,C=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=p.fn.init=function(e,t){var n,r;if(!e)return this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?n=[null,e,null]:n=C.exec(e);if(n&&(n[1]||!t)){if(n[1]){t=t instanceof p?t[0]:t,p.merge(this,p.parseHTML(n[1],t&&t.nodeType?t.ownerDocument||t:N,!0));if(E.test(n[1])&&p.isPlainObject(t))for(n in t)p.isFunction(this[n])?this[n](t[n]):this.attr(n,t[n]);return this}r=N.getElementById(n[2]);if(r&&r.parentNode){if(r.id!==n[2])return T.find(e);this.length=1,this[0]=r}return this.context=N,this.selector=e,this}return!t||t.jquery?(t||T).find(e):this.constructor(t).find(e)}return e.nodeType?(this.context=this[0]=e,this.length=1,this):p.isFunction(e)?typeof T.ready!="undefined"?T.ready(e):e(p):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),p.makeArray(e,this))};k.prototype=p.fn,T=p(N);var L=/^(?:parents|prev(?:Until|All))/,A={children:!0,contents:!0,next:!0,prev:!0};p.extend({dir:function(e,t,n){var r=[],i=e[t];while(i&&i.nodeType!==9&&(n===undefined||i.nodeType!==1||!p(i).is(n)))i.nodeType===1&&r.push(i),i=i[t];return r},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}}),p.fn.extend({has:function(e){var t,n=p(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(p.contains(this,n[t]))return!0})},closest:function(e,t){var n,r=0,i=this.length,s=[],o=w.test(e)||typeof e!="string"?p(e,t||this.context):0;for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(o?o.index(n)>-1:n.nodeType===1&&p.find.matchesSelector(n,e))){s.push(n);break}return this.pushStack(s.length>1?p.unique(s):s)},index:function(e){return e?typeof e=="string"?p.inArray(this[0],p(e)):p.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(p.unique(p.merge(this.get(),p(e,t))))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),p.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return p.dir(e,"parentNode")},parentsUntil:function(e,t,n){return p.dir(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return p.dir(e,"nextSibling")},prevAll:function(e){return p.dir(e,"previousSibling")},nextUntil:function(e,t,n){return p.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return p.dir(e,"previousSibling",n)},siblings:function(e){return p.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return p.sibling(e.firstChild)},contents:function(e){return p.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:p.merge([],e.childNodes)}},function(e,t){p.fn[e]=function(n,r){var i=p.map(this,t,n);return e.slice(-5)!=="Until"&&(r=n),r&&typeof r=="string"&&(i=p.filter(r,i)),this.length>1&&(A[e]||(i=p.unique(i)),L.test(e)&&(i=i.reverse())),this.pushStack(i)}});var M=/\S+/g,_={};p.Callbacks=function(e){e=typeof e=="string"?_[e]||D(e):p.extend({},e);var t,n,r,i,s,o,u=[],a=!e.once&&[],f=function(c){n=e.memory&&c,r=!0,s=o||0,o=0,i=u.length,t=!0;for(;u&&s<i;s++)if(u[s].apply(c[0],c[1])===!1&&e.stopOnFalse){n=!1;break}t=!1,u&&(a?a.length&&f(a.shift()):n?u=[]:l.disable())},l={add:function(){if(u){var r=u.length;(function s(t){p.each(t,function(t,n){var r=p.type(n);r==="function"?(!e.unique||!l.has(n))&&u.push(n):n&&n.length&&r!=="string"&&s(n)})})(arguments),t?i=u.length:n&&(o=r,f(n))}return this},remove:function(){return u&&p.each(arguments,function(e,n){var r;while((r=p.inArray(n,u,r))>-1)u.splice(r,1),t&&(r<=i&&i--,r<=s&&s--)}),this},has:function(e){return e?p.inArray(e,u)>-1:!!u&&!!u.length},empty:function(){return u=[],i=0,this},disable:function(){return u=a=n=undefined,this},disabled:function(){return!u},lock:function(){return a=undefined,n||l.disable(),this},locked:function(){return!a},fireWith:function(e,n){return u&&(!r||a)&&(n=n||[],n=[e,n.slice?n.slice():n],t?a.push(n):f(n)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},p.extend({Deferred:function(e){var t=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return p.Deferred(function(n){p.each(t,function(t,s){var o=p.isFunction(e[t])&&e[t];i[s[1]](function(){var e=o&&o.apply(this,arguments);e&&p.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s[0]+"With"](this===r?n.promise():this,o?[e]:arguments)})}),e=null}).promise()},promise:function(e){return e!=null?p.extend(e,r):r}},i={};return r.pipe=r.then,p.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=function(){return i[s[0]+"With"](this===i?r:this,arguments),this},i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=r.call(arguments),i=n.length,s=i!==1||e&&p.isFunction(e.promise)?i:0,o=s===1?e:p.Deferred(),u=function(e,t,n){return function(i){t[e]=this,n[e]=arguments.length>1?r.call(arguments):i,n===a?o.notifyWith(t,n):--s||o.resolveWith(t,n)}},a,f,l;if(i>1){a=new Array(i),f=new Array(i),l=new Array(i);for(;t<i;t++)n[t]&&p.isFunction(n[t].promise)?n[t].promise().done(u(t,l,n)).fail(o.reject).progress(u(t,f,a)):--s}return s||o.resolveWith(l,n),o.promise()}});var P;p.fn.ready=function(e){return p.ready.promise().done(e),this},p.extend({isReady:!1,readyWait:1,holdReady:function(e){e?p.readyWait++:p.ready(!0)},ready:function(e){if(e===!0?--p.readyWait:p.isReady)return;if(!N.body)return setTimeout(p.ready);p.isReady=!0;if(e!==!0&&--p.readyWait>0)return;P.resolveWith(N,[p]),p.fn.trigger&&p(N).trigger("ready").off("ready")}}),p.ready.promise=function(t){if(!P){P=p.Deferred();if(N.readyState==="complete")setTimeout(p.ready);else if(N.addEventListener)N.addEventListener("DOMContentLoaded",B,!1),e.addEventListener("load",B,!1);else{N.attachEvent("onreadystatechange",B),e.attachEvent("onload",B);var n=!1;try{n=e.frameElement==null&&N.documentElement}catch(r){}n&&n.doScroll&&function i(){if(!p.isReady){try{n.doScroll("left")}catch(e){return setTimeout(i,50)}H(),p.ready()}}()}}return P.promise(t)};var j=typeof undefined,F;for(F in p(c))break;c.ownLast=F!=="0",c.inlineBlockNeedsLayout=!1,p(function(){var e,t,n=N.getElementsByTagName("body")[0];if(!n)return;e=N.createElement("div"),e.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",t=N.createElement("div"),n.appendChild(e).appendChild(t);if(typeof t.style.zoom!==j){t.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1";if(c.inlineBlockNeedsLayout=t.offsetWidth===3)n.style.zoom=1}n.removeChild(e),e=t=null}),function(){var e=N.createElement("div");if(c.deleteExpando==null){c.deleteExpando=!0;try{delete e.test}catch(t){c.deleteExpando=!1}}e=null}(),p.acceptData=function(e){var t=p.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return n!==1&&n!==9?!1:!t||t!==!0&&e.getAttribute("classid")===t};var I=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,q=/([A-Z])/g;p.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?p.cache[e[p.expando]]:e[p.expando],!!e&&!U(e)},data:function(e,t,n){return z(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return z(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)}}),p.fn.extend({data:function(e,t){var n,r,i,s=this[0],o=s&&s.attributes;if(e===undefined){if(this.length){i=p.data(s);if(s.nodeType===1&&!p._data(s,"parsedAttrs")){n=o.length;while(n--)r=o[n].name,r.indexOf("data-")===0&&(r=p.camelCase(r.slice(5)),R(s,r,i[r]));p._data(s,"parsedAttrs",!0)}}return i}return typeof e=="object"?this.each(function(){p.data(this,e)}):arguments.length>1?this.each(function(){p.data(this,e,t)}):s?R(s,e,p.data(s,e)):undefined},removeData:function(e){return this.each(function(){p.removeData(this,e)})}}),p.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=p._data(e,t),n&&(!r||p.isArray(n)?r=p._data(e,t,p.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=p.queue(e,t),r=n.length,i=n.shift(),s=p._queueHooks(e,t),o=function(){p.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return p._data(e,n)||p._data(e,n,{empty:p.Callbacks("once memory").add(function(){p._removeData(e,t+"queue"),p._removeData(e,n)})})}}),p.fn.extend({queue:function(e,t){var n=2;return typeof e!="string"&&(t=e,e="fx",n--),arguments.length<n?p.queue(this[0],e):t===undefined?this:this.each(function(){var n=p.queue(this,e,t);p._queueHooks(this,e),e==="fx"&&n[0]!=="inprogress"&&p.dequeue(this,e)})},dequeue:function(e){return this.each(function(){p.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=p.Deferred(),s=this,o=this.length,u=function(){--r||i.resolveWith(s,[s])};typeof e!="string"&&(t=e,e=undefined),e=e||"fx";while(o--)n=p._data(s[o],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(u));return u(),i.promise(t)}});var X=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,V=["Top","Right","Bottom","Left"],$=function(e,t){return e=t||e,p.css(e,"display")==="none"||!p.contains(e.ownerDocument,e)},J=p.access=function(e,t,n,r,i,s,o){var u=0,a=e.length,f=n==null;if(p.type(n)==="object"){i=!0;for(u in n)p.access(e,t,u,n[u],!0,s,o)}else if(r!==undefined){i=!0,p.isFunction(r)||(o=!0),f&&(o?(t.call(e,r),t=null):(f=t,t=function(e,t,n){return f.call(p(e),n)}));if(t)for(;u<a;u++)t(e[u],n,o?r:r.call(e[u],u,t(e[u],n)))}return i?e:f?t.call(e):a?t(e[0],n):s},K=/^(?:checkbox|radio)$/i;(function(){var e=N.createDocumentFragment(),t=N.createElement("div"),n=N.createElement("input");t.setAttribute("className","t"),t.innerHTML=" <link/><table></table><a href='/a'>a</a>",c.leadingWhitespace=t.firstChild.nodeType===3,c.tbody=!t.getElementsByTagName("tbody").length,c.htmlSerialize=!!t.getElementsByTagName("link").length,c.html5Clone=N.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",n.type="checkbox",n.checked=!0,e.appendChild(n),c.appendChecked=n.checked,t.innerHTML="<textarea>x</textarea>",c.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue,e.appendChild(t),t.innerHTML="<input type='radio' checked='checked' name='t'/>",c.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,c.noCloneEvent=!0,t.attachEvent&&(t.attachEvent("onclick",function(){c.noCloneEvent=!1}),t.cloneNode(!0).click());if(c.deleteExpando==null){c.deleteExpando=!0;try{delete t.test}catch(r){c.deleteExpando=!1}}e=t=n=null})(),function(){var t,n,r=N.createElement("div");for(t in{submit:!0,change:!0,focusin:!0})n="on"+t,(c[t+"Bubbles"]=n in e)||(r.setAttribute(n,"t"),c[t+"Bubbles"]=r.attributes[n].expando===!1);r=null}();var Q=/^(?:input|select|textarea)$/i,G=/^key/,Y=/^(?:mouse|contextmenu)|click/,Z=/^(?:focusinfocus|focusoutblur)$/,et=/^([^.]*)(?:\.(.+)|)$/;p.event={global:{},add:function(e,t,n,r,i){var s,o,u,a,f,l,c,h,d,v,m,g=p._data(e);if(!g)return;n.handler&&(a=n,n=a.handler,i=a.selector),n.guid||(n.guid=p.guid++),(o=g.events)||(o=g.events={}),(l=g.handle)||(l=g.handle=function(e){return typeof p===j||!!e&&p.event.triggered===e.type?undefined:p.event.dispatch.apply(l.elem,arguments)},l.elem=e),t=(t||"").match(M)||[""],u=t.length;while(u--){s=et.exec(t[u])||[],d=m=s[1],v=(s[2]||"").split(".").sort();if(!d)continue;f=p.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=p.event.special[d]||{},c=p.extend({type:d,origType:m,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&p.expr.match.needsContext.test(i),namespace:v.join(".")},a);if(!(h=o[d])){h=o[d]=[],h.delegateCount=0;if(!f.setup||f.setup.call(e,r,v,l)===!1)e.addEventListener?e.addEventListener(d,l,!1):e.attachEvent&&e.attachEvent("on"+d,l)}f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?h.splice(h.delegateCount++,0,c):h.push(c),p.event.global[d]=!0}e=null},remove:function(e,t,n,r,i){var s,o,u,a,f,l,c,h,d,v,m,g=p.hasData(e)&&p._data(e);if(!g||!(l=g.events))return;t=(t||"").match(M)||[""],f=t.length;while(f--){u=et.exec(t[f])||[],d=m=u[1],v=(u[2]||"").split(".").sort();if(!d){for(d in l)p.event.remove(e,d+t[f],n,r,!0);continue}c=p.event.special[d]||{},d=(r?c.delegateType:c.bindType)||d,h=l[d]||[],u=u[2]&&new RegExp("(^|\\.)"+v.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=s=h.length;while(s--)o=h[s],(i||m===o.origType)&&(!n||n.guid===o.guid)&&(!u||u.test(o.namespace))&&(!r||r===o.selector||r==="**"&&o.selector)&&(h.splice(s,1),o.selector&&h.delegateCount--,c.remove&&c.remove.call(e,o));a&&!h.length&&((!c.teardown||c.teardown.call(e,v,g.handle)===!1)&&p.removeEvent(e,d,g.handle),delete l[d])}p.isEmptyObject(l)&&(delete g.handle,p._removeData(e,"events"))},trigger:function(t,n,r,i){var s,o,u,a,l,c,h,d=[r||N],v=f.call(t,"type")?t.type:t,m=f.call(t,"namespace")?t.namespace.split("."):[];u=c=r=r||N;if(r.nodeType===3||r.nodeType===8)return;if(Z.test(v+p.event.triggered))return;v.indexOf(".")>=0&&(m=v.split("."),v=m.shift(),m.sort()),o=v.indexOf(":")<0&&"on"+v,t=t[p.expando]?t:new p.Event(v,typeof t=="object"&&t),t.isTrigger=i?2:3,t.namespace=m.join("."),t.namespace_re=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=undefined,t.target||(t.target=r),n=n==null?[t]:p.makeArray(n,[t]),l=p.event.special[v]||{};if(!i&&l.trigger&&l.trigger.apply(r,n)===!1)return;if(!i&&!l.noBubble&&!p.isWindow(r)){a=l.delegateType||v,Z.test(a+v)||(u=u.parentNode);for(;u;u=u.parentNode)d.push(u),c=u;c===(r.ownerDocument||N)&&d.push(c.defaultView||c.parentWindow||e)}h=0;while((u=d[h++])&&!t.isPropagationStopped())t.type=h>1?a:l.bindType||v,s=(p._data(u,"events")||{})[t.type]&&p._data(u,"handle"),s&&s.apply(u,n),s=o&&u[o],s&&s.apply&&p.acceptData(u)&&(t.result=s.apply(u,n),t.result===!1&&t.preventDefault());t.type=v;if(!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&p.acceptData(r)&&o&&r[v]&&!p.isWindow(r)){c=r[o],c&&(r[o]=null),p.event.triggered=v;try{r[v]()}catch(g){}p.event.triggered=undefined,c&&(r[o]=c)}return t.result},dispatch:function(e){e=p.event.fix(e);var t,n,i,s,o,u=[],a=r.call(arguments),f=(p._data(this,"events")||{})[e.type]||[],l=p.event.special[e.type]||{};a[0]=e,e.delegateTarget=this;if(l.preDispatch&&l.preDispatch.call(this,e)===!1)return;u=p.event.handlers.call(this,e,f),t=0;while((s=u[t++])&&!e.isPropagationStopped()){e.currentTarget=s.elem,o=0;while((i=s.handlers[o++])&&!e.isImmediatePropagationStopped())if(!e.namespace_re||e.namespace_re.test(i.namespace))e.handleObj=i,e.data=i.data,n=((p.event.special[i.origType]||{}).handle||i.handler).apply(s.elem,a),n!==undefined&&(e.result=n)===!1&&(e.preventDefault(),e.stopPropagation())}return l.postDispatch&&l.postDispatch.call(this,e),e.result},handlers:function(e,t){var n,r,i,s,o=[],u=t.delegateCount,a=e.target;if(u&&a.nodeType&&(!e.button||e.type!=="click"))for(;a!=this;a=a.parentNode||this)if(a.nodeType===1&&(a.disabled!==!0||e.type!=="click")){i=[];for(s=0;s<u;s++)r=t[s],n=r.selector+" ",i[n]===undefined&&(i[n]=r.needsContext?p(n,this).index(a)>=0:p.find(n,this,null,[a]).length),i[n]&&i.push(r);i.length&&o.push({elem:a,handlers:i})}return u<t.length&&o.push({elem:this,handlers:t.slice(u)}),o},fix:function(e){if(e[p.expando])return e;var t,n,r,i=e.type,s=e,o=this.fixHooks[i];o||(this.fixHooks[i]=o=Y.test(i)?this.mouseHooks:G.test(i)?this.keyHooks:{}),r=o.props?this.props.concat(o.props):this.props,e=new p.Event(s),t=r.length;while(t--)n=r[t],e[n]=s[n];return e.target||(e.target=s.srcElement||N),e.target.nodeType===3&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,o.filter?o.filter(e,s):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return e.which==null&&(e.which=t.charCode!=null?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,s=t.button,o=t.fromElement;return e.pageX==null&&t.clientX!=null&&(r=e.target.ownerDocument||N,i=r.documentElement,n=r.body,e.pageX=t.clientX+(i&&i.scrollLeft||n&&n.scrollLeft||0)-(i&&i.clientLeft||n&&n.clientLeft||0),e.pageY=t.clientY+(i&&i.scrollTop||n&&n.scrollTop||0)-(i&&i.clientTop||n&&n.clientTop||0)),!e.relatedTarget&&o&&(e.relatedTarget=o===e.target?t.toElement:o),!e.which&&s!==undefined&&(e.which=s&1?1:s&2?3:s&4?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==rt()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){if(this===rt()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if(p.nodeName(this,"input")&&this.type==="checkbox"&&this.click)return this.click(),!1},_default:function(e){return p.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=p.extend(new p.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?p.event.trigger(i,null,t):p.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},p.removeEvent=N.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===j&&(e[r]=null),e.detachEvent(r,n))},p.Event=function(e,t){if(!(this instanceof p.Event))return new p.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.defaultPrevented===undefined&&(e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault())?tt:nt):this.type=e,t&&p.extend(this,t),this.timeStamp=e&&e.timeStamp||p.now(),this[p.expando]=!0},p.Event.prototype={isDefaultPrevented:nt,isPropagationStopped:nt,isImmediatePropagationStopped:nt,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=tt;if(!e)return;e.preventDefault?e.preventDefault():e.returnValue=!1},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=tt;if(!e)return;e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=tt,this.stopPropagation()}},p.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){p.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,s=e.handleObj;if(!i||i!==r&&!p.contains(r,i))e.type=s.origType,n=s.handler.apply(this,arguments),e.type=t;return n}}}),c.submitBubbles||(p.event.special.submit={setup:function(){if(p.nodeName(this,"form"))return!1;p.event.add(this,"click._submit keypress._submit",function(e){var t=e.target,n=p.nodeName(t,"input")||p.nodeName(t,"button")?t.form:undefined;n&&!p._data(n,"submitBubbles")&&(p.event.add(n,"submit._submit",function(e){e._submit_bubble=!0}),p._data(n,"submitBubbles",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&p.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){if(p.nodeName(this,"form"))return!1;p.event.remove(this,"._submit")}}),c.changeBubbles||(p.event.special.change={setup:function(){if(Q.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")p.event.add(this,"propertychange._change",function(e){e.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),p.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),p.event.simulate("change",this,e,!0)});return!1}p.event.add(this,"beforeactivate._change",function(e){var t=e.target;Q.test(t.nodeName)&&!p._data(t,"changeBubbles")&&(p.event.add(t,"change._change",function(e){this.parentNode&&!e.isSimulated&&!e.isTrigger&&p.event.simulate("change",this.parentNode,e,!0)}),p._data(t,"changeBubbles",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||t.type!=="radio"&&t.type!=="checkbox")return e.handleObj.handler.apply(this,arguments)},teardown:function(){return p.event.remove(this,"._change"),!Q.test(this.nodeName)}}),c.focusinBubbles||p.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){p.event.simulate(t,e.target,p.event.fix(e),!0)};p.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=p._data(r,t);i||r.addEventListener(e,n,!0),p._data(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=p._data(r,t)-1;i?p._data(r,t,i):(r.removeEventListener(e,n,!0),p._removeData(r,t))}}}),p.fn.extend({on:function(e,t,n,r,i){var s,o;if(typeof e=="object"){typeof t!="string"&&(n=n||t,t=undefined);for(s in e)this.on(s,t,n,e[s],i);return this}n==null&&r==null?(r=t,n=t=undefined):r==null&&(typeof t=="string"?(r=n,n=undefined):(r=n,n=t,t=undefined));if(r===!1)r=nt;else if(!r)return this;return i===1&&(o=r,r=function(e){return p().off(e),o.apply(this,arguments)},r.guid=o.guid||(o.guid=p.guid++)),this.each(function(){p.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,p(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if(typeof e=="object"){for(i in e)this.off(i,t,e[i]);return this}if(t===!1||typeof t=="function")n=t,t=undefined;return n===!1&&(n=nt),this.each(function(){p.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){p.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return p.event.trigger(e,t,n,!0)}});var st="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ot=/ jQuery\d+="(?:null|\d+)"/g,ut=new RegExp("<(?:"+st+")[\\s/>]","i"),at=/^\s+/,ft=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,lt=/<([\w:]+)/,ct=/<tbody/i,ht=/<|&#?\w+;/,pt=/<(?:script|style|link)/i,dt=/checked\s*(?:[^=]|=\s*.checked.)/i,vt=/^$|\/(?:java|ecma)script/i,mt=/^true\/(.*)/,gt=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,yt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:c.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},bt=it(N),wt=bt.appendChild(N.createElement("div"));yt.optgroup=yt.option,yt.tbody=yt.tfoot=yt.colgroup=yt.caption=yt.thead,yt.th=yt.td,p.extend({clone:function(e,t,n){var r,i,s,o,u,a=p.contains(e.ownerDocument,e);c.html5Clone||p.isXMLDoc(e)||!ut.test("<"+e.nodeName+">")?s=e.cloneNode(!0):(wt.innerHTML=e.outerHTML,wt.removeChild(s=wt.firstChild));if((!c.noCloneEvent||!c.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!p.isXMLDoc(e)){r=Et(s),u=Et(e);for(o=0;(i=u[o])!=null;++o)r[o]&&Lt(i,r[o])}if(t)if(n){u=u||Et(e),r=r||Et(s);for(o=0;(i=u[o])!=null;o++)kt(i,r[o])}else kt(e,s);return r=Et(s,"script"),r.length>0&&Ct(r,!a&&Et(e,"script")),r=u=i=null,s},buildFragment:function(e,t,n,r){var i,s,o,u,a,f,l,h=e.length,d=it(t),v=[],m=0;for(;m<h;m++){s=e[m];if(s||s===0)if(p.type(s)==="object")p.merge(v,s.nodeType?[s]:s);else if(!ht.test(s))v.push(t.createTextNode(s));else{u=u||d.appendChild(t.createElement("div")),a=(lt.exec(s)||["",""])[1].toLowerCase(),l=yt[a]||yt._default,u.innerHTML=l[1]+s.replace(ft,"<$1></$2>")+l[2],i=l[0];while(i--)u=u.lastChild;!c.leadingWhitespace&&at.test(s)&&v.push(t.createTextNode(at.exec(s)[0]));if(!c.tbody){s=a==="table"&&!ct.test(s)?u.firstChild:l[1]==="<table>"&&!ct.test(s)?u:0,i=s&&s.childNodes.length;while(i--)p.nodeName(f=s.childNodes[i],"tbody")&&!f.childNodes.length&&s.removeChild(f)}p.merge(v,u.childNodes),u.textContent="";while(u.firstChild)u.removeChild(u.firstChild);u=d.lastChild}}u&&d.removeChild(u),c.appendChecked||p.grep(Et(v,"input"),St),m=0;while(s=v[m++]){if(r&&p.inArray(s,r)!==-1)continue;o=p.contains(s.ownerDocument,s),u=Et(d.appendChild(s),"script"),o&&Ct(u);if(n){i=0;while(s=u[i++])vt.test(s.type||"")&&n.push(s)}}return u=null,d},cleanData:function(e,t){var r,i,s,o,u=0,a=p.expando,f=p.cache,l=c.deleteExpando,h=p.event.special;for(;(r=e[u])!=null;u++)if(t||p.acceptData(r)){s=r[a],o=s&&f[s];if(o){if(o.events)for(i in o.events)h[i]?p.event.remove(r,i):p.removeEvent(r,i,o.handle);f[s]&&(delete f[s],l?delete r[a]:typeof r.removeAttribute!==j?r.removeAttribute(a):r[a]=null,n.push(s))}}}}),p.fn.extend({text:function(e){return J(this,function(e){return e===undefined?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||N).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var t=xt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var t=xt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?p.filter(e,this):this,i=0;for(;(n=r[i])!=null;i++)!t&&n.nodeType===1&&p.cleanData(Et(n)),n.parentNode&&(t&&p.contains(n.ownerDocument,n)&&Ct(Et(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&p.cleanData(Et(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&p.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return p.clone(this,e,t)})},html:function(e){return J(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined)return t.nodeType===1?t.innerHTML.replace(ot,""):undefined;if(typeof e=="string"&&!pt.test(e)&&(c.htmlSerialize||!ut.test(e))&&(c.leadingWhitespace||!at.test(e))&&!yt[(lt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(ft,"<$1></$2>");try{for(;n<r;n++)t=this[n]||{},t.nodeType===1&&(p.cleanData(Et(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=arguments[0];return this.domManip(arguments,function(t){e=this.parentNode,p.cleanData(Et(this)),e&&e.replaceChild(t,this)}),e&&(e.length||e.nodeType)?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t){e=i.apply([],e);var n,r,s,o,u,a,f=0,l=this.length,h=this,d=l-1,v=e[0],m=p.isFunction(v);if(m||l>1&&typeof v=="string"&&!c.checkClone&&dt.test(v))return this.each(function(n){var r=h.eq(n);m&&(e[0]=v.call(this,n,r.html())),r.domManip(e,t)});if(l){a=p.buildFragment(e,this[0].ownerDocument,!1,this),n=a.firstChild,a.childNodes.length===1&&(a=n);if(n){o=p.map(Et(a,"script"),Tt),s=o.length;for(;f<l;f++)r=a,f!==d&&(r=p.clone(r,!0,!0),s&&p.merge(o,Et(r,"script"))),t.call(this[f],r,f);if(s){u=o[o.length-1].ownerDocument,p.map(o,Nt);for(f=0;f<s;f++)r=o[f],vt.test(r.type||"")&&!p._data(r,"globalEval")&&p.contains(u,r)&&(r.src?p._evalUrl&&p._evalUrl(r.src):p.globalEval((r.text||r.textContent||r.innerHTML||"").replace(gt,"")))}a=n=null}}return this}}),p.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){p.fn[e]=function(e){var n,r=0,i=[],o=p(e),u=o.length-1;for(;r<=u;r++)n=r===u?this:this.clone(!0),p(o[r])[t](n),s.apply(i,n.get());return this.pushStack(i)}});var At,Ot={};(function(){var e,t,n=N.createElement("div"),r="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";n.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",e=n.getElementsByTagName("a")[0],e.style.cssText="float:left;opacity:.5",c.opacity=/^0.5/.test(e.style.opacity),c.cssFloat=!!e.style.cssFloat,n.style.backgroundClip="content-box",n.cloneNode(!0).style.backgroundClip="",c.clearCloneStyle=n.style.backgroundClip==="content-box",e=n=null,c.shrinkWrapBlocks=function(){var e,n,i,s;if(t==null){e=N.getElementsByTagName("body")[0];if(!e)return;s="border:0;width:0;height:0;position:absolute;top:0;left:-9999px",n=N.createElement("div"),i=N.createElement("div"),e.appendChild(n).appendChild(i),t=!1,typeof i.style.zoom!==j&&(i.style.cssText=r+";width:1px;padding:1px;zoom:1",i.innerHTML="<div></div>",i.firstChild.style.width="5px",t=i.offsetWidth!==3),e.removeChild(n),e=n=i=null}return t}})();var Dt=/^margin/,Pt=new RegExp("^("+X+")(?!px)[a-z%]+$","i"),Ht,Bt,jt=/^(top|right|bottom|left)$/;e.getComputedStyle?(Ht=function(e){return e.ownerDocument.defaultView.getComputedStyle(e,null)},Bt=function(e,t,n){var r,i,s,o,u=e.style;return n=n||Ht(e),o=n?n.getPropertyValue(t)||n[t]:undefined,n&&(o===""&&!p.contains(e.ownerDocument,e)&&(o=p.style(e,t)),Pt.test(o)&&Dt.test(t)&&(r=u.width,i=u.minWidth,s=u.maxWidth,u.minWidth=u.maxWidth=u.width=o,o=n.width,u.width=r,u.minWidth=i,u.maxWidth=s)),o===undefined?o:o+""}):N.documentElement.currentStyle&&(Ht=function(e){return e.currentStyle},Bt=function(e,t,n){var r,i,s,o,u=e.style;return n=n||Ht(e),o=n?n[t]:undefined,o==null&&u&&u[t]&&(o=u[t]),Pt.test(o)&&!jt.test(t)&&(r=u.left,i=e.runtimeStyle,s=i&&i.left,s&&(i.left=e.currentStyle.left),u.left=t==="fontSize"?"1em":o,o=u.pixelLeft+"px",u.left=r,s&&(i.left=s)),o===undefined?o:o+""||"auto"}),function(){function l(){var t,n,u=N.getElementsByTagName("body")[0];if(!u)return;t=N.createElement("div"),n=N.createElement("div"),t.style.cssText=a,u.appendChild(t).appendChild(n),n.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;display:block;padding:1px;border:1px;width:4px;margin-top:1%;top:1%",p.swap(u,u.style.zoom!=null?{zoom:1}:{},function(){r=n.offsetWidth===4}),i=!0,s=!1,o=!0,e.getComputedStyle&&(s=(e.getComputedStyle(n,null)||{}).top!=="1%",i=(e.getComputedStyle(n,null)||{width:"4px"}).width==="4px"),u.removeChild(t),n=u=null}var t,n,r,i,s,o,u=N.createElement("div"),a="border:0;width:0;height:0;position:absolute;top:0;left:-9999px",f="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";u.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",t=u.getElementsByTagName("a")[0],t.style.cssText="float:left;opacity:.5",c.opacity=/^0.5/.test(t.style.opacity),c.cssFloat=!!t.style.cssFloat,u.style.backgroundClip="content-box",u.cloneNode(!0).style.backgroundClip="",c.clearCloneStyle=u.style.backgroundClip==="content-box",t=u=null,p.extend(c,{reliableHiddenOffsets:function(){if(n!=null)return n;var e,t,r,i=N.createElement("div"),s=N.getElementsByTagName("body")[0];if(!s)return;return i.setAttribute("className","t"),i.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",e=N.createElement("div"),e.style.cssText=a,s.appendChild(e).appendChild(i),i.innerHTML="<table><tr><td></td><td>t</td></tr></table>",t=i.getElementsByTagName("td"),t[0].style.cssText="padding:0;margin:0;border:0;display:none",r=t[0].offsetHeight===0,t[0].style.display="",t[1].style.display="none",n=r&&t[0].offsetHeight===0,s.removeChild(e),i=s=null,n},boxSizing:function(){return r==null&&l(),r},boxSizingReliable:function(){return i==null&&l(),i},pixelPosition:function(){return s==null&&l(),s},reliableMarginRight:function(){var t,n,r,i;if(o==null&&e.getComputedStyle){t=N.getElementsByTagName("body")[0];if(!t)return;n=N.createElement("div"),r=N.createElement("div"),n.style.cssText=a,t.appendChild(n).appendChild(r),i=r.appendChild(N.createElement("div")),i.style.cssText=r.style.cssText=f,i.style.marginRight=i.style.width="0",r.style.width="1px",o=!parseFloat((e.getComputedStyle(i,null)||{}).marginRight),t.removeChild(n)}return o}})}(),p.swap=function(e,t,n,r){var i,s,o={};for(s in t)o[s]=e.style[s],e.style[s]=t[s];i=n.apply(e,r||[]);for(s in t)e.style[s]=o[s];return i};var It=/alpha\([^)]*\)/i,qt=/opacity\s*=\s*([^)]*)/,Rt=/^(none|table(?!-c[ea]).+)/,Ut=new RegExp("^("+X+")(.*)$","i"),zt=new RegExp("^([+-])=("+X+")","i"),Wt={position:"absolute",visibility:"hidden",display:"block"},Xt={letterSpacing:0,fontWeight:400},Vt=["Webkit","O","Moz","ms"];p.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Bt(e,"opacity");return n===""?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":c.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var i,s,o,u=p.camelCase(t),a=e.style;t=p.cssProps[u]||(p.cssProps[u]=$t(a,u)),o=p.cssHooks[t]||p.cssHooks[u];if(n===undefined)return o&&"get"in o&&(i=o.get(e,!1,r))!==undefined?i:a[t];s=typeof n,s==="string"&&(i=zt.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(p.css(e,t)),s="number");if(n==null||n!==n)return;s==="number"&&!p.cssNumber[u]&&(n+="px"),!c.clearCloneStyle&&n===""&&t.indexOf("background")===0&&(a[t]="inherit");if(!o||!("set"in o)||(n=o.set(e,n,r))!==undefined)try{a[t]="",a[t]=n}catch(f){}},css:function(e,t,n,r){var i,s,o,u=p.camelCase(t);return t=p.cssProps[u]||(p.cssProps[u]=$t(e.style,u)),o=p.cssHooks[t]||p.cssHooks[u],o&&"get"in o&&(s=o.get(e,!0,n)),s===undefined&&(s=Bt(e,t,r)),s==="normal"&&t in Xt&&(s=Xt[t]),n===""||n?(i=parseFloat(s),n===!0||p.isNumeric(i)?i||0:s):s}}),p.each(["height","width"],function(e,t){p.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&Rt.test(p.css(e,"display"))?p.swap(e,Wt,function(){return Gt(e,t,r)}):Gt(e,t,r)},set:function(e,n,r){var i=r&&Ht(e);return Kt(e,n,r?Qt(e,t,r,c.boxSizing()&&p.css(e,"boxSizing",!1,i)==="border-box",i):0)}}}),c.opacity||(p.cssHooks.opacity={get:function(e,t){return qt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=p.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if((t>=1||t==="")&&p.trim(s.replace(It,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(t===""||r&&!r.filter)return}n.filter=It.test(s)?s.replace(It,i):s+" "+i}}),p.cssHooks.marginRight=Ft(c.reliableMarginRight,function(e,t){if(t)return p.swap(e,{display:"inline-block"},Bt,[e,"marginRight"])}),p.each({margin:"",padding:"",border:"Width"},function(e,t){p.cssHooks[e+t]={expand:function(n){var r=0,i={},s=typeof n=="string"?n.split(" "):[n];for(;r<4;r++)i[e+V[r]+t]=s[r]||s[r-2]||s[0];return i}},Dt.test(e)||(p.cssHooks[e+t].set=Kt)}),p.fn.extend({css:function(e,t){return J(this,function(e,t,n){var r,i,s={},o=0;if(p.isArray(t)){r=Ht(e),i=t.length;for(;o<i;o++)s[t[o]]=p.css(e,t[o],!1,r);return s}return n!==undefined?p.style(e,t,n):p.css(e,t)},e,t,arguments.length>1)},show:function(){return Jt(this,!0)},hide:function(){return Jt(this)},toggle:function(e){return typeof e=="boolean"?e?this.show():this.hide():this.each(function(){$(this)?p(this).show():p(this).hide()})}}),p.Tween=Yt,Yt.prototype={constructor:Yt,init:function(e,t,n,r,i,s){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=s||(p.cssNumber[n]?"":"px")},cur:function(){var e=Yt.propHooks[this.prop];return e&&e.get?e.get(this):Yt.propHooks._default.get(this)},run:function(e){var t,n=Yt.propHooks[this.prop];return this.options.duration?this.pos=t=p.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Yt.propHooks._default.set(this),this}},Yt.prototype.init.prototype=Yt.prototype,Yt.propHooks={_default:{get:function(e){var t;return e.elem[e.prop]==null||!!e.elem.style&&e.elem.style[e.prop]!=null?(t=p.css(e.elem,e.prop,""),!t||t==="auto"?0:t):e.elem[e.prop]},set:function(e){p.fx.step[e.prop]?p.fx.step[e.prop](e):e.elem.style&&(e.elem.style[p.cssProps[e.prop]]!=null||p.cssHooks[e.prop])?p.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Yt.propHooks.scrollTop=Yt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},p.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},p.fx=Yt.prototype.init,p.fx.step={};var Zt,en,tn=/^(?:toggle|show|hide)$/,nn=new RegExp("^(?:([+-])=|)("+X+")([a-z%]*)$","i"),rn=/queueHooks$/,sn=[ln],on={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=nn.exec(t),s=i&&i[3]||(p.cssNumber[e]?"":"px"),o=(p.cssNumber[e]||s!=="px"&&+r)&&nn.exec(p.css(n.elem,e)),u=1,a=20;if(o&&o[3]!==s){s=s||o[3],i=i||[],o=+r||1;do u=u||".5",o/=u,p.style(n.elem,e,o+s);while(u!==(u=n.cur()/r)&&u!==1&&--a)}return i&&(o=n.start=+o||+r||0,n.unit=s,n.end=i[1]?o+(i[1]+1)*i[2]:+i[2]),n}]};p.Animation=p.extend(hn,{tweener:function(e,t){p.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r<i;r++)n=e[r],on[n]=on[n]||[],on[n].unshift(t)},prefilter:function(e,t){t?sn.unshift(e):sn.push(e)}}),p.speed=function(e,t,n){var r=e&&typeof e=="object"?p.extend({},e):{complete:n||!n&&t||p.isFunction(e)&&e,duration:e,easing:n&&t||t&&!p.isFunction(t)&&t};r.duration=p.fx.off?0:typeof r.duration=="number"?r.duration:r.duration in p.fx.speeds?p.fx.speeds[r.duration]:p.fx.speeds._default;if(r.queue==null||r.queue===!0)r.queue="fx";return r.old=r.complete,r.complete=function(){p.isFunction(r.old)&&r.old.call(this),r.queue&&p.dequeue(this,r.queue)},r},p.fn.extend({fadeTo:function(e,t,n,r){return this.filter($).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=p.isEmptyObject(e),s=p.speed(t,n,r),o=function(){var t=hn(this,p.extend({},e),s);(i||p._data(this,"finish"))&&t.stop(!0)};return o.finish=o,i||s.queue===!1?this.each(o):this.queue(s.queue,o)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return typeof e!="string"&&(n=t,t=e,e=undefined),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=e!=null&&e+"queueHooks",s=p.timers,o=p._data(this);if(i)o[i]&&o[i].stop&&r(o[i]);else for(i in o)o[i]&&o[i].stop&&rn.test(i)&&r(o[i]);for(i=s.length;i--;)s[i].elem===this&&(e==null||s[i].queue===e)&&(s[i].anim.stop(n),t=!1,s.splice(i,1));(t||!n)&&p.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=p._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],s=p.timers,o=r?r.length:0;n.finish=!0,p.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0);for(t=s.length;t--;)s[t].elem===this&&s[t].queue===e&&(s[t].anim.stop(!0),s.splice(t,1));for(t=0;t<o;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),p.each(["toggle","show","hide"],function(e,t){var n=p.fn[t];p.fn[t]=function(e,r,i){return e==null||typeof e=="boolean"?n.apply(this,arguments):this.animate(an(t,!0),e,r,i)}}),p.each({slideDown:an("show"),slideUp:an("hide"),slideToggle:an("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){p.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),p.timers=[],p.fx.tick=function(){var e,t=p.timers,n=0;Zt=p.now();for(;n<t.length;n++)e=t[n],!e()&&t[n]===e&&t.splice(n--,1);t.length||p.fx.stop(),Zt=undefined},p.fx.timer=function(e){p.timers.push(e),e()?p.fx.start():p.timers.pop()},p.fx.interval=13,p.fx.start=function(){en||(en=setInterval(p.fx.tick,p.fx.interval))},p.fx.stop=function(){clearInterval(en),en=null},p.fx.speeds={slow:600,fast:200,_default:400},p.fn.delay=function(e,t){return e=p.fx?p.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},function(){var e,t,n,r,i=N.createElement("div");i.setAttribute("className","t"),i.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",e=i.getElementsByTagName("a")[0],n=N.createElement("select"),r=n.appendChild(N.createElement("option")),t=i.getElementsByTagName("input")[0],e.style.cssText="top:1px",c.getSetAttribute=i.className!=="t",c.style=/top/.test(e.getAttribute("style")),c.hrefNormalized=e.getAttribute("href")==="/a",c.checkOn=!!t.value,c.optSelected=r.selected,c.enctype=!!N.createElement("form").enctype,n.disabled=!0,c.optDisabled=!r.disabled,t=N.createElement("input"),t.setAttribute("value",""),c.input=t.getAttribute("value")==="",t.value="t",t.setAttribute("type","radio"),c.radioValue=t.value==="t",e=t=n=r=i=null}();var pn=/\r/g;p.fn.extend({val:function(e){var t,n,r,i=this[0];if(!arguments.length){if(i)return t=p.valHooks[i.type]||p.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&(n=t.get(i,"value"))!==undefined?n:(n=i.value,typeof n=="string"?n.replace(pn,""):n==null?"":n);return}return r=p.isFunction(e),this.each(function(n){var i;if(this.nodeType!==1)return;r?i=e.call(this,n,p(this).val()):i=e,i==null?i="":typeof i=="number"?i+="":p.isArray(i)&&(i=p.map(i,function(e){return e==null?"":e+""})),t=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!t||!("set"in t)||t.set(this,i,"value")===undefined)this.value=i})}}),p.extend({valHooks:{option:{get:function(e){var t=p.find.attr(e,"value");return t!=null?t:p.text(e)}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a<u;a++){n=r[a];if((n.selected||a===i)&&(c.optDisabled?!n.disabled:n.getAttribute("disabled")===null)&&(!n.parentNode.disabled||!p.nodeName(n.parentNode,"optgroup"))){t=p(n).val();if(s)return t;o.push(t)}}return o},set:function(e,t){var n,r,i=e.options,s=p.makeArray(t),o=i.length;while(o--){r=i[o];if(p.inArray(p.valHooks.option.get(r),s)>=0)try{r.selected=n=!0}catch(u){r.scrollHeight}else r.selected=!1}return n||(e.selectedIndex=-1),i}}}}),p.each(["radio","checkbox"],function(){p.valHooks[this]={set:function(e,t){if(p.isArray(t))return e.checked=p.inArray(p(e).val(),t)>=0}},c.checkOn||(p.valHooks[this].get=function(e){return e.getAttribute("value")===null?"on":e.value})});var dn,vn,mn=p.expr.attrHandle,gn=/^(?:checked|selected)$/i,yn=c.getSetAttribute,bn=c.input;p.fn.extend({attr:function(e,t){return J(this,p.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){p.removeAttr(this,e)})}}),p.extend({attr:function(e,t,n){var r,i,s=e.nodeType;if(!e||s===3||s===8||s===2)return;if(typeof e.getAttribute===j)return p.prop(e,t,n);if(s!==1||!p.isXMLDoc(e))t=t.toLowerCase(),r=p.attrHooks[t]||(p.expr.match.bool.test(t)?vn:dn);if(n===undefined)return r&&"get"in r&&(i=r.get(e,t))!==null?i:(i=p.find.attr(e,t),i==null?undefined:i);if(n!==null)return r&&"set"in r&&(i=r.set(e,n,t))!==undefined?i:(e.setAttribute(t,n+""),n);p.removeAttr(e,t)},removeAttr:function(e,t){var n,r,i=0,s=t&&t.match(M);if(s&&e.nodeType===1)while(n=s[i++])r=p.propFix[n]||n,p.expr.match.bool.test(n)?bn&&yn||!gn.test(n)?e[r]=!1:e[p.camelCase("default-"+n)]=e[r]=!1:p.attr(e,n,""),e.removeAttribute(yn?n:r)},attrHooks:{type:{set:function(e,t){if(!c.radioValue&&t==="radio"&&p.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}}}),vn={set:function(e,t,n){return t===!1?p.removeAttr(e,n):bn&&yn||!gn.test(n)?e.setAttribute(!yn&&p.propFix[n]||n,n):e[p.camelCase("default-"+n)]=e[n]=!0,n}},p.each(p.expr.match.bool.source.match(/\w+/g),function(e,t){var n=mn[t]||p.find.attr;mn[t]=bn&&yn||!gn.test(t)?function(e,t,r){var i,s;return r||(s=mn[t],mn[t]=i,i=n(e,t,r)!=null?t.toLowerCase():null,mn[t]=s),i}:function(e,t,n){if(!n)return e[p.camelCase("default-"+t)]?t.toLowerCase():null}});if(!bn||!yn)p.attrHooks.value={set:function(e,t,n){if(!p.nodeName(e,"input"))return dn&&dn.set(e,t,n);e.defaultValue=t}};yn||(dn={set:function(e,t,n){var r=e.getAttributeNode(n);r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="";if(n==="value"||t===e.getAttribute(n))return t}},mn.id=mn.name=mn.coords=function(e,t,n){var r;if(!n)return(r=e.getAttributeNode(t))&&r.value!==""?r.value:null},p.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);if(n&&n.specified)return n.value},set:dn.set},p.attrHooks.contenteditable={set:function(e,t,n){dn.set(e,t===""?!1:t,n)}},p.each(["width","height"],function(e,t){p.attrHooks[t]={set:function(e,n){if(n==="")return e.setAttribute(t,"auto"),n}}})),c.style||(p.attrHooks.style={get:function(e){return e.style.cssText||undefined},set:function(e,t){return e.style.cssText=t+""}});var wn=/^(?:input|select|textarea|button|object)$/i,En=/^(?:a|area)$/i;p.fn.extend({prop:function(e,t){return J(this,p.prop,e,t,arguments.length>1)},removeProp:function(e){return e=p.propFix[e]||e,this.each(function(){try{this[e]=undefined,delete this[e]}catch(t){}})}}),p.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(e,t,n){var r,i,s,o=e.nodeType;if(!e||o===3||o===8||o===2)return;return s=o!==1||!p.isXMLDoc(e),s&&(t=p.propFix[t]||t,i=p.propHooks[t]),n!==undefined?i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&"get"in i&&(r=i.get(e,t))!==null?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=p.find.attr(e,"tabindex");return t?parseInt(t,10):wn.test(e.nodeName)||En.test(e.nodeName)&&e.href?0:-1}}}}),c.hrefNormalized||p.each(["href","src"],function(e,t){p.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),c.optSelected||(p.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),p.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){p.propFix[this.toLowerCase()]=this}),c.enctype||(p.propFix.enctype="encoding");var Sn=/[\t\r\n\f]/g;p.fn.extend({addClass:function(e){var t,n,r,i,s,o,u=0,a=this.length,f=typeof e=="string"&&e;if(p.isFunction(e))return this.each(function(t){p(this).addClass(e.call(this,t,this.className))});if(f){t=(e||"").match(M)||[];for(;u<a;u++){n=this[u],r=n.nodeType===1&&(n.className?(" "+n.className+" ").replace(Sn," "):" ");if(r){s=0;while(i=t[s++])r.indexOf(" "+i+" ")<0&&(r+=i+" ");o=p.trim(r),n.className!==o&&(n.className=o)}}}return this},removeClass:function(e){var t,n,r,i,s,o,u=0,a=this.length,f=arguments.length===0||typeof e=="string"&&e;if(p.isFunction(e))return this.each(function(t){p(this).removeClass(e.call(this,t,this.className))});if(f){t=(e||"").match(M)||[];for(;u<a;u++){n=this[u],r=n.nodeType===1&&(n.className?(" "+n.className+" ").replace(Sn," "):"");if(r){s=0;while(i=t[s++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");o=e?p.trim(r):"",n.className!==o&&(n.className=o)}}}return this},toggleClass:function(e,t){var n=typeof e;return typeof t=="boolean"&&n==="string"?t?this.addClass(e):this.removeClass(e):p.isFunction(e)?this.each(function(n){p(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var t,r=0,i=p(this),s=e.match(M)||[];while(t=s[r++])i.hasClass(t)?i.removeClass(t):i.addClass(t)}else if(n===j||n==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||e===!1?"":p._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n<r;n++)if(this[n].nodeType===1&&(" "+this[n].className+" ").replace(Sn," ").indexOf(t)>=0)return!0;return!1}}),p.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){p.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),p.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return arguments.length===1?this.off(e,"**"):this.off(t,e||"**",n)}});var xn=p.now(),Tn=/\?/,Nn=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;p.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=p.trim(t+"");return i&&!p.trim(i.replace(Nn,function(e,t,i,s){return n&&t&&(r=0),r===0?e:(n=i||t,r+=!s-!i,"")}))?Function("return "+i)():p.error("Invalid JSON: "+t)},p.parseXML=function(t){var n,r;if(!t||typeof t!="string")return null;try{e.DOMParser?(r=new DOMParser,n=r.parseFromString(t,"text/xml")):(n=new ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(i){n=undefined}return(!n||!n.documentElement||n.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+t),n};var Cn,kn,Ln=/#.*$/,An=/([?&])_=[^&]*/,On=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,Mn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,_n=/^(?:GET|HEAD)$/,Dn=/^\/\//,Pn=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hn={},Bn={},jn="*/".concat("*");try{kn=location.href}catch(Fn){kn=N.createElement("a"),kn.href="",kn=kn.href}Cn=Pn.exec(kn.toLowerCase())||[],p.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:kn,type:"GET",isLocal:Mn.test(Cn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":jn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Rn(Rn(e,p.ajaxSettings),t):Rn(p.ajaxSettings,e)},ajaxPrefilter:In(Hn),ajaxTransport:In(Bn),ajax:function(e,t){function x(e,t,n,r){var f,g,y,w,S,x=t;if(b===2)return;b=2,o&&clearTimeout(o),a=undefined,s=r||"",E.readyState=e>0?4:0,f=e>=200&&e<300||e===304,n&&(w=Un(l,E,n)),w=zn(l,w,E,f);if(f)l.ifModified&&(S=E.getResponseHeader("Last-Modified"),S&&(p.lastModified[i]=S),S=E.getResponseHeader("etag"),S&&(p.etag[i]=S)),e===204||l.type==="HEAD"?x="nocontent":e===304?x="notmodified":(x=w.state,g=w.data,y=w.error,f=!y);else{y=x;if(e||!x)x="error",e<0&&(e=0)}E.status=e,E.statusText=(t||x)+"",f?d.resolveWith(c,[g,x,E]):d.rejectWith(c,[E,x,y]),E.statusCode(m),m=undefined,u&&h.trigger(f?"ajaxSuccess":"ajaxError",[E,l,f?g:y]),v.fireWith(c,[E,x]),u&&(h.trigger("ajaxComplete",[E,l]),--p.active||p.event.trigger("ajaxStop"))}typeof e=="object"&&(t=e,e=undefined),t=t||{};var n,r,i,s,o,u,a,f,l=p.ajaxSetup({},t),c=l.context||l,h=l.context&&(c.nodeType||c.jquery)?p(c):p.event,d=p.Deferred(),v=p.Callbacks("once memory"),m=l.statusCode||{},g={},y={},b=0,w="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(b===2){if(!f){f={};while(t=On.exec(s))f[t[1].toLowerCase()]=t[2]}t=f[e.toLowerCase()]}return t==null?null:t},getAllResponseHeaders:function(){return b===2?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=y[n]=y[n]||e,g[e]=t),this},overrideMimeType:function(e){return b||(l.mimeType=e),this},statusCode:function(e){var t;if(e)if(b<2)for(t in e)m[t]=[m[t],e[t]];else E.always(e[E.status]);return this},abort:function(e){var t=e||w;return a&&a.abort(t),x(0,t),this}};d.promise(E).complete=v.add,E.success=E.done,E.error=E.fail,l.url=((e||l.url||kn)+"").replace(Ln,"").replace(Dn,Cn[1]+"//"),l.type=t.method||t.type||l.method||l.type,l.dataTypes=p.trim(l.dataType||"*").toLowerCase().match(M)||[""],l.crossDomain==null&&(n=Pn.exec(l.url.toLowerCase()),l.crossDomain=!(!n||n[1]===Cn[1]&&n[2]===Cn[2]&&(n[3]||(n[1]==="http:"?"80":"443"))===(Cn[3]||(Cn[1]==="http:"?"80":"443")))),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),qn(Hn,l,t,E);if(b===2)return E;u=l.global,u&&p.active++===0&&p.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!_n.test(l.type),i=l.url,l.hasContent||(l.data&&(i=l.url+=(Tn.test(i)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=An.test(i)?i.replace(An,"$1_="+xn++):i+(Tn.test(i)?"&":"?")+"_="+xn++)),l.ifModified&&(p.lastModified[i]&&E.setRequestHeader("If-Modified-Since",p.lastModified[i]),p.etag[i]&&E.setRequestHeader("If-None-Match",p.etag[i])),(l.data&&l.hasContent&&l.contentType!==!1||t.contentType)&&E.setRequestHeader("Content-Type",l.contentType),E.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+jn+"; q=0.01":""):l.accepts["*"]);for(r in l.headers)E.setRequestHeader(r,l.headers[r]);if(!l.beforeSend||l.beforeSend.call(c,E,l)!==!1&&b!==2){w="abort";for(r in{success:1,error:1,complete:1})E[r](l[r]);a=qn(Bn,l,t,E);if(!a)x(-1,"No Transport");else{E.readyState=1,u&&h.trigger("ajaxSend",[E,l]),l.async&&l.timeout>0&&(o=setTimeout(function(){E.abort("timeout")},l.timeout));try{b=1,a.send(g,x)}catch(S){if(!(b<2))throw S;x(-1,S)}}return E}return E.abort()},getJSON:function(e,t,n){return p.get(e,t,n,"json")},getScript:function(e,t){return p.get(e,undefined,t,"script")}}),p.each(["get","post"],function(e,t){p[t]=function(e,n,r,i){return p.isFunction(n)&&(i=i||r,r=n,n=undefined),p.ajax({url:e,type:t,dataType:i,data:n,success:r})}}),p.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){p.fn[t]=function(e){return this.on(t,e)}}),p._evalUrl=function(e){return p.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},p.fn.extend({wrapAll:function(e){if(p.isFunction(e))return this.each(function(t){p(this).wrapAll(e.call(this,t))});if(this[0]){var t=p(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return p.isFunction(e)?this.each(function(t){p(this).wrapInner(e.call(this,t))}):this.each(function(){var t=p(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=p.isFunction(e);return this.each(function(n){p(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()}}),p.expr.filters.hidden=function(e){return e.offsetWidth<=0&&e.offsetHeight<=0||!c.reliableHiddenOffsets()&&(e.style&&e.style.display||p.css(e,"display"))==="none"},p.expr.filters.visible=function(e){return!p.expr.filters.hidden(e)};var Wn=/%20/g,Xn=/\[\]$/,Vn=/\r?\n/g,$n=/^(?:submit|button|image|reset|file)$/i,Jn=/^(?:input|select|textarea|keygen)/i;p.param=function(e,t){var n,r=[],i=function(e,t){t=p.isFunction(t)?t():t==null?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};t===undefined&&(t=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(e)||e.jquery&&!p.isPlainObject(e))p.each(e,function(){i(this.name,this.value)});else for(n in e)Kn(n,e[n],t,i);return r.join("&").replace(Wn,"+")},p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=p.prop(this,"elements");return e?p.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!p(this).is(":disabled")&&Jn.test(this.nodeName)&&!$n.test(e)&&(this.checked||!K.test(e))}).map(function(e,t){var n=p(this).val();return n==null?null:p.isArray(n)?p.map(n,function(e){return{name:t.name,value:e.replace(Vn,"\r\n")}}):{name:t.name,value:n.replace(Vn,"\r\n")}}).get()}}),p.ajaxSettings.xhr=e.ActiveXObject!==undefined?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zn()||er()}:Zn;var Qn=0,Gn={},Yn=p.ajaxSettings.xhr();e.ActiveXObject&&p(e).on("unload",function(){for(var e in Gn)Gn[e](undefined,!0)}),c.cors=!!Yn&&"withCredentials"in Yn,Yn=c.ajax=!!Yn,Yn&&p.ajaxTransport(function(e){if(!e.crossDomain||c.cors){var t;return{send:function(n,r){var i,s=e.xhr(),o=++Qn;s.open(e.type,e.url,e.async,e.username,e.password);if(e.xhrFields)for(i in e.xhrFields)s[i]=e.xhrFields[i];e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),!e.crossDomain&&!n["X-Requested-With"]&&(n["X-Requested-With"]="XMLHttpRequest");for(i in n)n[i]!==undefined&&s.setRequestHeader(i,n[i]+"");s.send(e.hasContent&&e.data||null),t=function(n,i){var u,a,f;if(t&&(i||s.readyState===4)){delete Gn[o],t=undefined,s.onreadystatechange=p.noop;if(i)s.readyState!==4&&s.abort();else{f={},u=s.status,typeof s.responseText=="string"&&(f.text=s.responseText);try{a=s.statusText}catch(l){a=""}!u&&e.isLocal&&!e.crossDomain?u=f.text?200:404:u===1223&&(u=204)}}f&&r(u,a,f,s.getAllResponseHeaders())},e.async?s.readyState===4?setTimeout(t):s.onreadystatechange=Gn[o]=t:t()},abort:function(){t&&t(undefined,!0)}}}}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return p.globalEval(e),e}}}),p.ajaxPrefilter("script",function(e){e.cache===undefined&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),p.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=N.head||p("head")[0]||N.documentElement;return{send:function(r,i){t=N.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){if(n||!t.readyState||/loaded|complete/.test(t.readyState))t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success")},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(undefined,!0)}}}});var tr=[],nr=/(=)\?(?=&|$)|\?\?/;p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=tr.pop()||p.expando+"_"+xn++;return this[e]=!0,e}}),p.ajaxPrefilter("json jsonp",function(t,n,r){var i,s,o,u=t.jsonp!==!1&&(nr.test(t.url)?"url":typeof t.data=="string"&&!(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&nr.test(t.data)&&"data");if(u||t.dataTypes[0]==="jsonp")return i=t.jsonpCallback=p.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,u?t[u]=t[u].replace(nr,"$1"+i):t.jsonp!==!1&&(t.url+=(Tn.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return o||p.error(i+" was not called"),o[0]},t.dataTypes[0]="json",s=e[i],e[i]=function(){o=arguments},r.always(function(){e[i]=s,t[i]&&(t.jsonpCallback=n.jsonpCallback,tr.push(i)),o&&p.isFunction(s)&&s(o[0]),o=s=undefined}),"script"}),p.parseHTML=function(e,t,n){if(!e||typeof e!="string")return null;typeof t=="boolean"&&(n=t,t=!1),t=t||N;var r=E.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=p.buildFragment([e],t,i),i&&i.length&&p(i).remove(),p.merge([],r.childNodes))};var rr=p.fn.load;p.fn.load=function(e,t,n){if(typeof e!="string"&&rr)return rr.apply(this,arguments);var r,i,s,o=this,u=e.indexOf(" ");return u>=0&&(r=e.slice(u,e.length),e=e.slice(0,u)),p.isFunction(t)?(n=t,t=undefined):t&&typeof t=="object"&&(s="POST"),o.length>0&&p.ajax({url:e,type:s,dataType:"html",data:t}).done(function(e){i=arguments,o.html(r?p("<div>").append(p.parseHTML(e)).find(r):e)}).complete(n&&function(e,t){o.each(n,i||[e.responseText,t,e])}),this},p.expr.filters.animated=function(e){return p.grep(p.timers,function(t){return e===t.elem}).length};var ir=e.document.documentElement;p.offset={setOffset:function(e,t,n){var r,i,s,o,u,a,f,l=p.css(e,"position"),c=p(e),h={};l==="static"&&(e.style.position="relative"),u=c.offset(),s=p.css(e,"top"),a=p.css(e,"left"),f=(l==="absolute"||l==="fixed")&&p.inArray("auto",[s,a])>-1,f?(r=c.position(),o=r.top,i=r.left):(o=parseFloat(s)||0,i=parseFloat(a)||0),p.isFunction(t)&&(t=t.call(e,n,u)),t.top!=null&&(h.top=t.top-u.top+o),t.left!=null&&(h.left=t.left-u.left+i),"using"in t?t.using.call(e,h):c.css(h)}},p.fn.extend({offset:function(e){if(arguments.length)return e===undefined?this:this.each(function(t){p.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],s=i&&i.ownerDocument;if(!s)return;return t=s.documentElement,p.contains(t,i)?(typeof i.getBoundingClientRect!==j&&(r=i.getBoundingClientRect()),n=sr(s),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r},position:function(){if(!this[0])return;var e,t,n={top:0,left:0},r=this[0];return p.css(r,"position")==="fixed"?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),p.nodeName(e[0],"html")||(n=e.offset()),n.top+=p.css(e[0],"borderTopWidth",!0),n.left+=p.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-p.css(r,"marginTop",!0),left:t.left-n.left-p.css(r,"marginLeft",!0)}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||ir;while(e&&!p.nodeName(e,"html")&&p.css(e,"position")==="static")e=e.offsetParent;return e||ir})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);p.fn[e]=function(r){return J(this,function(e,r,i){var s=sr(e);if(i===undefined)return s?t in s?s[t]:s.document.documentElement[r]:e[r];s?s.scrollTo(n?p(s).scrollLeft():i,n?i:p(s).scrollTop()):e[r]=i},e,r,arguments.length,null)}}),p.each(["top","left"],function(e,t){p.cssHooks[t]=Ft(c.pixelPosition,function(e,n){if(n)return n=Bt(e,t),Pt.test(n)?p(e).position()[t]+"px":n})}),p.each({Height:"height",Width:"width"},function(e,t){p.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){p.fn[r]=function(r,i){var s=arguments.length&&(n||typeof r!="boolean"),o=n||(r===!0||i===!0?"margin":"border");return J(this,function(t,n,r){var i;return p.isWindow(t)?t.document.documentElement["client"+e]:t.nodeType===9?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):r===undefined?p.css(t,n,o):p.style(t,n,r,o)},t,s?r:undefined,s,null)}})}),p.fn.size=function(){return this.length},p.fn.andSelf=p.fn.addBack,typeof define=="function"&&define.amd&&define("jquery",[],function(){return p});var or=e.jQuery,ur=e.$;return p.noConflict=function(t){return e.$===p&&(e.$=ur),t&&e.jQuery===p&&(e.jQuery=or),p},typeof t===j&&(e.jQuery=e.$=p),p}),define("jquery-private",["jquery"],function(e){return e.noConflict(!0)}),function(){function x(e){function t(t,n,r,i,s,o){for(;s>=0&&s<o;s+=e){var u=i?i[s]:s;r=n(r,t[u],u,t)}return r}return function(n,r,i,s){r=v(r,s,4);var o=!S(n)&&d.keys(n),u=(o||n).length,a=e>0?0:u-1;return arguments.length<3&&(i=n[o?o[a]:a],a+=e),t(n,r,i,o,a,u)}}function C(e){return function(t,n,r){n=m(n,r);var i=E(t),s=e>0?0:i-1;for(;s>=0&&s<i;s+=e)if(n(t[s],s,t))return s;return-1}}function k(e,t,n){return function(r,i,s){var u=0,a=E(r);if(typeof s=="number")e>0?u=s>=0?s:Math.max(s+a,u):a=s>=0?Math.min(s+1,a):s+a+1;else if(n&&s&&a)return s=n(r,i),r[s]===i?s:-1;if(i!==i)return s=t(o.call(r,u,a),d.isNaN),s>=0?s+u:-1;for(s=e>0?u:a-1;s>=0&&s<a;s+=e)if(r[s]===i)return s;return-1}}function M(e,t){var n=O.length,i=e.constructor,s=d.isFunction(i)&&i.prototype||r,o="constructor";d.has(e,o)&&!d.contains(t,o)&&t.push(o);while(n--)o=O[n],o in e&&e[o]!==s[o]&&!d.contains(t,o)&&t.push(o)}var e=this,t=e._,n=Array.prototype,r=Object.prototype,i=Function.prototype,s=n.push,o=n.slice,u=r.toString,a=r.hasOwnProperty,f=Array.isArray,l=Object.keys,c=i.bind,h=Object.create,p=function(){},d=function(e){if(e instanceof d)return e;if(!(this instanceof d))return new d(e);this._wrapped=e};typeof exports!="undefined"?(typeof module!="undefined"&&module.exports&&(exports=module.exports=d),exports._=d):e._=d,d.VERSION="1.8.3";var v=function(e,t,n){if(t===void 0)return e;switch(n==null?3:n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)};case 4:return function(n,r,i,s){return e.call(t,n,r,i,s)}}return function(){return e.apply(t,arguments)}},m=function(e,t,n){return e==null?d.identity:d.isFunction(e)?v(e,t,n):d.isObject(e)?d.matcher(e):d.property(e)};d.iteratee=function(e,t){return m(e,t,Infinity)};var g=function(e,t){return function(n){var r=arguments.length;if(r<2||n==null)return n;for(var i=1;i<r;i++){var s=arguments[i],o=e(s),u=o.length;for(var a=0;a<u;a++){var f=o[a];if(!t||n[f]===void 0)n[f]=s[f]}}return n}},y=function(e){if(!d.isObject(e))return{};if(h)return h(e);p.prototype=e;var t=new p;return p.prototype=null,t},b=function(e){return function(t){return t==null?void 0:t[e]}},w=Math.pow(2,53)-1,E=b("length"),S=function(e){var t=E(e);return typeof t=="number"&&t>=0&&t<=w};d.each=d.forEach=function(e,t,n){t=v(t,n);var r,i;if(S(e))for(r=0,i=e.length;r<i;r++)t(e[r],r,e);else{var s=d.keys(e);for(r=0,i=s.length;r<i;r++)t(e[s[r]],s[r],e)}return e},d.map=d.collect=function(e,t,n){t=m(t,n);var r=!S(e)&&d.keys(e),i=(r||e).length,s=Array(i);for(var o=0;o<i;o++){var u=r?r[o]:o;s[o]=t(e[u],u,e)}return s},d.reduce=d.foldl=d.inject=x(1),d.reduceRight=d.foldr=x(-1),d.find=d.detect=function(e,t,n){var r;S(e)?r=d.findIndex(e,t,n):r=d.findKey(e,t,n);if(r!==void 0&&r!==-1)return e[r]},d.filter=d.select=function(e,t,n){var r=[];return t=m(t,n),d.each(e,function(e,n,i){t(e,n,i)&&r.push(e)}),r},d.reject=function(e,t,n){return d.filter(e,d.negate(m(t)),n)},d.every=d.all=function(e,t,n){t=m(t,n);var r=!S(e)&&d.keys(e),i=(r||e).length;for(var s=0;s<i;s++){var o=r?r[s]:s;if(!t(e[o],o,e))return!1}return!0},d.some=d.any=function(e,t,n){t=m(t,n);var r=!S(e)&&d.keys(e),i=(r||e).length;for(var s=0;s<i;s++){var o=r?r[s]:s;if(t(e[o],o,e))return!0}return!1},d.contains=d.includes=d.include=function(e,t,n,r){S(e)||(e=d.values(e));if(typeof n!="number"||r)n=0;return d.indexOf(e,t,n)>=0},d.invoke=function(e,t){var n=o.call(arguments,2),r=d.isFunction(t);return d.map(e,function(e){var i=r?t:e[t];return i==null?i:i.apply(e,n)})},d.pluck=function(e,t){return d.map(e,d.property(t))},d.where=function(e,t){return d.filter(e,d.matcher(t))},d.findWhere=function(e,t){return d.find(e,d.matcher(t))},d.max=function(e,t,n){var r=-Infinity,i=-Infinity,s,o;if(t==null&&e!=null){e=S(e)?e:d.values(e);for(var u=0,a=e.length;u<a;u++)s=e[u],s>r&&(r=s)}else t=m(t,n),d.each(e,function(e,n,s){o=t(e,n,s);if(o>i||o===-Infinity&&r===-Infinity)r=e,i=o});return r},d.min=function(e,t,n){var r=Infinity,i=Infinity,s,o;if(t==null&&e!=null){e=S(e)?e:d.values(e);for(var u=0,a=e.length;u<a;u++)s=e[u],s<r&&(r=s)}else t=m(t,n),d.each(e,function(e,n,s){o=t(e,n,s);if(o<i||o===Infinity&&r===Infinity)r=e,i=o});return r},d.shuffle=function(e){var t=S(e)?e:d.values(e),n=t.length,r=Array(n);for(var i=0,s;i<n;i++)s=d.random(0,i),s!==i&&(r[i]=r[s]),r[s]=t[i];return r},d.sample=function(e,t,n){return t==null||n?(S(e)||(e=d.values(e)),e[d.random(e.length-1)]):d.shuffle(e).slice(0,Math.max(0,t))},d.sortBy=function(e,t,n){return t=m(t,n),d.pluck(d.map(e,function(e,n,r){return{value:e,index:n,criteria:t(e,n,r)}}).sort(function(e,t){var n=e.criteria,r=t.criteria;if(n!==r){if(n>r||n===void 0)return 1;if(n<r||r===void 0)return-1}return e.index-t.index}),"value")};var T=function(e){return function(t,n,r){var i={};return n=m(n,r),d.each(t,function(r,s){var o=n(r,s,t);e(i,r,o)}),i}};d.groupBy=T(function(e,t,n){d.has(e,n)?e[n].push(t):e[n]=[t]}),d.indexBy=T(function(e,t,n){e[n]=t}),d.countBy=T(function(e,t,n){d.has(e,n)?e[n]++:e[n]=1}),d.toArray=function(e){return e?d.isArray(e)?o.call(e):S(e)?d.map(e,d.identity):d.values(e):[]},d.size=function(e){return e==null?0:S(e)?e.length:d.keys(e).length},d.partition=function(e,t,n){t=m(t,n);var r=[],i=[];return d.each(e,function(e,n,s){(t(e,n,s)?r:i).push(e)}),[r,i]},d.first=d.head=d.take=function(e,t,n){return e==null?void 0:t==null||n?e[0]:d.initial(e,e.length-t)},d.initial=function(e,t,n){return o.call(e,0,Math.max(0,e.length-(t==null||n?1:t)))},d.last=function(e,t,n){return e==null?void 0:t==null||n?e[e.length-1]:d.rest(e,Math.max(0,e.length-t))},d.rest=d.tail=d.drop=function(e,t,n){return o.call(e,t==null||n?1:t)},d.compact=function(e){return d.filter(e,d.identity)};var N=function(e,t,n,r){var i=[],s=0;for(var o=r||0,u=E(e);o<u;o++){var a=e[o];if(S(a)&&(d.isArray(a)||d.isArguments(a))){t||(a=N(a,t,n));var f=0,l=a.length;i.length+=l;while(f<l)i[s++]=a[f++]}else n||(i[s++]=a)}return i};d.flatten=function(e,t){return N(e,t,!1)},d.without=function(e){return d.difference(e,o.call(arguments,1))},d.uniq=d.unique=function(e,t,n,r){d.isBoolean(t)||(r=n,n=t,t=!1),n!=null&&(n=m(n,r));var i=[],s=[];for(var o=0,u=E(e);o<u;o++){var a=e[o],f=n?n(a,o,e):a;t?((!o||s!==f)&&i.push(a),s=f):n?d.contains(s,f)||(s.push(f),i.push(a)):d.contains(i,a)||i.push(a)}return i},d.union=function(){return d.uniq(N(arguments,!0,!0))},d.intersection=function(e){var t=[],n=arguments.length;for(var r=0,i=E(e);r<i;r++){var s=e[r];if(d.contains(t,s))continue;for(var o=1;o<n;o++)if(!d.contains(arguments[o],s))break;o===n&&t.push(s)}return t},d.difference=function(e){var t=N(arguments,!0,!0,1);return d.filter(e,function(e){return!d.contains(t,e)})},d.zip=function(){return d.unzip(arguments)},d.unzip=function(e){var t=e&&d.max(e,E).length||0,n=Array(t);for(var r=0;r<t;r++)n[r]=d.pluck(e,r);return n},d.object=function(e,t){var n={};for(var r=0,i=E(e);r<i;r++)t?n[e[r]]=t[r]:n[e[r][0]]=e[r][1];return n},d.findIndex=C(1),d.findLastIndex=C(-1),d.sortedIndex=function(e,t,n,r){n=m(n,r,1);var i=n(t),s=0,o=E(e);while(s<o){var u=Math.floor((s+o)/2);n(e[u])<i?s=u+1:o=u}return s},d.indexOf=k(1,d.findIndex,d.sortedIndex),d.lastIndexOf=k(-1,d.findLastIndex),d.range=function(e,t,n){t==null&&(t=e||0,e=0),n=n||1;var r=Math.max(Math.ceil((t-e)/n),0),i=Array(r);for(var s=0;s<r;s++,e+=n)i[s]=e;return i};var L=function(e,t,n,r,i){if(r instanceof t){var s=y(e.prototype),o=e.apply(s,i);return d.isObject(o)?o:s}return e.apply(n,i)};d.bind=function(e,t){if(c&&e.bind===c)return c.apply(e,o.call(arguments,1));if(!d.isFunction(e))throw new TypeError("Bind must be called on a function");var n=o.call(arguments,2),r=function(){return L(e,r,t,this,n.concat(o.call(arguments)))};return r},d.partial=function(e){var t=o.call(arguments,1),n=function(){var r=0,i=t.length,s=Array(i);for(var o=0;o<i;o++)s[o]=t[o]===d?arguments[r++]:t[o];while(r<arguments.length)s.push(arguments[r++]);return L(e,n,this,this,s)};return n},d.bindAll=function(e){var t,n=arguments.length,r;if(n<=1)throw new Error("bindAll must be passed function names");for(t=1;t<n;t++)r=arguments[t],e[r]=d.bind(e[r],e);return e},d.memoize=function(e,t){var n=function(r){var i=n.cache,s=""+(t?t.apply(this,arguments):r);return d.has(i,s)||(i[s]=e.apply(this,arguments)),i[s]};return n.cache={},n},d.delay=function(e,t){var n=o.call(arguments,2);return setTimeout(function(){return e.apply(null,n)},t)},d.defer=d.partial(d.delay,d,1),d.throttle=function(e,t,n){var r,i,s,o=null,u=0;n||(n={});var a=function(){u=n.leading===!1?0:d.now(),o=null,s=e.apply(r,i),o||(r=i=null)};return function(){var f=d.now();!u&&n.leading===!1&&(u=f);var l=t-(f-u);return r=this,i=arguments,l<=0||l>t?(o&&(clearTimeout(o),o=null),u=f,s=e.apply(r,i),o||(r=i=null)):!o&&n.trailing!==!1&&(o=setTimeout(a,l)),s}},d.debounce=function(e,t,n){var r,i,s,o,u,a=function(){var f=d.now()-o;f<t&&f>=0?r=setTimeout(a,t-f):(r=null,n||(u=e.apply(s,i),r||(s=i=null)))};return function(){s=this,i=arguments,o=d.now();var f=n&&!r;return r||(r=setTimeout(a,t)),f&&(u=e.apply(s,i),s=i=null),u}},d.wrap=function(e,t){return d.partial(t,e)},d.negate=function(e){return function(){return!e.apply(this,arguments)}},d.compose=function(){var e=arguments,t=e.length-1;return function(){var n=t,r=e[t].apply(this,arguments);while(n--)r=e[n].call(this,r);return r}},d.after=function(e,t){return function(){if(--e<1)return t.apply(this,arguments)}},d.before=function(e,t){var n;return function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=null),n}},d.once=d.partial(d.before,2);var A=!{toString:null}.propertyIsEnumerable("toString"),O=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];d.keys=function(e){if(!d.isObject(e))return[];if(l)return l(e);var t=[];for(var n in e)d.has(e,n)&&t.push(n);return A&&M(e,t),t},d.allKeys=function(e){if(!d.isObject(e))return[];var t=[];for(var n in e)t.push(n);return A&&M(e,t),t},d.values=function(e){var t=d.keys(e),n=t.length,r=Array(n);for(var i=0;i<n;i++)r[i]=e[t[i]];return r},d.mapObject=function(e,t,n){t=m(t,n);var r=d.keys(e),i=r.length,s={},o;for(var u=0;u<i;u++)o=r[u],s[o]=t(e[o],o,e);return s},d.pairs=function(e){var t=d.keys(e),n=t.length,r=Array(n);for(var i=0;i<n;i++)r[i]=[t[i],e[t[i]]];return r},d.invert=function(e){var t={},n=d.keys(e);for(var r=0,i=n.length;r<i;r++)t[e[n[r]]]=n[r];return t},d.functions=d.methods=function(e){var t=[];for(var n in e)d.isFunction(e[n])&&t.push(n);return t.sort()},d.extend=g(d.allKeys),d.extendOwn=d.assign=g(d.keys),d.findKey=function(e,t,n){t=m(t,n);var r=d.keys(e),i;for(var s=0,o=r.length;s<o;s++){i=r[s];if(t(e[i],i,e))return i}},d.pick=function(e,t,n){var r={},i=e,s,o;if(i==null)return r;d.isFunction(t)?(o=d.allKeys(i),s=v(t,n)):(o=N(arguments,!1,!1,1),s=function(e,t,n){return t in n},i=Object(i));for(var u=0,a=o.length;u<a;u++){var f=o[u],l=i[f];s(l,f,i)&&(r[f]=l)}return r},d.omit=function(e,t,n){if(d.isFunction(t))t=d.negate(t);else{var r=d.map(N(arguments,!1,!1,1),String);t=function(e,t){return!d.contains(r,t)}}return d.pick(e,t,n)},d.defaults=g(d.allKeys,!0),d.create=function(e,t){var n=y(e);return t&&d.extendOwn(n,t),n},d.clone=function(e){return d.isObject(e)?d.isArray(e)?e.slice():d.extend({},e):e},d.tap=function(e,t){return t(e),e},d.isMatch=function(e,t){var n=d.keys(t),r=n.length;if(e==null)return!r;var i=Object(e);for(var s=0;s<r;s++){var o=n[s];if(t[o]!==i[o]||!(o in i))return!1}return!0};var _=function(e,t,n,r){if(e===t)return e!==0||1/e===1/t;if(e==null||t==null)return e===t;e instanceof d&&(e=e._wrapped),t instanceof d&&(t=t._wrapped);var i=u.call(e);if(i!==u.call(t))return!1;switch(i){case"[object RegExp]":case"[object String]":return""+e==""+t;case"[object Number]":if(+e!==+e)return+t!==+t;return+e===0?1/+e===1/t:+e===+t;case"[object Date]":case"[object Boolean]":return+e===+t}var s=i==="[object Array]";if(!s){if(typeof e!="object"||typeof t!="object")return!1;var o=e.constructor,a=t.constructor;if(o!==a&&!(d.isFunction(o)&&o instanceof o&&d.isFunction(a)&&a instanceof a)&&"constructor"in e&&"constructor"in t)return!1}n=n||[],r=r||[];var f=n.length;while(f--)if(n[f]===e)return r[f]===t;n.push(e),r.push(t);if(s){f=e.length;if(f!==t.length)return!1;while(f--)if(!_(e[f],t[f],n,r))return!1}else{var l=d.keys(e),c;f=l.length;if(d.keys(t).length!==f)return!1;while(f--){c=l[f];if(!d.has(t,c)||!_(e[c],t[c],n,r))return!1}}return n.pop(),r.pop(),!0};d.isEqual=function(e,t){return _(e,t)},d.isEmpty=function(e){return e==null?!0:S(e)&&(d.isArray(e)||d.isString(e)||d.isArguments(e))?e.length===0:d.keys(e).length===0},d.isElement=function(e){return!!e&&e.nodeType===1},d.isArray=f||function(e){return u.call(e)==="[object Array]"},d.isObject=function(e){var t=typeof e;return t==="function"||t==="object"&&!!e},d.each(["Arguments","Function","String","Number","Date","RegExp","Error"],function(e){d["is"+e]=function(t){return u.call(t)==="[object "+e+"]"}}),d.isArguments(arguments)||(d.isArguments=function(e){return d.has(e,"callee")}),typeof /./!="function"&&typeof Int8Array!="object"&&(d.isFunction=function(e){return typeof e=="function"||!1}),d.isFinite=function(e){return isFinite(e)&&!isNaN(parseFloat(e))},d.isNaN=function(e){return d.isNumber(e)&&e!==+e},d.isBoolean=function(e){return e===!0||e===!1||u.call(e)==="[object Boolean]"},d.isNull=function(e){return e===null},d.isUndefined=function(e){return e===void 0},d.has=function(e,t){return e!=null&&a.call(e,t)},d.noConflict=function(){return e._=t,this},d.identity=function(e){return e},d.constant=function(e){return function(){return e}},d.noop=function(){},d.property=b,d.propertyOf=function(e){return e==null?function(){}:function(t){return e[t]}},d.matcher=d.matches=function(e){return e=d.extendOwn({},e),function(t){return d.isMatch(t,e)}},d.times=function(e,t,n){var r=Array(Math.max(0,e));t=v(t,n,1);for(var i=0;i<e;i++)r[i]=t(i);return r},d.random=function(e,t){return t==null&&(t=e,e=0),e+Math.floor(Math.random()*(t-e+1))},d.now=Date.now||function(){return(new Date).getTime()};var D={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},P=d.invert(D),H=function(e){var t=function(t){return e[t]},n="(?:"+d.keys(e).join("|")+")",r=RegExp(n),i=RegExp(n,"g");return function(e){return e=e==null?"":""+e,r.test(e)?e.replace(i,t):e}};d.escape=H(D),d.unescape=H(P),d.result=function(e,t,n){var r=e==null?void 0:e[t];return r===void 0&&(r=n),d.isFunction(r)?r.call(e):r};var B=0;d.uniqueId=function(e){var t=++B+"";return e?e+t:t},d.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var j=/(.)^/,F={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},I=/\\|'|\r|\n|\u2028|\u2029/g,q=function(e){return"\\"+F[e]};d.template=function(e,t,n){!t&&n&&(t=n),t=d.defaults({},t,d.templateSettings);var r=RegExp([(t.escape||j).source,(t.interpolate||j).source,(t.evaluate||j).source].join("|")+"|$","g"),i=0,s="__p+='";e.replace(r,function(t,n,r,o,u){return s+=e.slice(i,u).replace(I,q),i=u+t.length,n?s+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'":r?s+="'+\n((__t=("+r+"))==null?'':__t)+\n'":o&&(s+="';\n"+o+"\n__p+='"),t}),s+="';\n",t.variable||(s="with(obj||{}){\n"+s+"}\n"),s="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+s+"return __p;\n";try{var o=new Function(t.variable||"obj","_",s)}catch(u){throw u.source=s,u}var a=function(e){return o.call(this,e,d)},f=t.variable||"obj";return a.source="function("+f+"){\n"+s+"}",a},d.chain=function(e){var t=d(e);return t._chain=!0,t};var R=function(e,t){return e._chain?d(t).chain():t};d.mixin=function(e){d.each(d.functions(e),function(t){var n=d[t]=e[t];d.prototype[t]=function(){var e=[this._wrapped];return s.apply(e,arguments),R(this,n.apply(d,e))}})},d.mixin(d),d.each(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=n[e];d.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),(e==="shift"||e==="splice")&&n.length===0&&delete n[0],R(this,n)}}),d.each(["concat","join","slice"],function(e){var t=n[e];d.prototype[e]=function(){return R(this,t.apply(this._wrapped,arguments))}}),d.prototype.value=function(){return this._wrapped},d.prototype.valueOf=d.prototype.toJSON=d.prototype.value,d.prototype.toString=function(){return""+this._wrapped},typeof define=="function"&&define.amd&&define("underscore",[],function(){return d})}.call(this),String.prototype.endsWith||(String.prototype.endsWith=function(e,t){var n=this.toString();if(t===undefined||t>n.length)t=n.length;t-=e.length;var r=n.indexOf(e,t);return r!==-1&&r===t}),String.prototype.splitOnce=function(e){var t=this.split(e);return[t.shift(),t.join(e)]},String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),define("polyfill",function(){}),define("text",["module"],function(e){"use strict";var t,n,r,i,s,o=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"],u=/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,a=/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im,f=typeof location!="undefined"&&location.href,l=f&&location.protocol&&location.protocol.replace(/\:/,""),c=f&&location.hostname,h=f&&(location.port||undefined),p={},d=e.config&&e.config()||{};t={version:"2.0.14",strip:function(e){if(e){e=e.replace(u,"");var t=e.match(a);t&&(e=t[1])}else e="";return e},jsEscape:function(e){return e.replace(/(['\\])/g,"\\$1").replace(/[\f]/g,"\\f").replace(/[\b]/g,"\\b").replace(/[\n]/g,"\\n").replace(/[\t]/g,"\\t").replace(/[\r]/g,"\\r").replace(/[\u2028]/g,"\\u2028").replace(/[\u2029]/g,"\\u2029")},createXhr:d.createXhr||function(){var e,t,n;if(typeof XMLHttpRequest!="undefined")return new XMLHttpRequest;if(typeof ActiveXObject!="undefined")for(t=0;t<3;t+=1){n=o[t];try{e=new ActiveXObject(n)}catch(r){}if(e){o=[n];break}}return e},parseName:function(e){var t,n,r,i=!1,s=e.lastIndexOf("."),o=e.indexOf("./")===0||e.indexOf("../")===0;return s!==-1&&(!o||s>1)?(t=e.substring(0,s),n=e.substring(s+1)):t=e,r=n||t,s=r.indexOf("!"),s!==-1&&(i=r.substring(s+1)==="strip",r=r.substring(0,s),n?n=r:t=r),{moduleName:t,ext:n,strip:i}},xdRegExp:/^((\w+)\:)?\/\/([^\/\\]+)/,useXhr:function(e,n,r,i){var s,o,u,a=t.xdRegExp.exec(e);return a?(s=a[2],o=a[3],o=o.split(":"),u=o[1],o=o[0],(!s||s===n)&&(!o||o.toLowerCase()===r.toLowerCase())&&(!u&&!o||u===i)):!0},finishLoad:function(e,n,r,i){r=n?t.strip(r):r,d.isBuild&&(p[e]=r),i(r)},load:function(e,n,r,i){if(i&&i.isBuild&&!i.inlineText){r();return}d.isBuild=i&&i.isBuild;var s=t.parseName(e),o=s.moduleName+(s.ext?"."+s.ext:""),u=n.toUrl(o),a=d.useXhr||t.useXhr;if(u.indexOf("empty:")===0){r();return}!f||a(u,l,c,h)?t.get(u,function(n){t.finishLoad(e,s.strip,n,r)},function(e){r.error&&r.error(e)}):n([o],function(e){t.finishLoad(s.moduleName+"."+s.ext,s.strip,e,r)})},write:function(e,n,r,i){if(p.hasOwnProperty(n)){var s=t.jsEscape(p[n]);r.asModule(e+"!"+n,"define(function () { return '"+s+"';});\n")}},writeFile:function(e,n,r,i,s){var o=t.parseName(n),u=o.ext?"."+o.ext:"",a=o.moduleName+u,f=r.toUrl(o.moduleName+u)+".js";t.load(a,r,function(n){var r=function(e){return i(f,e)};r.asModule=function(e,t){return i.asModule(e,f,t)},t.write(e,a,r,s)},s)}};if(d.env==="node"||!d.env&&typeof process!="undefined"&&process.versions&&!!process.versions.node&&!process.versions["node-webkit"]&&!process.versions["atom-shell"])n=require.nodeRequire("fs"),t.get=function(e,t,r){try{var i=n.readFileSync(e,"utf8");i[0]===""&&(i=i.substring(1)),t(i)}catch(s){r&&r(s)}};else if(d.env==="xhr"||!d.env&&t.createXhr())t.get=function(e,n,r,i){var s=t.createXhr(),o;s.open("GET",e,!0);if(i)for(o in i)i.hasOwnProperty(o)&&s.setRequestHeader(o.toLowerCase(),i[o]);d.onXhr&&d.onXhr(s,e),s.onreadystatechange=function(t){var i,o;s.readyState===4&&(i=s.status||0,i>399&&i<600?(o=new Error(e+" HTTP status: "+i),o.xhr=s,r&&r(o)):n(s.responseText),d.onXhrComplete&&d.onXhrComplete(s,e))},s.send(null)};else if(d.env==="rhino"||!d.env&&typeof Packages!="undefined"&&typeof java!="undefined")t.get=function(e,t){var n,r,i="utf-8",s=new java.io.File(e),o=java.lang.System.getProperty("line.separator"),u=new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(s),i)),a="";try{n=new java.lang.StringBuffer,r=u.readLine(),r&&r.length()&&r.charAt(0)===65279&&(r=r.substring(1)),r!==null&&n.append(r);while((r=u.readLine())!==null)n.append(o),n.append(r);a=String(n.toString())}finally{u.close()}t(a)};else if(d.env==="xpconnect"||!d.env&&typeof Components!="undefined"&&Components.classes&&Components.interfaces)r=Components.classes,i=Components.interfaces,Components.utils["import"]("resource://gre/modules/FileUtils.jsm"),s="@mozilla.org/windows-registry-key;1"in r,t.get=function(e,t){var n,o,u,a={};s&&(e=e.replace(/\//g,"\\")),u=new FileUtils.File(e);try{n=r["@mozilla.org/network/file-input-stream;1"].createInstance(i.nsIFileInputStream),n.init(u,1,0,!1),o=r["@mozilla.org/intl/converter-input-stream;1"].createInstance(i.nsIConverterInputStream),o.init(n,"utf-8",n.available(),i.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER),o.readString(n.available(),a),o.close(),n.close(),t(a.value)}catch(f){throw new Error((u&&u.path||"")+": "+f)}};return t}),define("tpl",["text","underscore"],function(e,t){"use strict";var n={},r="define('{pluginName}!{moduleName}', function () { return {source}; });\n";return{version:"0.0.2",load:function(r,i,s,o){o.tpl&&o.tpl.templateSettings&&(t.templateSettings=o.tpl.templateSettings);if(n[r])s(n[r]);else{var u=o.tpl&&o.tpl.extension||".html",a=o.tpl&&o.tpl.path||"";e.load(a+r+u,i,function(e){n[r]=t.template(e),s(n[r])},o)}},write:function(e,t,i){var s=n[t],o=s&&s.source;o&&i.asModule(e+"!"+t,r.replace("{pluginName}",e).replace("{moduleName}",t).replace("{source}",o))}}}),define("tpl!action",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div class="chat-message '+((__t=extra_classes)==null?"":__t)+'" data-isodate="'+((__t=isodate)==null?"":__t)+'">\n <span class="chat-msg-author chat-msg-'+((__t=sender)==null?"":__t)+'">'+((__t=time)==null?"":__t)+" **"+((__t=username)==null?"":__t)+' </span>\n <span class="chat-msg-content">'+((__t=message)==null?"":__t)+"</span>\n</div>\n";return __p}}),define("tpl!add_contact_dropdown",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<dl class="add-converse-contact dropdown">\n <dt id="xmpp-contact-search" class="fancy-dropdown">\n <a class="toggle-xmpp-contact-form icon-plus" href="#" title="'+((__t=label_click_to_chat)==null?"":__t)+'"> '+((__t=label_add_contact)==null?"":__t)+'</a>\n </dt>\n <dd class="search-xmpp" style="display:none"><ul></ul></dd>\n</dl>\n';return __p}}),define("tpl!add_contact_form",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<li>\n <form class="pure-form add-xmpp-contact">\n <input type="text"\n name="identifier"\n class="username"\n placeholder="'+((__t=label_contact_username)==null?"":__t)+'"/>\n <button class="pure-button button-primary" type="submit">'+((__t=label_add)==null?"":__t)+"</button>\n </form>\n</li>\n";return __p}}),define("tpl!change_status_message",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<form id="set-custom-xmpp-status" class="pure-form">\n<fieldset>\n <span class="input-button-group">\n <input type="text" class="custom-xmpp-status" '+((__t=status_message)==null?"":__t)+' placeholder="'+((__t=label_custom_status)==null?"":__t)+'"/>\n <input type="submit" class="pure-button button-primary" value="'+((__t=label_save)==null?"":__t)+'"/>\n </span>\n</fieldset>\n</form>\n';return __p}}),define("tpl!chat_status",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div class="xmpp-status">\n <a class="choose-xmpp-status '+((__t=chat_status)==null?"":__t)+" icon-"+((__t=chat_status)==null?"":__t)+'" data-value="'+((__t=status_message)==null?"":__t)+'" href="#" title="'+((__t=desc_change_status)==null?"":__t)+'">\n '+((__t=status_message)==null?"":__t)+'\n </a>\n <a class="change-xmpp-status-message icon-pencil" href="#" title="'+((__t=desc_custom_status)==null?"":__t)+'"></a>\n</div>\n';return __p}}),define("tpl!chatarea",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div class="chat-area">\n <div class="chat-content"></div>\n <form class="sendXMPPMessage" action="" method="post">\n ',show_toolbar&&(__p+='\n <ul class="chat-toolbar no-text-select"></ul>\n '),__p+='\n <textarea type="text" class="chat-textarea" \n placeholder="'+((__t=label_message)==null?"":__t)+'"/>\n </form>\n</div>\n';return __p}}),define("tpl!chatbox",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div class="flyout box-flyout">\n <div class="dragresize dragresize-top"></div>\n <div class="dragresize dragresize-topleft"></div>\n <div class="dragresize dragresize-left"></div>\n <div class="chat-head chat-head-chatbox">\n <a class="chatbox-btn close-chatbox-button icon-close" title="'+((__t=info_close)==null?"":__t)+'"></a>\n <a class="chatbox-btn toggle-chatbox-button icon-minus" title="'+((__t=info_minimize)==null?"":__t)+'"></a>\n <div class="chat-title">\n ',url&&(__p+='\n <a href="'+((__t=url)==null?"":__t)+'" target="_blank" class="user">\n '),__p+="\n "+((__t=fullname)==null?"":__t)+"\n ",url&&(__p+="\n </a>\n "),__p+='\n </div>\n <p class="user-custom-message"><p/>\n </div>\n <div class="chat-body">\n <div class="chat-content"></div>\n <form class="sendXMPPMessage" action="" method="post">\n ',show_toolbar&&(__p+='\n <ul class="chat-toolbar no-text-select"></ul>\n '),__p+='\n <textarea\n type="text"\n class="chat-textarea"\n placeholder="'+((__t=label_personal_message)==null?"":__t)+'"/>\n </form>\n </div>\n</div>\n';return __p}}),define("tpl!chatroom",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div class="flyout box-flyout">\n <div class="dragresize dragresize-top"></div>\n <div class="dragresize dragresize-topleft"></div>\n <div class="dragresize dragresize-left"></div>\n <div class="chat-head chat-head-chatroom">\n <a class="chatbox-btn close-chatbox-button icon-close"></a>\n <a class="chatbox-btn toggle-chatbox-button icon-minus"></a>\n <a class="chatbox-btn configure-chatroom-button icon-wrench" style="display:none"></a>\n <div class="chat-title"> '+((__t=_.escape(name))==null?"":__t)+' </div>\n <p class="chatroom-topic"><p/>\n </div>\n <div class="chat-body chatroom-body"><span class="spinner centered"/></div>\n</div>\n';return __p}}),define("tpl!chatroom_form",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div class="chatroom-form-container">\n <form class="pure-form pure-form-stacked converse-form chatroom-form">\n <fieldset>\n <span class="spinner centered"/>\n </fieldset>\n </form>\n</div>\n';return __p}}),define("tpl!chatroom_password_form",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div class="chatroom-form-container">\n <form class="pure-form converse-form chatroom-form">\n <fieldset>\n <legend>'+((__t=heading)==null?"":__t)+"</legend>\n <label>"+((__t=label_password)==null?"":__t)+'</label>\n <input type="password" name="password"/>\n </fieldset>\n <fieldset>\n <input class="pure-button button-primary" type="submit" value="'+((__t=label_submit)==null?"":__t)+'"/>\n </fieldset>\n </form>\n</div>\n';return __p}}),define("tpl!chatroom_sidebar",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<!-- <div class="occupants"> -->\n<form class="pure-form room-invite">\n <input class="invited-contact" placeholder="'+((__t=label_invitation)==null?"":__t)+'" type="text"/>\n</form>\n<p class="occupants-heading">'+((__t=label_occupants)==null?"":__t)+':</p>\n<ul class="occupant-list"></ul>\n<!-- </div> -->\n';return __p}}),define("tpl!chatrooms_tab",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<li><a class="s" href="#chatrooms">'+((__t=label_rooms)==null?"":__t)+"</a></li>\n";return __p}}),define("tpl!chats_panel",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div id="minimized-chats">\n <a id="toggle-minimized-chats" href="#"></a>\n <div class="flyout minimized-chats-flyout"></div>\n</div>\n';return __p}}),define("tpl!choose_status",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<dl id="target" class="dropdown">\n <dt id="fancy-xmpp-status-select" class="fancy-dropdown"></dt>\n <dd><ul class="xmpp-status-menu"></ul></dd>\n</dl>\n';return __p}}),define("tpl!contacts_panel",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<form class="pure-form set-xmpp-status" action="" method="post">\n <span id="xmpp-status-holder">\n <select id="select-xmpp-status" style="display:none">\n <option value="online">'+((__t=label_online)==null?"":__t)+'</option>\n <option value="dnd">'+((__t=label_busy)==null?"":__t)+'</option>\n <option value="away">'+((__t=label_away)==null?"":__t)+'</option>\n <option value="offline">'+((__t=label_offline)==null?"":__t)+"</option>\n ",allow_logout&&(__p+='\n <option value="logout">'+((__t=label_logout)==null?"":__t)+"</option>\n "),__p+="\n </select>\n </span>\n</form>\n";return __p}}),define("tpl!contacts_tab",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<li><a class="s current" href="#users">'+((__t=label_contacts)==null?"":__t)+"</a></li>\n";return __p}}),define("tpl!controlbox",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div class="flyout box-flyout">\n <div class="dragresize dragresize-top"></div>\n <div class="dragresize dragresize-topleft"></div>\n <div class="dragresize dragresize-left"></div>\n <div class="chat-head controlbox-head">\n <ul id="controlbox-tabs"></ul>\n <a class="chatbox-btn close-chatbox-button icon-close"></a>\n </div>\n <div class="controlbox-panes"></div>\n</div>\n';return __p}}),define("tpl!controlbox_toggle",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<span class="conn-feedback">'+((__t=label_toggle)==null?"":__t)+'</span>\n<span style="display: none" id="online-count">(0)</span>\n';return __p}}),define("tpl!field",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<field var="'+((__t=name)==null?"":__t)+'">',_.isArray(value)?(__p+="\n ",_.each(value,function(e){__p+="<value>"+((__t=e)==null?"":__t)+"</value>"}),__p+="\n"):__p+="\n <value>"+((__t=value)==null?"":__t)+"</value>\n",__p+="</field>\n";return __p}}),define("tpl!form_captcha",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+="",label&&(__p+="\n<label>\n "+((__t=label)==null?"":__t)+"\n</label>\n"),__p+='\n<img src="data:'+((__t=type)==null?"":__t)+";base64,"+((__t=data)==null?"":__t)+'">\n<input name="'+((__t=name)==null?"":__t)+'" type="text" ',required&&(__p+=' class="required" '),__p+=" >\n\n\n";return __p}}),define("tpl!form_checkbox",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+="<label>"+((__t=label)==null?"":__t)+'</label>\n<input name="'+((__t=name)==null?"":__t)+'" type="'+((__t=type)==null?"":__t)+'" '+((__t=checked)==null?"":__t)+">\n";return __p}}),define("tpl!form_input",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+="",label&&(__p+="\n<label>\n "+((__t=label)==null?"":__t)+"\n</label>\n"),__p+='\n<input name="'+((__t=name)==null?"":__t)+'" type="'+((__t=type)==null?"":__t)+'" \n ',value&&(__p+=' value="'+((__t=value)==null?"":__t)+'" '),__p+="\n ",required&&(__p+=' class="required" '),__p+=" >\n";return __p}}),define("tpl!form_select",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+="<label>"+((__t=label)==null?"":__t)+'</label>\n<select name="'+((__t=name)==null?"":__t)+'" ',multiple&&(__p+=' multiple="multiple" '),__p+=">"+((__t=options)==null?"":__t)+"</select>\n";return __p}}),define("tpl!form_textarea",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<label class="label-ta">'+((__t=label)==null?"":__t)+'</label>\n<textarea name="'+((__t=name)==null?"":__t)+'">'+((__t=value)==null?"":__t)+"</textarea>\n";return __p}}),define("tpl!form_username",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+="",label&&(__p+="\n<label>\n "+((__t=label)==null?"":__t)+"\n</label>\n"),__p+='\n<div class="input-group">\n <input name="'+((__t=name)==null?"":__t)+'" type="'+((__t=type)==null?"":__t)+'"\n ',value&&(__p+=' value="'+((__t=value)==null?"":__t)+'" '),__p+="\n ",required&&(__p+=' class="required" '),__p+=' />\n <span title="'+((__t=domain)==null?"":__t)+'">'+((__t=domain)==null?"":__t)+"</span>\n</div>\n";return __p}}),define("tpl!group_header",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<a href="#" class="group-toggle icon-'+((__t=toggle_state)==null?"":__t)+'" title="'+((__t=desc_group_toggle)==null?"":__t)+'">'+((__t=label_group)==null?"":__t)+"</a>\n";return __p}}),define("tpl!info",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div class="chat-info">'+((__t=message)==null?"":__t)+"</div>\n";return __p}}),define("tpl!login_panel",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<form class="pure-form pure-form-stacked converse-form" id="converse-login" method="post">\n ',auto_login&&(__p+='\n <span class="spinner login-submit"/>\n '),__p+="\n ",auto_login||(__p+="\n ",authentication==LOGIN&&(__p+="\n <label>"+((__t=label_username)==null?"":__t)+'</label>\n <input type="text" name="jid" placeholder="'+((__t=placeholder_username)==null?"":__t)+'">\n <label>'+((__t=label_password)==null?"":__t)+'</label>\n <input type="password" name="password" placeholder="'+((__t=placeholder_password)==null?"":__t)+'">\n <input class="pure-button button-primary" type="submit" value="'+((__t=label_login)==null?"":__t)+'">\n <span class="conn-feedback"></span>\n '),__p+="\n ",authentication==ANONYMOUS&&(__p+='\n <input type="pure-button button-primary" class="submit login-anon" value="'+((__t=label_anon_login)==null?"":__t)+'"/>\n '),__p+="\n ",authentication==PREBIND&&(__p+="\n <p>Disconnected.</p>\n "),__p+="\n "),__p+="\n</form>\n";return __p}}),define("tpl!login_tab",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<li><a class="current" href="#login-dialog">'+((__t=label_sign_in)==null?"":__t)+"</a></li>\n";return __p}}),define("tpl!message",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div class="chat-message '+((__t=extra_classes)==null?"":__t)+'" data-isodate="'+((__t=isodate)==null?"":__t)+'" data-msgid="'+((__t=msgid)==null?"":__t)+'">\n <span class="chat-msg-author chat-msg-'+((__t=sender)==null?"":__t)+'">'+((__t=time)==null?"":__t)+" "+((__t=username)==null?"":__t)+': </span>\n <span class="chat-msg-content">'+((__t=message)==null?"":__t)+"</span>\n</div>\n";return __p}}),define("tpl!new_day",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<time class="chat-info chat-date" data-isodate="'+((__t=isodate)==null?"":__t)+'">'+((__t=datestring)==null?"":__t)+"</time>\n";return __p}}),define("tpl!occupant",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<li class="'+((__t=role)==null?"":__t)+'"\n ',role==="moderator"&&(__p+='\n title="'+((__t=desc_moderator)==null?"":__t)+'"\n '),__p+="\n ",role==="occupant"&&(__p+='\n title="'+((__t=desc_occupant)==null?"":__t)+'"\n '),__p+="\n ",role==="visitor"&&(__p+='\n title="'+((__t=desc_visitor)==null?"":__t)+'"\n '),__p+="\n>"+((__t=nick)==null?"":__t)+"</li>\n";return __p}}),define("tpl!pending_contact",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+="",allow_chat_pending_contacts&&(__p+='\n<a class="open-chat"href="#">\n'),__p+='\n<span class="pending-contact-name" title="Name: '+((__t=fullname)==null?"":__t)+"\nJID: "+((__t=jid)==null?"":__t)+'">'+((__t=fullname)==null?"":__t)+"</span> \n",allow_chat_pending_contacts&&(__p+="\n</a>\n"),__p+='\n<a class="remove-xmpp-contact icon-remove" title="'+((__t=desc_remove)==null?"":__t)+'" href="#"></a>\n';return __p}}),define("tpl!pending_contacts",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<dt class="roster-group" id="pending-xmpp-contacts"><a href="#" class="group-toggle icon-'+((__t=toggle_state)==null?"":__t)+'" title="'+((__t=desc_group_toggle)==null?"":__t)+'">'+((__t=label_pending_contacts)==null?"":__t)+"</a></dt>\n";return __p}}),define("tpl!register_panel",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<form id="converse-register" class="pure-form converse-form">\n <span class="reg-feedback"></span>\n <label>'+((__t=label_domain)==null?"":__t)+'</label>\n <input type="text" name="domain" placeholder="'+((__t=domain_placeholder)==null?"":__t)+'">\n <p class="form-help">'+((__t=help_providers)==null?"":__t)+' <a href="'+((__t=href_providers)==null?"":__t)+'" class="url" target="_blank">'+((__t=help_providers_link)==null?"":__t)+'</a>.</p>\n <input class="pure-button button-primary" type="submit" value="'+((__t=label_register)==null?"":__t)+'">\n</form>\n';return __p}}),define("tpl!register_tab",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<li><a class="s" href="#register">'+((__t=label_register)==null?"":__t)+"</a></li>\n";return __p}}),define("tpl!registration_form",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<p class="provider-title">'+((__t=domain)==null?"":__t)+"</p>\n<a href='https://xmpp.net/result.php?domain="+((__t=domain)==null?"":__t)+"&type=client'>\n <img class=\"provider-score\" src='https://xmpp.net/badge.php?domain="+((__t=domain)==null?"":__t)+"' alt='xmpp.net score' />\n</a>\n<p class=\"title\">"+((__t=title)==null?"":__t)+'</p>\n<p class="instructions">'+((__t=instructions)==null?"":__t)+"</p>\n";return __p}}),define("tpl!registration_request",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<span class="spinner login-submit"/>\n<p class="info">'+((__t=info_message)==null?"":__t)+'</p>\n<button class="pure-button button-cancel hor_centered">'+((__t=cancel)==null?"":__t)+"</button>\n";return __p}}),define("tpl!requesting_contact",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+="",allow_chat_pending_contacts&&(__p+='\n<a class="open-chat"href="#">\n'),__p+='\n<span class="req-contact-name" title="Name: '+((__t=fullname)==null?"":__t)+"\nJID: "+((__t=jid)==null?"":__t)+'">'+((__t=fullname)==null?"":__t)+"</span>\n",allow_chat_pending_contacts&&(__p+="\n</a>\n"),__p+='\n<span class="request-actions">\n <a class="accept-xmpp-request icon-checkmark" title="'+((__t=desc_accept)==null?"":__t)+'" href="#"></a>\n <a class="decline-xmpp-request icon-close" title="'+((__t=desc_decline)==null?"":__t)+'" href="#"></a>\n</span>\n';return __p}}),define("tpl!requesting_contacts",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<dt class="roster-group" id="xmpp-contact-requests"><a href="#" class="group-toggle icon-'+((__t=toggle_state)==null?"":__t)+'" title="'+((__t=desc_group_toggle)==null?"":__t)+'">'+((__t=label_contact_requests)==null?"":__t)+"</a></dt>\n";return __p}}),define("tpl!room_description",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<!-- FIXME: check markup in mockup -->\n<div class="room-info">\n<p class="room-info"><strong>'+((__t=label_desc)==null?"":__t)+"</strong> "+((__t=desc)==null?"":__t)+'</p>\n<p class="room-info"><strong>'+((__t=label_occ)==null?"":__t)+"</strong> "+((__t=occ)==null?"":__t)+'</p>\n<p class="room-info"><strong>'+((__t=label_features)==null?"":__t)+"</strong>\n <ul>\n ",passwordprotected&&(__p+='\n <li class="room-info locked">'+((__t=label_requires_auth)==null?"":__t)+"</li>\n "),__p+="\n ",hidden&&(__p+='\n <li class="room-info">'+((__t=label_hidden)==null?"":__t)+"</li>\n "),__p+="\n ",membersonly&&(__p+='\n <li class="room-info">'+((__t=label_requires_invite)==null?"":__t)+"</li>\n "),__p+="\n ",moderated&&(__p+='\n <li class="room-info">'+((__t=label_moderated)==null?"":__t)+"</li>\n "),__p+="\n ",nonanonymous&&(__p+='\n <li class="room-info">'+((__t=label_non_anon)==null?"":__t)+"</li>\n "),__p+="\n ",open&&(__p+='\n <li class="room-info">'+((__t=label_open_room)==null?"":__t)+"</li>\n "),__p+="\n ",persistent&&(__p+='\n <li class="room-info">'+((__t=label_permanent_room)==null?"":__t)+"</li>\n "),__p+="\n ",publicroom&&(__p+='\n <li class="room-info">'+((__t=label_public)==null?"":__t)+"</li>\n "),__p+="\n ",semianonymous&&(__p+='\n <li class="room-info">'+((__t=label_semi_anon)==null?"":__t)+"</li>\n "),__p+="\n ",temporary&&(__p+='\n <li class="room-info">'+((__t=label_temp_room)==null?"":__t)+"</li>\n "),__p+="\n ",unmoderated&&(__p+='\n <li class="room-info">'+((__t=label_unmoderated)==null?"":__t)+"</li>\n "),__p+="\n </ul>\n</p>\n</div>\n";return __p}}),define("tpl!room_item",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<dd class="available-chatroom">\n<a class="open-room" data-room-jid="'+((__t=jid)==null?"":__t)+'"\n title="'+((__t=open_title)==null?"":__t)+'" href="#">'+((__t=_.escape(name))==null?"":__t)+'</a>\n<a class="room-info icon-room-info" data-room-jid="'+((__t=jid)==null?"":__t)+'"\n title="'+((__t=info_title)==null?"":__t)+'" href="#"> </a>\n</dd>\n';return __p}}),define("tpl!room_panel",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<form class="pure-form pure-form-stacked converse-form add-chatroom" action="" method="post">\n <fieldset>\n <label>'+((__t=label_room_name)==null?"":__t)+'</label>\n <input type="text" name="chatroom" class="new-chatroom-name" placeholder="'+((__t=label_room_name)==null?"":__t)+'"/>\n <label>'+((__t=label_nickname)==null?"":__t)+'</label> <input type="text" name="nick" class="new-chatroom-nick" placeholder="'+((__t=label_nickname)==null?"":__t)+'"/>\n <input type="submit" class="pure-button button-primary" name="join" value="'+((__t=label_join)==null?"":__t)+'"/>\n </fieldset>\n <fieldset>\n ',server_input_type!="hidden"&&(__p+="\n <label"+((__t=server_label_global_attr)==null?"":__t)+">"+((__t=label_server)==null?"":__t)+"</label>\n "),__p+='\n <input type="'+((__t=server_input_type)==null?"":__t)+'" name="server" class="new-chatroom-server" placeholder="'+((__t=label_server)==null?"":__t)+'"/>\n <input type="button" class="pure-button button-secondary" name="show" id="show-rooms" value="'+((__t=label_show_rooms)==null?"":__t)+'"/>\n </fieldset>\n</form>\n<dl id="available-chatrooms"></dl>\n';return __p}}),define("tpl!roster",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<form class="pure-form roster-filter-group input-button-group">\n <input style="display: none;" class="roster-filter" placeholder="'+((__t=placeholder)==null?"":__t)+'">\n <select style="display: none;" class="filter-type">\n <option value="contacts">'+((__t=label_contacts)==null?"":__t)+'</option>\n <option value="groups">'+((__t=label_groups)==null?"":__t)+"</option>\n </select>\n</form>\n";return __p}}),define("tpl!roster_item",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<a class="open-chat" title="'+((__t=title_fullname)==null?"":__t)+": "+((__t=fullname)==null?"":__t)+"\nJID: "+((__t=jid)==null?"":__t)+"\n"+((__t=desc_chat)==null?"":__t)+'" href="#"><span class="icon-'+((__t=chat_status)==null?"":__t)+'" title="'+((__t=desc_status)==null?"":__t)+'"></span>'+((__t=fullname)==null?"":__t)+"</a>\n",allow_contact_removal&&(__p+='\n<a class="remove-xmpp-contact icon-remove" title="'+((__t=desc_remove)==null?"":__t)+'" href="#"></a>\n'),__p+="\n";return __p}}),define("tpl!search_contact",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<li>\n <form class="search-xmpp-contact">\n <input type="text"\n name="identifier"\n class="username"\n placeholder="'+((__t=label_contact_name)==null?"":__t)+'"/>\n <button type="submit">'+((__t=label_search)==null?"":__t)+"</button>\n </form>\n</li>\n";return __p}}),define("tpl!select_option",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<option value="'+((__t=value)==null?"":__t)+'" ',selected&&(__p+=' selected="selected" '),__p+=" >"+((__t=label)==null?"":__t)+"</option>\n";return __p}}),define("tpl!status_option",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<li>\n <a href="#" class="'+((__t=value)==null?"":__t)+'" data-value="'+((__t=value)==null?"":__t)+'">\n <span class="icon-'+((__t=value)==null?"":__t)+'"></span>\n '+((__t=text)==null?"":__t)+"\n </a>\n</li>\n";return __p}}),define("tpl!toggle_chats",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+=""+((__t=Minimized)==null?"":__t)+' <span id="minimized-count">('+((__t=num_minimized)==null?"":__t)+')</span>\n<span class="unread-message-count"\n ',num_unread||(__p+=' style="display: none" '),__p+='\n href="#">'+((__t=num_unread)==null?"":__t)+"</span>\n";return __p}}),define("tpl!toolbar",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+="",show_emoticons&&(__p+='\n <li class="toggle-smiley icon-happy" title="'+((__t=label_insert_smiley)==null?"":__t)+'">\n <ul>\n <li><a class="icon-smiley" href="#" data-emoticon=":)"></a></li>\n <li><a class="icon-wink" href="#" data-emoticon=";)"></a></li>\n <li><a class="icon-grin" href="#" data-emoticon=":D"></a></li>\n <li><a class="icon-tongue" href="#" data-emoticon=":P"></a></li>\n <li><a class="icon-cool" href="#" data-emoticon="8)"></a></li>\n <li><a class="icon-evil" href="#" data-emoticon=">:)"></a></li>\n <li><a class="icon-confused" href="#" data-emoticon=":S"></a></li>\n <li><a class="icon-wondering" href="#" data-emoticon=":\\"></a></li>\n <li><a class="icon-angry" href="#" data-emoticon=">:("></a></li>\n <li><a class="icon-sad" href="#" data-emoticon=":("></a></li>\n <li><a class="icon-shocked" href="#" data-emoticon=":O"></a></li>\n <li><a class="icon-thumbs-up" href="#" data-emoticon="(^.^)b"></a></li>\n <li><a class="icon-heart" href="#" data-emoticon="<3"></a></li>\n </ul>\n </li>\n'),__p+="\n",show_call_button&&(__p+='\n<li class="toggle-call"><a class="icon-phone" title="'+((__t=label_start_call)==null?"":__t)+'"></a></li>\n'),__p+="\n",show_occupants_toggle&&(__p+='\n<li class="toggle-occupants"><a class="icon-hide-users" title="'+((__t=label_hide_occupants)==null?"":__t)+'"></a></li>\n'),__p+="\n",show_clear_button&&(__p+='\n<li class="toggle-clear"><a class="icon-remove" title="'+((__t=label_clear)==null?"":__t)+'"></a></li>\n'),__p+="\n",allow_otr&&(__p+='\n <li class="toggle-otr '+((__t=otr_status_class)==null?"":__t)+'" title="'+((__t=otr_tooltip)==null?"":__t)+'">\n <span class="chat-toolbar-text">'+((__t=otr_translated_status)==null?"":__t)+"</span>\n ",otr_status==UNENCRYPTED&&(__p+='\n <span class="icon-unlocked"></span>\n '),__p+="\n ",otr_status==UNVERIFIED&&(__p+='\n <span class="icon-lock"></span>\n '),__p+="\n ",otr_status==VERIFIED&&(__p+='\n <span class="icon-lock"></span>\n '),__p+="\n ",otr_status==FINISHED&&(__p+='\n <span class="icon-unlocked"></span>\n '),__p+="\n <ul>\n ",otr_status==UNENCRYPTED&&(__p+='\n <li><a class="start-otr" href="#">'+((__t=label_start_encrypted_conversation)==null?"":__t)+"</a></li>\n "),__p+="\n ",otr_status!=UNENCRYPTED&&(__p+='\n <li><a class="start-otr" href="#">'+((__t=label_refresh_encrypted_conversation)==null?"":__t)+'</a></li>\n <li><a class="end-otr" href="#">'+((__t=label_end_encrypted_conversation)==null?"":__t)+'</a></li>\n <li><a class="auth-otr" data-scheme="smp" href="#">'+((__t=label_verify_with_smp)==null?"":__t)+"</a></li>\n "),__p+="\n ",otr_status==UNVERIFIED&&(__p+='\n <li><a class="auth-otr" data-scheme="fingerprint" href="#">'+((__t=label_verify_with_fingerprints)==null?"":__t)+"</a></li>\n "),__p+='\n <li><a href="http://www.cypherpunks.ca/otr/help/3.2.0/levels.php" target="_blank">'+((__t=label_whats_this)==null?"":__t)+"</a></li>\n </ul>\n </li>\n"),__p+="\n";return __p}}),define("tpl!trimmed_chat",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<a class="chatbox-btn close-chatbox-button icon-close"></a>\n<a class="chat-head-message-count" \n ',num_unread||(__p+=' style="display: none" '),__p+='\n href="#">'+((__t=num_unread)==null?"":__t)+'</a>\n<a href="#" class="restore-chat" title="'+((__t=tooltip)==null?"":__t)+'">\n '+((__t=title)==null?"":__t)+"\n</a>\n";return __p}}),define("tpl!vcard",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<form class="pure-form converse-form vcard-info">\n <fieldset>\n <legend>The VCard info gets rendered here</legend>\n <label>Full name:</label>\n '+((__t=fullname)==null?"":__t)+"\n <label>URL:</label>\n "+((__t=url)==null?"":__t)+'\n </fieldset>\n <fieldset>\n <input type="button" class="pure-button button-cancel" value="'+((__t=label_return)==null?"":__t)+'"/>\n </fieldset>\n</form>\n';return __p}}),define("converse-templates",["tpl!action","tpl!add_contact_dropdown","tpl!add_contact_form","tpl!change_status_message","tpl!chat_status","tpl!chatarea","tpl!chatbox","tpl!chatroom","tpl!chatroom_form","tpl!chatroom_password_form","tpl!chatroom_sidebar","tpl!chatrooms_tab","tpl!chats_panel","tpl!choose_status","tpl!contacts_panel","tpl!contacts_tab","tpl!controlbox","tpl!controlbox_toggle","tpl!field","tpl!form_captcha","tpl!form_checkbox","tpl!form_input","tpl!form_select","tpl!form_textarea","tpl!form_username","tpl!group_header","tpl!info","tpl!login_panel","tpl!login_tab","tpl!message","tpl!new_day","tpl!occupant","tpl!pending_contact","tpl!pending_contacts","tpl!register_panel","tpl!register_tab","tpl!registration_form","tpl!registration_request","tpl!requesting_contact","tpl!requesting_contacts","tpl!room_description","tpl!room_item","tpl!room_panel","tpl!roster","tpl!roster_item","tpl!search_contact","tpl!select_option","tpl!status_option","tpl!toggle_chats","tpl!toolbar","tpl!trimmed_chat","tpl!vcard"],function(){return{action:arguments[0],add_contact_dropdown:arguments[1],add_contact_form:arguments[2],change_status_message:arguments[3],chat_status:arguments[4],chatarea:arguments[5],chatbox:arguments[6],chatroom:arguments[7],chatroom_form:arguments[8],chatroom_password_form:arguments[9],chatroom_sidebar:arguments[10],chatrooms_tab:arguments[11],chats_panel:arguments[12],choose_status:arguments[13],contacts_panel:arguments[14],contacts_tab:arguments[15],controlbox:arguments[16],controlbox_toggle:arguments[17],field:arguments[18],form_captcha:arguments[19],form_checkbox:arguments[20],form_input:arguments[21],form_select:arguments[22],form_textarea:arguments[23],form_username:arguments[24],group_header:arguments[25],info:arguments[26],login_panel:arguments[27],login_tab:arguments[28],message:arguments[29],new_day:arguments[30],occupant:arguments[31],pending_contact:arguments[32],pending_contacts:arguments[33],register_panel:arguments[34],register_tab:arguments[35],registration_form:arguments[36],registration_request:arguments[37],requesting_contact:arguments[38],requesting_contacts:arguments[39],room_description:arguments[40],room_item:arguments[41],room_panel:arguments[42],roster:arguments[43],roster_item:arguments[44],search_contact:arguments[45],select_option:arguments[46],status_option:arguments[47],toggle_chats:arguments[48],toolbar:arguments[49],trimmed_chat:arguments[50],vcard:arguments[51]}}),function(e,t){function l(e){return f.PF.compile(e||"nplurals=2; plural=(n != 1);")}function c(e,t){this._key=e,this._i18n=t}var n=Array.prototype,r=Object.prototype,i=n.slice,s=r.hasOwnProperty,o=n.forEach,u={},a={forEach:function(e,t,n){var r,i,a;if(e===null)return;if(o&&e.forEach===o)e.forEach(t,n);else if(e.length===+e.length){for(r=0,i=e.length;r<i;r++)if(r in e&&t.call(n,e[r],r,e)===u)return}else for(a in e)if(s.call(e,a)&&t.call(n,e[a],a,e)===u)return},extend:function(e){return this.forEach(i.call(arguments,1),function(t){for(var n in t)e[n]=t[n]}),e}},f=function(e){this.defaults={locale_data:{messages:{"":{domain:"messages",lang:"en",plural_forms:"nplurals=2; plural=(n != 1);"}}},domain:"messages"},this.options=a.extend({},this.defaults,e),this.textdomain(this.options.domain);if(e.domain&&!this.options.locale_data[this.options.domain])throw new Error("Text domain set to non-existent domain: `"+e.domain+"`")};f.context_delimiter=String.fromCharCode(4),a.extend(c.prototype,{onDomain:function(e){return this._domain=e,this},withContext:function(e){return this._context=e,this},ifPlural:function(e,t){return this._val=e,this._pkey=t,this},fetch:function(e){return{}.toString.call(e)!="[object Array]"&&(e=[].slice.call(arguments)),(e&&e.length?f.sprintf:function(e){return e})(this._i18n.dcnpgettext(this._domain,this._context,this._key,this._pkey,this._val),e)}}),a.extend(f.prototype,{translate:function(e){return new c(e,this)},textdomain:function(e){if(!e)return this._textdomain;this._textdomain=e},gettext:function(e){return this.dcnpgettext.call(this,t,t,e)},dgettext:function(e,n){return this.dcnpgettext.call(this,e,t,n)},dcgettext:function(e,n){return this.dcnpgettext.call(this,e,t,n)},ngettext:function(e,n,r){return this.dcnpgettext.call(this,t,t,e,n,r)},dngettext:function(e,n,r,i){return this.dcnpgettext.call(this,e,t,n,r,i)},dcngettext:function(e,n,r,i){return this.dcnpgettext.call(this,e,t,n,r,i)},pgettext:function(e,n){return this.dcnpgettext.call(this,t,e,n)},dpgettext:function(e,t,n){return this.dcnpgettext.call(this,e,t,n)},dcpgettext:function(e,t,n){return this.dcnpgettext.call(this,e,t,n)},npgettext:function(e,n,r,i){return this.dcnpgettext.call(this,t,e,n,r,i)},dnpgettext:function(e,t,n,r,i){return this.dcnpgettext.call(this,e,t,n,r,i)},dcnpgettext:function(e,t,n,r,i){r=r||n,e=e||this._textdomain,i=typeof i=="undefined"?1:i;var s;if(!this.options)return s=new f,s.dcnpgettext.call(s,undefined,undefined,n,r,i);if(!this.options.locale_data)throw new Error("No locale data provided.");if(!this.options.locale_data[e])throw new Error("Domain `"+e+"` was not found.");if(!this.options.locale_data[e][""])throw new Error("No locale meta information provided.");if(!n)throw new Error("No translation key found.");if(typeof i!="number"){i=parseInt(i,10);if(isNaN(i))throw new Error("The number that was passed in is not a number.")}var o=t?t+f.context_delimiter+n:n,u=this.options.locale_data,a=u[e],c=a[""].plural_forms||(u.messages||this.defaults.locale_data.messages)[""].plural_forms,h=l(c)(i)+1,p,d;if(!a)throw new Error("No domain named `"+e+"` could be found.");return p=a[o],!p||h>=p.length?(this.options.missing_key_callback&&this.options.missing_key_callback(o),d=[null,n,r],d[l(c)(i)+1]):(d=p[h],d?d:(d=[null,n,r],d[l(c)(i)+1]))}});var h=function(){function e(e){return Object.prototype.toString.call(e).slice(8,-1).toLowerCase()}function t(e,t){for(var n=[];t>0;n[--t]=e);return n.join("")}var n=function(){return n.cache.hasOwnProperty(arguments[0])||(n.cache[arguments[0]]=n.parse(arguments[0])),n.format.call(null,n.cache[arguments[0]],arguments)};return n.format=function(n,r){var i=1,s=n.length,o="",u,a=[],f,l,c,p,d,v;for(f=0;f<s;f++){o=e(n[f]);if(o==="string")a.push(n[f]);else if(o==="array"){c=n[f];if(c[2]){u=r[i];for(l=0;l<c[2].length;l++){if(!u.hasOwnProperty(c[2][l]))throw h('[sprintf] property "%s" does not exist',c[2][l]);u=u[c[2][l]]}}else c[1]?u=r[c[1]]:u=r[i++];if(/[^s]/.test(c[8])&&e(u)!="number")throw h("[sprintf] expecting number but found %s",e(u));if(typeof u=="undefined"||u===null)u="";switch(c[8]){case"b":u=u.toString(2);break;case"c":u=String.fromCharCode(u);break;case"d":u=parseInt(u,10);break;case"e":u=c[7]?u.toExponential(c[7]):u.toExponential();break;case"f":u=c[7]?parseFloat(u).toFixed(c[7]):parseFloat(u);break;case"o":u=u.toString(8);break;case"s":u=(u=String(u))&&c[7]?u.substring(0,c[7]):u;break;case"u":u=Math.abs(u);break;case"x":u=u.toString(16);break;case"X":u=u.toString(16).toUpperCase()}u=/[def]/.test(c[8])&&c[3]&&u>=0?"+"+u:u,d=c[4]?c[4]=="0"?"0":c[4].charAt(1):" ",v=c[6]-String(u).length,p=c[6]?t(d,v):"",a.push(c[5]?u+p:p+u)}}return a.join("")},n.cache={},n.parse=function(e){var t=e,n=[],r=[],i=0;while(t){if((n=/^[^\x25]+/.exec(t))!==null)r.push(n[0]);else if((n=/^\x25{2}/.exec(t))!==null)r.push("%");else{if((n=/^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(t))===null)throw"[sprintf] huh?";if(n[2]){i|=1;var s=[],o=n[2],u=[];if((u=/^([a-z_][a-z_\d]*)/i.exec(o))===null)throw"[sprintf] huh?";s.push(u[1]);while((o=o.substring(u[0].length))!=="")if((u=/^\.([a-z_][a-z_\d]*)/i.exec(o))!==null)s.push(u[1]);else{if((u=/^\[(\d+)\]/.exec(o))===null)throw"[sprintf] huh?";s.push(u[1])}n[2]=s}else i|=2;if(i===3)throw"[sprintf] mixing positional and named placeholders is not (yet) supported";r.push(n)}t=t.substring(n[0].length)}return r},n}(),p=function(e,t){return t.unshift(e),h.apply(null,t)};f.parse_plural=function(e,t){return e=e.replace(/n/g,t),f.parse_expression(e)},f.sprintf=function(e,t){return{}.toString.call(t)=="[object Array]"?p(e,[].slice.call(t)):h.apply(this,[].slice.call(arguments))},f.prototype.sprintf=function(){return f.sprintf.apply(this,arguments)},f.PF={},f.PF.parse=function(e){var t=f.PF.extractPluralExpr(e);return f.PF.parser.parse.call(f.PF.parser,t)},f.PF.compile=function(e){function t(e){return e===!0?1:e?e:0}var n=f.PF.parse(e);return function(e){return t(f.PF.interpreter(n)(e))}},f.PF.interpreter=function(e){return function(t){var n;switch(e.type){case"GROUP":return f.PF.interpreter(e.expr)(t);case"TERNARY":if(f.PF.interpreter(e.expr)(t))return f.PF.interpreter(e.truthy)(t);return f.PF.interpreter(e.falsey)(t);case"OR":return f.PF.interpreter(e.left)(t)||f.PF.interpreter(e.right)(t);case"AND":return f.PF.interpreter(e.left)(t)&&f.PF.interpreter(e.right)(t);case"LT":return f.PF.interpreter(e.left)(t)<f.PF.interpreter(e.right)(t);case"GT":return f.PF.interpreter(e.left)(t)>f.PF.interpreter(e.right)(t);case"LTE":return f.PF.interpreter(e.left)(t)<=f.PF.interpreter(e.right)(t);case"GTE":return f.PF.interpreter(e.left)(t)>=f.PF.interpreter(e.right)(t);case"EQ":return f.PF.interpreter(e.left)(t)==f.PF.interpreter(e.right)(t);case"NEQ":return f.PF.interpreter(e.left)(t)!=f.PF.interpreter(e.right)(t);case"MOD":return f.PF.interpreter(e.left)(t)%f.PF.interpreter(e.right)(t);case"VAR":return t;case"NUM":return e.val;default:throw new Error("Invalid Token found.")}}},f.PF.extractPluralExpr=function(e){e=e.replace(/^\s\s*/,"").replace(/\s\s*$/,""),/;\s*$/.test(e)||(e=e.concat(";"));var t=/nplurals\=(\d+);/,n=/plural\=(.*);/,r=e.match(t),i={},s;if(r.length>1){i.nplurals=r[1],e=e.replace(t,""),s=e.match(n);if(!(s&&s.length>1))throw new Error("`plural` expression not found: "+e);return s[1]}throw new Error("nplurals not found in plural_forms string: "+e)},f.PF.parser=function(){var e={trace:function(){},yy:{},symbols_:{error:2,expressions:3,e:4,EOF:5,"?":6,":":7,"||":8,"&&":9,"<":10,"<=":11,">":12,">=":13,"!=":14,"==":15,"%":16,"(":17,")":18,n:19,NUMBER:20,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",6:"?",7:":",8:"||",9:"&&",10:"<",11:"<=",12:">",13:">=",14:"!=",15:"==",16:"%",17:"(",18:")",19:"n",20:"NUMBER"},productions_:[0,[3,2],[4,5],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,1],[4,1]],performAction:function(t,n,r,i,s,o,u){var a=o.length-1;switch(s){case 1:return{type:"GROUP",expr:o[a-1]};case 2:this.$={type:"TERNARY",expr:o[a-4],truthy:o[a-2],falsey:o[a]};break;case 3:this.$={type:"OR",left:o[a-2],right:o[a]};break;case 4:this.$={type:"AND",left:o[a-2],right:o[a]};break;case 5:this.$={type:"LT",left:o[a-2],right:o[a]};break;case 6:this.$={type:"LTE",left:o[a-2],right:o[a]};break;case 7:this.$={type:"GT",left:o[a-2],right:o[a]};break;case 8:this.$={type:"GTE",left:o[a-2],right:o[a]};break;case 9:this.$={type:"NEQ",left:o[a-2],right:o[a]};break;case 10:this.$={type:"EQ",left:o[a-2],right:o[a]};break;case 11:this.$={type:"MOD",left:o[a-2],right:o[a]};break;case 12:this.$={type:"GROUP",expr:o[a-1]};break;case 13:this.$={type:"VAR"};break;case 14:this.$={type:"NUM",val:Number(t)}}},table:[{3:1,4:2,17:[1,3],19:[1,4],20:[1,5]},{1:[3]},{5:[1,6],6:[1,7],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16]},{4:17,17:[1,3],19:[1,4],20:[1,5]},{5:[2,13],6:[2,13],7:[2,13],8:[2,13],9:[2,13],10:[2,13],11:[2,13],12:[2,13],13:[2,13],14:[2,13],15:[2,13],16:[2,13],18:[2,13]},{5:[2,14],6:[2,14],7:[2,14],8:[2,14],9:[2,14],10:[2,14],11:[2,14],12:[2,14],13:[2,14],14:[2,14],15:[2,14],16:[2,14],18:[2,14]},{1:[2,1]},{4:18,17:[1,3],19:[1,4],20:[1,5]},{4:19,17:[1,3],19:[1,4],20:[1,5]},{4:20,17:[1,3],19:[1,4],20:[1,5]},{4:21,17:[1,3],19:[1,4],20:[1,5]},{4:22,17:[1,3],19:[1,4],20:[1,5]},{4:23,17:[1,3],19:[1,4],20:[1,5]},{4:24,17:[1,3],19:[1,4],20:[1,5]},{4:25,17:[1,3],19:[1,4],20:[1,5]},{4:26,17:[1,3],19:[1,4],20:[1,5]},{4:27,17:[1,3],19:[1,4],20:[1,5]},{6:[1,7],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[1,28]},{6:[1,7],7:[1,29],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16]},{5:[2,3],6:[2,3],7:[2,3],8:[2,3],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,3]},{5:[2,4],6:[2,4],7:[2,4],8:[2,4],9:[2,4],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,4]},{5:[2,5],6:[2,5],7:[2,5],8:[2,5],9:[2,5],10:[2,5],11:[2,5],12:[2,5],13:[2,5],14:[2,5],15:[2,5],16:[1,16],18:[2,5]},{5:[2,6],6:[2,6],7:[2,6],8:[2,6],9:[2,6],10:[2,6],11:[2,6],12:[2,6],13:[2,6],14:[2,6],15:[2,6],16:[1,16],18:[2,6]},{5:[2,7],6:[2,7],7:[2,7],8:[2,7],9:[2,7],10:[2,7],11:[2,7],12:[2,7],13:[2,7],14:[2,7],15:[2,7],16:[1,16],18:[2,7]},{5:[2,8],6:[2,8],7:[2,8],8:[2,8],9:[2,8],10:[2,8],11:[2,8],12:[2,8],13:[2,8],14:[2,8],15:[2,8],16:[1,16],18:[2,8]},{5:[2,9],6:[2,9],7:[2,9],8:[2,9],9:[2,9],10:[2,9],11:[2,9],12:[2,9],13:[2,9],14:[2,9],15:[2,9],16:[1,16],18:[2,9]},{5:[2,10],6:[2,10],7:[2,10],8:[2,10],9:[2,10],10:[2,10],11:[2,10],12:[2,10],13:[2,10],14:[2,10],15:[2,10],16:[1,16],18:[2,10]},{5:[2,11],6:[2,11],7:[2,11],8:[2,11],9:[2,11],10:[2,11],11:[2,11],12:[2,11],13:[2,11],14:[2,11],15:[2,11],16:[2,11],18:[2,11]},{5:[2,12],6:[2,12],7:[2,12],8:[2,12],9:[2,12],10:[2,12],11:[2,12],12:[2,12],13:[2,12],14:[2,12],15:[2,12],16:[2,12],18:[2,12]},{4:30,17:[1,3],19:[1,4],20:[1,5]},{5:[2,2],6:[1,7],7:[2,2],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,2]}],defaultActions:{6:[2,1]},parseError:function(t,n){throw new Error(t)},parse:function(t){function d(e){r.length=r.length-2*e,i.length=i.length-e,s.length=s.length-e}function v(){var e;return e=n.lexer.lex()||1,typeof e!="number"&&(e=n.symbols_[e]||e),e}var n=this,r=[0],i=[null],s=[],o=this.table,u="",a=0,f=0,l=0,c=2,h=1;this.lexer.setInput(t),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,typeof this.lexer.yylloc=="undefined"&&(this.lexer.yylloc={});var p=this.lexer.yylloc;s.push(p),typeof this.yy.parseError=="function"&&(this.parseError=this.yy.parseError);var m,g,y,b,w,E,S={},x,T,N,C;for(;;){y=r[r.length-1],this.defaultActions[y]?b=this.defaultActions[y]:(m==null&&(m=v()),b=o[y]&&o[y][m]);if(typeof b=="undefined"||!b.length||!b[0]){if(!l){C=[];for(x in o[y])this.terminals_[x]&&x>2&&C.push("'"+this.terminals_[x]+"'");var k="";this.lexer.showPosition?k="Parse error on line "+(a+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+C.join(", ")+", got '"+this.terminals_[m]+"'":k="Parse error on line "+(a+1)+": Unexpected "+(m==1?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(k,{text:this.lexer.match,token:this.terminals_[m]||m,line:this.lexer.yylineno,loc:p,expected:C})}if(l==3){if(m==h)throw new Error(k||"Parsing halted.");f=this.lexer.yyleng,u=this.lexer.yytext,a=this.lexer.yylineno,p=this.lexer.yylloc,m=v()}for(;;){if(c.toString()in o[y])break;if(y==0)throw new Error(k||"Parsing halted.");d(1),y=r[r.length-1]}g=m,m=c,y=r[r.length-1],b=o[y]&&o[y][c],l=3}if(b[0]instanceof Array&&b.length>1)throw new Error("Parse Error: multiple actions possible at state: "+y+", token: "+m);switch(b[0]){case 1:r.push(m),i.push(this.lexer.yytext),s.push(this.lexer.yylloc),r.push(b[1]),m=null,g?(m=g,g=null):(f=this.lexer.yyleng,u=this.lexer.yytext,a=this.lexer.yylineno,p=this.lexer.yylloc,l>0&&l--);break;case 2:T=this.productions_[b[1]][1],S.$=i[i.length-T],S._$={first_line:s[s.length-(T||1)].first_line,last_line:s[s.length-1].last_line,first_column:s[s.length-(T||1)].first_column,last_column:s[s.length-1].last_column},E=this.performAction.call(S,u,f,a,this.yy,b[1],i,s);if(typeof E!="undefined")return E;T&&(r=r.slice(0,-1*T*2),i=i.slice(0,-1*T),s=s.slice(0,-1*T)),r.push(this.productions_[b[1]][0]),i.push(S.$),s.push(S._$),N=o[r[r.length-2]][r[r.length-1]],r.push(N);break;case 3:return!0}}return!0}},t=function(){var e={EOF:1,parseError:function(t,n){if(!this.yy.parseError)throw new Error(t);this.yy.parseError(t,n)},setInput:function(e){return this._input=e,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this},input:function(){var e=this._input[0];this.yytext+=e,this.yyleng++,this.match+=e,this.matched+=e;var t=e.match(/\n/);return t&&this.yylineno++,this._input=this._input.slice(1),e},unput:function(e){return this._input=e+this._input,this},more:function(){return this._more=!0,this},pastInput:function(){var e=this.matched.substr(0,this.matched.length-this.match.length);return(e.length>20?"...":"")+e.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var e=this.match;return e.length<20&&(e+=this._input.substr(0,20-e.length)),(e.substr(0,20)+(e.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var e=this.pastInput(),t=(new Array(e.length+1)).join("-");return e+this.upcomingInput()+"\n"+t+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var e,t,n,r;this._more||(this.yytext="",this.match="");var i=this._currentRules();for(var s=0;s<i.length;s++){t=this._input.match(this.rules[i[s]]);if(t){r=t[0].match(/\n.*/g),r&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-1:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this._more=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],e=this.performAction.call(this,this.yy,this,i[s],this.conditionStack[this.conditionStack.length-1]);if(e)return e;return}}if(this._input==="")return this.EOF;this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return typeof t!="undefined"?t:this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(t){this.begin(t)}};return e.performAction=function(t,n,r,i){var s=i;switch(r){case 0:break;case 1:return 20;case 2:return 19;case 3:return 8;case 4:return 9;case 5:return 6;case 6:return 7;case 7:return 11;case 8:return 13;case 9:return 10;case 10:return 12;case 11:return 14;case 12:return 15;case 13:return 16;case 14:return 17;case 15:return 18;case 16:return 5;case 17:return"INVALID"}},e.rules=[/^\s+/,/^[0-9]+(\.[0-9]+)?\b/,/^n\b/,/^\|\|/,/^&&/,/^\?/,/^:/,/^<=/,/^>=/,/^</,/^>/,/^!=/,/^==/,/^%/,/^\(/,/^\)/,/^$/,/^./],e.conditions={INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],inclusive:!0}},e}();return e.lexer=t,e}(),typeof exports!="undefined"?(typeof module!="undefined"&&module.exports&&(exports=module.exports=f),exports.Jed=f):(typeof define=="function"&&define.amd&&define("jed",[],function(){return f}),e.Jed=f)}(this),define("text!af",[],function(){return'{\n "domain": "converse",\n "locale_data": {\n "converse": {\n "": {\n "domain": "converse",\n "lang": "af"\n },\n " e.g. conversejs.org": [\n null,\n "bv. conversejs.org"\n ],\n "unencrypted": [\n null,\n "nie-privaat"\n ],\n "unverified": [\n null,\n "onbevestig"\n ],\n "verified": [\n null,\n "privaat"\n ],\n "finished": [\n null,\n "afgesluit"\n ],\n "This contact is busy": [\n null,\n "Hierdie persoon is besig"\n ],\n "This contact is online": [\n null,\n "Hierdie persoon is aanlyn"\n ],\n "This contact is offline": [\n null,\n "Hierdie persoon is aflyn"\n ],\n "This contact is unavailable": [\n null,\n "Hierdie persoon is onbeskikbaar"\n ],\n "This contact is away for an extended period": [\n null,\n "Hierdie persoon is vir lank afwesig"\n ],\n "This contact is away": [\n null,\n "Hierdie persoon is afwesig"\n ],\n "Click to hide these contacts": [\n null,\n "Klik om hierdie kontakte te verskuil"\n ],\n "My contacts": [\n null,\n "My kontakte"\n ],\n "Pending contacts": [\n null,\n "Hangende kontakte"\n ],\n "Contact requests": [\n null,\n "Kontak versoeke"\n ],\n "Ungrouped": [\n null,\n "Ongegroepeer"\n ],\n "Contacts": [\n null,\n "Kontakte"\n ],\n "Groups": [\n null,\n "Groepe"\n ],\n "Attempting to reconnect in 5 seconds": [\n null,\n ""\n ],\n "Error": [\n null,\n "Fout"\n ],\n "Connecting": [\n null,\n "Verbind tans"\n ],\n "Authenticating": [\n null,\n "Besig om te bekragtig"\n ],\n "Authentication Failed": [\n null,\n "Bekragtiging het gefaal"\n ],\n "Re-establishing encrypted session": [\n null,\n "Herstel versleutelde sessie"\n ],\n "Generating private key.": [\n null,\n "Genereer private sleutel."\n ],\n "Your browser might become unresponsive.": [\n null,\n "U webblaaier mag tydelik onreageerbaar word."\n ],\n "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n null,\n "Identiteitbevestigingsversoek van %1$s\\n\\nU gespreksmaat probeer om u identiteit te bevestig, deur die volgende vraag te vra \\n\\n%2$s"\n ],\n "Could not verify this user\'s identify.": [\n null,\n "Kon nie hierdie gebruiker se identitied bevestig nie."\n ],\n "Exchanging private key with contact.": [\n null,\n "Sleutels word met gespreksmaat uitgeruil."\n ],\n "Close this chat box": [\n null,\n "Klik om hierdie kletskas toe te maak"\n ],\n "Minimize this chat box": [\n null,\n "Minimeer hierdie kletskas"\n ],\n "View more information on this person": [\n null,\n "Wys meer inligting aangaande hierdie persoon"\n ],\n "Personal message": [\n null,\n "Persoonlike boodskap"\n ],\n "Are you sure you want to clear the messages from this room?": [\n null,\n "Is u seker dat u die boodskappe in hierdie kamer wil verwyder?"\n ],\n "me": [\n null,\n "ek"\n ],\n "is typing": [\n null,\n "tik tans"\n ],\n "has stopped typing": [\n null,\n "het opgehou tik"\n ],\n "has gone away": [\n null,\n "het weggegaan"\n ],\n "Show this menu": [\n null,\n "Vertoon hierdie keuselys"\n ],\n "Write in the third person": [\n null,\n "Skryf in die derde persoon"\n ],\n "Remove messages": [\n null,\n "Verwyder boodskappe"\n ],\n "Are you sure you want to clear the messages from this chat box?": [\n null,\n "Is u seker u wil die boodskappe in hierdie kletskas uitvee?"\n ],\n "Your message could not be sent": [\n null,\n "U boodskap kon nie gestuur word nie"\n ],\n "We received an unencrypted message": [\n null,\n "Ons het \'n onversleutelde boodskap ontvang"\n ],\n "We received an unreadable encrypted message": [\n null,\n "Ons het \'n onleesbare versleutelde boodskap ontvang"\n ],\n "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n null,\n "Hier is die vingerafdrukke, bevestig hulle met %1$s, buite hierdie kletskanaal \\n\\nU vingerafdruk, %2$s: %3$s\\n\\nVingerafdruk vir %1$s: %4$s\\n\\nIndien u die vingerafdrukke bevestig het, klik OK, andersinds klik Kanselleer"\n ],\n "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n null,\n "Daar sal van u verwag word om \'n sekuriteitsvraag te stel, en dan ook die antwoord tot daardie vraag te verskaf.\\n\\nU gespreksmaat sal dan daardie vraag gestel word, en indien hulle presies dieselfde antwoord (lw. hoofletters tel) verskaf, sal hul identiteit bevestig wees."\n ],\n "What is your security question?": [\n null,\n "Wat is u sekuriteitsvraag?"\n ],\n "What is the answer to the security question?": [\n null,\n "Wat is die antwoord tot die sekuriteitsvraag?"\n ],\n "Invalid authentication scheme provided": [\n null,\n "Ongeldige verifikasiemetode verskaf"\n ],\n "has gone offline": [\n null,\n "is nou aflyn"\n ],\n "is busy": [\n null,\n "is besig"\n ],\n "Your messages are not encrypted anymore": [\n null,\n "U boodskappe is nie meer versleutel nie"\n ],\n "Your messages are now encrypted but your contact\'s identity has not been verified.": [\n null,\n "U boodskappe is now versleutel maar u gespreksmaat se identiteit is nog onseker."\n ],\n "Your contact\'s identify has been verified.": [\n null,\n "U gespreksmaat se identiteit is bevestig."\n ],\n "Your contact has ended encryption on their end, you should do the same.": [\n null,\n "U gespreksmaat het versleuteling gestaak, u behoort nou dieselfde te doen."\n ],\n "Your messages are not encrypted. Click here to enable OTR encryption.": [\n null,\n "U boodskappe is nie versleutel nie. Klik hier om OTR versleuteling te aktiveer."\n ],\n "Your messages are encrypted, but your contact has not been verified.": [\n null,\n "U boodskappe is versleutel, maar u gespreksmaat se identiteit is not onseker."\n ],\n "Your messages are encrypted and your contact verified.": [\n null,\n "U boodskappe is versleutel en u gespreksmaat se identiteit bevestig."\n ],\n "Your contact has closed their end of the private session, you should do the same": [\n null,\n "U gespreksmaat het die private sessie gestaak. U behoort dieselfde te doen"\n ],\n "Clear all messages": [\n null,\n "Vee alle boodskappe uit"\n ],\n "End encrypted conversation": [\n null,\n "Beëindig versleutelde gesprek"\n ],\n "Insert a smiley": [\n null,\n ""\n ],\n "Hide the list of occupants": [\n null,\n "Verskuil die lys van deelnemers"\n ],\n "Refresh encrypted conversation": [\n null,\n "Verfris versleutelde gesprek"\n ],\n "Start a call": [\n null,\n "Begin \'n oproep"\n ],\n "Start encrypted conversation": [\n null,\n "Begin versleutelde gesprek"\n ],\n "Verify with fingerprints": [\n null,\n "Bevestig met vingerafdrukke"\n ],\n "Verify with SMP": [\n null,\n "Bevestig met SMP"\n ],\n "What\'s this?": [\n null,\n "Wat is hierdie?"\n ],\n "Online": [\n null,\n "Aangemeld"\n ],\n "Busy": [\n null,\n "Besig"\n ],\n "Away": [\n null,\n "Afwesig"\n ],\n "Offline": [\n null,\n "Afgemeld"\n ],\n "Log out": [\n null,\n "Meld af"\n ],\n "Contact name": [\n null,\n "Kontaknaam"\n ],\n "Search": [\n null,\n "Soek"\n ],\n "e.g. user@example.com": [\n null,\n ""\n ],\n "Add": [\n null,\n "Voeg by"\n ],\n "Click to add new chat contacts": [\n null,\n "Klik om nuwe kletskontakte by te voeg"\n ],\n "Add a contact": [\n null,\n "Voeg \'n kontak by"\n ],\n "No users found": [\n null,\n "Geen gebruikers gevind"\n ],\n "Click to add as a chat contact": [\n null,\n "Klik om as kletskontak by te voeg"\n ],\n "Room name": [\n null,\n "Kamer naam"\n ],\n "Nickname": [\n null,\n "Bynaam"\n ],\n "Server": [\n null,\n "Bediener"\n ],\n "Join Room": [\n null,\n "Betree kamer"\n ],\n "Show rooms": [\n null,\n "Wys kamers"\n ],\n "Rooms": [\n null,\n "Kamers"\n ],\n "No rooms on %1$s": [\n null,\n "Geen kamers op %1$s"\n ],\n "Rooms on %1$s": [\n null,\n "Kamers op %1$s"\n ],\n "Click to open this room": [\n null,\n "Klik om hierdie kletskamer te open"\n ],\n "Show more information on this room": [\n null,\n "Wys meer inligting aangaande hierdie kletskamer"\n ],\n "Description:": [\n null,\n "Beskrywing:"\n ],\n "Occupants:": [\n null,\n "Deelnemers:"\n ],\n "Features:": [\n null,\n "Eienskappe:"\n ],\n "Requires authentication": [\n null,\n "Benodig magtiging"\n ],\n "Hidden": [\n null,\n "Verskuil"\n ],\n "Requires an invitation": [\n null,\n "Benodig \'n uitnodiging"\n ],\n "Moderated": [\n null,\n "Gemodereer"\n ],\n "Non-anonymous": [\n null,\n "Nie-anoniem"\n ],\n "Open room": [\n null,\n "Oop kletskamer"\n ],\n "Permanent room": [\n null,\n "Permanente kamer"\n ],\n "Public": [\n null,\n "Publiek"\n ],\n "Semi-anonymous": [\n null,\n "Deels anoniem"\n ],\n "Temporary room": [\n null,\n "Tydelike kamer"\n ],\n "Unmoderated": [\n null,\n "Ongemodereer"\n ],\n "This user is a moderator": [\n null,\n "Hierdie gebruiker is \'n moderator"\n ],\n "This user can send messages in this room": [\n null,\n "Hierdie gebruiker kan boodskappe na die kamer stuur"\n ],\n "This user can NOT send messages in this room": [\n null,\n "Hierdie gebruiker kan NIE boodskappe na die kamer stuur nie"\n ],\n "Invite...": [\n null,\n "Nooi uit..."\n ],\n "Occupants": [\n null,\n "Deelnemers"\n ],\n "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n null,\n "U is op die punt om %1$s na die kletskamer \\"%2$s\\" uit te nooi."\n ],\n "You may optionally include a message, explaining the reason for the invitation.": [\n null,\n "U mag na keuse \'n boodskap insluit, om bv. die rede vir die uitnodiging te staaf."\n ],\n "Message": [\n null,\n "Boodskap"\n ],\n "Error: could not execute the command": [\n null,\n "Fout: kon nie die opdrag uitvoer nie"\n ],\n "Error: the \\"": [\n null,\n ""\n ],\n "Change user\'s affiliation to admin": [\n null,\n ""\n ],\n "Ban user from room": [\n null,\n "Verban gebruiker uit hierdie kletskamer"\n ],\n "Change user role to occupant": [\n null,\n "Verander gebruiker se rol na lid"\n ],\n "Kick user from room": [\n null,\n "Skop gebruiker uit hierdie kletskamer"\n ],\n "Write in 3rd person": [\n null,\n "Skryf in die derde persoon"\n ],\n "Grant membership to a user": [\n null,\n "Verleen lidmaatskap aan \'n gebruiker"\n ],\n "Remove user\'s ability to post messages": [\n null,\n "Verwyder gebruiker se vermoë om boodskappe te plaas"\n ],\n "Change your nickname": [\n null,\n "Verander u bynaam"\n ],\n "Grant moderator role to user": [\n null,\n "Verleen moderator rol aan gebruiker"\n ],\n "Grant ownership of this room": [\n null,\n "Verleen eienaarskap van hierdie kamer"\n ],\n "Revoke user\'s membership": [\n null,\n "Herroep gebruiker se lidmaatskap"\n ],\n "Set room topic": [\n null,\n "Stel onderwerp vir kletskamer"\n ],\n "Allow muted user to post messages": [\n null,\n "Laat stilgemaakte gebruiker toe om weer boodskappe te plaas"\n ],\n "Save": [\n null,\n "Stoor"\n ],\n "Cancel": [\n null,\n "Kanseleer"\n ],\n "An error occurred while trying to save the form.": [\n null,\n "A fout het voorgekom terwyl probeer is om die vorm te stoor."\n ],\n "This chatroom requires a password": [\n null,\n "Hiedie kletskamer benodig \'n wagwoord"\n ],\n "Password: ": [\n null,\n "Wagwoord:"\n ],\n "Submit": [\n null,\n "Dien in"\n ],\n "This room is not anonymous": [\n null,\n "Hierdie vertrek is nie anoniem nie"\n ],\n "This room now shows unavailable members": [\n null,\n "Hierdie vertrek wys nou onbeskikbare lede"\n ],\n "This room does not show unavailable members": [\n null,\n "Hierdie vertrek wys nie onbeskikbare lede nie"\n ],\n "Non-privacy-related room configuration has changed": [\n null,\n "Nie-privaatheidverwante kamer instellings het verander"\n ],\n "Room logging is now enabled": [\n null,\n "Kamer log is nou aangeskakel"\n ],\n "Room logging is now disabled": [\n null,\n "Kamer log is nou afgeskakel"\n ],\n "This room is now non-anonymous": [\n null,\n "Hiedie kamer is nou nie anoniem nie"\n ],\n "This room is now semi-anonymous": [\n null,\n "Hierdie kamer is nou gedeeltelik anoniem"\n ],\n "This room is now fully-anonymous": [\n null,\n "Hierdie kamer is nou ten volle anoniem"\n ],\n "A new room has been created": [\n null,\n "\'n Nuwe kamer is geskep"\n ],\n "You have been banned from this room": [\n null,\n "Jy is uit die kamer verban"\n ],\n "You have been kicked from this room": [\n null,\n "Jy is uit die kamer geskop"\n ],\n "You have been removed from this room because of an affiliation change": [\n null,\n "Jy is vanuit die kamer verwyder a.g.v \'n verandering van affiliasie"\n ],\n "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n null,\n "Jy is vanuit die kamer verwyder omdat die kamer nou slegs tot lede beperk word en jy nie \'n lid is nie."\n ],\n "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n null,\n "Jy is van hierdie kamer verwyder aangesien die MUC (Multi-user chat) diens nou afgeskakel word."\n ],\n "<strong>%1$s</strong> has been banned": [\n null,\n "<strong>%1$s</strong> is verban"\n ],\n "<strong>%1$s</strong>\'s nickname has changed": [\n null,\n "<strong>%1$s</strong> se bynaam het verander"\n ],\n "<strong>%1$s</strong> has been kicked out": [\n null,\n "<strong>%1$s</strong> is uitgeskop"\n ],\n "<strong>%1$s</strong> has been removed because of an affiliation change": [\n null,\n "<strong>%1$s</strong> is verwyder a.g.v \'n verandering van affiliasie"\n ],\n "<strong>%1$s</strong> has been removed for not being a member": [\n null,\n "<strong>%1$s</strong> is nie \'n lid nie, en dus verwyder"\n ],\n "Your nickname has been automatically changed to: <strong>%1$s</strong>": [\n null,\n "U bynaam is outomaties verander na: <strong>%1$s</strong>"\n ],\n "Your nickname has been changed to: <strong>%1$s</strong>": [\n null,\n "U bynaam is verander na: <strong>%1$s</strong>"\n ],\n "The reason given is: \\"": [\n null,\n "Die gegewe rede is: \\""\n ],\n "You are not on the member list of this room": [\n null,\n "Jy is nie op die ledelys van hierdie kamer nie"\n ],\n "No nickname was specified": [\n null,\n "Geen bynaam verskaf nie"\n ],\n "You are not allowed to create new rooms": [\n null,\n "Jy word nie toegelaat om nog kamers te skep nie"\n ],\n "Your nickname doesn\'t conform to this room\'s policies": [\n null,\n "Jou bynaam voldoen nie aan die kamer se beleid nie"\n ],\n "Your nickname is already taken": [\n null,\n "Jou bynaam is reeds geneem"\n ],\n "This room does not (yet) exist": [\n null,\n "Hierdie kamer bestaan tans (nog) nie"\n ],\n "This room has reached it\'s maximum number of occupants": [\n null,\n "Hierdie kamer het sy maksimum aantal deelnemers bereik"\n ],\n "Topic set by %1$s to: %2$s": [\n null,\n "Onderwerp deur %1$s bygewerk na: %2$s"\n ],\n "%1$s has invited you to join a chat room: %2$s": [\n null,\n "%1$s het u uitgenooi om die kletskamer %2$s te besoek"\n ],\n "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n null,\n "%1$s het u uitgenooi om die kletskamer %2$s te besoek, en het die volgende rede verskaf: \\"%3$s\\""\n ],\n "Click to restore this chat": [\n null,\n "Klik om hierdie klets te herstel"\n ],\n "Minimized": [\n null,\n "Geminimaliseer"\n ],\n "Click to remove this contact": [\n null,\n "Klik om hierdie kontak te verwyder"\n ],\n "Click to accept this contact request": [\n null,\n "Klik om hierdie kontakversoek te aanvaar"\n ],\n "Click to decline this contact request": [\n null,\n "Klik om hierdie kontakversoek te weier"\n ],\n "Click to chat with this contact": [\n null,\n "Klik om met hierdie kontak te klets"\n ],\n "Name": [\n null,\n ""\n ],\n "Are you sure you want to remove this contact?": [\n null,\n "Is u seker u wil hierdie gespreksmaat verwyder?"\n ],\n "Sorry, there was an error while trying to remove ": [\n null,\n ""\n ],\n "Are you sure you want to decline this contact request?": [\n null,\n "Is u seker dat u hierdie persoon se versoek wil afkeur?"\n ],\n "Sorry, there was an error while trying to add ": [\n null,\n ""\n ],\n "This client does not allow presence subscriptions": [\n null,\n ""\n ],\n "Type to filter": [\n null,\n "Tik om te filtreer"\n ],\n "I am %1$s": [\n null,\n "Ek is %1$s"\n ],\n "Click here to write a custom status message": [\n null,\n "Klik hier om jou eie statusboodskap te skryf"\n ],\n "Click to change your chat status": [\n null,\n "Klik om jou klets-status te verander"\n ],\n "Custom status": [\n null,\n "Doelgemaakte status"\n ],\n "online": [\n null,\n "aangemeld"\n ],\n "busy": [\n null,\n "besig"\n ],\n "away for long": [\n null,\n "vir lank afwesig"\n ],\n "away": [\n null,\n "afwesig"\n ],\n "offline": [\n null,\n "afgemeld"\n ],\n "Your XMPP provider\'s domain name:": [\n null,\n "U XMPP-verskaffer se domein naam:"\n ],\n "Fetch registration form": [\n null,\n "Haal die registrasie form"\n ],\n "Tip: A list of public XMPP providers is available": [\n null,\n "Wenk: A lys van publieke XMPP-verskaffers is beskikbaar"\n ],\n "here": [\n null,\n "hier"\n ],\n "Register": [\n null,\n "Registreer"\n ],\n "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n null,\n "Jammer, die gekose verskaffer ondersteun nie in-band registrasie nie.Probeer weer met \'n ander verskaffer."\n ],\n "Requesting a registration form from the XMPP server": [\n null,\n "Vra tans die XMPP-bediener vir \'n registrasie vorm"\n ],\n "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n null,\n "Iets het fout geloop tydens koppeling met \\"%1$s\\". Is u seker dat dit bestaan?"\n ],\n "Now logging you in": [\n null,\n "U word nou aangemeld"\n ],\n "Registered successfully": [\n null,\n "Suksesvol geregistreer"\n ],\n "Return": [\n null,\n "Terug"\n ],\n "XMPP Username:": [\n null,\n "XMPP Gebruikersnaam:"\n ],\n "Password:": [\n null,\n "Wagwoord"\n ],\n "Click here to log in anonymously": [\n null,\n "Klik hier om anoniem aan te meld"\n ],\n "Log In": [\n null,\n "Meld aan"\n ],\n "user@server": [\n null,\n "gebruiker@bediener"\n ],\n "password": [\n null,\n "wagwoord"\n ],\n "Sign in": [\n null,\n "Teken in"\n ],\n "Toggle chat": [\n null,\n "Klets"\n ]\n }\n }\n}'}),define("text!de",[],function(){return'{\n "domain": "converse",\n "locale_data": {\n "converse": {\n "": {\n "domain": "converse",\n "plural_forms": "nplurals=2; plural=(n != 1);",\n "lang": "de"\n },\n " e.g. conversejs.org": [\n null,\n "z. B. conversejs.org"\n ],\n "unencrypted": [\n null,\n "unverschlüsselt"\n ],\n "unverified": [\n null,\n "nicht verifiziert"\n ],\n "verified": [\n null,\n "verifiziert"\n ],\n "finished": [\n null,\n "erledigt"\n ],\n "This contact is busy": [\n null,\n "Dieser Kontakt ist beschäftigt"\n ],\n "This contact is online": [\n null,\n "Dieser Kontakt ist online"\n ],\n "This contact is offline": [\n null,\n "Dieser Kontakt ist offline"\n ],\n "This contact is unavailable": [\n null,\n "Dieser Kontakt ist nicht verfügbar"\n ],\n "This contact is away for an extended period": [\n null,\n "Dieser Kontakt ist für längere Zeit abwesend"\n ],\n "This contact is away": [\n null,\n "Dieser Kontakt ist abwesend"\n ],\n "Click to hide these contacts": [\n null,\n "Hier klicken um diese Kontakte zu verstecken"\n ],\n "My contacts": [\n null,\n "Meine Kontakte"\n ],\n "Pending contacts": [\n null,\n "Unbestätigte Kontakte"\n ],\n "Contact requests": [\n null,\n "Kontaktanfragen"\n ],\n "Ungrouped": [\n null,\n "Ungruppiert"\n ],\n "Contacts": [\n null,\n "Kontakte"\n ],\n "Groups": [\n null,\n "Gruppen"\n ],\n "Attempting to reconnect in 5 seconds": [\n null,\n ""\n ],\n "Error": [\n null,\n "Fehler"\n ],\n "Connecting": [\n null,\n "Verbindungsaufbau …"\n ],\n "Authenticating": [\n null,\n "Authentifizierung"\n ],\n "Authentication Failed": [\n null,\n "Authentifizierung gescheitert"\n ],\n "Re-establishing encrypted session": [\n null,\n "Verschlüsselte Sitzung wiederherstellen"\n ],\n "Generating private key.": [\n null,\n "Generiere privaten Schlüssel."\n ],\n "Your browser might become unresponsive.": [\n null,\n "Ihr Browser könnte langsam reagieren."\n ],\n "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n null,\n "Authentifizierungsanfrage von %1$s\\n\\nIhr Kontakt möchte durch die folgende Frage Ihre Identität verifizieren:\\n\\n%2$s"\n ],\n "Could not verify this user\'s identify.": [\n null,\n "Die Identität des Benutzers konnte nicht verifiziert werden."\n ],\n "Exchanging private key with contact.": [\n null,\n "Tausche private Schlüssel mit Kontakt aus."\n ],\n "Minimize this chat box": [\n null,\n ""\n ],\n "Personal message": [\n null,\n "Persönliche Nachricht"\n ],\n "Are you sure you want to clear the messages from this room?": [\n null,\n "Sind Sie sicher, dass Sie alle Nachrichten in diesem Raum löschen möchten?"\n ],\n "me": [\n null,\n "Ich"\n ],\n "is typing": [\n null,\n "tippt"\n ],\n "has stopped typing": [\n null,\n "tippt nicht mehr"\n ],\n "has gone away": [\n null,\n "ist jetzt abwesend"\n ],\n "Show this menu": [\n null,\n "Dieses Menü anzeigen"\n ],\n "Write in the third person": [\n null,\n "In der dritten Person schreiben"\n ],\n "Remove messages": [\n null,\n "Nachrichten entfernen"\n ],\n "Are you sure you want to clear the messages from this chat box?": [\n null,\n "Sind Sie sicher, dass Sie alle Nachrichten dieses Chats löschen möchten?"\n ],\n "Your message could not be sent": [\n null,\n "Ihre Nachricht konnte nicht gesendet werden"\n ],\n "We received an unencrypted message": [\n null,\n "Wir haben eine unverschlüsselte Nachricht empfangen"\n ],\n "We received an unreadable encrypted message": [\n null,\n "Wir haben eine unlesbare Nachricht empfangen"\n ],\n "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n null,\n ""\n ],\n "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n null,\n ""\n ],\n "What is your security question?": [\n null,\n ""\n ],\n "What is the answer to the security question?": [\n null,\n ""\n ],\n "Invalid authentication scheme provided": [\n null,\n ""\n ],\n "is busy": [\n null,\n "ist beschäftigt"\n ],\n "Your messages are not encrypted anymore": [\n null,\n ""\n ],\n "Your messages are now encrypted but your contact\'s identity has not been verified.": [\n null,\n ""\n ],\n "Your contact\'s identify has been verified.": [\n null,\n ""\n ],\n "Your contact has ended encryption on their end, you should do the same.": [\n null,\n ""\n ],\n "Your messages are not encrypted. Click here to enable OTR encryption.": [\n null,\n ""\n ],\n "Your messages are encrypted, but your contact has not been verified.": [\n null,\n ""\n ],\n "Your messages are encrypted and your contact verified.": [\n null,\n ""\n ],\n "Your contact has closed their end of the private session, you should do the same": [\n null,\n ""\n ],\n "Clear all messages": [\n null,\n "Alle Nachrichten löschen"\n ],\n "End encrypted conversation": [\n null,\n ""\n ],\n "Insert a smiley": [\n null,\n ""\n ],\n "Refresh encrypted conversation": [\n null,\n ""\n ],\n "Start a call": [\n null,\n ""\n ],\n "Start encrypted conversation": [\n null,\n ""\n ],\n "Verify with fingerprints": [\n null,\n ""\n ],\n "Verify with SMP": [\n null,\n ""\n ],\n "What\'s this?": [\n null,\n "Was ist das?"\n ],\n "Online": [\n null,\n "Online"\n ],\n "Busy": [\n null,\n "Beschäftigt"\n ],\n "Away": [\n null,\n "Abwesend"\n ],\n "Offline": [\n null,\n "Abgemeldet"\n ],\n "Log out": [\n null,\n "Abmelden"\n ],\n "Contact name": [\n null,\n "Name des Kontakts"\n ],\n "Search": [\n null,\n "Suche"\n ],\n "e.g. user@example.com": [\n null,\n ""\n ],\n "Add": [\n null,\n "Hinzufügen"\n ],\n "Click to add new chat contacts": [\n null,\n "Hier klicken um neuen Kontakt hinzuzufügen"\n ],\n "Add a contact": [\n null,\n "Kontakt hinzufügen"\n ],\n "No users found": [\n null,\n "Keine Benutzer gefunden"\n ],\n "Click to add as a chat contact": [\n null,\n "Hier klicken um als Kontakt hinzuzufügen"\n ],\n "Room name": [\n null,\n "Raumname"\n ],\n "Nickname": [\n null,\n "Spitzname"\n ],\n "Server": [\n null,\n "Server"\n ],\n "Join Room": [\n null,\n "Raum betreten"\n ],\n "Show rooms": [\n null,\n "Räume anzeigen"\n ],\n "Rooms": [\n null,\n "Räume"\n ],\n "No rooms on %1$s": [\n null,\n "Keine Räume auf %1$s"\n ],\n "Rooms on %1$s": [\n null,\n "Räume auf %1$s"\n ],\n "Click to open this room": [\n null,\n "Hier klicken um diesen Raum zu öffnen"\n ],\n "Show more information on this room": [\n null,\n "Mehr Information über diesen Raum zeigen"\n ],\n "Description:": [\n null,\n "Beschreibung"\n ],\n "Occupants:": [\n null,\n "Teilnehmer"\n ],\n "Features:": [\n null,\n "Funktionen:"\n ],\n "Requires authentication": [\n null,\n "Authentifizierung erforderlich"\n ],\n "Hidden": [\n null,\n "Versteckt"\n ],\n "Requires an invitation": [\n null,\n "Einladung erforderlich"\n ],\n "Moderated": [\n null,\n "Moderiert"\n ],\n "Non-anonymous": [\n null,\n "Nicht anonym"\n ],\n "Open room": [\n null,\n "Offener Raum"\n ],\n "Permanent room": [\n null,\n "Dauerhafter Raum"\n ],\n "Public": [\n null,\n "Öffentlich"\n ],\n "Semi-anonymous": [\n null,\n "Teils anonym"\n ],\n "Temporary room": [\n null,\n "Vorübergehender Raum"\n ],\n "Unmoderated": [\n null,\n "Unmoderiert"\n ],\n "This user is a moderator": [\n null,\n "Dieser Benutzer ist ein Moderator"\n ],\n "This user can send messages in this room": [\n null,\n "Dieser Benutzer kann Nachrichten in diesem Raum verschicken"\n ],\n "This user can NOT send messages in this room": [\n null,\n "Dieser Benutzer kann keine Nachrichten in diesem Raum verschicken"\n ],\n "Invite...": [\n null,\n "Einladen..."\n ],\n "Occupants": [\n null,\n "Teilnehmer"\n ],\n "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n null,\n ""\n ],\n "You may optionally include a message, explaining the reason for the invitation.": [\n null,\n ""\n ],\n "Message": [\n null,\n "Nachricht"\n ],\n "Error: could not execute the command": [\n null,\n "Fehler: Konnte den Befehl nicht ausführen"\n ],\n "Error: the \\"": [\n null,\n ""\n ],\n "Change user\'s affiliation to admin": [\n null,\n ""\n ],\n "Ban user from room": [\n null,\n "Verbanne einen Benutzer aus dem Raum."\n ],\n "Kick user from room": [\n null,\n "Werfe einen Benutzer aus dem Raum."\n ],\n "Write in 3rd person": [\n null,\n "In der dritten Person schreiben"\n ],\n "Grant membership to a user": [\n null,\n ""\n ],\n "Remove user\'s ability to post messages": [\n null,\n ""\n ],\n "Change your nickname": [\n null,\n "Spitznamen ändern"\n ],\n "Grant moderator role to user": [\n null,\n ""\n ],\n "Grant ownership of this room": [\n null,\n "Besitzrechte an diesem Raum vergeben"\n ],\n "Revoke user\'s membership": [\n null,\n ""\n ],\n "Set room topic": [\n null,\n "Chatraum Thema festlegen"\n ],\n "Allow muted user to post messages": [\n null,\n ""\n ],\n "Save": [\n null,\n "Speichern"\n ],\n "Cancel": [\n null,\n "Abbrechen"\n ],\n "An error occurred while trying to save the form.": [\n null,\n "Beim Speichern des Formulars ist ein Fehler aufgetreten."\n ],\n "This chatroom requires a password": [\n null,\n "Dieser Raum erfordert ein Passwort"\n ],\n "Password: ": [\n null,\n "Passwort: "\n ],\n "Submit": [\n null,\n "Abschicken"\n ],\n "This room is not anonymous": [\n null,\n "Dieser Raum ist nicht anonym"\n ],\n "This room now shows unavailable members": [\n null,\n "Dieser Raum zeigt jetzt nicht verfügbare Mitglieder an"\n ],\n "This room does not show unavailable members": [\n null,\n "Dieser Raum zeigt jetzt nicht verfügbare Mitglieder nicht an"\n ],\n "Non-privacy-related room configuration has changed": [\n null,\n "Die Raumkonfiguration hat sich geändert (nicht Privatsphäre relevant)"\n ],\n "Room logging is now enabled": [\n null,\n "Nachrichten in diesem Raum werden ab jetzt protokolliert."\n ],\n "Room logging is now disabled": [\n null,\n "Nachrichten in diesem Raum werden nicht mehr protokolliert."\n ],\n "This room is now non-anonymous": [\n null,\n "Dieser Raum ist jetzt nicht anonym"\n ],\n "This room is now semi-anonymous": [\n null,\n "Dieser Raum ist jetzt teils anonym"\n ],\n "This room is now fully-anonymous": [\n null,\n "Dieser Raum ist jetzt anonym"\n ],\n "A new room has been created": [\n null,\n "Ein neuer Raum wurde erstellt"\n ],\n "You have been banned from this room": [\n null,\n "Sie sind aus diesem Raum verbannt worden"\n ],\n "You have been kicked from this room": [\n null,\n "Sie wurden aus diesem Raum hinausgeworfen"\n ],\n "You have been removed from this room because of an affiliation change": [\n null,\n "Sie wurden wegen einer Zugehörigkeitsänderung entfernt"\n ],\n "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n null,\n "Sie wurden aus diesem Raum entfernt, da Sie kein Mitglied sind."\n ],\n "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n null,\n "Sie wurden aus diesem Raum entfernt, da der MUC (Multi-User Chat) Dienst gerade heruntergefahren wird."\n ],\n "<strong>%1$s</strong> has been banned": [\n null,\n "<strong>%1$s</strong> ist verbannt worden"\n ],\n "<strong>%1$s</strong>\'s nickname has changed": [\n null,\n "<strong>%1$s</strong> hat den Spitznamen geändert"\n ],\n "<strong>%1$s</strong> has been kicked out": [\n null,\n "<strong>%1$s</strong> wurde hinausgeworfen"\n ],\n "<strong>%1$s</strong> has been removed because of an affiliation change": [\n null,\n "<strong>%1$s</strong> wurde wegen einer Zugehörigkeitsänderung entfernt"\n ],\n "<strong>%1$s</strong> has been removed for not being a member": [\n null,\n "<strong>%1$s</strong> ist kein Mitglied und wurde daher entfernt"\n ],\n "Your nickname has been automatically changed to: <strong>%1$s</strong>": [\n null,\n "Ihr Spitzname wurde automatisiert geändert zu: <strong>%1$s</strong>"\n ],\n "Your nickname has been changed to: <strong>%1$s</strong>": [\n null,\n "Ihr Spitzname wurde geändert zu: <strong>%1$s</strong>"\n ],\n "The reason given is: \\"": [\n null,\n "Die angegebene Begründung lautet: \\""\n ],\n "You are not on the member list of this room": [\n null,\n "Sie sind nicht auf der Mitgliederliste dieses Raums"\n ],\n "No nickname was specified": [\n null,\n "Kein Spitzname festgelegt"\n ],\n "You are not allowed to create new rooms": [\n null,\n "Es ist Ihnen nicht erlaubt neue Räume anzulegen"\n ],\n "Your nickname doesn\'t conform to this room\'s policies": [\n null,\n "Ungültiger Spitzname"\n ],\n "Your nickname is already taken": [\n null,\n "Ihre Spitzname existiert bereits."\n ],\n "This room does not (yet) exist": [\n null,\n "Dieser Raum existiert (noch) nicht"\n ],\n "This room has reached it\'s maximum number of occupants": [\n null,\n "Dieser Raum hat die maximale Mitgliederanzahl erreicht"\n ],\n "Topic set by %1$s to: %2$s": [\n null,\n "%1$s hat das Thema zu \\"%2$s\\" geändert"\n ],\n "%1$s has invited you to join a chat room: %2$s": [\n null,\n "%1$s hat Sie in den Raum \\"%2$s\\" eingeladen"\n ],\n "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n null,\n "%1$s hat Sie in den Raum \\"%2$s\\" eingeladen. Begründung: \\"%3$s\\""\n ],\n "Click to restore this chat": [\n null,\n "Hier klicken um diesen Chat wiederherzustellen"\n ],\n "Minimized": [\n null,\n "Minimiert"\n ],\n "Click to remove this contact": [\n null,\n "Hier klicken um diesen Kontakt zu entfernen"\n ],\n "Click to accept this contact request": [\n null,\n "Hier klicken um diese Kontaktanfrage zu akzeptieren"\n ],\n "Click to decline this contact request": [\n null,\n "Hier klicken um diese Kontaktanfrage zu abzulehnen"\n ],\n "Click to chat with this contact": [\n null,\n "Hier klicken um mit diesem Kontakt zu chatten"\n ],\n "Name": [\n null,\n ""\n ],\n "Are you sure you want to remove this contact?": [\n null,\n "Wollen Sie diesen Kontakt wirklich entfernen?"\n ],\n "Sorry, there was an error while trying to remove ": [\n null,\n ""\n ],\n "Are you sure you want to decline this contact request?": [\n null,\n "Wollen Sie diese Kontaktanfrage wirklich ablehnen?"\n ],\n "Sorry, there was an error while trying to add ": [\n null,\n ""\n ],\n "This client does not allow presence subscriptions": [\n null,\n ""\n ],\n "Type to filter": [\n null,\n "Tippen um zu filtern"\n ],\n "I am %1$s": [\n null,\n "Ich bin %1$s"\n ],\n "Click here to write a custom status message": [\n null,\n "Hier klicken um Statusnachricht zu ändern"\n ],\n "Click to change your chat status": [\n null,\n "Hier klicken um Status zu ändern"\n ],\n "Custom status": [\n null,\n "Statusnachricht"\n ],\n "online": [\n null,\n "online"\n ],\n "busy": [\n null,\n "beschäftigt"\n ],\n "away for long": [\n null,\n "länger abwesend"\n ],\n "away": [\n null,\n "abwesend"\n ],\n "Your XMPP provider\'s domain name:": [\n null,\n ""\n ],\n "Fetch registration form": [\n null,\n ""\n ],\n "Tip: A list of public XMPP providers is available": [\n null,\n ""\n ],\n "here": [\n null,\n ""\n ],\n "Register": [\n null,\n ""\n ],\n "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n null,\n ""\n ],\n "Requesting a registration form from the XMPP server": [\n null,\n ""\n ],\n "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n null,\n ""\n ],\n "Now logging you in": [\n null,\n ""\n ],\n "Registered successfully": [\n null,\n ""\n ],\n "Return": [\n null,\n "Zurück"\n ],\n "The provider rejected your registration attempt. Please check the values you entered for correctness.": [\n null,\n ""\n ],\n "XMPP Username:": [\n null,\n "XMPP Benutzername"\n ],\n "Password:": [\n null,\n "Passwort:"\n ],\n "Click here to log in anonymously": [\n null,\n "Hier klicken um anonym anzumelden"\n ],\n "Log In": [\n null,\n "Anmelden"\n ],\n "user@server": [\n null,\n ""\n ],\n "Sign in": [\n null,\n "Anmelden"\n ],\n "Toggle chat": [\n null,\n "Chat ein-/ausblenden"\n ]\n }\n }\n}'}),define("text!en",[],function(){return'{\n "domain": "converse",\n "locale_data": {\n "converse": {\n "": {\n "domain": "converse",\n "plural_forms": "nplurals=2; plural=(n != 1);",\n "lang": "en"\n },\n " e.g. conversejs.org": [\n null,\n ""\n ],\n "unencrypted": [\n null,\n ""\n ],\n "unverified": [\n null,\n ""\n ],\n "verified": [\n null,\n ""\n ],\n "finished": [\n null,\n ""\n ],\n "This contact is busy": [\n null,\n ""\n ],\n "This contact is online": [\n null,\n ""\n ],\n "This contact is offline": [\n null,\n ""\n ],\n "This contact is unavailable": [\n null,\n ""\n ],\n "This contact is away for an extended period": [\n null,\n ""\n ],\n "This contact is away": [\n null,\n ""\n ],\n "Click to hide these contacts": [\n null,\n ""\n ],\n "My contacts": [\n null,\n ""\n ],\n "Pending contacts": [\n null,\n ""\n ],\n "Contact requests": [\n null,\n ""\n ],\n "Ungrouped": [\n null,\n ""\n ],\n "Contacts": [\n null,\n ""\n ],\n "Groups": [\n null,\n ""\n ],\n "Attempting to reconnect in 5 seconds": [\n null,\n ""\n ],\n "Error": [\n null,\n ""\n ],\n "Connecting": [\n null,\n ""\n ],\n "Authenticating": [\n null,\n ""\n ],\n "Authentication Failed": [\n null,\n ""\n ],\n "Re-establishing encrypted session": [\n null,\n ""\n ],\n "Generating private key.": [\n null,\n ""\n ],\n "Your browser might become unresponsive.": [\n null,\n ""\n ],\n "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n null,\n ""\n ],\n "Could not verify this user\'s identify.": [\n null,\n ""\n ],\n "Exchanging private key with contact.": [\n null,\n ""\n ],\n "Close this chat box": [\n null,\n ""\n ],\n "Minimize this chat box": [\n null,\n ""\n ],\n "Personal message": [\n null,\n ""\n ],\n "Are you sure you want to clear the messages from this room?": [\n null,\n ""\n ],\n "me": [\n null,\n ""\n ],\n "is typing": [\n null,\n ""\n ],\n "has stopped typing": [\n null,\n ""\n ],\n "has gone away": [\n null,\n ""\n ],\n "Show this menu": [\n null,\n "Show this menu"\n ],\n "Write in the third person": [\n null,\n "Write in the third person"\n ],\n "Remove messages": [\n null,\n "Remove messages"\n ],\n "Are you sure you want to clear the messages from this chat box?": [\n null,\n ""\n ],\n "Your message could not be sent": [\n null,\n ""\n ],\n "We received an unencrypted message": [\n null,\n ""\n ],\n "We received an unreadable encrypted message": [\n null,\n ""\n ],\n "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n null,\n ""\n ],\n "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n null,\n ""\n ],\n "What is your security question?": [\n null,\n ""\n ],\n "What is the answer to the security question?": [\n null,\n ""\n ],\n "Invalid authentication scheme provided": [\n null,\n ""\n ],\n "has gone offline": [\n null,\n ""\n ],\n "is busy": [\n null,\n ""\n ],\n "Your messages are not encrypted anymore": [\n null,\n ""\n ],\n "Your messages are now encrypted but your contact\'s identity has not been verified.": [\n null,\n ""\n ],\n "Your contact\'s identify has been verified.": [\n null,\n ""\n ],\n "Your contact has ended encryption on their end, you should do the same.": [\n null,\n ""\n ],\n "Your messages are not encrypted. Click here to enable OTR encryption.": [\n null,\n ""\n ],\n "Your messages are encrypted, but your contact has not been verified.": [\n null,\n ""\n ],\n "Your messages are encrypted and your contact verified.": [\n null,\n ""\n ],\n "Your contact has closed their end of the private session, you should do the same": [\n null,\n ""\n ],\n "Clear all messages": [\n null,\n ""\n ],\n "End encrypted conversation": [\n null,\n ""\n ],\n "Insert a smiley": [\n null,\n ""\n ],\n "Hide the list of occupants": [\n null,\n ""\n ],\n "Refresh encrypted conversation": [\n null,\n ""\n ],\n "Start a call": [\n null,\n ""\n ],\n "Start encrypted conversation": [\n null,\n ""\n ],\n "Verify with fingerprints": [\n null,\n ""\n ],\n "Verify with SMP": [\n null,\n ""\n ],\n "What\'s this?": [\n null,\n ""\n ],\n "Online": [\n null,\n ""\n ],\n "Busy": [\n null,\n ""\n ],\n "Away": [\n null,\n ""\n ],\n "Offline": [\n null,\n ""\n ],\n "Log out": [\n null,\n ""\n ],\n "Contact name": [\n null,\n ""\n ],\n "Search": [\n null,\n ""\n ],\n "e.g. user@example.com": [\n null,\n ""\n ],\n "Add": [\n null,\n ""\n ],\n "Click to add new chat contacts": [\n null,\n ""\n ],\n "Add a contact": [\n null,\n ""\n ],\n "No users found": [\n null,\n ""\n ],\n "Click to add as a chat contact": [\n null,\n ""\n ],\n "Room name": [\n null,\n ""\n ],\n "Nickname": [\n null,\n ""\n ],\n "Server": [\n null,\n "Server"\n ],\n "Join Room": [\n null,\n ""\n ],\n "Show rooms": [\n null,\n ""\n ],\n "Rooms": [\n null,\n ""\n ],\n "No rooms on %1$s": [\n null,\n ""\n ],\n "Rooms on %1$s": [\n null,\n "Rooms on %1$s"\n ],\n "Click to open this room": [\n null,\n "Click to open this room"\n ],\n "Show more information on this room": [\n null,\n "Show more information on this room"\n ],\n "Description:": [\n null,\n "Description:"\n ],\n "Occupants:": [\n null,\n "Occupants:"\n ],\n "Features:": [\n null,\n "Features:"\n ],\n "Requires authentication": [\n null,\n "Requires authentication"\n ],\n "Hidden": [\n null,\n "Hidden"\n ],\n "Requires an invitation": [\n null,\n "Requires an invitation"\n ],\n "Moderated": [\n null,\n "Moderated"\n ],\n "Non-anonymous": [\n null,\n "Non-anonymous"\n ],\n "Open room": [\n null,\n "Open room"\n ],\n "Permanent room": [\n null,\n "Permanent room"\n ],\n "Public": [\n null,\n "Public"\n ],\n "Semi-anonymous": [\n null,\n "Semi-anonymous"\n ],\n "Temporary room": [\n null,\n "Temporary room"\n ],\n "Unmoderated": [\n null,\n "Unmoderated"\n ],\n "This user is a moderator": [\n null,\n "This user is a moderator"\n ],\n "This user can send messages in this room": [\n null,\n "This user can send messages in this room"\n ],\n "This user can NOT send messages in this room": [\n null,\n "This user can NOT send messages in this room"\n ],\n "Invite...": [\n null,\n ""\n ],\n "Occupants": [\n null,\n ""\n ],\n "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n null,\n ""\n ],\n "You may optionally include a message, explaining the reason for the invitation.": [\n null,\n ""\n ],\n "Message": [\n null,\n "Message"\n ],\n "Error: could not execute the command": [\n null,\n ""\n ],\n "Error: the \\"": [\n null,\n ""\n ],\n "Change user\'s affiliation to admin": [\n null,\n ""\n ],\n "Ban user from room": [\n null,\n ""\n ],\n "Change user role to occupant": [\n null,\n ""\n ],\n "Kick user from room": [\n null,\n ""\n ],\n "Write in 3rd person": [\n null,\n ""\n ],\n "Grant membership to a user": [\n null,\n ""\n ],\n "Remove user\'s ability to post messages": [\n null,\n ""\n ],\n "Change your nickname": [\n null,\n ""\n ],\n "Grant moderator role to user": [\n null,\n ""\n ],\n "Grant ownership of this room": [\n null,\n ""\n ],\n "Revoke user\'s membership": [\n null,\n ""\n ],\n "Set room topic": [\n null,\n ""\n ],\n "Allow muted user to post messages": [\n null,\n ""\n ],\n "Save": [\n null,\n "Save"\n ],\n "Cancel": [\n null,\n "Cancel"\n ],\n "An error occurred while trying to save the form.": [\n null,\n "An error occurred while trying to save the form."\n ],\n "This chatroom requires a password": [\n null,\n "This chatroom requires a password"\n ],\n "Password: ": [\n null,\n "Password: "\n ],\n "Submit": [\n null,\n "Submit"\n ],\n "This room is not anonymous": [\n null,\n "This room is not anonymous"\n ],\n "This room now shows unavailable members": [\n null,\n "This room now shows unavailable members"\n ],\n "This room does not show unavailable members": [\n null,\n "This room does not show unavailable members"\n ],\n "Non-privacy-related room configuration has changed": [\n null,\n "Non-privacy-related room configuration has changed"\n ],\n "Room logging is now enabled": [\n null,\n "Room logging is now enabled"\n ],\n "Room logging is now disabled": [\n null,\n "Room logging is now disabled"\n ],\n "This room is now non-anonymous": [\n null,\n "This room is now non-anonymous"\n ],\n "This room is now semi-anonymous": [\n null,\n "This room is now semi-anonymous"\n ],\n "This room is now fully-anonymous": [\n null,\n "This room is now fully-anonymous"\n ],\n "A new room has been created": [\n null,\n "A new room has been created"\n ],\n "You have been banned from this room": [\n null,\n "You have been banned from this room"\n ],\n "You have been kicked from this room": [\n null,\n "You have been kicked from this room"\n ],\n "You have been removed from this room because of an affiliation change": [\n null,\n "You have been removed from this room because of an affiliation change"\n ],\n "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n null,\n "You have been removed from this room because the room has changed to members-only and you\'re not a member"\n ],\n "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n null,\n "You have been removed from this room because the MUC (Multi-user chat) service is being shut down."\n ],\n "<strong>%1$s</strong> has been banned": [\n null,\n "<strong>%1$s</strong> has been banned"\n ],\n "<strong>%1$s</strong>\'s nickname has changed": [\n null,\n ""\n ],\n "<strong>%1$s</strong> has been kicked out": [\n null,\n "<strong>%1$s</strong> has been kicked out"\n ],\n "<strong>%1$s</strong> has been removed because of an affiliation change": [\n null,\n "<strong>%1$s</strong> has been removed because of an affiliation change"\n ],\n "<strong>%1$s</strong> has been removed for not being a member": [\n null,\n "<strong>%1$s</strong> has been removed for not being a member"\n ],\n "Your nickname has been automatically changed to: <strong>%1$s</strong>": [\n null,\n ""\n ],\n "Your nickname has been changed to: <strong>%1$s</strong>": [\n null,\n ""\n ],\n "The reason given is: \\"": [\n null,\n ""\n ],\n "You are not on the member list of this room": [\n null,\n "You are not on the member list of this room"\n ],\n "No nickname was specified": [\n null,\n "No nickname was specified"\n ],\n "You are not allowed to create new rooms": [\n null,\n "You are not allowed to create new rooms"\n ],\n "Your nickname doesn\'t conform to this room\'s policies": [\n null,\n "Your nickname doesn\'t conform to this room\'s policies"\n ],\n "Your nickname is already taken": [\n null,\n "Your nickname is already taken"\n ],\n "This room does not (yet) exist": [\n null,\n "This room does not (yet) exist"\n ],\n "This room has reached it\'s maximum number of occupants": [\n null,\n "This room has reached it\'s maximum number of occupants"\n ],\n "Topic set by %1$s to: %2$s": [\n null,\n "Topic set by %1$s to: %2$s"\n ],\n "%1$s has invited you to join a chat room: %2$s": [\n null,\n ""\n ],\n "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n null,\n ""\n ],\n "Click to restore this chat": [\n null,\n ""\n ],\n "Minimized": [\n null,\n ""\n ],\n "Click to remove this contact": [\n null,\n "Click to remove this contact"\n ],\n "Click to accept this contact request": [\n null,\n ""\n ],\n "Click to decline this contact request": [\n null,\n ""\n ],\n "Click to chat with this contact": [\n null,\n "Click to chat with this contact"\n ],\n "Name": [\n null,\n ""\n ],\n "Are you sure you want to remove this contact?": [\n null,\n ""\n ],\n "Sorry, there was an error while trying to remove ": [\n null,\n ""\n ],\n "Are you sure you want to decline this contact request?": [\n null,\n ""\n ],\n "Sorry, there was an error while trying to add ": [\n null,\n ""\n ],\n "This client does not allow presence subscriptions": [\n null,\n ""\n ],\n "Type to filter": [\n null,\n ""\n ],\n "I am %1$s": [\n null,\n "I am %1$s"\n ],\n "Click here to write a custom status message": [\n null,\n "Click here to write a custom status message"\n ],\n "Click to change your chat status": [\n null,\n "Click to change your chat status"\n ],\n "Custom status": [\n null,\n "Custom status"\n ],\n "online": [\n null,\n "online"\n ],\n "busy": [\n null,\n "busy"\n ],\n "away for long": [\n null,\n "away for long"\n ],\n "away": [\n null,\n "away"\n ],\n "Your XMPP provider\'s domain name:": [\n null,\n ""\n ],\n "Fetch registration form": [\n null,\n ""\n ],\n "Tip: A list of public XMPP providers is available": [\n null,\n ""\n ],\n "here": [\n null,\n ""\n ],\n "Register": [\n null,\n ""\n ],\n "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n null,\n ""\n ],\n "Requesting a registration form from the XMPP server": [\n null,\n ""\n ],\n "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n null,\n ""\n ],\n "Now logging you in": [\n null,\n ""\n ],\n "Registered successfully": [\n null,\n ""\n ],\n "Return": [\n null,\n ""\n ],\n "The provider rejected your registration attempt. Please check the values you entered for correctness.": [\n null,\n ""\n ],\n "XMPP Username:": [\n null,\n ""\n ],\n "Password:": [\n null,\n "Password:"\n ],\n "Click here to log in anonymously": [\n null,\n "Click here to log in anonymously"\n ],\n "Log In": [\n null,\n "Log In"\n ],\n "user@server": [\n null,\n ""\n ],\n "Sign in": [\n null,\n "Sign in"\n ],\n "Toggle chat": [\n null,\n ""\n ]\n }\n }\n}'}),define("text!es",[],function(){return'{\n "domain": "converse",\n "locale_data": {\n "converse": {\n "": {\n "domain": "converse",\n "plural_forms": "nplurals=2; plural=(n != 1);",\n "lang": "es"\n },\n " e.g. conversejs.org": [\n null,\n ""\n ],\n "unencrypted": [\n null,\n "texto plano"\n ],\n "unverified": [\n null,\n "sin verificar"\n ],\n "verified": [\n null,\n "verificado"\n ],\n "finished": [\n null,\n "finalizado"\n ],\n "This contact is busy": [\n null,\n "Este contacto está ocupado"\n ],\n "This contact is online": [\n null,\n "Este contacto está en línea"\n ],\n "This contact is offline": [\n null,\n "Este contacto está desconectado"\n ],\n "This contact is unavailable": [\n null,\n "Este contacto no está disponible"\n ],\n "This contact is away for an extended period": [\n null,\n "Este contacto está ausente por un largo periodo de tiempo"\n ],\n "This contact is away": [\n null,\n "Este contacto está ausente"\n ],\n "My contacts": [\n null,\n "Mis contactos"\n ],\n "Pending contacts": [\n null,\n "Contactos pendientes"\n ],\n "Contact requests": [\n null,\n "Solicitudes de contacto"\n ],\n "Ungrouped": [\n null,\n ""\n ],\n "Contacts": [\n null,\n "Contactos"\n ],\n "Groups": [\n null,\n ""\n ],\n "Attempting to reconnect in 5 seconds": [\n null,\n ""\n ],\n "Error": [\n null,\n "Error"\n ],\n "Connecting": [\n null,\n "Conectando"\n ],\n "Authenticating": [\n null,\n "Autenticando"\n ],\n "Authentication Failed": [\n null,\n "La autenticación falló"\n ],\n "Re-establishing encrypted session": [\n null,\n "Re-estableciendo sesión cifrada"\n ],\n "Generating private key.": [\n null,\n "Generando llave privada"\n ],\n "Your browser might become unresponsive.": [\n null,\n "Su navegador podría dejar de responder por un momento"\n ],\n "Could not verify this user\'s identify.": [\n null,\n "No se pudo verificar la identidad de este usuario"\n ],\n "Minimize this chat box": [\n null,\n ""\n ],\n "Personal message": [\n null,\n "Mensaje personal"\n ],\n "Are you sure you want to clear the messages from this room?": [\n null,\n "¿Está seguro de querer limpiar los mensajes de esta sala?"\n ],\n "me": [\n null,\n "yo"\n ],\n "is typing": [\n null,\n ""\n ],\n "has stopped typing": [\n null,\n ""\n ],\n "Show this menu": [\n null,\n "Mostrar este menú"\n ],\n "Write in the third person": [\n null,\n "Escribir en tercera persona"\n ],\n "Remove messages": [\n null,\n "Eliminar mensajes"\n ],\n "Are you sure you want to clear the messages from this chat box?": [\n null,\n "¿Está seguro de querer limpiar los mensajes de esta conversación?"\n ],\n "Your message could not be sent": [\n null,\n "Su mensaje no se pudo enviar"\n ],\n "We received an unencrypted message": [\n null,\n "Se recibío un mensaje sin cifrar"\n ],\n "We received an unreadable encrypted message": [\n null,\n "Se recibío un mensaje cifrado corrupto"\n ],\n "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n null,\n "Por favor confirme los identificadores de %1$s fuera de este chat.\\n\\nSu identificador es, %2$s: %3$s\\n\\nEl identificador de %1$s es: %4$s\\n\\nDespués de confirmar los identificadores haga click en OK, cancele si no concuerdan."\n ],\n "What is your security question?": [\n null,\n "Introduzca su pregunta de seguridad"\n ],\n "What is the answer to the security question?": [\n null,\n "Introduzca la respuesta a su pregunta de seguridad"\n ],\n "Invalid authentication scheme provided": [\n null,\n "Esquema de autenticación inválido"\n ],\n "Your messages are not encrypted anymore": [\n null,\n "Sus mensajes han dejado de cifrarse"\n ],\n "Your messages are not encrypted. Click here to enable OTR encryption.": [\n null,\n "Sus mensajes no están cifrados. Haga click aquí para habilitar el cifrado OTR"\n ],\n "End encrypted conversation": [\n null,\n "Finalizar sesión cifrada"\n ],\n "Insert a smiley": [\n null,\n ""\n ],\n "Hide the list of occupants": [\n null,\n ""\n ],\n "Refresh encrypted conversation": [\n null,\n "Actualizar sesión cifrada"\n ],\n "Start a call": [\n null,\n ""\n ],\n "Start encrypted conversation": [\n null,\n "Iniciar sesión cifrada"\n ],\n "Verify with fingerprints": [\n null,\n "Verificar con identificadores"\n ],\n "Verify with SMP": [\n null,\n "Verificar con SMP"\n ],\n "What\'s this?": [\n null,\n "¿Qué es esto?"\n ],\n "Online": [\n null,\n "En línea"\n ],\n "Busy": [\n null,\n "Ocupado"\n ],\n "Away": [\n null,\n "Ausente"\n ],\n "Offline": [\n null,\n "Desconectado"\n ],\n "Contact name": [\n null,\n "Nombre de contacto"\n ],\n "Search": [\n null,\n "Búsqueda"\n ],\n "e.g. user@example.com": [\n null,\n ""\n ],\n "Add": [\n null,\n "Agregar"\n ],\n "Click to add new chat contacts": [\n null,\n "Haga click para agregar nuevos contactos al chat"\n ],\n "Add a contact": [\n null,\n "Agregar un contacto"\n ],\n "No users found": [\n null,\n "Sin usuarios encontrados"\n ],\n "Click to add as a chat contact": [\n null,\n "Haga click para agregar como contacto de chat"\n ],\n "Room name": [\n null,\n "Nombre de sala"\n ],\n "Nickname": [\n null,\n "Apodo"\n ],\n "Server": [\n null,\n "Servidor"\n ],\n "Show rooms": [\n null,\n "Mostrar salas"\n ],\n "Rooms": [\n null,\n "Salas"\n ],\n "No rooms on %1$s": [\n null,\n "Sin salas en %1$s"\n ],\n "Rooms on %1$s": [\n null,\n "Salas en %1$s"\n ],\n "Click to open this room": [\n null,\n "Haga click para abrir esta sala"\n ],\n "Show more information on this room": [\n null,\n "Mostrar más información en esta sala"\n ],\n "Description:": [\n null,\n "Descripción"\n ],\n "Occupants:": [\n null,\n "Ocupantes:"\n ],\n "Features:": [\n null,\n "Características:"\n ],\n "Requires authentication": [\n null,\n "Autenticación requerida"\n ],\n "Hidden": [\n null,\n "Oculto"\n ],\n "Requires an invitation": [\n null,\n "Requiere una invitación"\n ],\n "Moderated": [\n null,\n "Moderado"\n ],\n "Non-anonymous": [\n null,\n "No anónimo"\n ],\n "Open room": [\n null,\n "Abrir sala"\n ],\n "Permanent room": [\n null,\n "Sala permanente"\n ],\n "Public": [\n null,\n "Pública"\n ],\n "Semi-anonymous": [\n null,\n "Semi anónimo"\n ],\n "Temporary room": [\n null,\n "Sala temporal"\n ],\n "Unmoderated": [\n null,\n "Sin moderar"\n ],\n "This user is a moderator": [\n null,\n "Este usuario es un moderador"\n ],\n "This user can send messages in this room": [\n null,\n "Este usuario puede enviar mensajes en esta sala"\n ],\n "This user can NOT send messages in this room": [\n null,\n "Este usuario NO puede enviar mensajes en esta"\n ],\n "Invite...": [\n null,\n ""\n ],\n "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n null,\n ""\n ],\n "You may optionally include a message, explaining the reason for the invitation.": [\n null,\n ""\n ],\n "Message": [\n null,\n "Mensaje"\n ],\n "Error: could not execute the command": [\n null,\n ""\n ],\n "Error: the \\"": [\n null,\n ""\n ],\n "Change user\'s affiliation to admin": [\n null,\n ""\n ],\n "Change user role to occupant": [\n null,\n ""\n ],\n "Grant membership to a user": [\n null,\n ""\n ],\n "Remove user\'s ability to post messages": [\n null,\n ""\n ],\n "Change your nickname": [\n null,\n ""\n ],\n "Grant moderator role to user": [\n null,\n ""\n ],\n "Revoke user\'s membership": [\n null,\n ""\n ],\n "Allow muted user to post messages": [\n null,\n ""\n ],\n "Save": [\n null,\n "Guardar"\n ],\n "Cancel": [\n null,\n "Cancelar"\n ],\n "An error occurred while trying to save the form.": [\n null,\n "Un error ocurrío mientras se guardaba el formulario."\n ],\n "This chatroom requires a password": [\n null,\n "Esta sala de chat requiere una contraseña."\n ],\n "Password: ": [\n null,\n "Contraseña: "\n ],\n "Submit": [\n null,\n "Enviar"\n ],\n "This room is not anonymous": [\n null,\n "Esta sala no es para usuarios anónimos"\n ],\n "This room now shows unavailable members": [\n null,\n "Esta sala ahora muestra los miembros no disponibles"\n ],\n "This room does not show unavailable members": [\n null,\n "Esta sala no muestra los miembros no disponibles"\n ],\n "Non-privacy-related room configuration has changed": [\n null,\n "Una configuración de la sala no relacionada con la privacidad ha sido cambiada"\n ],\n "Room logging is now enabled": [\n null,\n "El registro de la sala ahora está habilitado"\n ],\n "Room logging is now disabled": [\n null,\n "El registro de la sala ahora está deshabilitado"\n ],\n "This room is now non-anonymous": [\n null,\n "Esta sala ahora es pública"\n ],\n "This room is now semi-anonymous": [\n null,\n "Esta sala ahora es semi-anónima"\n ],\n "This room is now fully-anonymous": [\n null,\n "Esta sala ahora es completamente anónima"\n ],\n "A new room has been created": [\n null,\n "Una nueva sala ha sido creada"\n ],\n "You have been banned from this room": [\n null,\n "Usted ha sido bloqueado de esta sala"\n ],\n "You have been kicked from this room": [\n null,\n "Usted ha sido expulsado de esta sala"\n ],\n "You have been removed from this room because of an affiliation change": [\n null,\n "Usted ha sido eliminado de esta sala debido a un cambio de afiliación"\n ],\n "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n null,\n "Usted ha sido eliminado de esta sala debido a que la sala cambio su configuración a solo-miembros y usted no es un miembro"\n ],\n "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n null,\n "Usted ha sido eliminado de esta sala debido a que el servicio MUC (Multi-user chat) está deshabilitado."\n ],\n "<strong>%1$s</strong> has been banned": [\n null,\n "<strong>%1$s</strong> ha sido bloqueado"\n ],\n "<strong>%1$s</strong> has been kicked out": [\n null,\n "<strong>%1$s</strong> ha sido expulsado"\n ],\n "<strong>%1$s</strong> has been removed because of an affiliation change": [\n null,\n "<strong>%1$s</strong> ha sido eliminado debido a un cambio de afiliación"\n ],\n "<strong>%1$s</strong> has been removed for not being a member": [\n null,\n "<strong>%1$s</strong> ha sido eliminado debido a que no es miembro"\n ],\n "The reason given is: \\"": [\n null,\n ""\n ],\n "You are not on the member list of this room": [\n null,\n "Usted no está en la lista de miembros de esta sala"\n ],\n "No nickname was specified": [\n null,\n "Sin apodo especificado"\n ],\n "You are not allowed to create new rooms": [\n null,\n "Usted no esta autorizado para crear nuevas salas"\n ],\n "Your nickname doesn\'t conform to this room\'s policies": [\n null,\n "Su apodo no se ajusta a la política de esta sala"\n ],\n "Your nickname is already taken": [\n null,\n "Su apodo ya ha sido tomando por otro usuario"\n ],\n "This room does not (yet) exist": [\n null,\n "Esta sala (aún) no existe"\n ],\n "This room has reached it\'s maximum number of occupants": [\n null,\n "Esta sala ha alcanzado su número máximo de ocupantes"\n ],\n "Topic set by %1$s to: %2$s": [\n null,\n "Tema fijado por %1$s a: %2$s"\n ],\n "%1$s has invited you to join a chat room: %2$s": [\n null,\n ""\n ],\n "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n null,\n ""\n ],\n "Click to restore this chat": [\n null,\n "Haga click para eliminar este contacto"\n ],\n "Minimized": [\n null,\n "Minimizado"\n ],\n "Click to remove this contact": [\n null,\n "Haga click para eliminar este contacto"\n ],\n "Click to chat with this contact": [\n null,\n "Haga click para conversar con este contacto"\n ],\n "Name": [\n null,\n ""\n ],\n "Are you sure you want to remove this contact?": [\n null,\n "¿Esta seguro de querer eliminar este contacto?"\n ],\n "Sorry, there was an error while trying to remove ": [\n null,\n ""\n ],\n "Sorry, there was an error while trying to add ": [\n null,\n ""\n ],\n "This client does not allow presence subscriptions": [\n null,\n ""\n ],\n "Type to filter": [\n null,\n ""\n ],\n "I am %1$s": [\n null,\n "Estoy %1$s"\n ],\n "Click here to write a custom status message": [\n null,\n "Haga click para escribir un mensaje de estatus personalizado"\n ],\n "Click to change your chat status": [\n null,\n "Haga click para cambiar su estatus de chat"\n ],\n "Custom status": [\n null,\n "Personalizar estatus"\n ],\n "online": [\n null,\n "en línea"\n ],\n "busy": [\n null,\n "ocupado"\n ],\n "away for long": [\n null,\n "ausente por mucho tiempo"\n ],\n "away": [\n null,\n "ausente"\n ],\n "Your XMPP provider\'s domain name:": [\n null,\n ""\n ],\n "Fetch registration form": [\n null,\n ""\n ],\n "Tip: A list of public XMPP providers is available": [\n null,\n ""\n ],\n "here": [\n null,\n ""\n ],\n "Register": [\n null,\n ""\n ],\n "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n null,\n ""\n ],\n "Requesting a registration form from the XMPP server": [\n null,\n ""\n ],\n "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n null,\n ""\n ],\n "Now logging you in": [\n null,\n ""\n ],\n "Registered successfully": [\n null,\n ""\n ],\n "Return": [\n null,\n ""\n ],\n "The provider rejected your registration attempt. Please check the values you entered for correctness.": [\n null,\n ""\n ],\n "Password:": [\n null,\n "Contraseña:"\n ],\n "Log In": [\n null,\n "Iniciar sesión"\n ],\n "user@server": [\n null,\n ""\n ],\n "Sign in": [\n null,\n "Registrar"\n ],\n "Toggle chat": [\n null,\n "Chat"\n ]\n }\n }\n}'}),define("text!fr",[],function(){return'{\n "domain": "converse",\n "locale_data": {\n "converse": {\n "": {\n "domain": "converse",\n "plural_forms": "nplurals=2; plural=(n != 1);",\n "lang": "fr"\n },\n " e.g. conversejs.org": [\n null,\n ""\n ],\n "unencrypted": [\n null,\n "non crypté"\n ],\n "unverified": [\n null,\n "non vérifié"\n ],\n "verified": [\n null,\n "vérifié"\n ],\n "finished": [\n null,\n "terminé"\n ],\n "This contact is busy": [\n null,\n "Ce contact est occupé"\n ],\n "This contact is online": [\n null,\n "Ce contact est connecté"\n ],\n "This contact is offline": [\n null,\n "Ce contact est déconnecté"\n ],\n "This contact is unavailable": [\n null,\n "Ce contact est indisponible"\n ],\n "This contact is away for an extended period": [\n null,\n "Ce contact est absent"\n ],\n "This contact is away": [\n null,\n "Ce contact est absent"\n ],\n "Click to hide these contacts": [\n null,\n "Cliquez pour cacher ces contacts"\n ],\n "My contacts": [\n null,\n "Mes contacts"\n ],\n "Pending contacts": [\n null,\n "Contacts en attente"\n ],\n "Contact requests": [\n null,\n "Demandes de contacts"\n ],\n "Ungrouped": [\n null,\n "Sans groupe"\n ],\n "Contacts": [\n null,\n "Contacts"\n ],\n "Groups": [\n null,\n "Groupes"\n ],\n "Attempting to reconnect in 5 seconds": [\n null,\n ""\n ],\n "Error": [\n null,\n "Erreur"\n ],\n "Connecting": [\n null,\n "Connexion"\n ],\n "Authenticating": [\n null,\n "Authentification"\n ],\n "Authentication Failed": [\n null,\n "L\'authentification a échoué"\n ],\n "Re-establishing encrypted session": [\n null,\n "Rétablissement de la session encryptée"\n ],\n "Generating private key.": [\n null,\n "Génération de la clé privée"\n ],\n "Your browser might become unresponsive.": [\n null,\n "Votre navigateur pourrait ne plus répondre"\n ],\n "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n null,\n "Demande d\'authentification de %1$s\\n\\nVotre contact tente de vérifier votre identité, en vous posant la question ci-dessous.\\n\\n%2$s"\n ],\n "Could not verify this user\'s identify.": [\n null,\n "L\'identité de cet utilisateur ne peut pas être vérifiée"\n ],\n "Exchanging private key with contact.": [\n null,\n "Échange de clé privée avec le contact"\n ],\n "Minimize this chat box": [\n null,\n ""\n ],\n "Personal message": [\n null,\n "Message personnel"\n ],\n "Are you sure you want to clear the messages from this room?": [\n null,\n "Etes-vous sûr de vouloir supprimer les messages de ce salon ?"\n ],\n "me": [\n null,\n "moi"\n ],\n "is typing": [\n null,\n "écrit"\n ],\n "has stopped typing": [\n null,\n "a arrêté d\'écrire"\n ],\n "has gone away": [\n null,\n "est parti"\n ],\n "Show this menu": [\n null,\n "Afficher ce menu"\n ],\n "Write in the third person": [\n null,\n "Écrire à la troisième personne"\n ],\n "Remove messages": [\n null,\n "Effacer les messages"\n ],\n "Are you sure you want to clear the messages from this chat box?": [\n null,\n "Êtes-vous sûr de vouloir supprimer les messages de cette conversation?"\n ],\n "Your message could not be sent": [\n null,\n "Votre message ne peut pas être envoyé"\n ],\n "We received an unencrypted message": [\n null,\n "Un message non crypté a été reçu"\n ],\n "We received an unreadable encrypted message": [\n null,\n "Un message crypté illisible a été reçu"\n ],\n "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n null,\n "Voici les empreintes de sécurité, veuillez les confirmer avec %1$s, en dehors de ce chat.\\n\\nEmpreinte pour vous, %2$s: %3$s\\n\\nEmpreinte pour %1$s: %4$s\\n\\nSi vous avez confirmé que les empreintes correspondent, cliquez OK, sinon cliquez Annuler."\n ],\n "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n null,\n "Vous allez être invité à fournir une question de sécurité et une réponse à cette question.\\n\\nVotre contact devra répondre à la même question et s\'il fournit la même réponse (sensible à la casse), son identité sera vérifiée."\n ],\n "What is your security question?": [\n null,\n "Quelle est votre question de sécurité?"\n ],\n "What is the answer to the security question?": [\n null,\n "Quelle est la réponse à la question de sécurité?"\n ],\n "Invalid authentication scheme provided": [\n null,\n "Schéma d\'authentification fourni non valide"\n ],\n "has gone offline": [\n null,\n "s\'est déconnecté"\n ],\n "is busy": [\n null,\n "est occupé"\n ],\n "Your messages are not encrypted anymore": [\n null,\n "Vos messages ne sont plus cryptés"\n ],\n "Your messages are now encrypted but your contact\'s identity has not been verified.": [\n null,\n "Vos messages sont maintenant cryptés mais l\'identité de votre contact n\'a pas econre été véfifiée"\n ],\n "Your contact\'s identify has been verified.": [\n null,\n "L\'identité de votre contact a été vérifiée"\n ],\n "Your contact has ended encryption on their end, you should do the same.": [\n null,\n "Votre contact a arrêté le cryptage de son côté, vous devriez le faire aussi"\n ],\n "Your messages are not encrypted. Click here to enable OTR encryption.": [\n null,\n "Vos messges ne sont pas cryptés. Cliquez ici pour activer le cryptage OTR"\n ],\n "Your messages are encrypted, but your contact has not been verified.": [\n null,\n "Vos messges sont cryptés, mais votre contact n\'a pas été vérifié"\n ],\n "Your messages are encrypted and your contact verified.": [\n null,\n "Vos messages sont cryptés et votre contact est vérifié"\n ],\n "Your contact has closed their end of the private session, you should do the same": [\n null,\n "Votre contact a fermé la session privée de son côté, vous devriez le faire aussi"\n ],\n "Clear all messages": [\n null,\n "Supprimer tous les messages"\n ],\n "End encrypted conversation": [\n null,\n "Terminer la conversation cryptée"\n ],\n "Insert a smiley": [\n null,\n ""\n ],\n "Refresh encrypted conversation": [\n null,\n "Actualiser la conversation cryptée"\n ],\n "Start a call": [\n null,\n "Démarrer un appel"\n ],\n "Start encrypted conversation": [\n null,\n "Démarrer une conversation cryptée"\n ],\n "Verify with fingerprints": [\n null,\n "Vérifier par empreintes de sécurité"\n ],\n "Verify with SMP": [\n null,\n "Vérifier par Question/Réponse"\n ],\n "What\'s this?": [\n null,\n "Qu\'est-ce qu\'une conversation cryptée?"\n ],\n "Online": [\n null,\n "En ligne"\n ],\n "Busy": [\n null,\n "Occupé"\n ],\n "Away": [\n null,\n "Absent"\n ],\n "Offline": [\n null,\n "Déconnecté"\n ],\n "Log out": [\n null,\n "Se déconnecter"\n ],\n "Contact name": [\n null,\n "Nom du contact"\n ],\n "Search": [\n null,\n "Rechercher"\n ],\n "e.g. user@example.com": [\n null,\n ""\n ],\n "Add": [\n null,\n "Ajouter"\n ],\n "Click to add new chat contacts": [\n null,\n "Cliquez pour ajouter de nouveaux contacts"\n ],\n "Add a contact": [\n null,\n "Ajouter un contact"\n ],\n "No users found": [\n null,\n "Aucun utilisateur trouvé"\n ],\n "Click to add as a chat contact": [\n null,\n "Cliquer pour ajouter aux contacts"\n ],\n "Room name": [\n null,\n "Nom du salon"\n ],\n "Nickname": [\n null,\n "Alias"\n ],\n "Server": [\n null,\n "Serveur"\n ],\n "Join Room": [\n null,\n "Rejoindre"\n ],\n "Show rooms": [\n null,\n "Afficher les salons"\n ],\n "Rooms": [\n null,\n "Salons"\n ],\n "No rooms on %1$s": [\n null,\n "Aucun salon dans %1$s"\n ],\n "Rooms on %1$s": [\n null,\n "Salons dans %1$s"\n ],\n "Click to open this room": [\n null,\n "Cliquer pour ouvrir ce salon"\n ],\n "Show more information on this room": [\n null,\n "Afficher davantage d\'informations sur ce salon"\n ],\n "Description:": [\n null,\n "Description:"\n ],\n "Occupants:": [\n null,\n "Participants:"\n ],\n "Features:": [\n null,\n "Caractéristiques:"\n ],\n "Requires authentication": [\n null,\n "Nécessite une authentification"\n ],\n "Hidden": [\n null,\n "Masqué"\n ],\n "Requires an invitation": [\n null,\n "Nécessite une invitation"\n ],\n "Moderated": [\n null,\n "Modéré"\n ],\n "Non-anonymous": [\n null,\n "Non-anonyme"\n ],\n "Open room": [\n null,\n "Ouvrir un salon"\n ],\n "Permanent room": [\n null,\n "Salon permanent"\n ],\n "Public": [\n null,\n "Public"\n ],\n "Semi-anonymous": [\n null,\n "Semi-anonyme"\n ],\n "Temporary room": [\n null,\n "Salon temporaire"\n ],\n "Unmoderated": [\n null,\n "Non modéré"\n ],\n "This user is a moderator": [\n null,\n "Cet utilisateur est modérateur"\n ],\n "This user can send messages in this room": [\n null,\n "Cet utilisateur peut envoyer des messages dans ce salon"\n ],\n "This user can NOT send messages in this room": [\n null,\n "Cet utilisateur ne peut PAS envoyer de messages dans ce salon"\n ],\n "Invite...": [\n null,\n "Inviter..."\n ],\n "Occupants": [\n null,\n "Participants:"\n ],\n "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n null,\n "Vous vous apprêtez à inviter %1$s dans le salon \\"%2$s\\". "\n ],\n "You may optionally include a message, explaining the reason for the invitation.": [\n null,\n "Vous pouvez facultativement ajouter un message, expliquant la raison de cette invitation."\n ],\n "Message": [\n null,\n "Message"\n ],\n "Error: could not execute the command": [\n null,\n "Erreur: la commande ne peut pas être exécutée"\n ],\n "Error: the \\"": [\n null,\n ""\n ],\n "Change user\'s affiliation to admin": [\n null,\n "Changer le rôle de l\'utilisateur en administrateur"\n ],\n "Ban user from room": [\n null,\n "Bannir l\'utilisateur du salon"\n ],\n "Kick user from room": [\n null,\n "Expulser l\'utilisateur du salon"\n ],\n "Write in 3rd person": [\n null,\n "Écrire à la troisième personne"\n ],\n "Grant membership to a user": [\n null,\n "Autoriser l\'utilisateur à être membre"\n ],\n "Remove user\'s ability to post messages": [\n null,\n "Retirer le droit d\'envoyer des messages"\n ],\n "Change your nickname": [\n null,\n "Changer votre alias"\n ],\n "Grant moderator role to user": [\n null,\n "Changer le rôle de l\'utilisateur en modérateur"\n ],\n "Grant ownership of this room": [\n null,\n "Accorder la propriété à ce salon"\n ],\n "Revoke user\'s membership": [\n null,\n "Révoquer l\'utilisateur des membres"\n ],\n "Set room topic": [\n null,\n "Indiquer le sujet du salon"\n ],\n "Allow muted user to post messages": [\n null,\n "Autoriser les utilisateurs muets à poster des messages"\n ],\n "Save": [\n null,\n "Enregistrer"\n ],\n "Cancel": [\n null,\n "Annuler"\n ],\n "An error occurred while trying to save the form.": [\n null,\n "Une erreur est survenue lors de l\'enregistrement du formulaire."\n ],\n "This chatroom requires a password": [\n null,\n "Ce salon nécessite un mot de passe."\n ],\n "Password: ": [\n null,\n "Mot de passe: "\n ],\n "Submit": [\n null,\n "Soumettre"\n ],\n "This room is not anonymous": [\n null,\n "Ce salon n\'est pas anonyme"\n ],\n "This room now shows unavailable members": [\n null,\n "Ce salon affiche maintenant les membres indisponibles"\n ],\n "This room does not show unavailable members": [\n null,\n "Ce salon n\'affiche pas les membres indisponibles"\n ],\n "Non-privacy-related room configuration has changed": [\n null,\n "Les paramètres du salon non liés à la confidentialité ont été modifiés"\n ],\n "Room logging is now enabled": [\n null,\n "Le logging du salon est activé"\n ],\n "Room logging is now disabled": [\n null,\n "Le logging du salon est désactivé"\n ],\n "This room is now non-anonymous": [\n null,\n "Ce salon est maintenant non-anonyme"\n ],\n "This room is now semi-anonymous": [\n null,\n "Ce salon est maintenant semi-anonyme"\n ],\n "This room is now fully-anonymous": [\n null,\n "Ce salon est maintenant entièrement anonyme"\n ],\n "A new room has been created": [\n null,\n "Un nouveau salon a été créé"\n ],\n "You have been banned from this room": [\n null,\n "Vous avez été banni de ce salon"\n ],\n "You have been kicked from this room": [\n null,\n "Vous avez été expulsé de ce salon"\n ],\n "You have been removed from this room because of an affiliation change": [\n null,\n "Vous avez été retiré de ce salon du fait d\'un changement d\'affiliation"\n ],\n "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n null,\n "Vous avez été retiré de ce salon parce que ce salon est devenu réservé aux membres et vous n\'êtes pas membre"\n ],\n "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n null,\n "Vous avez été retiré de ce salon parce que le service de chat multi-utilisateur a été désactivé."\n ],\n "<strong>%1$s</strong> has been banned": [\n null,\n "<strong>%1$s</strong> a été banni"\n ],\n "<strong>%1$s</strong>\'s nickname has changed": [\n null,\n "<strong>%1$s</strong> a changé son nom"\n ],\n "<strong>%1$s</strong> has been kicked out": [\n null,\n "<strong>%1$s</strong> a été expulsé"\n ],\n "<strong>%1$s</strong> has been removed because of an affiliation change": [\n null,\n "<strong>%1$s</strong> a été supprimé à cause d\'un changement d\'affiliation"\n ],\n "<strong>%1$s</strong> has been removed for not being a member": [\n null,\n "<strong>%1$s</strong> a été supprimé car il n\'est pas membre"\n ],\n "Your nickname has been automatically changed to: <strong>%1$s</strong>": [\n null,\n "Votre alias a été modifié automatiquement en: <strong>%1$s</strong>"\n ],\n "Your nickname has been changed to: <strong>%1$s</strong>": [\n null,\n "Votre alias a été modifié en: <strong>%1$s</strong>"\n ],\n "The reason given is: \\"": [\n null,\n "La raison indiquée est: \\""\n ],\n "You are not on the member list of this room": [\n null,\n "Vous n\'êtes pas dans la liste des membres de ce salon"\n ],\n "No nickname was specified": [\n null,\n "Aucun alias n\'a été indiqué"\n ],\n "You are not allowed to create new rooms": [\n null,\n "Vous n\'êtes pas autorisé à créer des salons"\n ],\n "Your nickname doesn\'t conform to this room\'s policies": [\n null,\n "Votre alias n\'est pas conforme à la politique de ce salon"\n ],\n "Your nickname is already taken": [\n null,\n "Votre alias est déjà utilisé"\n ],\n "This room does not (yet) exist": [\n null,\n "Ce salon n\'existe pas encore"\n ],\n "This room has reached it\'s maximum number of occupants": [\n null,\n "Ce salon a atteint la limite maximale d\'occupants"\n ],\n "Topic set by %1$s to: %2$s": [\n null,\n "Le sujet \'%2$s\' a été défini par %1$s"\n ],\n "%1$s has invited you to join a chat room: %2$s": [\n null,\n "%1$s vous invite à rejoindre le salon: %2$s"\n ],\n "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n null,\n "%1$s vous invite à rejoindre le salon: %2$s, avec le message suivant:\\"%3$s\\""\n ],\n "Click to restore this chat": [\n null,\n "Cliquez pour afficher cette discussion"\n ],\n "Minimized": [\n null,\n "Réduit(s)"\n ],\n "Click to remove this contact": [\n null,\n "Cliquez pour supprimer ce contact"\n ],\n "Click to accept this contact request": [\n null,\n "Cliquez pour accepter la demande de ce contact"\n ],\n "Click to decline this contact request": [\n null,\n "Cliquez pour refuser la demande de ce contact"\n ],\n "Click to chat with this contact": [\n null,\n "Cliquez pour discuter avec ce contact"\n ],\n "Name": [\n null,\n ""\n ],\n "Are you sure you want to remove this contact?": [\n null,\n "Êtes-vous sûr de vouloir supprimer ce contact?"\n ],\n "Sorry, there was an error while trying to remove ": [\n null,\n ""\n ],\n "Are you sure you want to decline this contact request?": [\n null,\n "Êtes-vous sûr de vouloir refuser la demande de ce contact?"\n ],\n "Sorry, there was an error while trying to add ": [\n null,\n ""\n ],\n "This client does not allow presence subscriptions": [\n null,\n ""\n ],\n "Type to filter": [\n null,\n "Filtrer"\n ],\n "I am %1$s": [\n null,\n "Je suis %1$s"\n ],\n "Click here to write a custom status message": [\n null,\n "Cliquez ici pour indiquer votre statut personnel"\n ],\n "Click to change your chat status": [\n null,\n "Cliquez pour changer votre statut"\n ],\n "Custom status": [\n null,\n "Statut personnel"\n ],\n "online": [\n null,\n "en ligne"\n ],\n "busy": [\n null,\n "occupé"\n ],\n "away for long": [\n null,\n "absent pour une longue durée"\n ],\n "away": [\n null,\n "absent"\n ],\n "Your XMPP provider\'s domain name:": [\n null,\n "Votre domaine XMPP:"\n ],\n "Fetch registration form": [\n null,\n "Récupération du formulaire d\'enregistrement"\n ],\n "Tip: A list of public XMPP providers is available": [\n null,\n "Astuce: Une liste publique de fournisseurs XMPP est disponible"\n ],\n "here": [\n null,\n "ici"\n ],\n "Register": [\n null,\n "S\'enregistrer"\n ],\n "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n null,\n "Désolé, le fournisseur indiqué ne supporte pas l\'enregistrement de compte en ligne. Merci d\'essayer avec un autre fournisseur."\n ],\n "Requesting a registration form from the XMPP server": [\n null,\n "Demande du formulaire enregistrement au serveur XMPP"\n ],\n "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n null,\n "Quelque chose a échoué lors de l\'établissement de la connexion avec \\"%1$s\\". Êtes-vous sure qu\'il existe ?"\n ],\n "Now logging you in": [\n null,\n "En cours de connexion"\n ],\n "Registered successfully": [\n null,\n "Enregistré avec succès"\n ],\n "Return": [\n null,\n "Retourner"\n ],\n "XMPP Username:": [\n null,\n "Nom d\'utilisateur XMPP/Jabber"\n ],\n "Password:": [\n null,\n "Mot de passe:"\n ],\n "Click here to log in anonymously": [\n null,\n "Cliquez ici pour se connecter anonymement"\n ],\n "Log In": [\n null,\n "Se connecter"\n ],\n "user@server": [\n null,\n ""\n ],\n "Sign in": [\n null,\n "S\'inscrire"\n ],\n "Toggle chat": [\n null,\n "Ouvrir IM"\n ]\n }\n }\n}'}),define("text!he",[],function(){return'{\n "domain": "converse",\n "locale_data": {\n "converse": {\n "": {\n "domain": "converse",\n "plural_forms": "nplurals=2; plural=(n != 1);",\n "lang": "he"\n },\n " e.g. conversejs.org": [\n null,\n " למשל conversejs.org"\n ],\n "unencrypted": [\n null,\n "לא מוצפנת"\n ],\n "unverified": [\n null,\n "לא מאומתת"\n ],\n "verified": [\n null,\n "מאומתת"\n ],\n "finished": [\n null,\n "מוגמרת"\n ],\n "This contact is busy": [\n null,\n "איש קשר זה עסוק"\n ],\n "This contact is online": [\n null,\n "איש קשר זה מקוון"\n ],\n "This contact is offline": [\n null,\n "איש קשר זה אינו מקוון"\n ],\n "This contact is unavailable": [\n null,\n "איש קשר זה לא זמין"\n ],\n "This contact is away for an extended period": [\n null,\n "איש קשר זה נעדר למשך זמן ממושך"\n ],\n "This contact is away": [\n null,\n "איש קשר זה הינו נעדר"\n ],\n "Click to hide these contacts": [\n null,\n "לחץ כדי להסתיר את אנשי קשר אלה"\n ],\n "My contacts": [\n null,\n "האנשי קשר שלי"\n ],\n "Pending contacts": [\n null,\n "אנשי קשר ממתינים"\n ],\n "Contact requests": [\n null,\n "בקשות איש קשר"\n ],\n "Ungrouped": [\n null,\n "ללא קבוצה"\n ],\n "Contacts": [\n null,\n "אנשי קשר"\n ],\n "Groups": [\n null,\n "קבוצות"\n ],\n "Attempting to reconnect in 5 seconds": [\n null,\n "מנסה להתחבר בעוד 5 שניות"\n ],\n "Error": [\n null,\n "שגיאה"\n ],\n "Connecting": [\n null,\n "כעת מתחבר"\n ],\n "Authenticating": [\n null,\n "כעת מאמת"\n ],\n "Authentication Failed": [\n null,\n "אימות נכשל"\n ],\n "Re-establishing encrypted session": [\n null,\n "בסס מחדש ישיבה מוצפנת"\n ],\n "Generating private key.": [\n null,\n "כעת מפיק מפתח פרטי."\n ],\n "Your browser might become unresponsive.": [\n null,\n "הדפדפן שלך עשוי שלא להגיב."\n ],\n "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n null,\n "בקשת אימות מאת %1$s\\n\\nהאיש קשר שלך מנסה לאמת את הזהות שלך, בעזרת שאילת השאלה שלהלן.\\n\\n%2$s"\n ],\n "Could not verify this user\'s identify.": [\n null,\n "לא היתה אפשרות לאמת את זהות משתמש זה."\n ],\n "Exchanging private key with contact.": [\n null,\n "מחליף מפתח פרטי עם איש קשר."\n ],\n "Minimize this chat box": [\n null,\n ""\n ],\n "Personal message": [\n null,\n "הודעה אישית"\n ],\n "Are you sure you want to clear the messages from this room?": [\n null,\n "האם אתה בטוח כי ברצונך לטהר את ההודעות מתוך חדר זה?"\n ],\n "me": [\n null,\n "אני"\n ],\n "is typing": [\n null,\n "מקליד(ה) כעת"\n ],\n "has stopped typing": [\n null,\n "חדל(ה) להקליד"\n ],\n "has gone away": [\n null,\n "נעדר(ת)"\n ],\n "Show this menu": [\n null,\n "הצג את תפריט זה"\n ],\n "Write in the third person": [\n null,\n "כתוב בגוף השלישי"\n ],\n "Remove messages": [\n null,\n "הסר הודעות"\n ],\n "Are you sure you want to clear the messages from this chat box?": [\n null,\n "האם אתה בטוח כי ברצונך לטהר את ההודעות מתוך תיבת שיחה זה?"\n ],\n "Your message could not be sent": [\n null,\n "ההודעה שלך לא היתה יכולה להישלח"\n ],\n "We received an unencrypted message": [\n null,\n "אנחנו קיבלנו הודעה לא מוצפנת"\n ],\n "We received an unreadable encrypted message": [\n null,\n "אנחנו קיבלנו הודעה מוצפנת לא קריאה"\n ],\n "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n null,\n "הרי טביעות האצבע, אנא אמת אותן עם %1$s, מחוץ לשיחה זו.\\n\\nטביעת אצבע עבורך, %2$s: %3$s\\n\\nטביעת אצבע עבור %1$s: %4$s\\n\\nהיה ואימתת כי טביעות האצבע תואמות, לחץ אישור (OK), אחרת לחץ ביטול (Cancel)."\n ],\n "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n null,\n "אתה תתבקש לספק שאלת אבטחה ולאחריה תשובה לשאלה הזו.\\n\\nהאיש קשר יתבקש עובר זאת לאותה שאלת אבטחה ואם אלו יקלידו את אותה התשובה במדויק (case sensitive), זהותם תאומת."\n ],\n "What is your security question?": [\n null,\n "מהי שאלת האבטחה שלך?"\n ],\n "What is the answer to the security question?": [\n null,\n "מהי התשובה לשאלת האבטחה?"\n ],\n "Invalid authentication scheme provided": [\n null,\n "סופקה סכימת אימות שגויה"\n ],\n "has gone offline": [\n null,\n "כבר לא מקוון"\n ],\n "is busy": [\n null,\n "עסוק(ה) כעת"\n ],\n "Your messages are not encrypted anymore": [\n null,\n "ההודעות שלך אינן מוצפנות עוד"\n ],\n "Your messages are now encrypted but your contact\'s identity has not been verified.": [\n null,\n "ההודעות שלך מוצפנות כעת אך זהות האיש קשר שלך טרם אומתה."\n ],\n "Your contact\'s identify has been verified.": [\n null,\n "זהות האיש קשר שלך אומתה."\n ],\n "Your contact has ended encryption on their end, you should do the same.": [\n null,\n "האיש קשר סיים הצפנה בקצה שלהם, עליך לעשות זאת גם כן."\n ],\n "Your messages are not encrypted. Click here to enable OTR encryption.": [\n null,\n "ההודעות שלך אינן מוצפנות. לחץ כאן כדי לאפשר OTR."\n ],\n "Your messages are encrypted, but your contact has not been verified.": [\n null,\n "ההודעות שלך מוצפנות כעת, אך האיש קשר שלך טרם אומת."\n ],\n "Your messages are encrypted and your contact verified.": [\n null,\n "ההודעות שלך מוצפנות כעת והאיש קשר שלך אומת."\n ],\n "Your contact has closed their end of the private session, you should do the same": [\n null,\n "האיש קשר סגר את קצה ישיבה פרטית שלהם, עליך לעשות זאת גם כן"\n ],\n "Clear all messages": [\n null,\n "טהר את כל ההודעות"\n ],\n "End encrypted conversation": [\n null,\n "סיים ישיבה מוצפנת"\n ],\n "Insert a smiley": [\n null,\n "הכנס סמיילי"\n ],\n "Refresh encrypted conversation": [\n null,\n "רענן ישיבה מוצפנת"\n ],\n "Start a call": [\n null,\n "התחל שיחה"\n ],\n "Start encrypted conversation": [\n null,\n "התחל ישיבה מוצפנת"\n ],\n "Verify with fingerprints": [\n null,\n "אמת בעזרת טביעות אצבע"\n ],\n "Verify with SMP": [\n null,\n "אמת בעזרת SMP"\n ],\n "What\'s this?": [\n null,\n "מה זה?"\n ],\n "Online": [\n null,\n "מקוון"\n ],\n "Busy": [\n null,\n "עסוק"\n ],\n "Away": [\n null,\n "נעדר"\n ],\n "Offline": [\n null,\n "לא מקוון"\n ],\n "Log out": [\n null,\n "התנתקות"\n ],\n "Contact name": [\n null,\n "שם איש קשר"\n ],\n "Search": [\n null,\n "חיפוש"\n ],\n "e.g. user@example.com": [\n null,\n "למשל user@example.com"\n ],\n "Add": [\n null,\n "הוסף"\n ],\n "Click to add new chat contacts": [\n null,\n "לחץ כדי להוסיף אנשי קשר שיחה חדשים"\n ],\n "Add a contact": [\n null,\n "הוסף איש קשר"\n ],\n "No users found": [\n null,\n "לא נמצאו משתמשים"\n ],\n "Click to add as a chat contact": [\n null,\n "לחץ כדי להוסיף בתור איש קשר שיחה"\n ],\n "Room name": [\n null,\n "שם חדר"\n ],\n "Nickname": [\n null,\n "שם כינוי"\n ],\n "Server": [\n null,\n "שרת"\n ],\n "Join Room": [\n null,\n "הצטרף לחדר"\n ],\n "Show rooms": [\n null,\n "הצג חדרים"\n ],\n "Rooms": [\n null,\n "חדרים"\n ],\n "No rooms on %1$s": [\n null,\n "אין חדרים על %1$s"\n ],\n "Rooms on %1$s": [\n null,\n "חדרים על %1$s"\n ],\n "Click to open this room": [\n null,\n "לחץ כדי לפתוח את חדר זה"\n ],\n "Show more information on this room": [\n null,\n "הצג עוד מידע אודות חדר זה"\n ],\n "Description:": [\n null,\n "תיאור:"\n ],\n "Occupants:": [\n null,\n "נוכחים:"\n ],\n "Features:": [\n null,\n "תכונות:"\n ],\n "Requires authentication": [\n null,\n "מצריך אישור"\n ],\n "Hidden": [\n null,\n "נסתר"\n ],\n "Requires an invitation": [\n null,\n "מצריך הזמנה"\n ],\n "Moderated": [\n null,\n "מבוקר"\n ],\n "Non-anonymous": [\n null,\n "לא-אנונימי"\n ],\n "Open room": [\n null,\n "חדר פתוח"\n ],\n "Permanent room": [\n null,\n "חדר צמיתה"\n ],\n "Public": [\n null,\n "פומבי"\n ],\n "Semi-anonymous": [\n null,\n "אנונימי-למחצה"\n ],\n "Temporary room": [\n null,\n "חדר זמני"\n ],\n "Unmoderated": [\n null,\n "לא מבוקר"\n ],\n "This user is a moderator": [\n null,\n "משתמש זה הינו אחראי"\n ],\n "This user can send messages in this room": [\n null,\n "משתמש זה מסוגל לשלוח הודעות בתוך חדר זה"\n ],\n "This user can NOT send messages in this room": [\n null,\n "משתמש זה ﬥﬡ מסוגל לשלוח הודעות בתוך חדר זה"\n ],\n "Invite...": [\n null,\n "הזמנה..."\n ],\n "Occupants": [\n null,\n "נוכחים"\n ],\n "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n null,\n "אתה עומד להזמין את %1$s לחדר שיחה \\"%2$s\\". "\n ],\n "You may optionally include a message, explaining the reason for the invitation.": [\n null,\n "באפשרותך להכליל הודעה, אשר מסבירה את הסיבה להזמנה."\n ],\n "Message": [\n null,\n "הודעה"\n ],\n "Error: could not execute the command": [\n null,\n "שגיאה: לא היתה אפשרות לבצע פקודה"\n ],\n "Error: the \\"": [\n null,\n ""\n ],\n "Change user\'s affiliation to admin": [\n null,\n "שנה סינוף משתמש למנהל"\n ],\n "Ban user from room": [\n null,\n "אסור משתמש מתוך חדר"\n ],\n "Kick user from room": [\n null,\n "בעט משתמש מתוך חדר"\n ],\n "Write in 3rd person": [\n null,\n "כתוב בגוף שלישי"\n ],\n "Grant membership to a user": [\n null,\n "הענק חברות למשתמש"\n ],\n "Remove user\'s ability to post messages": [\n null,\n "הסר יכולת משתמש לפרסם הודעות"\n ],\n "Change your nickname": [\n null,\n "שנה את השם כינוי שלך"\n ],\n "Grant moderator role to user": [\n null,\n "הענק תפקיד אחראי למשתמש"\n ],\n "Grant ownership of this room": [\n null,\n "הענק בעלות על חדר זה"\n ],\n "Revoke user\'s membership": [\n null,\n "שלול חברות משתמש"\n ],\n "Set room topic": [\n null,\n "קבע נושא חדר"\n ],\n "Allow muted user to post messages": [\n null,\n "התר למשתמש מושתק לפרסם הודעות"\n ],\n "Save": [\n null,\n "שמור"\n ],\n "Cancel": [\n null,\n "ביטול"\n ],\n "An error occurred while trying to save the form.": [\n null,\n "אירעה שגיאה במהלך ניסיון שמירת הטופס."\n ],\n "This chatroom requires a password": [\n null,\n "חדר שיחה זה מצריך סיסמה"\n ],\n "Password: ": [\n null,\n "סיסמה: "\n ],\n "Submit": [\n null,\n "שלח"\n ],\n "This room is not anonymous": [\n null,\n "חדר זה אינו אנונימי"\n ],\n "This room now shows unavailable members": [\n null,\n "חדר זה כעת מציג חברים לא זמינים"\n ],\n "This room does not show unavailable members": [\n null,\n "חדר זה לא מציג חברים לא זמינים"\n ],\n "Non-privacy-related room configuration has changed": [\n null,\n "תצורת חדר אשר לא-קשורה-בפרטיות שונתה"\n ],\n "Room logging is now enabled": [\n null,\n "יומן חדר הינו מופעל כעת"\n ],\n "Room logging is now disabled": [\n null,\n "יומן חדר הינו מנוטרל כעת"\n ],\n "This room is now non-anonymous": [\n null,\n "חדר זה אינו אנונימי כעת"\n ],\n "This room is now semi-anonymous": [\n null,\n "חדר זה הינו אנונימי-למחצה כעת"\n ],\n "This room is now fully-anonymous": [\n null,\n "חדר זה הינו אנונימי-לחלוטין כעת"\n ],\n "A new room has been created": [\n null,\n "חדר חדש נוצר"\n ],\n "You have been banned from this room": [\n null,\n "נאסרת מתוך חדר זה"\n ],\n "You have been kicked from this room": [\n null,\n "נבעטת מתוך חדר זה"\n ],\n "You have been removed from this room because of an affiliation change": [\n null,\n "הוסרת מתוך חדר זה משום שינוי שיוך"\n ],\n "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n null,\n "הוסרת מתוך חדר זה משום שהחדר שונה לחברים-בלבד ואינך במעמד של חבר"\n ],\n "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n null,\n "הוסרת מתוך חדר זה משום ששירות שמ״מ (שיחה מרובת משתמשים) זה כעת מצוי בהליכי סגירה."\n ],\n "<strong>%1$s</strong> has been banned": [\n null,\n "<strong>%1$s</strong> נאסר(ה)"\n ],\n "<strong>%1$s</strong>\'s nickname has changed": [\n null,\n "השם כינוי של<strong>%1$s</strong> השתנה"\n ],\n "<strong>%1$s</strong> has been kicked out": [\n null,\n "<strong>%1$s</strong> נבעט(ה)"\n ],\n "<strong>%1$s</strong> has been removed because of an affiliation change": [\n null,\n "<strong>%1$s</strong> הוסרה(ה) משום שינוי שיוך"\n ],\n "<strong>%1$s</strong> has been removed for not being a member": [\n null,\n "<strong>%1$s</strong> הוסר(ה) משום אי הימצאות במסגרת מעמד של חבר"\n ],\n "Your nickname has been automatically changed to: <strong>%1$s</strong>": [\n null,\n "השם כינוי שלך שונה אוטומטית בשם: <strong>%1$s</strong>"\n ],\n "Your nickname has been changed to: <strong>%1$s</strong>": [\n null,\n "השם כינוי שלך שונה בשם: <strong>%1$s</strong>"\n ],\n "The reason given is: \\"": [\n null,\n "הסיבה שניתנה היא: \\""\n ],\n "You are not on the member list of this room": [\n null,\n "אינך ברשימת החברים של חדר זה"\n ],\n "No nickname was specified": [\n null,\n "לא צוין שום שם כינוי"\n ],\n "You are not allowed to create new rooms": [\n null,\n "אין לך רשות ליצור חדרים חדשים"\n ],\n "Your nickname doesn\'t conform to this room\'s policies": [\n null,\n "השם כינוי שלך לא תואם את המדינויות של חדר זה"\n ],\n "Your nickname is already taken": [\n null,\n "השם כינוי שלך הינו תפוס"\n ],\n "This room does not (yet) exist": [\n null,\n "חדר זה (עדיין) לא קיים"\n ],\n "This room has reached it\'s maximum number of occupants": [\n null,\n "חדר זה הגיע לסף הנוכחים המרבי שלו"\n ],\n "Topic set by %1$s to: %2$s": [\n null,\n "נושא חדר זה נקבע על ידי %1$s אל: %2$s"\n ],\n "%1$s has invited you to join a chat room: %2$s": [\n null,\n "%1$s הזמינך להצטרף לחדר שיחה: %2$s"\n ],\n "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n null,\n "%1$s הזמינך להצטרף לחדר שיחה: %2$s, והשאיר את הסיבה הבאה: \\"%3$s\\""\n ],\n "Click to restore this chat": [\n null,\n "לחץ כדי לשחזר את שיחה זו"\n ],\n "Minimized": [\n null,\n "ממוזער"\n ],\n "Click to remove this contact": [\n null,\n "לחץ כדי להסיר את איש קשר זה"\n ],\n "Click to accept this contact request": [\n null,\n "לחץ כדי לקבל את בקשת איש קשר זה"\n ],\n "Click to decline this contact request": [\n null,\n "לחץ כדי לסרב את בקשת איש קשר זה"\n ],\n "Click to chat with this contact": [\n null,\n "לחץ כדי לשוחח עם איש קשר זה"\n ],\n "Name": [\n null,\n "שם"\n ],\n "Are you sure you want to remove this contact?": [\n null,\n "האם אתה בטוח כי ברצונך להסיר את איש קשר זה?"\n ],\n "Sorry, there was an error while trying to remove ": [\n null,\n "מצטערים, היתה שגיאה במהלך ניסיון להסיר את "\n ],\n "Are you sure you want to decline this contact request?": [\n null,\n "האם אתה בטוח כי ברצונך לסרב את בקשת איש קשר זה?"\n ],\n "Sorry, there was an error while trying to add ": [\n null,\n "מצטערים, היתה שגיאה במהלך ניסיון הוספת "\n ],\n "This client does not allow presence subscriptions": [\n null,\n "לקוח זה לא מתיר הרשמות נוכחות"\n ],\n "Type to filter": [\n null,\n "הקלד כדי לסנן"\n ],\n "I am %1$s": [\n null,\n "מצבי כעת הינו %1$s"\n ],\n "Click here to write a custom status message": [\n null,\n "לחץ כאן כדי לכתוב הודעת מצב מותאמת"\n ],\n "Click to change your chat status": [\n null,\n "לחץ כדי לשנות את הודעת השיחה שלך"\n ],\n "Custom status": [\n null,\n "מצב מותאם"\n ],\n "online": [\n null,\n "מקוון"\n ],\n "busy": [\n null,\n "עסוק"\n ],\n "away for long": [\n null,\n "נעדר לזמן מה"\n ],\n "away": [\n null,\n "נעדר"\n ],\n "offline": [\n null,\n "לא מקוון"\n ],\n "Your XMPP provider\'s domain name:": [\n null,\n "שם מתחם של ספק XMPP שלך:"\n ],\n "Fetch registration form": [\n null,\n "משוך טופס הרשמה"\n ],\n "Tip: A list of public XMPP providers is available": [\n null,\n "טיפ: רשימה פומבית של ספקי XMPP הינה זמינה"\n ],\n "here": [\n null,\n "כאן"\n ],\n "Register": [\n null,\n "הירשם"\n ],\n "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n null,\n "מצטערים, הספק שניתן לא תומך ברישום חשבונות in band. אנא נסה עם ספק אחר."\n ],\n "Requesting a registration form from the XMPP server": [\n null,\n "כעת מבקש טופס הרשמה מתוך שרת XMPP"\n ],\n "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n null,\n "משהו השתבש במהלך ביסוס חיבור עם \\"%1$s\\". האם אתה בטוח כי זה קיים?"\n ],\n "Now logging you in": [\n null,\n "כעת מחבר אותך פנימה"\n ],\n "Registered successfully": [\n null,\n "נרשם בהצלחה"\n ],\n "Return": [\n null,\n "חזור"\n ],\n "XMPP Username:": [\n null,\n "שם משתמש XMPP:"\n ],\n "Password:": [\n null,\n "סיסמה:"\n ],\n "Click here to log in anonymously": [\n null,\n "לחץ כאן כדי להתחבר באופן אנונימי"\n ],\n "Log In": [\n null,\n "כניסה"\n ],\n "user@server": [\n null,\n ""\n ],\n "password": [\n null,\n "סיסמה"\n ],\n "Sign in": [\n null,\n "התחברות"\n ],\n "Toggle chat": [\n null,\n "הפעל שיח"\n ]\n }\n }\n}'}),define("text!hu",[],function(){return'{\n "domain": "converse",\n "locale_data": {\n "converse": {\n "": {\n "domain": "converse",\n "lang": "hu"\n },\n " e.g. conversejs.org": [\n null,\n ""\n ],\n "unencrypted": [\n null,\n "titkosítatlan"\n ],\n "unverified": [\n null,\n "nem hitelesített"\n ],\n "verified": [\n null,\n "hitelesített"\n ],\n "finished": [\n null,\n "befejezett"\n ],\n "This contact is busy": [\n null,\n "Elfoglalt"\n ],\n "This contact is online": [\n null,\n "Elérhető"\n ],\n "This contact is offline": [\n null,\n "Nincs bejelentkezve"\n ],\n "This contact is unavailable": [\n null,\n "Elérhetetlen"\n ],\n "This contact is away for an extended period": [\n null,\n "Hosszabb ideje távol"\n ],\n "This contact is away": [\n null,\n "Távol"\n ],\n "Click to hide these contacts": [\n null,\n "A csevegő partnerek elrejtése"\n ],\n "My contacts": [\n null,\n "Kapcsolataim"\n ],\n "Pending contacts": [\n null,\n "Függőben levő kapcsolatok"\n ],\n "Contact requests": [\n null,\n "Kapcsolatnak jelölés"\n ],\n "Ungrouped": [\n null,\n "Nincs csoportosítva"\n ],\n "Contacts": [\n null,\n "Kapcsolatok"\n ],\n "Groups": [\n null,\n "Csoportok"\n ],\n "Attempting to reconnect in 5 seconds": [\n null,\n ""\n ],\n "Error": [\n null,\n "Hiba"\n ],\n "Connecting": [\n null,\n "Kapcsolódás"\n ],\n "Authenticating": [\n null,\n "Azonosítás"\n ],\n "Authentication Failed": [\n null,\n "Azonosítási hiba"\n ],\n "Re-establishing encrypted session": [\n null,\n "Titkosított kapcsolat újraépítése"\n ],\n "Generating private key.": [\n null,\n "Privát kulcs generálása"\n ],\n "Your browser might become unresponsive.": [\n null,\n "Előfordulhat, hogy a böngésző futása megáll."\n ],\n "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n null,\n "Azonosítási kérés érkezett: %1$s\\n\\nA csevegő partnere hitelesítést kér a következő kérdés megválaszolásával:\\n\\n%2$s"\n ],\n "Could not verify this user\'s identify.": [\n null,\n "A felhasználó ellenőrzése sikertelen."\n ],\n "Exchanging private key with contact.": [\n null,\n "Privát kulcs cseréje..."\n ],\n "Minimize this chat box": [\n null,\n ""\n ],\n "Personal message": [\n null,\n "Személyes üzenet"\n ],\n "Are you sure you want to clear the messages from this room?": [\n null,\n "Törölni szeretné az üzeneteket ebből a szobából?"\n ],\n "me": [\n null,\n "Én"\n ],\n "is typing": [\n null,\n "gépel..."\n ],\n "has stopped typing": [\n null,\n "már nem gépel"\n ],\n "Show this menu": [\n null,\n "Mutasd a menüt"\n ],\n "Write in the third person": [\n null,\n "Írjon egyes szám harmadik személyben"\n ],\n "Remove messages": [\n null,\n "Üzenetek törlése"\n ],\n "Are you sure you want to clear the messages from this chat box?": [\n null,\n "Törölni szeretné az eddigi üzeneteket?"\n ],\n "Your message could not be sent": [\n null,\n "Az üzenet elküldése nem sikerült"\n ],\n "We received an unencrypted message": [\n null,\n "Titkosítatlan üzenet érkezett"\n ],\n "We received an unreadable encrypted message": [\n null,\n "Visszafejthetetlen titkosított üzenet érkezett"\n ],\n "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n null,\n "Újjlenyomatok megerősítése.\\n\\nAz Ön újjlenyomata, %2$s: %3$s\\n\\nA csevegő partnere újjlenyomata, %1$s: %4$s\\n\\nAmennyiben az újjlenyomatok biztosan egyeznek, klikkeljen az OK, ellenkező esetben a Mégsem gombra."\n ],\n "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n null,\n "Elsőként egy biztonsági kérdést kell majd feltennie és megválaszolnia.\\n\\nMajd a csevegő partnerének is megjelenik ez a kérdés. Végül ha a válaszok azonosak lesznek (kis- nagybetű érzékeny), a partner hitelesítetté válik."\n ],\n "What is your security question?": [\n null,\n "Mi legyen a biztonsági kérdés?"\n ],\n "What is the answer to the security question?": [\n null,\n "Mi a válasz a biztonsági kérdésre?"\n ],\n "Invalid authentication scheme provided": [\n null,\n "Érvénytelen hitelesítési séma."\n ],\n "Your messages are not encrypted anymore": [\n null,\n "Az üzenetek mostantól már nem titkosítottak"\n ],\n "Your messages are now encrypted but your contact\'s identity has not been verified.": [\n null,\n "Az üzenetek titikosítva vannak, de a csevegő partnerét még nem hitelesítette."\n ],\n "Your contact\'s identify has been verified.": [\n null,\n "A csevegő partnere hitelesítve lett."\n ],\n "Your contact has ended encryption on their end, you should do the same.": [\n null,\n "A csevegő partnere kikapcsolta a titkosítást, így Önnek is ezt kellene tennie."\n ],\n "Your messages are not encrypted. Click here to enable OTR encryption.": [\n null,\n "Az üzenetek titkosítatlanok. OTR titkosítás aktiválása."\n ],\n "Your messages are encrypted, but your contact has not been verified.": [\n null,\n "Az üzenetek titikosítottak, de a csevegő partnere még nem hitelesített."\n ],\n "Your messages are encrypted and your contact verified.": [\n null,\n "Az üzenetek titikosítottak és a csevegő partnere hitelesített."\n ],\n "Your contact has closed their end of the private session, you should do the same": [\n null,\n "A csevegő partnere lezárta a magán beszélgetést"\n ],\n "Clear all messages": [\n null,\n "Üzenetek törlése"\n ],\n "End encrypted conversation": [\n null,\n "Titkosított kapcsolat vége"\n ],\n "Insert a smiley": [\n null,\n ""\n ],\n "Refresh encrypted conversation": [\n null,\n "A titkosított kapcsolat frissítése"\n ],\n "Start a call": [\n null,\n "Hívás indítása"\n ],\n "Start encrypted conversation": [\n null,\n "Titkosított beszélgetés indítása"\n ],\n "Verify with fingerprints": [\n null,\n "Ellenőrzés újjlenyomattal"\n ],\n "Verify with SMP": [\n null,\n "Ellenőrzés SMP-vel"\n ],\n "What\'s this?": [\n null,\n "Mi ez?"\n ],\n "Online": [\n null,\n "Elérhető"\n ],\n "Busy": [\n null,\n "Foglalt"\n ],\n "Away": [\n null,\n "Távol"\n ],\n "Offline": [\n null,\n "Nem elérhető"\n ],\n "Log out": [\n null,\n "Kilépés"\n ],\n "Contact name": [\n null,\n "Partner neve"\n ],\n "Search": [\n null,\n "Keresés"\n ],\n "e.g. user@example.com": [\n null,\n ""\n ],\n "Add": [\n null,\n "Hozzáad"\n ],\n "Click to add new chat contacts": [\n null,\n "Új csevegő partner hozzáadása"\n ],\n "Add a contact": [\n null,\n "Új partner felvétele"\n ],\n "No users found": [\n null,\n "Nincs felhasználó"\n ],\n "Click to add as a chat contact": [\n null,\n "Felvétel a csevegő partnerek közé"\n ],\n "Room name": [\n null,\n "Szoba neve"\n ],\n "Nickname": [\n null,\n "Becenév"\n ],\n "Server": [\n null,\n "Szerver"\n ],\n "Show rooms": [\n null,\n "Létező szobák"\n ],\n "Rooms": [\n null,\n "Szobák"\n ],\n "No rooms on %1$s": [\n null,\n "Nincs csevegő szoba a(z) %1$s szerveren"\n ],\n "Rooms on %1$s": [\n null,\n "Csevegő szobák a(z) %1$s szerveren:"\n ],\n "Click to open this room": [\n null,\n "Belépés a csevegő szobába"\n ],\n "Show more information on this room": [\n null,\n "További információk a csevegő szobáról"\n ],\n "Description:": [\n null,\n "Leírás:"\n ],\n "Occupants:": [\n null,\n "Jelenlevők:"\n ],\n "Features:": [\n null,\n "Tulajdonságok:"\n ],\n "Requires authentication": [\n null,\n "Azonosítás szükséges"\n ],\n "Hidden": [\n null,\n "Rejtett"\n ],\n "Requires an invitation": [\n null,\n "Meghívás szükséges"\n ],\n "Moderated": [\n null,\n "Moderált"\n ],\n "Non-anonymous": [\n null,\n "NEM névtelen"\n ],\n "Open room": [\n null,\n "Nyitott szoba"\n ],\n "Permanent room": [\n null,\n "Állandó szoba"\n ],\n "Public": [\n null,\n "Nyílvános"\n ],\n "Semi-anonymous": [\n null,\n "Félig névtelen"\n ],\n "Temporary room": [\n null,\n "Ideiglenes szoba"\n ],\n "Unmoderated": [\n null,\n "Moderálatlan"\n ],\n "This user is a moderator": [\n null,\n "Ez a felhasználó egy moderátor"\n ],\n "This user can send messages in this room": [\n null,\n "Ez a felhasználó küldhet üzenetet ebbe a szobába"\n ],\n "This user can NOT send messages in this room": [\n null,\n "Ez a felhasználó NEM küldhet üzenetet ebbe a szobába"\n ],\n "Invite...": [\n null,\n "Meghívás..."\n ],\n "Occupants": [\n null,\n "Jelenlevők"\n ],\n "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n null,\n "%1$s meghívott a \\"%2$s\\" csevegő szobába. "\n ],\n "Message": [\n null,\n "Üzenet"\n ],\n "Error: could not execute the command": [\n null,\n "Hiba: A parancs nem értelmezett"\n ],\n "Error: the \\"": [\n null,\n ""\n ],\n "Change user\'s affiliation to admin": [\n null,\n ""\n ],\n "Ban user from room": [\n null,\n "Felhasználó kitíltása a csevegő szobából"\n ],\n "Kick user from room": [\n null,\n "Felhasználó kiléptetése a csevegő szobából"\n ],\n "Write in 3rd person": [\n null,\n "Írjon egyes szám harmadik személyben"\n ],\n "Grant membership to a user": [\n null,\n ""\n ],\n "Remove user\'s ability to post messages": [\n null,\n "A felhasználó nem küldhet üzeneteket"\n ],\n "Change your nickname": [\n null,\n "Becenév módosítása"\n ],\n "Grant moderator role to user": [\n null,\n ""\n ],\n "Revoke user\'s membership": [\n null,\n ""\n ],\n "Set room topic": [\n null,\n "Csevegőszoba téma beállítás"\n ],\n "Allow muted user to post messages": [\n null,\n "Elnémított felhasználók is küldhetnek üzeneteket"\n ],\n "Save": [\n null,\n "Ment"\n ],\n "Cancel": [\n null,\n "Mégsem"\n ],\n "An error occurred while trying to save the form.": [\n null,\n "Hiba történt az adatok mentése közben."\n ],\n "This chatroom requires a password": [\n null,\n "A csevegő szoba belépéshez jelszó szükséges"\n ],\n "Password: ": [\n null,\n "Jelszó: "\n ],\n "Submit": [\n null,\n "Küldés"\n ],\n "This room is not anonymous": [\n null,\n "Ez a szoba NEM névtelen"\n ],\n "This room now shows unavailable members": [\n null,\n "Ez a szoba mutatja az elérhetetlen tagokat"\n ],\n "This room does not show unavailable members": [\n null,\n "Ez a szoba nem mutatja az elérhetetlen tagokat"\n ],\n "Non-privacy-related room configuration has changed": [\n null,\n "A szoba általános konfigurációja módosult"\n ],\n "Room logging is now enabled": [\n null,\n "A szobába a belépés lehetséges"\n ],\n "Room logging is now disabled": [\n null,\n "A szobába a belépés szünetel"\n ],\n "This room is now non-anonymous": [\n null,\n "Ez a szoba most NEM névtelen"\n ],\n "This room is now semi-anonymous": [\n null,\n "Ez a szoba most félig névtelen"\n ],\n "This room is now fully-anonymous": [\n null,\n "Ez a szoba most teljesen névtelen"\n ],\n "A new room has been created": [\n null,\n "Létrejött egy új csevegő szoba"\n ],\n "You have been banned from this room": [\n null,\n "Ki lettél tíltva ebből a szobából"\n ],\n "You have been kicked from this room": [\n null,\n "Ki lettél dobva ebből a szobából"\n ],\n "You have been removed from this room because of an affiliation change": [\n null,\n "Taglista módosítás miatt kiléptettünk a csevegő szobából"\n ],\n "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n null,\n "Kiléptettünk a csevegő szobából, mert mostantól csak a taglistán szereplők lehetnek jelen"\n ],\n "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n null,\n "Kiléptettünk a csevegő szobából, mert a MUC (Multi-User Chat) szolgáltatás leállításra került."\n ],\n "<strong>%1$s</strong> has been banned": [\n null,\n "A szobából kitíltva: <strong>%1$s</strong>"\n ],\n "<strong>%1$s</strong>\'s nickname has changed": [\n null,\n "<strong>%1$s</strong> beceneve módosult"\n ],\n "<strong>%1$s</strong> has been kicked out": [\n null,\n "A szobából kidobva: <strong>%1$s</strong>"\n ],\n "<strong>%1$s</strong> has been removed because of an affiliation change": [\n null,\n "Taglista módosítás miatt a szobából kiléptetve: <strong>%1$s</strong>"\n ],\n "<strong>%1$s</strong> has been removed for not being a member": [\n null,\n "A taglistán nem szerepel így a szobából kiléptetve: <strong>%1$s</strong>"\n ],\n "Your nickname has been automatically changed to: <strong>%1$s</strong>": [\n null,\n "A beceneved módosításra került a következőre: <strong>%1$s</strong>"\n ],\n "Your nickname has been changed to: <strong>%1$s</strong>": [\n null,\n "A beceneved a következőre módosult: <strong>%1$s</strong>"\n ],\n "The reason given is: \\"": [\n null,\n "Az indok: \\""\n ],\n "You are not on the member list of this room": [\n null,\n "Nem szerepelsz a csevegő szoba taglistáján"\n ],\n "No nickname was specified": [\n null,\n "Nem lett megadva becenév"\n ],\n "You are not allowed to create new rooms": [\n null,\n "Nem lehet új csevegő szobát létrehozni"\n ],\n "Your nickname doesn\'t conform to this room\'s policies": [\n null,\n "A beceneved ütközik a csevegő szoba szabályzataival"\n ],\n "Your nickname is already taken": [\n null,\n "A becenevedet már valaki használja"\n ],\n "This room does not (yet) exist": [\n null,\n "Ez a szoba (még) nem létezik"\n ],\n "This room has reached it\'s maximum number of occupants": [\n null,\n "Ez a csevegő szoba elérte a maximális jelenlévők számát"\n ],\n "Topic set by %1$s to: %2$s": [\n null,\n "A következő témát állította be %1$s: %2$s"\n ],\n "%1$s has invited you to join a chat room: %2$s": [\n null,\n "%1$s meghívott a(z) %2$s csevegő szobába"\n ],\n "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n null,\n "%1$s meghívott a(z) %2$s csevegő szobába. Indok: \\"%3$s\\""\n ],\n "Click to restore this chat": [\n null,\n "A csevegés visszaállítása"\n ],\n "Minimized": [\n null,\n "Lezárva"\n ],\n "Click to remove this contact": [\n null,\n "Partner törlése"\n ],\n "Click to accept this contact request": [\n null,\n "Elogadása a partnerlistába történő felvételnek"\n ],\n "Click to decline this contact request": [\n null,\n "Megtagadása a partnerlistába történő felvételnek"\n ],\n "Click to chat with this contact": [\n null,\n "Csevegés indítása ezzel a partnerünkkel"\n ],\n "Name": [\n null,\n ""\n ],\n "Are you sure you want to remove this contact?": [\n null,\n "Valóban törölni szeretné a csevegő partnerét?"\n ],\n "Sorry, there was an error while trying to remove ": [\n null,\n ""\n ],\n "Are you sure you want to decline this contact request?": [\n null,\n "Valóban elutasítja ezt a kapcsolat felvételi kérést?"\n ],\n "Sorry, there was an error while trying to add ": [\n null,\n ""\n ],\n "This client does not allow presence subscriptions": [\n null,\n ""\n ],\n "Type to filter": [\n null,\n "Írjon be pár betűt"\n ],\n "I am %1$s": [\n null,\n "%1$s vagyok"\n ],\n "Click here to write a custom status message": [\n null,\n "Egyedi státusz üzenet írása"\n ],\n "Click to change your chat status": [\n null,\n "Saját státusz beállítása"\n ],\n "Custom status": [\n null,\n "Egyedi státusz"\n ],\n "online": [\n null,\n "Elérhető"\n ],\n "busy": [\n null,\n "Elfoglalt"\n ],\n "away for long": [\n null,\n "Hosszú ideje távol"\n ],\n "away": [\n null,\n "Távol"\n ],\n "Your XMPP provider\'s domain name:": [\n null,\n "Az XMPP szolgáltató domain neve:"\n ],\n "Fetch registration form": [\n null,\n "Regisztrációs űrlap"\n ],\n "Tip: A list of public XMPP providers is available": [\n null,\n "Tipp: A nyílvános XMPP szolgáltatókról egy lista elérhető"\n ],\n "here": [\n null,\n "itt"\n ],\n "Register": [\n null,\n "Regisztráció"\n ],\n "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n null,\n "A megadott szolgáltató nem támogatja a csevegőn keresztüli regisztrációt. Próbáljon meg egy másikat."\n ],\n "Requesting a registration form from the XMPP server": [\n null,\n "Regisztrációs űrlap lekérése az XMPP szervertől"\n ],\n "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n null,\n "Hiba történt a(z) \\"%1$s\\" kapcsolódásakor. Biztos benne, hogy ez létező kiszolgáló?"\n ],\n "Now logging you in": [\n null,\n "Belépés..."\n ],\n "Registered successfully": [\n null,\n "Sikeres regisztráció"\n ],\n "Return": [\n null,\n "Visza"\n ],\n "XMPP Username:": [\n null,\n "XMPP/Jabber azonosító:"\n ],\n "Password:": [\n null,\n "Jelszó:"\n ],\n "Log In": [\n null,\n "Belépés"\n ],\n "user@server": [\n null,\n ""\n ],\n "Sign in": [\n null,\n "Belépés"\n ],\n "Toggle chat": [\n null,\n "Csevegő ablak"\n ]\n }\n }\n}'}),define("text!id",[],function(){return'{\n "domain": "converse",\n "locale_data": {\n "converse": {\n "": {\n "domain": "converse",\n "lang": "id"\n },\n " e.g. conversejs.org": [\n null,\n ""\n ],\n "unencrypted": [\n null,\n "tak dienkripsi"\n ],\n "unverified": [\n null,\n "tak diverifikasi"\n ],\n "verified": [\n null,\n "diverifikasi"\n ],\n "finished": [\n null,\n "selesai"\n ],\n "This contact is busy": [\n null,\n "Teman ini sedang sibuk"\n ],\n "This contact is online": [\n null,\n "Teman ini terhubung"\n ],\n "This contact is offline": [\n null,\n "Teman ini tidak terhubung"\n ],\n "This contact is unavailable": [\n null,\n "Teman ini tidak tersedia"\n ],\n "This contact is away for an extended period": [\n null,\n "Teman ini tidak di tempat untuk waktu yang lama"\n ],\n "This contact is away": [\n null,\n "Teman ini tidak di tempat"\n ],\n "My contacts": [\n null,\n "Teman saya"\n ],\n "Pending contacts": [\n null,\n "Teman yang menunggu"\n ],\n "Contact requests": [\n null,\n "Permintaan pertemanan"\n ],\n "Ungrouped": [\n null,\n ""\n ],\n "Contacts": [\n null,\n "Teman"\n ],\n "Groups": [\n null,\n ""\n ],\n "Attempting to reconnect in 5 seconds": [\n null,\n ""\n ],\n "Error": [\n null,\n "Kesalahan"\n ],\n "Connecting": [\n null,\n "Menyambung"\n ],\n "Authenticating": [\n null,\n "Melakukan otentikasi"\n ],\n "Authentication Failed": [\n null,\n "Otentikasi gagal"\n ],\n "Re-establishing encrypted session": [\n null,\n "Menyambung kembali sesi terenkripsi"\n ],\n "Generating private key.": [\n null,\n ""\n ],\n "Your browser might become unresponsive.": [\n null,\n ""\n ],\n "Could not verify this user\'s identify.": [\n null,\n "Tak dapat melakukan verifikasi identitas pengguna ini."\n ],\n "Exchanging private key with contact.": [\n null,\n ""\n ],\n "Minimize this chat box": [\n null,\n ""\n ],\n "Personal message": [\n null,\n "Pesan pribadi"\n ],\n "me": [\n null,\n "saya"\n ],\n "is typing": [\n null,\n ""\n ],\n "has stopped typing": [\n null,\n ""\n ],\n "Show this menu": [\n null,\n "Tampilkan menu ini"\n ],\n "Write in the third person": [\n null,\n "Tulis ini menggunakan bahasa pihak ketiga"\n ],\n "Remove messages": [\n null,\n "Hapus pesan"\n ],\n "Are you sure you want to clear the messages from this chat box?": [\n null,\n ""\n ],\n "Your message could not be sent": [\n null,\n "Pesan anda tak dapat dikirim"\n ],\n "We received an unencrypted message": [\n null,\n "Kami menerima pesan terenkripsi"\n ],\n "We received an unreadable encrypted message": [\n null,\n "Kami menerima pesan terenkripsi yang gagal dibaca"\n ],\n "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n null,\n "Ini adalah sidik jari anda, konfirmasikan bersama mereka dengan %1$s, di luar percakapan ini.\\n\\nSidik jari untuk anda, %2$s: %3$s\\n\\nSidik jari untuk %1$s: %4$s\\n\\nJika anda bisa mengkonfirmasi sidik jadi cocok, klik Lanjutkan, jika tidak klik Batal."\n ],\n "What is your security question?": [\n null,\n "Apakah pertanyaan keamanan anda?"\n ],\n "What is the answer to the security question?": [\n null,\n "Apa jawaban dari pertanyaan keamanan tersebut?"\n ],\n "Invalid authentication scheme provided": [\n null,\n "Skema otentikasi salah"\n ],\n "Your messages are not encrypted anymore": [\n null,\n "Pesan anda tidak lagi terenkripsi"\n ],\n "Your messages are not encrypted. Click here to enable OTR encryption.": [\n null,\n "Pesan anda tak terenkripsi. Klik di sini untuk menyalakan enkripsi OTR."\n ],\n "End encrypted conversation": [\n null,\n "Sudahi percakapan terenkripsi"\n ],\n "Insert a smiley": [\n null,\n ""\n ],\n "Hide the list of occupants": [\n null,\n ""\n ],\n "Refresh encrypted conversation": [\n null,\n "Setel ulang percakapan terenkripsi"\n ],\n "Start a call": [\n null,\n ""\n ],\n "Start encrypted conversation": [\n null,\n "Mulai sesi terenkripsi"\n ],\n "Verify with fingerprints": [\n null,\n "Verifikasi menggunakan sidik jari"\n ],\n "Verify with SMP": [\n null,\n "Verifikasi menggunakan SMP"\n ],\n "What\'s this?": [\n null,\n "Apakah ini?"\n ],\n "Online": [\n null,\n "Terhubung"\n ],\n "Busy": [\n null,\n "Sibuk"\n ],\n "Away": [\n null,\n "Pergi"\n ],\n "Offline": [\n null,\n "Tak Terhubung"\n ],\n "Contact name": [\n null,\n "Nama teman"\n ],\n "Search": [\n null,\n "Cari"\n ],\n "e.g. user@example.com": [\n null,\n ""\n ],\n "Add": [\n null,\n "Tambah"\n ],\n "Click to add new chat contacts": [\n null,\n "Klik untuk menambahkan teman baru"\n ],\n "Add a contact": [\n null,\n "Tambah teman"\n ],\n "No users found": [\n null,\n "Pengguna tak ditemukan"\n ],\n "Click to add as a chat contact": [\n null,\n "Klik untuk menambahkan sebagai teman"\n ],\n "Room name": [\n null,\n "Nama ruangan"\n ],\n "Nickname": [\n null,\n "Nama panggilan"\n ],\n "Server": [\n null,\n "Server"\n ],\n "Show rooms": [\n null,\n "Perlihatkan ruangan"\n ],\n "Rooms": [\n null,\n "Ruangan"\n ],\n "No rooms on %1$s": [\n null,\n "Tak ada ruangan di %1$s"\n ],\n "Rooms on %1$s": [\n null,\n "Ruangan di %1$s"\n ],\n "Click to open this room": [\n null,\n "Klik untuk membuka ruangan ini"\n ],\n "Show more information on this room": [\n null,\n "Tampilkan informasi ruangan ini"\n ],\n "Description:": [\n null,\n "Keterangan:"\n ],\n "Occupants:": [\n null,\n "Penghuni:"\n ],\n "Features:": [\n null,\n "Fitur:"\n ],\n "Requires authentication": [\n null,\n "Membutuhkan otentikasi"\n ],\n "Hidden": [\n null,\n "Tersembunyi"\n ],\n "Requires an invitation": [\n null,\n "Membutuhkan undangan"\n ],\n "Moderated": [\n null,\n "Dimoderasi"\n ],\n "Non-anonymous": [\n null,\n "Tidak anonim"\n ],\n "Open room": [\n null,\n "Ruangan terbuka"\n ],\n "Permanent room": [\n null,\n "Ruangan permanen"\n ],\n "Public": [\n null,\n "Umum"\n ],\n "Semi-anonymous": [\n null,\n "Semi-anonim"\n ],\n "Temporary room": [\n null,\n "Ruangan sementara"\n ],\n "Unmoderated": [\n null,\n "Tak dimoderasi"\n ],\n "This user is a moderator": [\n null,\n "Pengguna ini adalah moderator"\n ],\n "This user can send messages in this room": [\n null,\n "Pengguna ini dapat mengirim pesan di ruangan ini"\n ],\n "This user can NOT send messages in this room": [\n null,\n "Pengguna ini tak dapat mengirim pesan di ruangan ini"\n ],\n "Invite...": [\n null,\n ""\n ],\n "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n null,\n ""\n ],\n "You may optionally include a message, explaining the reason for the invitation.": [\n null,\n ""\n ],\n "Message": [\n null,\n "Pesan"\n ],\n "Error: could not execute the command": [\n null,\n ""\n ],\n "Error: the \\"": [\n null,\n ""\n ],\n "Change user\'s affiliation to admin": [\n null,\n ""\n ],\n "Change user role to occupant": [\n null,\n ""\n ],\n "Grant membership to a user": [\n null,\n ""\n ],\n "Remove user\'s ability to post messages": [\n null,\n ""\n ],\n "Change your nickname": [\n null,\n ""\n ],\n "Grant moderator role to user": [\n null,\n ""\n ],\n "Revoke user\'s membership": [\n null,\n ""\n ],\n "Allow muted user to post messages": [\n null,\n ""\n ],\n "Save": [\n null,\n "Simpan"\n ],\n "Cancel": [\n null,\n "Batal"\n ],\n "An error occurred while trying to save the form.": [\n null,\n "Kesalahan terjadi saat menyimpan formulir ini."\n ],\n "This chatroom requires a password": [\n null,\n "Ruangan ini membutuhkan kata sandi"\n ],\n "Password: ": [\n null,\n "Kata sandi: "\n ],\n "Submit": [\n null,\n "Kirim"\n ],\n "This room is not anonymous": [\n null,\n "Ruangan ini tidak anonim"\n ],\n "This room now shows unavailable members": [\n null,\n "Ruangan ini menampilkan anggota yang tak tersedia"\n ],\n "This room does not show unavailable members": [\n null,\n "Ruangan ini tidak menampilkan anggota yang tak tersedia"\n ],\n "Non-privacy-related room configuration has changed": [\n null,\n "Konfigurasi ruangan yang tak berhubungan dengan privasi telah diubah"\n ],\n "Room logging is now enabled": [\n null,\n "Pencatatan di ruangan ini sekarang dinyalakan"\n ],\n "Room logging is now disabled": [\n null,\n "Pencatatan di ruangan ini sekarang dimatikan"\n ],\n "This room is now non-anonymous": [\n null,\n "Ruangan ini sekarang tak-anonim"\n ],\n "This room is now semi-anonymous": [\n null,\n "Ruangan ini sekarang semi-anonim"\n ],\n "This room is now fully-anonymous": [\n null,\n "Ruangan ini sekarang anonim"\n ],\n "A new room has been created": [\n null,\n "Ruangan baru telah dibuat"\n ],\n "You have been banned from this room": [\n null,\n "Anda telah dicekal dari ruangan ini"\n ],\n "You have been kicked from this room": [\n null,\n "Anda telah ditendang dari ruangan ini"\n ],\n "You have been removed from this room because of an affiliation change": [\n null,\n "Anda telah dihapus dari ruangan ini karena perubahan afiliasi"\n ],\n "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n null,\n "Anda telah dihapus dari ruangan ini karena ruangan ini hanya terbuka untuk anggota dan anda bukan anggota"\n ],\n "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n null,\n "Anda telah dihapus dari ruangan ini karena layanan MUC (Multi-user chat) telah dimatikan."\n ],\n "<strong>%1$s</strong> has been banned": [\n null,\n "<strong>%1$s</strong> telah dicekal"\n ],\n "<strong>%1$s</strong> has been kicked out": [\n null,\n "<strong>%1$s</strong> telah ditendang keluar"\n ],\n "<strong>%1$s</strong> has been removed because of an affiliation change": [\n null,\n "<strong>%1$s</strong> telah dihapus karena perubahan afiliasi"\n ],\n "<strong>%1$s</strong> has been removed for not being a member": [\n null,\n "<strong>%1$s</strong> telah dihapus karena bukan anggota"\n ],\n "The reason given is: \\"": [\n null,\n ""\n ],\n "You are not on the member list of this room": [\n null,\n "Anda bukan anggota dari ruangan ini"\n ],\n "No nickname was specified": [\n null,\n "Nama panggilan belum ditentukan"\n ],\n "You are not allowed to create new rooms": [\n null,\n "Anda tak diizinkan untuk membuat ruangan baru"\n ],\n "Your nickname doesn\'t conform to this room\'s policies": [\n null,\n "Nama panggilan anda tidak sesuai aturan ruangan ini"\n ],\n "Your nickname is already taken": [\n null,\n "Nama panggilan anda telah digunakan orang lain"\n ],\n "This room does not (yet) exist": [\n null,\n "Ruangan ini belum dibuat"\n ],\n "This room has reached it\'s maximum number of occupants": [\n null,\n "Ruangan ini telah mencapai jumlah penghuni maksimum"\n ],\n "Topic set by %1$s to: %2$s": [\n null,\n "Topik diganti oleh %1$s menjadi: %2$s"\n ],\n "%1$s has invited you to join a chat room: %2$s": [\n null,\n ""\n ],\n "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n null,\n ""\n ],\n "Minimized": [\n null,\n ""\n ],\n "Click to remove this contact": [\n null,\n "Klik untuk menghapus teman ini"\n ],\n "Click to chat with this contact": [\n null,\n "Klik untuk mulai perbinjangan dengan teman ini"\n ],\n "Name": [\n null,\n ""\n ],\n "Sorry, there was an error while trying to remove ": [\n null,\n ""\n ],\n "Sorry, there was an error while trying to add ": [\n null,\n ""\n ],\n "This client does not allow presence subscriptions": [\n null,\n ""\n ],\n "Type to filter": [\n null,\n ""\n ],\n "I am %1$s": [\n null,\n "Saya %1$s"\n ],\n "Click here to write a custom status message": [\n null,\n "Klik untuk menulis status kustom"\n ],\n "Click to change your chat status": [\n null,\n "Klik untuk mengganti status"\n ],\n "Custom status": [\n null,\n "Status kustom"\n ],\n "online": [\n null,\n "terhubung"\n ],\n "busy": [\n null,\n "sibuk"\n ],\n "away for long": [\n null,\n "lama tak di tempat"\n ],\n "away": [\n null,\n "tak di tempat"\n ],\n "Your XMPP provider\'s domain name:": [\n null,\n ""\n ],\n "Fetch registration form": [\n null,\n ""\n ],\n "Tip: A list of public XMPP providers is available": [\n null,\n ""\n ],\n "here": [\n null,\n ""\n ],\n "Register": [\n null,\n ""\n ],\n "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n null,\n ""\n ],\n "Requesting a registration form from the XMPP server": [\n null,\n ""\n ],\n "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n null,\n ""\n ],\n "Now logging you in": [\n null,\n ""\n ],\n "Registered successfully": [\n null,\n ""\n ],\n "Return": [\n null,\n ""\n ],\n "The provider rejected your registration attempt. Please check the values you entered for correctness.": [\n null,\n ""\n ],\n "Password:": [\n null,\n "Kata sandi:"\n ],\n "Log In": [\n null,\n "Masuk"\n ],\n "user@server": [\n null,\n ""\n ],\n "Sign in": [\n null,\n "Masuk"\n ],\n "Toggle chat": [\n null,\n ""\n ]\n }\n }\n}'}),define("text!it",[],function(){return'{\n "domain": "converse",\n "locale_data": {\n "converse": {\n "": {\n "domain": "converse",\n "plural_forms": "nplurals=2; plural=(n != 1);",\n "lang": "it"\n },\n " e.g. conversejs.org": [\n null,\n "es. conversejs.org"\n ],\n "unencrypted": [\n null,\n "non criptato"\n ],\n "unverified": [\n null,\n "non verificato"\n ],\n "verified": [\n null,\n "verificato"\n ],\n "finished": [\n null,\n "finito"\n ],\n "This contact is busy": [\n null,\n "Questo contatto è occupato"\n ],\n "This contact is online": [\n null,\n "Questo contatto è online"\n ],\n "This contact is offline": [\n null,\n "Questo contatto è offline"\n ],\n "This contact is unavailable": [\n null,\n "Questo contatto non è disponibile"\n ],\n "This contact is away for an extended period": [\n null,\n "Il contatto è away da un lungo periodo"\n ],\n "This contact is away": [\n null,\n "Questo contatto è away"\n ],\n "Click to hide these contacts": [\n null,\n "Clicca per nascondere questi contatti"\n ],\n "My contacts": [\n null,\n "I miei contatti"\n ],\n "Pending contacts": [\n null,\n "Contatti in attesa"\n ],\n "Contact requests": [\n null,\n "Richieste dei contatti"\n ],\n "Ungrouped": [\n null,\n "Senza Gruppo"\n ],\n "Contacts": [\n null,\n "Contatti"\n ],\n "Groups": [\n null,\n "Gruppi"\n ],\n "Attempting to reconnect in 5 seconds": [\n null,\n "Attendi riconversione in 5 secondi"\n ],\n "Error": [\n null,\n "Errore"\n ],\n "Connecting": [\n null,\n "Connessione in corso"\n ],\n "Authenticating": [\n null,\n "Autenticazione in corso"\n ],\n "Authentication Failed": [\n null,\n "Autenticazione fallita"\n ],\n "Re-establishing encrypted session": [\n null,\n ""\n ],\n "Generating private key.": [\n null,\n ""\n ],\n "Your browser might become unresponsive.": [\n null,\n ""\n ],\n "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n null,\n ""\n ],\n "Could not verify this user\'s identify.": [\n null,\n ""\n ],\n "Exchanging private key with contact.": [\n null,\n ""\n ],\n "Minimize this chat box": [\n null,\n ""\n ],\n "Personal message": [\n null,\n "Messaggio personale"\n ],\n "Are you sure you want to clear the messages from this room?": [\n null,\n "Sei sicuro di voler pulire i messaggi da questa stanza?"\n ],\n "me": [\n null,\n "me"\n ],\n "is typing": [\n null,\n "sta scrivendo"\n ],\n "has stopped typing": [\n null,\n "ha smesso di scrivere"\n ],\n "has gone away": [\n null,\n ""\n ],\n "Show this menu": [\n null,\n "Mostra questo menu"\n ],\n "Write in the third person": [\n null,\n "Scrivi in terza persona"\n ],\n "Remove messages": [\n null,\n "Rimuovi messaggi"\n ],\n "Are you sure you want to clear the messages from this chat box?": [\n null,\n ""\n ],\n "Your message could not be sent": [\n null,\n ""\n ],\n "We received an unencrypted message": [\n null,\n ""\n ],\n "We received an unreadable encrypted message": [\n null,\n ""\n ],\n "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n null,\n ""\n ],\n "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n null,\n ""\n ],\n "What is your security question?": [\n null,\n ""\n ],\n "What is the answer to the security question?": [\n null,\n ""\n ],\n "Invalid authentication scheme provided": [\n null,\n ""\n ],\n "has gone offline": [\n null,\n ""\n ],\n "is busy": [\n null,\n "è occupato"\n ],\n "Your messages are not encrypted anymore": [\n null,\n ""\n ],\n "Your messages are now encrypted but your contact\'s identity has not been verified.": [\n null,\n ""\n ],\n "Your contact\'s identify has been verified.": [\n null,\n ""\n ],\n "Your contact has ended encryption on their end, you should do the same.": [\n null,\n ""\n ],\n "Your messages are not encrypted. Click here to enable OTR encryption.": [\n null,\n ""\n ],\n "Your messages are encrypted, but your contact has not been verified.": [\n null,\n ""\n ],\n "Your messages are encrypted and your contact verified.": [\n null,\n ""\n ],\n "Your contact has closed their end of the private session, you should do the same": [\n null,\n ""\n ],\n "Clear all messages": [\n null,\n "Pulisci tutti i messaggi"\n ],\n "End encrypted conversation": [\n null,\n ""\n ],\n "Insert a smiley": [\n null,\n ""\n ],\n "Hide the list of occupants": [\n null,\n ""\n ],\n "Refresh encrypted conversation": [\n null,\n ""\n ],\n "Start a call": [\n null,\n ""\n ],\n "Start encrypted conversation": [\n null,\n ""\n ],\n "Verify with fingerprints": [\n null,\n ""\n ],\n "Verify with SMP": [\n null,\n ""\n ],\n "What\'s this?": [\n null,\n ""\n ],\n "Online": [\n null,\n "In linea"\n ],\n "Busy": [\n null,\n "Occupato"\n ],\n "Away": [\n null,\n "Assente"\n ],\n "Offline": [\n null,\n "Non in linea"\n ],\n "Log out": [\n null,\n "Logo out"\n ],\n "Contact name": [\n null,\n "Nome del contatto"\n ],\n "Search": [\n null,\n "Cerca"\n ],\n "e.g. user@example.com": [\n null,\n "es. user@example.com"\n ],\n "Add": [\n null,\n "Aggiungi"\n ],\n "Click to add new chat contacts": [\n null,\n "Clicca per aggiungere nuovi contatti alla chat"\n ],\n "Add a contact": [\n null,\n "Aggiungi contatti"\n ],\n "No users found": [\n null,\n "Nessun utente trovato"\n ],\n "Click to add as a chat contact": [\n null,\n "Clicca per aggiungere il contatto alla chat"\n ],\n "Room name": [\n null,\n "Nome stanza"\n ],\n "Nickname": [\n null,\n "Soprannome"\n ],\n "Server": [\n null,\n "Server"\n ],\n "Join Room": [\n null,\n "Entra nella Stanza"\n ],\n "Show rooms": [\n null,\n "Mostra stanze"\n ],\n "Rooms": [\n null,\n "Stanze"\n ],\n "No rooms on %1$s": [\n null,\n "Nessuna stanza su %1$s"\n ],\n "Rooms on %1$s": [\n null,\n "Stanze su %1$s"\n ],\n "Click to open this room": [\n null,\n "Clicca per aprire questa stanza"\n ],\n "Show more information on this room": [\n null,\n "Mostra più informazioni su questa stanza"\n ],\n "Description:": [\n null,\n "Descrizione:"\n ],\n "Occupants:": [\n null,\n "Utenti presenti:"\n ],\n "Features:": [\n null,\n "Funzionalità:"\n ],\n "Requires authentication": [\n null,\n "Richiede autenticazione"\n ],\n "Hidden": [\n null,\n "Nascosta"\n ],\n "Requires an invitation": [\n null,\n "Richiede un invito"\n ],\n "Moderated": [\n null,\n "Moderata"\n ],\n "Non-anonymous": [\n null,\n "Non-anonima"\n ],\n "Open room": [\n null,\n "Stanza aperta"\n ],\n "Permanent room": [\n null,\n "Stanza permanente"\n ],\n "Public": [\n null,\n "Pubblica"\n ],\n "Semi-anonymous": [\n null,\n "Semi-anonima"\n ],\n "Temporary room": [\n null,\n "Stanza temporanea"\n ],\n "Unmoderated": [\n null,\n "Non moderata"\n ],\n "This user is a moderator": [\n null,\n "Questo utente è un moderatore"\n ],\n "This user can send messages in this room": [\n null,\n "Questo utente può inviare messaggi in questa stanza"\n ],\n "This user can NOT send messages in this room": [\n null,\n "Questo utente NON può inviare messaggi in questa stanza"\n ],\n "Invite...": [\n null,\n "Invita…"\n ],\n "Occupants": [\n null,\n "Occupanti"\n ],\n "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n null,\n ""\n ],\n "You may optionally include a message, explaining the reason for the invitation.": [\n null,\n ""\n ],\n "Message": [\n null,\n "Messaggio"\n ],\n "Error: could not execute the command": [\n null,\n ""\n ],\n "Error: the \\"": [\n null,\n ""\n ],\n "Change user\'s affiliation to admin": [\n null,\n ""\n ],\n "Ban user from room": [\n null,\n "Bandisci utente dalla stanza"\n ],\n "Change user role to occupant": [\n null,\n ""\n ],\n "Kick user from room": [\n null,\n "Espelli utente dalla stanza"\n ],\n "Write in 3rd person": [\n null,\n "Scrivi in terza persona"\n ],\n "Grant membership to a user": [\n null,\n ""\n ],\n "Remove user\'s ability to post messages": [\n null,\n ""\n ],\n "Change your nickname": [\n null,\n ""\n ],\n "Grant moderator role to user": [\n null,\n ""\n ],\n "Revoke user\'s membership": [\n null,\n ""\n ],\n "Set room topic": [\n null,\n "Cambia oggetto della stanza"\n ],\n "Allow muted user to post messages": [\n null,\n ""\n ],\n "Save": [\n null,\n "Salva"\n ],\n "Cancel": [\n null,\n "Annulla"\n ],\n "An error occurred while trying to save the form.": [\n null,\n "Errore durante il salvataggio del modulo"\n ],\n "This chatroom requires a password": [\n null,\n "Questa stanza richiede una password"\n ],\n "Password: ": [\n null,\n "Password: "\n ],\n "Submit": [\n null,\n "Invia"\n ],\n "This room is not anonymous": [\n null,\n "Questa stanza non è anonima"\n ],\n "This room now shows unavailable members": [\n null,\n "Questa stanza mostra i membri non disponibili al momento"\n ],\n "This room does not show unavailable members": [\n null,\n "Questa stanza non mostra i membri non disponibili"\n ],\n "Non-privacy-related room configuration has changed": [\n null,\n "Una configurazione della stanza non legata alla privacy è stata modificata"\n ],\n "Room logging is now enabled": [\n null,\n "La registrazione è abilitata nella stanza"\n ],\n "Room logging is now disabled": [\n null,\n "La registrazione è disabilitata nella stanza"\n ],\n "This room is now non-anonymous": [\n null,\n "Questa stanza è non-anonima"\n ],\n "This room is now semi-anonymous": [\n null,\n "Questa stanza è semi-anonima"\n ],\n "This room is now fully-anonymous": [\n null,\n "Questa stanza è completamente-anonima"\n ],\n "A new room has been created": [\n null,\n "Una nuova stanza è stata creata"\n ],\n "You have been banned from this room": [\n null,\n "Sei stato bandito da questa stanza"\n ],\n "You have been kicked from this room": [\n null,\n "Sei stato espulso da questa stanza"\n ],\n "You have been removed from this room because of an affiliation change": [\n null,\n "Sei stato rimosso da questa stanza a causa di un cambio di affiliazione"\n ],\n "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n null,\n "Sei stato rimosso da questa stanza poiché ora la stanza accetta solo membri"\n ],\n "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n null,\n "Sei stato rimosso da questa stanza poiché il servizio MUC (Chat multi utente) è in fase di spegnimento"\n ],\n "<strong>%1$s</strong> has been banned": [\n null,\n "<strong>%1$s</strong> è stato bandito"\n ],\n "<strong>%1$s</strong>\'s nickname has changed": [\n null,\n "<strong>%1$s</strong> nickname è cambiato"\n ],\n "<strong>%1$s</strong> has been kicked out": [\n null,\n "<strong>%1$s</strong> è stato espulso"\n ],\n "<strong>%1$s</strong> has been removed because of an affiliation change": [\n null,\n "<strong>%1$s</strong> è stato rimosso a causa di un cambio di affiliazione"\n ],\n "<strong>%1$s</strong> has been removed for not being a member": [\n null,\n "<strong>%1$s</strong> è stato rimosso in quanto non membro"\n ],\n "Your nickname has been automatically changed to: <strong>%1$s</strong>": [\n null,\n "Il tuo nickname è stato cambiato automaticamente in: <strong>%1$s</strong>"\n ],\n "Your nickname has been changed to: <strong>%1$s</strong>": [\n null,\n "Il tuo nickname è stato cambiato: <strong>%1$s</strong>"\n ],\n "The reason given is: \\"": [\n null,\n ""\n ],\n "You are not on the member list of this room": [\n null,\n "Non sei nella lista dei membri di questa stanza"\n ],\n "No nickname was specified": [\n null,\n "Nessun soprannome specificato"\n ],\n "You are not allowed to create new rooms": [\n null,\n "Non ti è permesso creare nuove stanze"\n ],\n "Your nickname doesn\'t conform to this room\'s policies": [\n null,\n "Il tuo soprannome non è conforme alle regole di questa stanza"\n ],\n "Your nickname is already taken": [\n null,\n "Il tuo soprannome è già utilizzato"\n ],\n "This room does not (yet) exist": [\n null,\n "Questa stanza non esiste (per ora)"\n ],\n "This room has reached it\'s maximum number of occupants": [\n null,\n "Questa stanza ha raggiunto il limite massimo di utenti"\n ],\n "Topic set by %1$s to: %2$s": [\n null,\n "Topic impostato da %1$s a: %2$s"\n ],\n "%1$s has invited you to join a chat room: %2$s": [\n null,\n "%1$s ti ha invitato a partecipare a una chat room: %2$s"\n ],\n "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n null,\n "%1$s ti ha invitato a partecipare a una chat room: %2$s, e ha lasciato il seguente motivo: “%3$s”"\n ],\n "Click to restore this chat": [\n null,\n "Clicca per ripristinare questa chat"\n ],\n "Minimized": [\n null,\n "Ridotto"\n ],\n "Click to remove this contact": [\n null,\n "Clicca per rimuovere questo contatto"\n ],\n "Click to accept this contact request": [\n null,\n "Clicca per accettare questa richiesta di contatto"\n ],\n "Click to decline this contact request": [\n null,\n "Clicca per rifiutare questa richiesta di contatto"\n ],\n "Click to chat with this contact": [\n null,\n "Clicca per parlare con questo contatto"\n ],\n "Name": [\n null,\n "Nome"\n ],\n "Are you sure you want to remove this contact?": [\n null,\n "Sei sicuro di voler rimuovere questo contatto?"\n ],\n "Sorry, there was an error while trying to remove ": [\n null,\n "Si è verificato un errore durante il tentativo di rimozione"\n ],\n "Are you sure you want to decline this contact request?": [\n null,\n "Sei sicuro dirifiutare questa richiesta di contatto?"\n ],\n "Sorry, there was an error while trying to add ": [\n null,\n "Si è verificato un errore durante il tentativo di aggiunta"\n ],\n "This client does not allow presence subscriptions": [\n null,\n "Questo client non consente sottoscrizioni di presenza"\n ],\n "Type to filter": [\n null,\n ""\n ],\n "I am %1$s": [\n null,\n "Sono %1$s"\n ],\n "Click here to write a custom status message": [\n null,\n "Clicca qui per scrivere un messaggio di stato personalizzato"\n ],\n "Click to change your chat status": [\n null,\n "Clicca per cambiare il tuo stato"\n ],\n "Custom status": [\n null,\n "Stato personalizzato"\n ],\n "online": [\n null,\n "in linea"\n ],\n "busy": [\n null,\n "occupato"\n ],\n "away for long": [\n null,\n "assente da molto"\n ],\n "away": [\n null,\n "assente"\n ],\n "offline": [\n null,\n "offline"\n ],\n "Your XMPP provider\'s domain name:": [\n null,\n "Nome del dominio del provider XMPP:"\n ],\n "Fetch registration form": [\n null,\n "Recupero il modulo di registrazione"\n ],\n "Tip: A list of public XMPP providers is available": [\n null,\n "Suggerimento: È disponibile un elenco di provider XMPP pubblici"\n ],\n "here": [\n null,\n "qui"\n ],\n "Register": [\n null,\n "Registra"\n ],\n "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n null,\n "Siamo spiacenti, il provider specificato non supporta la registrazione di account. Si prega di provare con un altro provider."\n ],\n "Requesting a registration form from the XMPP server": [\n null,\n "Sto richiedendo un modulo di registrazione al server XMPP"\n ],\n "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n null,\n "Qualcosa è andato storto durante la connessione con “%1$s”. Sei sicuro che esiste?"\n ],\n "Now logging you in": [\n null,\n ""\n ],\n "Registered successfully": [\n null,\n "Registrazione riuscita"\n ],\n "Return": [\n null,\n ""\n ],\n "XMPP Username:": [\n null,\n "XMPP Username:"\n ],\n "Password:": [\n null,\n "Password:"\n ],\n "Click here to log in anonymously": [\n null,\n "Clicca per entrare anonimo"\n ],\n "Log In": [\n null,\n "Entra"\n ],\n "user@server": [\n null,\n "user@server"\n ],\n "password": [\n null,\n "Password"\n ],\n "Sign in": [\n null,\n "Accesso"\n ],\n "Toggle chat": [\n null,\n "Attiva/disattiva chat"\n ]\n }\n }\n}'}),define("text!ja",[],function(){return'{\n "domain": "converse",\n "locale_data": {\n "converse": {\n "": {\n "domain": "converse",\n "plural_forms": "nplurals=1; plural=0;",\n "lang": "JA"\n },\n " e.g. conversejs.org": [\n null,\n ""\n ],\n "unencrypted": [\n null,\n "暗号化されていません"\n ],\n "unverified": [\n null,\n "検証されていません"\n ],\n "verified": [\n null,\n "検証されました"\n ],\n "finished": [\n null,\n "完了"\n ],\n "This contact is busy": [\n null,\n "この相手先は取り込み中です"\n ],\n "This contact is online": [\n null,\n "この相手先は在席しています"\n ],\n "This contact is offline": [\n null,\n "この相手先はオフラインです"\n ],\n "This contact is unavailable": [\n null,\n "この相手先は不通です"\n ],\n "This contact is away for an extended period": [\n null,\n "この相手先は不在です"\n ],\n "This contact is away": [\n null,\n "この相手先は離席中です"\n ],\n "My contacts": [\n null,\n "相手先一覧"\n ],\n "Pending contacts": [\n null,\n "保留中の相手先"\n ],\n "Contact requests": [\n null,\n "会話に呼び出し"\n ],\n "Ungrouped": [\n null,\n ""\n ],\n "Contacts": [\n null,\n "相手先"\n ],\n "Groups": [\n null,\n ""\n ],\n "Attempting to reconnect in 5 seconds": [\n null,\n ""\n ],\n "Error": [\n null,\n "エラー"\n ],\n "Connecting": [\n null,\n "接続中です"\n ],\n "Authenticating": [\n null,\n "認証中"\n ],\n "Authentication Failed": [\n null,\n "認証に失敗"\n ],\n "Re-establishing encrypted session": [\n null,\n "暗号化セッションの再接続"\n ],\n "Generating private key.": [\n null,\n ""\n ],\n "Your browser might become unresponsive.": [\n null,\n ""\n ],\n "Could not verify this user\'s identify.": [\n null,\n "このユーザーの本人性を検証できませんでした。"\n ],\n "Exchanging private key with contact.": [\n null,\n ""\n ],\n "Minimize this chat box": [\n null,\n ""\n ],\n "Personal message": [\n null,\n "私信"\n ],\n "me": [\n null,\n "私"\n ],\n "is typing": [\n null,\n ""\n ],\n "has stopped typing": [\n null,\n ""\n ],\n "Show this menu": [\n null,\n "このメニューを表示"\n ],\n "Write in the third person": [\n null,\n "第三者に書く"\n ],\n "Remove messages": [\n null,\n "メッセージを削除"\n ],\n "Are you sure you want to clear the messages from this chat box?": [\n null,\n ""\n ],\n "Your message could not be sent": [\n null,\n "メッセージを送信できませんでした"\n ],\n "We received an unencrypted message": [\n null,\n "暗号化されていないメッセージを受信しました"\n ],\n "We received an unreadable encrypted message": [\n null,\n "読めない暗号化メッセージを受信しました"\n ],\n "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n null,\n "これは鍵指紋です。チャット以外の方法でこれらを %1$s と確認してください。\\n\\nあなた %2$s の鍵指紋: %3$s\\n\\n%1$s の鍵指紋: %4$s\\n\\n確認して、鍵指紋が正しければ「OK」を、正しくなければ「キャンセル」をクリックしてください。"\n ],\n "What is your security question?": [\n null,\n "秘密の質問はなんですか?"\n ],\n "What is the answer to the security question?": [\n null,\n "秘密の質問の答はなんですか?"\n ],\n "Invalid authentication scheme provided": [\n null,\n "認証の方式が正しくありません"\n ],\n "Your messages are not encrypted anymore": [\n null,\n "メッセージはもう暗号化されません"\n ],\n "Your messages are not encrypted. Click here to enable OTR encryption.": [\n null,\n "メッセージは暗号化されません。OTR 暗号化を有効にするにはここをクリックしてください。"\n ],\n "End encrypted conversation": [\n null,\n "暗号化された会話を終了"\n ],\n "Insert a smiley": [\n null,\n ""\n ],\n "Hide the list of occupants": [\n null,\n ""\n ],\n "Refresh encrypted conversation": [\n null,\n "暗号化された会話をリフレッシュ"\n ],\n "Start a call": [\n null,\n ""\n ],\n "Start encrypted conversation": [\n null,\n "暗号化された会話を開始"\n ],\n "Verify with fingerprints": [\n null,\n "鍵指紋で検証"\n ],\n "Verify with SMP": [\n null,\n "SMP で検証"\n ],\n "What\'s this?": [\n null,\n "これは何ですか?"\n ],\n "Online": [\n null,\n "オンライン"\n ],\n "Busy": [\n null,\n "取り込み中"\n ],\n "Away": [\n null,\n "離席中"\n ],\n "Offline": [\n null,\n "オフライン"\n ],\n "Contact name": [\n null,\n "名前"\n ],\n "Search": [\n null,\n "検索"\n ],\n "e.g. user@example.com": [\n null,\n ""\n ],\n "Add": [\n null,\n "追加"\n ],\n "Click to add new chat contacts": [\n null,\n "クリックして新しいチャットの相手先を追加"\n ],\n "Add a contact": [\n null,\n "相手先を追加"\n ],\n "No users found": [\n null,\n "ユーザーが見つかりません"\n ],\n "Click to add as a chat contact": [\n null,\n "クリックしてチャットの相手先として追加"\n ],\n "Room name": [\n null,\n "談話室の名前"\n ],\n "Nickname": [\n null,\n "ニックネーム"\n ],\n "Server": [\n null,\n "サーバー"\n ],\n "Show rooms": [\n null,\n "談話室一覧を見る"\n ],\n "Rooms": [\n null,\n "談話室"\n ],\n "No rooms on %1$s": [\n null,\n "%1$s に談話室はありません"\n ],\n "Rooms on %1$s": [\n null,\n "%1$s の談話室一覧"\n ],\n "Click to open this room": [\n null,\n "クリックしてこの談話室を開く"\n ],\n "Show more information on this room": [\n null,\n "この談話室についての詳細を見る"\n ],\n "Description:": [\n null,\n "説明: "\n ],\n "Occupants:": [\n null,\n "入室者:"\n ],\n "Features:": [\n null,\n "特徴:"\n ],\n "Requires authentication": [\n null,\n "認証の要求"\n ],\n "Hidden": [\n null,\n "非表示"\n ],\n "Requires an invitation": [\n null,\n "招待の要求"\n ],\n "Moderated": [\n null,\n "発言制限"\n ],\n "Non-anonymous": [\n null,\n "非匿名"\n ],\n "Open room": [\n null,\n "開放談話室"\n ],\n "Permanent room": [\n null,\n "常設談話室"\n ],\n "Public": [\n null,\n "公開談話室"\n ],\n "Semi-anonymous": [\n null,\n "半匿名"\n ],\n "Temporary room": [\n null,\n "臨時談話室"\n ],\n "Unmoderated": [\n null,\n "発言制限なし"\n ],\n "This user is a moderator": [\n null,\n "このユーザーは司会者です"\n ],\n "This user can send messages in this room": [\n null,\n "このユーザーはこの談話室で発言できます"\n ],\n "This user can NOT send messages in this room": [\n null,\n "このユーザーはこの談話室で発言できません"\n ],\n "Invite...": [\n null,\n ""\n ],\n "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n null,\n ""\n ],\n "You may optionally include a message, explaining the reason for the invitation.": [\n null,\n ""\n ],\n "Message": [\n null,\n "メッセージ"\n ],\n "Error: could not execute the command": [\n null,\n ""\n ],\n "Error: the \\"": [\n null,\n ""\n ],\n "Change user\'s affiliation to admin": [\n null,\n ""\n ],\n "Change user role to occupant": [\n null,\n ""\n ],\n "Grant membership to a user": [\n null,\n ""\n ],\n "Remove user\'s ability to post messages": [\n null,\n ""\n ],\n "Change your nickname": [\n null,\n ""\n ],\n "Grant moderator role to user": [\n null,\n ""\n ],\n "Revoke user\'s membership": [\n null,\n ""\n ],\n "Allow muted user to post messages": [\n null,\n ""\n ],\n "Save": [\n null,\n "保存"\n ],\n "Cancel": [\n null,\n "キャンセル"\n ],\n "An error occurred while trying to save the form.": [\n null,\n "フォームを保存する際にエラーが発生しました。"\n ],\n "This chatroom requires a password": [\n null,\n "この談話室にはパスワードが必要です"\n ],\n "Password: ": [\n null,\n "パスワード:"\n ],\n "Submit": [\n null,\n "送信"\n ],\n "This room is not anonymous": [\n null,\n "この談話室は非匿名です"\n ],\n "This room now shows unavailable members": [\n null,\n "この談話室はメンバー以外にも見えます"\n ],\n "This room does not show unavailable members": [\n null,\n "この談話室はメンバー以外には見えません"\n ],\n "Non-privacy-related room configuration has changed": [\n null,\n "談話室の設定(プライバシーに無関係)が変更されました"\n ],\n "Room logging is now enabled": [\n null,\n "談話室の記録を取りはじめます"\n ],\n "Room logging is now disabled": [\n null,\n "談話室の記録を止めます"\n ],\n "This room is now non-anonymous": [\n null,\n "この談話室はただいま非匿名です"\n ],\n "This room is now semi-anonymous": [\n null,\n "この談話室はただいま半匿名です"\n ],\n "This room is now fully-anonymous": [\n null,\n "この談話室はただいま匿名です"\n ],\n "A new room has been created": [\n null,\n "新しい談話室が作成されました"\n ],\n "You have been banned from this room": [\n null,\n "この談話室から締め出されました"\n ],\n "You have been kicked from this room": [\n null,\n "この談話室から蹴り出されました"\n ],\n "You have been removed from this room because of an affiliation change": [\n null,\n "分掌の変更のため、この談話室から削除されました"\n ],\n "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n null,\n "談話室がメンバー制に変更されました。メンバーではないため、この談話室から削除されました"\n ],\n "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n null,\n "MUC(グループチャット)のサービスが停止したため、この談話室から削除されました。"\n ],\n "<strong>%1$s</strong> has been banned": [\n null,\n "<strong>%1$s</strong> を締め出しました"\n ],\n "<strong>%1$s</strong> has been kicked out": [\n null,\n "<strong>%1$s</strong> を蹴り出しました"\n ],\n "<strong>%1$s</strong> has been removed because of an affiliation change": [\n null,\n "分掌の変更のため、<strong>%1$s</strong> を削除しました"\n ],\n "<strong>%1$s</strong> has been removed for not being a member": [\n null,\n "メンバーでなくなったため、<strong>%1$s</strong> を削除しました"\n ],\n "The reason given is: \\"": [\n null,\n ""\n ],\n "You are not on the member list of this room": [\n null,\n "この談話室のメンバー一覧にいません"\n ],\n "No nickname was specified": [\n null,\n "ニックネームがありません"\n ],\n "You are not allowed to create new rooms": [\n null,\n "新しい談話室を作成する権限がありません"\n ],\n "Your nickname doesn\'t conform to this room\'s policies": [\n null,\n "ニックネームがこの談話室のポリシーに従っていません"\n ],\n "Your nickname is already taken": [\n null,\n "ニックネームは既に使われています"\n ],\n "This room does not (yet) exist": [\n null,\n "この談話室は存在しません"\n ],\n "This room has reached it\'s maximum number of occupants": [\n null,\n "この談話室は入室者数の上限に達しています"\n ],\n "Topic set by %1$s to: %2$s": [\n null,\n "%1$s が話題を設定しました: %2$s"\n ],\n "%1$s has invited you to join a chat room: %2$s": [\n null,\n ""\n ],\n "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n null,\n ""\n ],\n "Minimized": [\n null,\n ""\n ],\n "Click to remove this contact": [\n null,\n "クリックしてこの相手先を削除"\n ],\n "Click to chat with this contact": [\n null,\n "クリックしてこの相手先とチャット"\n ],\n "Name": [\n null,\n ""\n ],\n "Sorry, there was an error while trying to remove ": [\n null,\n ""\n ],\n "Sorry, there was an error while trying to add ": [\n null,\n ""\n ],\n "This client does not allow presence subscriptions": [\n null,\n ""\n ],\n "Type to filter": [\n null,\n ""\n ],\n "I am %1$s": [\n null,\n "私はいま %1$s"\n ],\n "Click here to write a custom status message": [\n null,\n "状況メッセージを入力するには、ここをクリック"\n ],\n "Click to change your chat status": [\n null,\n "クリックして、在席状況を変更"\n ],\n "Custom status": [\n null,\n "独自の在席状況"\n ],\n "online": [\n null,\n "在席"\n ],\n "busy": [\n null,\n "取り込み中"\n ],\n "away for long": [\n null,\n "不在"\n ],\n "away": [\n null,\n "離席中"\n ],\n "Your XMPP provider\'s domain name:": [\n null,\n ""\n ],\n "Fetch registration form": [\n null,\n ""\n ],\n "Tip: A list of public XMPP providers is available": [\n null,\n ""\n ],\n "here": [\n null,\n ""\n ],\n "Register": [\n null,\n ""\n ],\n "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n null,\n ""\n ],\n "Requesting a registration form from the XMPP server": [\n null,\n ""\n ],\n "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n null,\n ""\n ],\n "Now logging you in": [\n null,\n ""\n ],\n "Registered successfully": [\n null,\n ""\n ],\n "Return": [\n null,\n ""\n ],\n "The provider rejected your registration attempt. Please check the values you entered for correctness.": [\n null,\n ""\n ],\n "Password:": [\n null,\n "パスワード:"\n ],\n "Log In": [\n null,\n "ログイン"\n ],\n "user@server": [\n null,\n ""\n ],\n "Sign in": [\n null,\n "サインイン"\n ],\n "Toggle chat": [\n null,\n ""\n ]\n }\n }\n}'}),define("text!nb",[],function(){return'{\n "domain": "converse",\n "locale_data": {\n "converse": {\n "": {\n "domain": "converse",\n "plural_forms": "nplurals=2; plural=(n != 1);",\n "lang": "nb"\n },\n " e.g. conversejs.org": [\n null,\n ""\n ],\n "unencrypted": [\n null,\n "ukryptertß"\n ],\n "unverified": [\n null,\n "uverifisert"\n ],\n "verified": [\n null,\n "verifisert"\n ],\n "finished": [\n null,\n "ferdig"\n ],\n "This contact is busy": [\n null,\n "Denne kontakten er opptatt"\n ],\n "This contact is online": [\n null,\n "Kontakten er pålogget"\n ],\n "This contact is offline": [\n null,\n "Kontakten er avlogget"\n ],\n "This contact is unavailable": [\n null,\n "Kontakten er utilgjengelig"\n ],\n "This contact is away for an extended period": [\n null,\n "Kontakten er borte for en lengre periode"\n ],\n "This contact is away": [\n null,\n "Kontakten er borte"\n ],\n "Click to hide these contacts": [\n null,\n "Klikk for å skjule disse kontaktene"\n ],\n "My contacts": [\n null,\n "Mine Kontakter"\n ],\n "Pending contacts": [\n null,\n "Kontakter som venter på godkjenning"\n ],\n "Contact requests": [\n null,\n "Kontaktforespørsler"\n ],\n "Ungrouped": [\n null,\n "Ugrupperte"\n ],\n "Contacts": [\n null,\n "Kontakter"\n ],\n "Groups": [\n null,\n "Grupper"\n ],\n "Attempting to reconnect in 5 seconds": [\n null,\n ""\n ],\n "Error": [\n null,\n "Feil"\n ],\n "Connecting": [\n null,\n "Kobler til"\n ],\n "Authenticating": [\n null,\n "Godkjenner"\n ],\n "Authentication Failed": [\n null,\n "Godkjenning mislyktes"\n ],\n "Re-establishing encrypted session": [\n null,\n "Gjenopptar kryptert økt"\n ],\n "Generating private key.": [\n null,\n "Genererer privat nøkkel"\n ],\n "Your browser might become unresponsive.": [\n null,\n "Din nettleser kan bli uresponsiv"\n ],\n "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n null,\n "Godkjenningsforespørsel fra %1$s\\n\\nDin nettpratkontakt forsøker å bekrefte din identitet, ved å spørre deg spørsmålet under.\\n\\n%2$s"\n ],\n "Could not verify this user\'s identify.": [\n null,\n "Kunne ikke bekrefte denne brukerens identitet"\n ],\n "Exchanging private key with contact.": [\n null,\n "Bytter private nøkler med kontakt"\n ],\n "Minimize this chat box": [\n null,\n ""\n ],\n "Personal message": [\n null,\n "Personlig melding"\n ],\n "Are you sure you want to clear the messages from this room?": [\n null,\n "Er du sikker på at du vil fjerne meldingene fra dette rommet?"\n ],\n "me": [\n null,\n "meg"\n ],\n "is typing": [\n null,\n "skriver"\n ],\n "has stopped typing": [\n null,\n "har stoppet å skrive"\n ],\n "Show this menu": [\n null,\n "Viser denne menyen"\n ],\n "Write in the third person": [\n null,\n "Skriv i tredjeperson"\n ],\n "Remove messages": [\n null,\n "Fjern meldinger"\n ],\n "Are you sure you want to clear the messages from this chat box?": [\n null,\n "Er du sikker på at du vil fjerne meldingene fra denne meldingsboksen?"\n ],\n "Your message could not be sent": [\n null,\n "Beskjeden din kunne ikke sendes"\n ],\n "We received an unencrypted message": [\n null,\n "Vi mottok en ukryptert beskjed"\n ],\n "We received an unreadable encrypted message": [\n null,\n "Vi mottok en uleselig melding"\n ],\n "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n null,\n "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nOm du har bekreftet at avtrykkene matcher, klikk OK. I motsatt fall, trykk Avbryt."\n ],\n "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n null,\n "Du vil bli spurt etter å tilby et sikkerhetsspørsmål og siden svare på dette.\\n\\nDin kontakt vil så bli spurt om det samme spørsmålet, og om de svarer det nøyaktig samme svaret (det er forskjell på små og store bokstaver), vil identiteten verifiseres."\n ],\n "What is your security question?": [\n null,\n "Hva er ditt Sikkerhetsspørsmål?"\n ],\n "What is the answer to the security question?": [\n null,\n "Hva er svaret på ditt Sikkerhetsspørsmål?"\n ],\n "Invalid authentication scheme provided": [\n null,\n "Du har vedlagt en ugyldig godkjenningsplan."\n ],\n "Your messages are not encrypted anymore": [\n null,\n "Dine meldinger er ikke kryptert lenger."\n ],\n "Your messages are now encrypted but your contact\'s identity has not been verified.": [\n null,\n "Dine meldinger er nå krypterte, men identiteten til din kontakt har ikke blitt verifisert."\n ],\n "Your contact\'s identify has been verified.": [\n null,\n "Din kontakts identitet har blitt verifisert."\n ],\n "Your contact has ended encryption on their end, you should do the same.": [\n null,\n "Din kontakt har avsluttet kryptering i sin ende, dette burde du også gjøre."\n ],\n "Your messages are not encrypted. Click here to enable OTR encryption.": [\n null,\n "Dine meldinger er ikke krypterte. Klikk her for å aktivere OTR-kryptering."\n ],\n "Your messages are encrypted, but your contact has not been verified.": [\n null,\n "Dine meldinger er krypterte, men din kontakt har ikke blitt verifisert."\n ],\n "Your messages are encrypted and your contact verified.": [\n null,\n "Dine meldinger er krypterte og din kontakt er verifisert."\n ],\n "Your contact has closed their end of the private session, you should do the same": [\n null,\n "Din kontakt har avsluttet økten i sin ende, dette burde du også gjøre."\n ],\n "Clear all messages": [\n null,\n "Fjern alle meldinger"\n ],\n "End encrypted conversation": [\n null,\n "Avslutt kryptert økt"\n ],\n "Insert a smiley": [\n null,\n ""\n ],\n "Refresh encrypted conversation": [\n null,\n "Last inn kryptert samtale på nytt"\n ],\n "Start a call": [\n null,\n "Start en samtale"\n ],\n "Start encrypted conversation": [\n null,\n "Start en kryptert samtale"\n ],\n "Verify with fingerprints": [\n null,\n "Verifiser med Avtrykk"\n ],\n "Verify with SMP": [\n null,\n "Verifiser med SMP"\n ],\n "What\'s this?": [\n null,\n "Hva er dette?"\n ],\n "Online": [\n null,\n "Pålogget"\n ],\n "Busy": [\n null,\n "Opptatt"\n ],\n "Away": [\n null,\n "Borte"\n ],\n "Offline": [\n null,\n "Avlogget"\n ],\n "Log out": [\n null,\n "Logg Av"\n ],\n "Contact name": [\n null,\n "Kontaktnavn"\n ],\n "Search": [\n null,\n "Søk"\n ],\n "e.g. user@example.com": [\n null,\n ""\n ],\n "Add": [\n null,\n "Legg Til"\n ],\n "Click to add new chat contacts": [\n null,\n "Klikk for å legge til nye meldingskontakter"\n ],\n "Add a contact": [\n null,\n "Legg til en Kontakt"\n ],\n "No users found": [\n null,\n "Ingen brukere funnet"\n ],\n "Click to add as a chat contact": [\n null,\n "Klikk for å legge til som meldingskontakt"\n ],\n "Room name": [\n null,\n "Romnavn"\n ],\n "Nickname": [\n null,\n "Kallenavn"\n ],\n "Server": [\n null,\n "Server"\n ],\n "Show rooms": [\n null,\n "Vis Rom"\n ],\n "Rooms": [\n null,\n "Rom"\n ],\n "No rooms on %1$s": [\n null,\n "Ingen rom på %1$s"\n ],\n "Rooms on %1$s": [\n null,\n "Rom på %1$s"\n ],\n "Click to open this room": [\n null,\n "Klikk for å åpne dette rommet"\n ],\n "Show more information on this room": [\n null,\n "Vis mer informasjon om dette rommet"\n ],\n "Description:": [\n null,\n "Beskrivelse:"\n ],\n "Occupants:": [\n null,\n "Brukere her:"\n ],\n "Features:": [\n null,\n "Egenskaper:"\n ],\n "Requires authentication": [\n null,\n "Krever Godkjenning"\n ],\n "Hidden": [\n null,\n "Skjult"\n ],\n "Requires an invitation": [\n null,\n "Krever en invitasjon"\n ],\n "Moderated": [\n null,\n "Moderert"\n ],\n "Non-anonymous": [\n null,\n "Ikke-Anonym"\n ],\n "Open room": [\n null,\n "Åpent Rom"\n ],\n "Permanent room": [\n null,\n "Permanent Rom"\n ],\n "Public": [\n null,\n "Alle"\n ],\n "Semi-anonymous": [\n null,\n "Semi-anonymt"\n ],\n "Temporary room": [\n null,\n "Midlertidig Rom"\n ],\n "Unmoderated": [\n null,\n "Umoderert"\n ],\n "This user is a moderator": [\n null,\n "Denne brukeren er moderator"\n ],\n "This user can send messages in this room": [\n null,\n "Denne brukeren kan skrive meldinger i dette rommet"\n ],\n "This user can NOT send messages in this room": [\n null,\n "Denne brukeren kan IKKE sende meldinger i dette rommet"\n ],\n "Invite...": [\n null,\n "Invitér..."\n ],\n "Occupants": [\n null,\n "Brukere her:"\n ],\n "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n null,\n "Du er i ferd med å invitere %1$s til samtalerommet \\"%2$s\\". "\n ],\n "You may optionally include a message, explaining the reason for the invitation.": [\n null,\n "Du kan eventuelt inkludere en melding og forklare årsaken til invitasjonen."\n ],\n "Message": [\n null,\n "Melding"\n ],\n "Error: could not execute the command": [\n null,\n "Feil: kunne ikke utføre kommandoen"\n ],\n "Error: the \\"": [\n null,\n ""\n ],\n "Change user\'s affiliation to admin": [\n null,\n ""\n ],\n "Ban user from room": [\n null,\n "Utesteng bruker fra rommet"\n ],\n "Kick user from room": [\n null,\n "Kast ut bruker fra rommet"\n ],\n "Write in 3rd person": [\n null,\n "Skriv i tredjeperson"\n ],\n "Grant membership to a user": [\n null,\n ""\n ],\n "Remove user\'s ability to post messages": [\n null,\n "Fjern brukerens muligheter til å skrive meldinger"\n ],\n "Change your nickname": [\n null,\n "Endre ditt kallenavn"\n ],\n "Grant moderator role to user": [\n null,\n ""\n ],\n "Revoke user\'s membership": [\n null,\n ""\n ],\n "Set room topic": [\n null,\n "Endre rommets emne"\n ],\n "Allow muted user to post messages": [\n null,\n "Tillat stumme brukere å skrive meldinger"\n ],\n "Save": [\n null,\n "Lagre"\n ],\n "Cancel": [\n null,\n "Avbryt"\n ],\n "An error occurred while trying to save the form.": [\n null,\n "En feil skjedde under lagring av skjemaet."\n ],\n "This chatroom requires a password": [\n null,\n "Dette rommet krever et passord"\n ],\n "Password: ": [\n null,\n "Passord:"\n ],\n "Submit": [\n null,\n "Send"\n ],\n "This room is not anonymous": [\n null,\n "Dette rommet er ikke anonymt"\n ],\n "This room now shows unavailable members": [\n null,\n "Dette rommet viser nå utilgjengelige medlemmer"\n ],\n "This room does not show unavailable members": [\n null,\n "Dette rommet viser ikke utilgjengelige medlemmer"\n ],\n "Non-privacy-related room configuration has changed": [\n null,\n "Ikke-personvernsrelatert romkonfigurasjon har blitt endret"\n ],\n "Room logging is now enabled": [\n null,\n "Romlogging er nå aktivert"\n ],\n "Room logging is now disabled": [\n null,\n "Romlogging er nå deaktivert"\n ],\n "This room is now non-anonymous": [\n null,\n "Dette rommet er nå ikke-anonymt"\n ],\n "This room is now semi-anonymous": [\n null,\n "Dette rommet er nå semi-anonymt"\n ],\n "This room is now fully-anonymous": [\n null,\n "Dette rommet er nå totalt anonymt"\n ],\n "A new room has been created": [\n null,\n "Et nytt rom har blitt opprettet"\n ],\n "You have been banned from this room": [\n null,\n "Du har blitt utestengt fra dette rommet"\n ],\n "You have been kicked from this room": [\n null,\n "Du ble kastet ut av dette rommet"\n ],\n "You have been removed from this room because of an affiliation change": [\n null,\n "Du har blitt fjernet fra dette rommet på grunn av en holdningsendring"\n ],\n "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n null,\n "Du har blitt fjernet fra dette rommet fordi rommet nå kun tillater medlemmer, noe du ikke er."\n ],\n "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n null,\n "Du har blitt fjernet fra dette rommet fordi MBC (Multi-Bruker-Chat)-tjenesten er stengt ned."\n ],\n "<strong>%1$s</strong> has been banned": [\n null,\n "<strong>%1$s</strong> har blitt utestengt"\n ],\n "<strong>%1$s</strong>\'s nickname has changed": [\n null,\n "<strong>%1$s</strong> sitt kallenavn er endret"\n ],\n "<strong>%1$s</strong> has been kicked out": [\n null,\n "<strong>%1$s</strong> ble kastet ut"\n ],\n "<strong>%1$s</strong> has been removed because of an affiliation change": [\n null,\n "<strong>%1$s</strong> har blitt fjernet på grunn av en holdningsendring"\n ],\n "<strong>%1$s</strong> has been removed for not being a member": [\n null,\n "<strong>%1$s</strong> har blitt fjernet på grunn av at han/hun ikke er medlem"\n ],\n "Your nickname has been automatically changed to: <strong>%1$s</strong>": [\n null,\n "Ditt kallenavn har blitt automatisk endret til <strong>%1$s</strong> "\n ],\n "Your nickname has been changed to: <strong>%1$s</strong>": [\n null,\n "Ditt kallenavn har blitt endret til <strong>%1$s</strong> "\n ],\n "The reason given is: \\"": [\n null,\n "Årsaken som er oppgitt er: \\""\n ],\n "You are not on the member list of this room": [\n null,\n "Du er ikke på medlemslisten til dette rommet"\n ],\n "No nickname was specified": [\n null,\n "Ingen kallenavn var spesifisert"\n ],\n "You are not allowed to create new rooms": [\n null,\n "Du har ikke tillatelse til å opprette nye rom"\n ],\n "Your nickname doesn\'t conform to this room\'s policies": [\n null,\n "Ditt kallenavn er ikke i samsvar med rommets regler"\n ],\n "Your nickname is already taken": [\n null,\n "Kallenavnet er allerede tatt"\n ],\n "This room does not (yet) exist": [\n null,\n "Dette rommet eksisterer ikke (enda)"\n ],\n "This room has reached it\'s maximum number of occupants": [\n null,\n "Dette rommet har nådd maksimalt antall brukere"\n ],\n "Topic set by %1$s to: %2$s": [\n null,\n "Emnet ble endret den %1$s til: %2$s"\n ],\n "%1$s has invited you to join a chat room: %2$s": [\n null,\n "%1$s har invitert deg til å bli med i chatterommet: %2$s"\n ],\n "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n null,\n "%1$s har invitert deg til å bli med i chatterommet: %2$s, og forlot selv av følgende grunn: \\"%3$s\\""\n ],\n "Click to restore this chat": [\n null,\n "Klikk for å gjenopprette denne samtalen"\n ],\n "Minimized": [\n null,\n "Minimert"\n ],\n "Click to remove this contact": [\n null,\n "Klikk for å fjerne denne kontakten"\n ],\n "Click to accept this contact request": [\n null,\n "Klikk for å Godta denne kontaktforespørselen"\n ],\n "Click to decline this contact request": [\n null,\n "Klikk for å avslå denne kontaktforespørselen"\n ],\n "Click to chat with this contact": [\n null,\n "Klikk for å chatte med denne kontakten"\n ],\n "Name": [\n null,\n ""\n ],\n "Are you sure you want to remove this contact?": [\n null,\n "Er du sikker på at du vil fjerne denne kontakten?"\n ],\n "Sorry, there was an error while trying to remove ": [\n null,\n ""\n ],\n "Are you sure you want to decline this contact request?": [\n null,\n "Er du sikker på at du vil avslå denne kontaktforespørselen?"\n ],\n "Sorry, there was an error while trying to add ": [\n null,\n ""\n ],\n "This client does not allow presence subscriptions": [\n null,\n ""\n ],\n "Type to filter": [\n null,\n "Skriv til filter"\n ],\n "I am %1$s": [\n null,\n "Jeg er %1$s"\n ],\n "Click here to write a custom status message": [\n null,\n "Klikk her for å skrive en personlig statusmelding"\n ],\n "Click to change your chat status": [\n null,\n "Klikk for å endre din meldingsstatus"\n ],\n "Custom status": [\n null,\n "Personlig status"\n ],\n "online": [\n null,\n "pålogget"\n ],\n "busy": [\n null,\n "opptatt"\n ],\n "away for long": [\n null,\n "borte lenge"\n ],\n "away": [\n null,\n "borte"\n ],\n "Your XMPP provider\'s domain name:": [\n null,\n "Din XMPP-tilbyders domenenavn:"\n ],\n "Fetch registration form": [\n null,\n "Hent registreringsskjema"\n ],\n "Tip: A list of public XMPP providers is available": [\n null,\n "Tips: En liste med offentlige XMPP-tilbydere er tilgjengelig"\n ],\n "here": [\n null,\n "her"\n ],\n "Register": [\n null,\n "Registrér deg"\n ],\n "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n null,\n "Beklager, den valgte tilbyderen støtter ikke in band kontoregistrering. Vennligst prøv igjen med en annen tilbyder. "\n ],\n "Requesting a registration form from the XMPP server": [\n null,\n "Spør etter registreringsskjema fra XMPP-tjeneren"\n ],\n "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n null,\n "Noe gikk galt under etablering av forbindelse med \\"%1$s\\". Er du sikker på at denne eksisterer?"\n ],\n "Now logging you in": [\n null,\n "Logger deg inn"\n ],\n "Registered successfully": [\n null,\n "Registrering var vellykket"\n ],\n "Return": [\n null,\n "Tilbake"\n ],\n "XMPP Username:": [\n null,\n "XMPP Brukernavn:"\n ],\n "Password:": [\n null,\n "Passord:"\n ],\n "Log In": [\n null,\n "Logg inn"\n ],\n "user@server": [\n null,\n ""\n ],\n "Sign in": [\n null,\n "Innlogging"\n ],\n "Toggle chat": [\n null,\n "Endre chatten"\n ]\n }\n }\n}'}),define("text!nl",[],function(){return'{\n "domain": "converse",\n "locale_data": {\n "converse": {\n "": {\n "domain": "converse",\n "plural_forms": "nplurals=2; plural=(n != 1);",\n "lang": "nl"\n },\n " e.g. conversejs.org": [\n null,\n ""\n ],\n "unencrypted": [\n null,\n "ongecodeerde"\n ],\n "unverified": [\n null,\n "niet geverifieerd"\n ],\n "verified": [\n null,\n "geverifieerd"\n ],\n "finished": [\n null,\n "klaar"\n ],\n "This contact is busy": [\n null,\n "Contact is bezet"\n ],\n "This contact is online": [\n null,\n "Contact is online"\n ],\n "This contact is offline": [\n null,\n "Contact is offline"\n ],\n "This contact is unavailable": [\n null,\n "Contact is niet beschikbaar"\n ],\n "This contact is away for an extended period": [\n null,\n "Contact is afwezig voor lange periode"\n ],\n "This contact is away": [\n null,\n "Conact is afwezig"\n ],\n "My contacts": [\n null,\n "Mijn contacts"\n ],\n "Pending contacts": [\n null,\n "Conacten in afwachting van"\n ],\n "Contact requests": [\n null,\n "Contact uitnodiging"\n ],\n "Ungrouped": [\n null,\n ""\n ],\n "Contacts": [\n null,\n "Contacten"\n ],\n "Groups": [\n null,\n ""\n ],\n "Attempting to reconnect in 5 seconds": [\n null,\n ""\n ],\n "Error": [\n null,\n "Error"\n ],\n "Connecting": [\n null,\n "Verbinden"\n ],\n "Authenticating": [\n null,\n "Authenticeren"\n ],\n "Authentication Failed": [\n null,\n "Authenticeren mislukt"\n ],\n "Re-establishing encrypted session": [\n null,\n "Bezig versleutelde sessie te herstellen"\n ],\n "Generating private key.": [\n null,\n ""\n ],\n "Your browser might become unresponsive.": [\n null,\n ""\n ],\n "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n null,\n ""\n ],\n "Could not verify this user\'s identify.": [\n null,\n "Niet kon de identiteit van deze gebruiker niet identificeren."\n ],\n "Exchanging private key with contact.": [\n null,\n ""\n ],\n "Minimize this chat box": [\n null,\n ""\n ],\n "Personal message": [\n null,\n "Persoonlijk bericht"\n ],\n "me": [\n null,\n "ikzelf"\n ],\n "Show this menu": [\n null,\n "Toon dit menu"\n ],\n "Write in the third person": [\n null,\n "Schrijf in de 3de persoon"\n ],\n "Remove messages": [\n null,\n "Verwijder bericht"\n ],\n "Are you sure you want to clear the messages from this chat box?": [\n null,\n ""\n ],\n "Your message could not be sent": [\n null,\n "Je bericht kon niet worden verzonden"\n ],\n "We received an unencrypted message": [\n null,\n "We ontvingen een unencrypted bericht "\n ],\n "We received an unreadable encrypted message": [\n null,\n "We ontvangen een onleesbaar unencrypted bericht"\n ],\n "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n null,\n ""\n ],\n "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n null,\n ""\n ],\n "What is your security question?": [\n null,\n "Wat is jou sericury vraag?"\n ],\n "What is the answer to the security question?": [\n null,\n "Wat is het antwoord op de security vraag?"\n ],\n "Invalid authentication scheme provided": [\n null,\n ""\n ],\n "Your messages are not encrypted anymore": [\n null,\n "Je berichten zijn niet meer encrypted"\n ],\n "Your messages are not encrypted. Click here to enable OTR encryption.": [\n null,\n "Jou bericht is niet encrypted. KLik hier om ORC encrytion aan te zetten."\n ],\n "End encrypted conversation": [\n null,\n "Beeindig encrypted gesprek"\n ],\n "Insert a smiley": [\n null,\n ""\n ],\n "Hide the list of occupants": [\n null,\n ""\n ],\n "Refresh encrypted conversation": [\n null,\n "Ververs encrypted gesprek"\n ],\n "Start a call": [\n null,\n ""\n ],\n "Start encrypted conversation": [\n null,\n "Start encrypted gesprek"\n ],\n "Verify with fingerprints": [\n null,\n ""\n ],\n "Verify with SMP": [\n null,\n ""\n ],\n "What\'s this?": [\n null,\n "Wat is dit?"\n ],\n "Online": [\n null,\n "Online"\n ],\n "Busy": [\n null,\n "Bezet"\n ],\n "Away": [\n null,\n "Afwezig"\n ],\n "Offline": [\n null,\n ""\n ],\n "Contact name": [\n null,\n "Contact naam"\n ],\n "Search": [\n null,\n "Zoeken"\n ],\n "e.g. user@example.com": [\n null,\n ""\n ],\n "Add": [\n null,\n "Toevoegen"\n ],\n "Click to add new chat contacts": [\n null,\n "Klik om nieuwe contacten toe te voegen"\n ],\n "Add a contact": [\n null,\n "Voeg contact toe"\n ],\n "No users found": [\n null,\n "Geen gebruikers gevonden"\n ],\n "Click to add as a chat contact": [\n null,\n "Klik om contact toe te voegen"\n ],\n "Room name": [\n null,\n "Room naam"\n ],\n "Nickname": [\n null,\n "Nickname"\n ],\n "Server": [\n null,\n "Server"\n ],\n "Show rooms": [\n null,\n "Toon rooms"\n ],\n "Rooms": [\n null,\n "Rooms"\n ],\n "No rooms on %1$s": [\n null,\n "Geen room op %1$s"\n ],\n "Rooms on %1$s": [\n null,\n "Room op %1$s"\n ],\n "Click to open this room": [\n null,\n "Klik om room te openen"\n ],\n "Show more information on this room": [\n null,\n "Toon meer informatie over deze room"\n ],\n "Description:": [\n null,\n "Beschrijving"\n ],\n "Occupants:": [\n null,\n "Deelnemers:"\n ],\n "Features:": [\n null,\n "Functies:"\n ],\n "Requires authentication": [\n null,\n "Verificatie vereist"\n ],\n "Hidden": [\n null,\n "Verborgen"\n ],\n "Requires an invitation": [\n null,\n "Veriest een uitnodiging"\n ],\n "Moderated": [\n null,\n "Gemodereerd"\n ],\n "Non-anonymous": [\n null,\n "Niet annoniem"\n ],\n "Open room": [\n null,\n "Open room"\n ],\n "Permanent room": [\n null,\n "Blijvend room"\n ],\n "Public": [\n null,\n "Publiek"\n ],\n "Semi-anonymous": [\n null,\n "Semi annoniem"\n ],\n "Temporary room": [\n null,\n "Tijdelijke room"\n ],\n "Unmoderated": [\n null,\n "Niet gemodereerd"\n ],\n "This user is a moderator": [\n null,\n "Dit is een moderator"\n ],\n "This user can send messages in this room": [\n null,\n "Deze gebruiker kan berichten sturen in deze room"\n ],\n "This user can NOT send messages in this room": [\n null,\n "Deze gebruiker kan NIET een bericht sturen in deze room"\n ],\n "Invite...": [\n null,\n ""\n ],\n "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n null,\n ""\n ],\n "You may optionally include a message, explaining the reason for the invitation.": [\n null,\n ""\n ],\n "Message": [\n null,\n "Bericht"\n ],\n "Error: could not execute the command": [\n null,\n ""\n ],\n "Error: the \\"": [\n null,\n ""\n ],\n "Change user\'s affiliation to admin": [\n null,\n ""\n ],\n "Change user role to occupant": [\n null,\n ""\n ],\n "Grant membership to a user": [\n null,\n ""\n ],\n "Remove user\'s ability to post messages": [\n null,\n ""\n ],\n "Change your nickname": [\n null,\n ""\n ],\n "Grant moderator role to user": [\n null,\n ""\n ],\n "Revoke user\'s membership": [\n null,\n ""\n ],\n "Allow muted user to post messages": [\n null,\n ""\n ],\n "Save": [\n null,\n "Opslaan"\n ],\n "Cancel": [\n null,\n "Annuleren"\n ],\n "An error occurred while trying to save the form.": [\n null,\n "Een error tijdens het opslaan van het formulier."\n ],\n "This chatroom requires a password": [\n null,\n "Chatroom heeft een wachtwoord"\n ],\n "Password: ": [\n null,\n "Wachtwoord: "\n ],\n "Submit": [\n null,\n "Indienen"\n ],\n "This room is not anonymous": [\n null,\n "Deze room is niet annoniem"\n ],\n "This room now shows unavailable members": [\n null,\n ""\n ],\n "This room does not show unavailable members": [\n null,\n ""\n ],\n "Non-privacy-related room configuration has changed": [\n null,\n ""\n ],\n "Room logging is now enabled": [\n null,\n ""\n ],\n "Room logging is now disabled": [\n null,\n ""\n ],\n "This room is now non-anonymous": [\n null,\n "Deze room is nu niet annoniem"\n ],\n "This room is now semi-anonymous": [\n null,\n "Deze room is nu semie annoniem"\n ],\n "This room is now fully-anonymous": [\n null,\n "Deze room is nu volledig annoniem"\n ],\n "A new room has been created": [\n null,\n "Een nieuwe room is gemaakt"\n ],\n "You have been banned from this room": [\n null,\n "Je bent verbannen uit deze room"\n ],\n "You have been kicked from this room": [\n null,\n "Je bent uit de room gegooid"\n ],\n "You have been removed from this room because of an affiliation change": [\n null,\n ""\n ],\n "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n null,\n ""\n ],\n "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n null,\n ""\n ],\n "<strong>%1$s</strong> has been banned": [\n null,\n "<strong>%1$s</strong> is verbannen"\n ],\n "<strong>%1$s</strong> has been kicked out": [\n null,\n "<strong>%1$s</strong> has been kicked out"\n ],\n "<strong>%1$s</strong> has been removed because of an affiliation change": [\n null,\n ""\n ],\n "<strong>%1$s</strong> has been removed for not being a member": [\n null,\n ""\n ],\n "The reason given is: \\"": [\n null,\n ""\n ],\n "You are not on the member list of this room": [\n null,\n "Je bent niet een gebruiker van deze room"\n ],\n "No nickname was specified": [\n null,\n "Geen nickname ingegeven"\n ],\n "You are not allowed to create new rooms": [\n null,\n "Je bent niet toegestaan nieuwe rooms te maken"\n ],\n "Your nickname doesn\'t conform to this room\'s policies": [\n null,\n "Je nickname is niet conform policy"\n ],\n "Your nickname is already taken": [\n null,\n "Je nickname bestaat al"\n ],\n "This room does not (yet) exist": [\n null,\n "Deze room bestaat niet"\n ],\n "This room has reached it\'s maximum number of occupants": [\n null,\n "Deze room heeft het maximale aantal gebruikers"\n ],\n "Topic set by %1$s to: %2$s": [\n null,\n ""\n ],\n "%1$s has invited you to join a chat room: %2$s": [\n null,\n ""\n ],\n "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n null,\n ""\n ],\n "Minimized": [\n null,\n ""\n ],\n "Click to remove this contact": [\n null,\n "Klik om contact te verwijderen"\n ],\n "Click to chat with this contact": [\n null,\n "Klik om te chatten met contact"\n ],\n "Name": [\n null,\n ""\n ],\n "Sorry, there was an error while trying to remove ": [\n null,\n ""\n ],\n "Sorry, there was an error while trying to add ": [\n null,\n ""\n ],\n "This client does not allow presence subscriptions": [\n null,\n ""\n ],\n "Type to filter": [\n null,\n ""\n ],\n "I am %1$s": [\n null,\n "Ik ben %1$s"\n ],\n "Click here to write a custom status message": [\n null,\n "Klik hier om custom status bericht te maken"\n ],\n "Click to change your chat status": [\n null,\n "Klik hier om status te wijzigen"\n ],\n "Custom status": [\n null,\n ""\n ],\n "online": [\n null,\n "online"\n ],\n "busy": [\n null,\n "bezet"\n ],\n "away for long": [\n null,\n "afwezig lange tijd"\n ],\n "away": [\n null,\n "afwezig"\n ],\n "Your XMPP provider\'s domain name:": [\n null,\n ""\n ],\n "Fetch registration form": [\n null,\n ""\n ],\n "Tip: A list of public XMPP providers is available": [\n null,\n ""\n ],\n "here": [\n null,\n ""\n ],\n "Register": [\n null,\n ""\n ],\n "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n null,\n ""\n ],\n "Requesting a registration form from the XMPP server": [\n null,\n ""\n ],\n "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n null,\n ""\n ],\n "Now logging you in": [\n null,\n ""\n ],\n "Registered successfully": [\n null,\n ""\n ],\n "Return": [\n null,\n ""\n ],\n "The provider rejected your registration attempt. Please check the values you entered for correctness.": [\n null,\n ""\n ],\n "Password:": [\n null,\n "Wachtwoord:"\n ],\n "Log In": [\n null,\n "Aanmelden"\n ],\n "user@server": [\n null,\n ""\n ],\n "Sign in": [\n null,\n "Aanmelden"\n ],\n "Toggle chat": [\n null,\n ""\n ]\n }\n }\n}'}),define("text!pl",[],function(){return'{\n "domain": "converse",\n "locale_data": {\n "converse": {\n "": {\n "domain": "converse",\n "plural_forms": "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);",\n "lang": "pl"\n },\n " e.g. conversejs.org": [\n null,\n "np. conversejs.org"\n ],\n "unencrypted": [\n null,\n "nieszyfrowane"\n ],\n "unverified": [\n null,\n "niezweryfikowane"\n ],\n "verified": [\n null,\n "zweryfikowane"\n ],\n "finished": [\n null,\n "zakończone"\n ],\n "This contact is busy": [\n null,\n "Kontakt jest zajęty"\n ],\n "This contact is online": [\n null,\n "Kontakt jest połączony"\n ],\n "This contact is offline": [\n null,\n "Kontakt jest niepołączony"\n ],\n "This contact is unavailable": [\n null,\n "Kontakt jest niedostępny"\n ],\n "This contact is away for an extended period": [\n null,\n "Kontakt jest nieobecny przez dłuższą chwilę"\n ],\n "This contact is away": [\n null,\n "Kontakt jest nieobecny"\n ],\n "Click to hide these contacts": [\n null,\n "Kliknij aby schować te kontakty"\n ],\n "My contacts": [\n null,\n "Moje kontakty"\n ],\n "Pending contacts": [\n null,\n "Kontakty oczekujące"\n ],\n "Contact requests": [\n null,\n "Zaproszenia do kontaktu"\n ],\n "Ungrouped": [\n null,\n "Niezgrupowane"\n ],\n "Contacts": [\n null,\n "Kontakty"\n ],\n "Groups": [\n null,\n "Grupy"\n ],\n "Attempting to reconnect in 5 seconds": [\n null,\n ""\n ],\n "Error": [\n null,\n "Błąd"\n ],\n "Connecting": [\n null,\n "Łączę się"\n ],\n "Authenticating": [\n null,\n "Autoryzacja"\n ],\n "Authentication Failed": [\n null,\n "Autoryzacja nie powiodła się"\n ],\n "Re-establishing encrypted session": [\n null,\n "Przywrócenie sesji szyfrowanej"\n ],\n "Generating private key.": [\n null,\n "Generuję klucz prywatny."\n ],\n "Your browser might become unresponsive.": [\n null,\n "Twoja przeglądarka może nieco zwolnić."\n ],\n "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n null,\n "Prośba o autoryzację od %1$s\\n\\nKontakt próbuje zweryfikować twoją tożsamość, zadając ci pytanie poniżej.\\n\\n%2$s"\n ],\n "Could not verify this user\'s identify.": [\n null,\n "Nie jestem w stanie zweryfikować tożsamości kontaktu."\n ],\n "Exchanging private key with contact.": [\n null,\n "Wymieniam klucze szyfrujące z kontaktem."\n ],\n "Minimize this chat box": [\n null,\n ""\n ],\n "Personal message": [\n null,\n "Wiadomość osobista"\n ],\n "Are you sure you want to clear the messages from this room?": [\n null,\n "Potwierdź czy rzeczywiście chcesz wyczyścić wiadomości z tego pokoju?"\n ],\n "me": [\n null,\n "ja"\n ],\n "is typing": [\n null,\n "pisze"\n ],\n "has stopped typing": [\n null,\n "przestał pisać"\n ],\n "has gone away": [\n null,\n "uciekł"\n ],\n "Show this menu": [\n null,\n "Pokaż menu"\n ],\n "Write in the third person": [\n null,\n "Pisz w trzeciej osobie"\n ],\n "Remove messages": [\n null,\n "Usuń wiadomość"\n ],\n "Are you sure you want to clear the messages from this chat box?": [\n null,\n "Potwierdź czy rzeczywiście chcesz wyczyścić wiadomości z okienka rozmowy?"\n ],\n "Your message could not be sent": [\n null,\n "Twoja wiadomość nie została wysłana"\n ],\n "We received an unencrypted message": [\n null,\n "Otrzymaliśmy niezaszyfrowaną wiadomość"\n ],\n "We received an unreadable encrypted message": [\n null,\n "Otrzymaliśmy nieczytelną zaszyfrowaną wiadomość"\n ],\n "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n null,\n "Oto odciski palców, potwiedź je proszę z %1$s używając innego sposobuwymiany informacji niż ta rozmowa.\\n\\nOdcisk palca dla ciebie, %2$s: %3$s\\n\\nOdcisk palca dla %1$s: %4$s\\n\\nJeśli odciski palców zostały potwierdzone, kliknij OK, w inny wypadku kliknij Anuluj."\n ],\n "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n null,\n "Poprosimy cię o podanie pytania sprawdzającego i odpowiedzi na nie.\\n\\nTwój kontakt zostanie poproszony później o odpowiedź na to samo pytanie i jeśli udzieli tej samej odpowiedzi (ważna jest wielkość liter), tożsamość zostanie zwerfikowana."\n ],\n "What is your security question?": [\n null,\n "Jakie jest pytanie bezpieczeństwa?"\n ],\n "What is the answer to the security question?": [\n null,\n "Jaka jest odpowiedź na pytanie bezpieczeństwa?"\n ],\n "Invalid authentication scheme provided": [\n null,\n "Niewłaściwy schemat autoryzacji"\n ],\n "has gone offline": [\n null,\n "wyłączył się"\n ],\n "is busy": [\n null,\n "zajęty"\n ],\n "Your messages are not encrypted anymore": [\n null,\n "Twoje wiadomości nie są już szyfrowane"\n ],\n "Your messages are now encrypted but your contact\'s identity has not been verified.": [\n null,\n "Wiadomości są teraz szyfrowane, ale tożsamość kontaktu nie została zweryfikowana."\n ],\n "Your contact\'s identify has been verified.": [\n null,\n "Tożsamość kontaktu została zweryfikowana"\n ],\n "Your contact has ended encryption on their end, you should do the same.": [\n null,\n "Kontakt zakończył sesję szyfrowaną, powinieneś zrobić to samo."\n ],\n "Your messages are not encrypted. Click here to enable OTR encryption.": [\n null,\n "Twoje wiadomości nie są szyfrowane. Kliknij, aby uruchomić szyfrowanie OTR"\n ],\n "Your messages are encrypted, but your contact has not been verified.": [\n null,\n "Wiadomości są szyfrowane, ale tożsamość kontaktu nie została zweryfikowana."\n ],\n "Your messages are encrypted and your contact verified.": [\n null,\n "Wiadomości są szyfrowane i tożsamość kontaktu została zweryfikowana."\n ],\n "Your contact has closed their end of the private session, you should do the same": [\n null,\n "Kontakt zakończył prywatną rozmowę i ty zrób to samo"\n ],\n "Clear all messages": [\n null,\n "Wyczyść wszystkie wiadomości"\n ],\n "End encrypted conversation": [\n null,\n "Zakończ szyfrowaną rozmowę"\n ],\n "Insert a smiley": [\n null,\n "Wstaw uśmieszek"\n ],\n "Refresh encrypted conversation": [\n null,\n "Odśwież szyfrowaną rozmowę"\n ],\n "Start a call": [\n null,\n "Zadzwoń"\n ],\n "Start encrypted conversation": [\n null,\n "Rozpocznij szyfrowaną rozmowę"\n ],\n "Verify with fingerprints": [\n null,\n "Zweryfikuj za pomocą odcisków palców"\n ],\n "Verify with SMP": [\n null,\n "Zweryfikuj za pomocą SMP"\n ],\n "What\'s this?": [\n null,\n "Co to jest?"\n ],\n "Online": [\n null,\n "Dostępny"\n ],\n "Busy": [\n null,\n "Zajęty"\n ],\n "Away": [\n null,\n "Nieobecny"\n ],\n "Offline": [\n null,\n "Rozłączony"\n ],\n "Log out": [\n null,\n "Wyloguj"\n ],\n "Contact name": [\n null,\n "Nazwa kontaktu"\n ],\n "Search": [\n null,\n "Szukaj"\n ],\n "e.g. user@example.com": [\n null,\n "np. user@example.com"\n ],\n "Add": [\n null,\n "Dodaj"\n ],\n "Click to add new chat contacts": [\n null,\n "Kliknij aby dodać nowe kontakty"\n ],\n "Add a contact": [\n null,\n "Dodaj kontakt"\n ],\n "No users found": [\n null,\n "Nie znaleziono użytkowników"\n ],\n "Click to add as a chat contact": [\n null,\n "Kliknij aby dodać jako kontakt"\n ],\n "Room name": [\n null,\n "Nazwa pokoju"\n ],\n "Nickname": [\n null,\n "Ksywka"\n ],\n "Server": [\n null,\n "Serwer"\n ],\n "Join Room": [\n null,\n "Wejdź do pokoju"\n ],\n "Show rooms": [\n null,\n "Pokaż pokoje"\n ],\n "Rooms": [\n null,\n "Pokoje"\n ],\n "No rooms on %1$s": [\n null,\n "Brak jest pokojów na %1$s"\n ],\n "Rooms on %1$s": [\n null,\n "Pokoje na %1$s"\n ],\n "Click to open this room": [\n null,\n "Kliknij aby wejść do pokoju"\n ],\n "Show more information on this room": [\n null,\n "Pokaż więcej informacji o pokoju"\n ],\n "Description:": [\n null,\n "Opis:"\n ],\n "Occupants:": [\n null,\n "Uczestnicy:"\n ],\n "Features:": [\n null,\n "Możliwości:"\n ],\n "Requires authentication": [\n null,\n "Wymaga autoryzacji"\n ],\n "Hidden": [\n null,\n "Ukryty"\n ],\n "Requires an invitation": [\n null,\n "Wymaga zaproszenia"\n ],\n "Moderated": [\n null,\n "Moderowany"\n ],\n "Non-anonymous": [\n null,\n "Nieanonimowy"\n ],\n "Open room": [\n null,\n "Otwarty pokój"\n ],\n "Permanent room": [\n null,\n "Stały pokój"\n ],\n "Public": [\n null,\n "Publiczny"\n ],\n "Semi-anonymous": [\n null,\n "Półanonimowy"\n ],\n "Temporary room": [\n null,\n "Pokój tymczasowy"\n ],\n "Unmoderated": [\n null,\n "Niemoderowany"\n ],\n "This user is a moderator": [\n null,\n "Ten człowiek jest moderatorem"\n ],\n "This user can send messages in this room": [\n null,\n "Ten człowiek może rozmawiać w niejszym pokoju"\n ],\n "This user can NOT send messages in this room": [\n null,\n "Ten człowiek nie może rozmawiać w niniejszym pokoju"\n ],\n "Invite...": [\n null,\n "Zaproś..."\n ],\n "Occupants": [\n null,\n "Uczestników"\n ],\n "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n null,\n "Zamierzasz zaprosić %1$s do pokoju rozmów \\"%2$s\\". "\n ],\n "You may optionally include a message, explaining the reason for the invitation.": [\n null,\n "Masz opcjonalną możliwość dołączenia wiadomości, która wyjaśni przyczynę zaproszenia."\n ],\n "Message": [\n null,\n "Wiadomość:"\n ],\n "Error: could not execute the command": [\n null,\n "Błąd: nie potrafię uruchomić polecenia"\n ],\n "Error: the \\"": [\n null,\n "Błąd: \\""\n ],\n "Change user\'s affiliation to admin": [\n null,\n "Przyznaj prawa administratora"\n ],\n "Ban user from room": [\n null,\n "Zablokuj dostępu do pokoju"\n ],\n "Kick user from room": [\n null,\n "Wykop z pokoju"\n ],\n "Write in 3rd person": [\n null,\n "Pisz w trzeciej osobie"\n ],\n "Grant membership to a user": [\n null,\n "Przyznaj członkowstwo "\n ],\n "Remove user\'s ability to post messages": [\n null,\n "Zablokuj człowiekowi możliwość rozmowy"\n ],\n "Change your nickname": [\n null,\n "Zmień ksywkę"\n ],\n "Grant moderator role to user": [\n null,\n "Przyznaj prawa moderatora"\n ],\n "Grant ownership of this room": [\n null,\n "Uczyń właścicielem pokoju"\n ],\n "Revoke user\'s membership": [\n null,\n "Usuń z listy członków"\n ],\n "Set room topic": [\n null,\n "Ustaw temat pokoju"\n ],\n "Allow muted user to post messages": [\n null,\n "Pozwól uciszonemu człowiekowi na rozmowę"\n ],\n "Save": [\n null,\n "Zachowaj"\n ],\n "Cancel": [\n null,\n "Anuluj"\n ],\n "An error occurred while trying to save the form.": [\n null,\n "Wystąpił błąd w czasie próby zachowania formularza."\n ],\n "This chatroom requires a password": [\n null,\n "Pokój rozmów wymaga podania hasła"\n ],\n "Password: ": [\n null,\n "Hasło:"\n ],\n "Submit": [\n null,\n "Wyślij"\n ],\n "This room is not anonymous": [\n null,\n "Pokój nie jest anonimowy"\n ],\n "This room now shows unavailable members": [\n null,\n "Pokój pokazuje niedostępnych rozmówców"\n ],\n "This room does not show unavailable members": [\n null,\n "Ten pokój nie wyświetla niedostępnych członków"\n ],\n "Non-privacy-related room configuration has changed": [\n null,\n "Ustawienia pokoju nie związane z prywatnością zostały zmienione"\n ],\n "Room logging is now enabled": [\n null,\n "Zostało włączone zapisywanie rozmów w pokoju"\n ],\n "Room logging is now disabled": [\n null,\n "Zostało wyłączone zapisywanie rozmów w pokoju"\n ],\n "This room is now non-anonymous": [\n null,\n "Pokój stał się nieanonimowy"\n ],\n "This room is now semi-anonymous": [\n null,\n "Pokój stał się półanonimowy"\n ],\n "This room is now fully-anonymous": [\n null,\n "Pokój jest teraz w pełni anonimowy"\n ],\n "A new room has been created": [\n null,\n "Został utworzony nowy pokój"\n ],\n "You have been banned from this room": [\n null,\n "Jesteś niemile widziany w tym pokoju"\n ],\n "You have been kicked from this room": [\n null,\n "Zostałeś wykopany z pokoju"\n ],\n "You have been removed from this room because of an affiliation change": [\n null,\n "Zostałeś usunięty z pokoju ze względu na zmianę przynależności"\n ],\n "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n null,\n "Zostałeś usunięty z pokoju ze względu na to, że pokój zmienił się na wymagający członkowstwa, a ty nie jesteś członkiem"\n ],\n "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n null,\n "Zostałeś usunięty z pokoju ze względu na to, że serwis MUC(Multi-user chat) został wyłączony."\n ],\n "<strong>%1$s</strong> has been banned": [\n null,\n "<strong>%1$s</strong> został zbanowany"\n ],\n "<strong>%1$s</strong>\'s nickname has changed": [\n null,\n "<strong>%1$s</strong> zmienił ksywkę"\n ],\n "<strong>%1$s</strong> has been kicked out": [\n null,\n "<strong>%1$s</strong> został wykopany"\n ],\n "<strong>%1$s</strong> has been removed because of an affiliation change": [\n null,\n "<strong>%1$s</strong> został usunięty z powodu zmiany przynależności"\n ],\n "<strong>%1$s</strong> has been removed for not being a member": [\n null,\n "<strong>%1$s</strong> został usunięty ze względu na to, że nie jest członkiem"\n ],\n "Your nickname has been automatically changed to: <strong>%1$s</strong>": [\n null,\n "Twoja ksywka została automatycznie zmieniona na: <strong>%1$s</strong>"\n ],\n "Your nickname has been changed to: <strong>%1$s</strong>": [\n null,\n "Twoja ksywka została zmieniona na: <strong>%1$s</strong>"\n ],\n "The reason given is: \\"": [\n null,\n "Podana przyczyna to: \\""\n ],\n "You are not on the member list of this room": [\n null,\n "Nie jesteś członkiem tego pokoju rozmów"\n ],\n "No nickname was specified": [\n null,\n "Nie podałeś ksywki"\n ],\n "You are not allowed to create new rooms": [\n null,\n "Nie masz uprawnień do tworzenia nowych pokojów rozmów"\n ],\n "Your nickname doesn\'t conform to this room\'s policies": [\n null,\n "Twoja ksywka nie jest zgodna z regulaminem pokoju"\n ],\n "Your nickname is already taken": [\n null,\n "Twoja ksywka jest już w użyciu"\n ],\n "This room does not (yet) exist": [\n null,\n "Ten pokój (jeszcze) nie istnieje"\n ],\n "This room has reached it\'s maximum number of occupants": [\n null,\n "Pokój przekroczył dozwoloną ilość rozmówców"\n ],\n "Topic set by %1$s to: %2$s": [\n null,\n "Temat ustawiony przez %1$s na: %2$s"\n ],\n "%1$s has invited you to join a chat room: %2$s": [\n null,\n "%1$s zaprosił(a) cię do wejścia do pokoju rozmów %2$s"\n ],\n "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n null,\n "%1$s zaprosił cię do pokoju: %2$s, podając następujący powód: \\"%3$s\\""\n ],\n "Click to restore this chat": [\n null,\n "Kliknij aby powrócić do rozmowy"\n ],\n "Minimized": [\n null,\n "Zminimalizowany"\n ],\n "Click to remove this contact": [\n null,\n "Kliknij aby usunąć kontakt"\n ],\n "Click to accept this contact request": [\n null,\n "Klknij aby zaakceptować życzenie nawiązania kontaktu"\n ],\n "Click to decline this contact request": [\n null,\n "Kliknij aby odrzucić życzenie nawiązania kontaktu"\n ],\n "Click to chat with this contact": [\n null,\n "Kliknij aby porozmawiać z kontaktem"\n ],\n "Name": [\n null,\n "Nazwa"\n ],\n "Are you sure you want to remove this contact?": [\n null,\n "Czy potwierdzasz zamiar usnunięcia tego kontaktu?"\n ],\n "Sorry, there was an error while trying to remove ": [\n null,\n "Wystąpił błąd w trakcie próby usunięcia "\n ],\n "Are you sure you want to decline this contact request?": [\n null,\n "Czy potwierdzasz odrzucenie chęci nawiązania kontaktu?"\n ],\n "Sorry, there was an error while trying to add ": [\n null,\n "Wystąpił błąd w czasie próby dodania "\n ],\n "This client does not allow presence subscriptions": [\n null,\n "Klient nie umożliwia subskrybcji obecności"\n ],\n "Type to filter": [\n null,\n "Zacznij pisać, aby odfiltrować"\n ],\n "I am %1$s": [\n null,\n "Jestem %1$s"\n ],\n "Click here to write a custom status message": [\n null,\n "Kliknij aby wpisać nowy status"\n ],\n "Click to change your chat status": [\n null,\n "Kliknij aby zmienić status rozmowy"\n ],\n "Custom status": [\n null,\n "Własny status"\n ],\n "online": [\n null,\n "dostępny"\n ],\n "busy": [\n null,\n "zajęty"\n ],\n "away for long": [\n null,\n "dłużej nieobecny"\n ],\n "away": [\n null,\n "nieobecny"\n ],\n "offline": [\n null,\n "rozłączony"\n ],\n "Your XMPP provider\'s domain name:": [\n null,\n "Domena twojego dostawcy XMPP:"\n ],\n "Fetch registration form": [\n null,\n "Pobierz formularz rejestracyjny"\n ],\n "Tip: A list of public XMPP providers is available": [\n null,\n "Wskazówka: dostępna jest lista publicznych dostawców XMPP"\n ],\n "here": [\n null,\n "tutaj"\n ],\n "Register": [\n null,\n "Zarejestruj"\n ],\n "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n null,\n "Przepraszamy, ale podany dostawca nie obsługuje rejestracji. Spróbuj wskazać innego dostawcę."\n ],\n "Requesting a registration form from the XMPP server": [\n null,\n "Pobieranie formularza rejestracyjnego z serwera XMPP"\n ],\n "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n null,\n "Coś nie zadziałało przy próbie połączenia z \\"%1$s\\". Jesteś pewien że istnieje?"\n ],\n "Now logging you in": [\n null,\n "Teraz jesteś logowany"\n ],\n "Registered successfully": [\n null,\n "Szczęśliwie zarejestrowany"\n ],\n "Return": [\n null,\n "Powrót"\n ],\n "The provider rejected your registration attempt. Please check the values you entered for correctness.": [\n null,\n "Dostawca odrzucił twoją próbę rejestracji. Sprawdź proszę poprawność danych które zostały wprowadzone."\n ],\n "XMPP Username:": [\n null,\n "Nazwa użytkownika XMPP:"\n ],\n "Password:": [\n null,\n "Hasło:"\n ],\n "Click here to log in anonymously": [\n null,\n "Kliknij tutaj aby zalogować się anonimowo"\n ],\n "Log In": [\n null,\n "Zaloguj się"\n ],\n "user@server": [\n null,\n "user@server"\n ],\n "password": [\n null,\n "hasło"\n ],\n "Sign in": [\n null,\n "Zarejestruj się"\n ],\n "Toggle chat": [\n null,\n "Przełącz rozmowę"\n ]\n }\n }\n}'}),define("text!pt_BR",[],function(){return'{\n "domain": "converse",\n "locale_data": {\n "converse": {\n "": {\n "domain": "converse",\n "plural_forms": "nplurals=2; plural=(n > 1);",\n "lang": "pt_BR"\n },\n " e.g. conversejs.org": [\n null,\n ""\n ],\n "unencrypted": [\n null,\n "não-criptografado"\n ],\n "unverified": [\n null,\n "não-verificado"\n ],\n "verified": [\n null,\n "verificado"\n ],\n "finished": [\n null,\n "finalizado"\n ],\n "This contact is busy": [\n null,\n "Este contato está ocupado"\n ],\n "This contact is online": [\n null,\n "Este contato está online"\n ],\n "This contact is offline": [\n null,\n "Este contato está offline"\n ],\n "This contact is unavailable": [\n null,\n "Este contato está indisponível"\n ],\n "This contact is away for an extended period": [\n null,\n "Este contato está ausente por um longo período"\n ],\n "This contact is away": [\n null,\n "Este contato está ausente"\n ],\n "My contacts": [\n null,\n "Meus contatos"\n ],\n "Pending contacts": [\n null,\n "Contados pendentes"\n ],\n "Contact requests": [\n null,\n "Solicitação de contatos"\n ],\n "Ungrouped": [\n null,\n ""\n ],\n "Contacts": [\n null,\n "Contatos"\n ],\n "Groups": [\n null,\n ""\n ],\n "Attempting to reconnect in 5 seconds": [\n null,\n ""\n ],\n "Error": [\n null,\n "Erro"\n ],\n "Connecting": [\n null,\n "Conectando"\n ],\n "Authenticating": [\n null,\n "Autenticando"\n ],\n "Authentication Failed": [\n null,\n "Falha de autenticação"\n ],\n "Re-establishing encrypted session": [\n null,\n "Reestabelecendo sessão criptografada"\n ],\n "Generating private key.": [\n null,\n "Gerando chave-privada."\n ],\n "Your browser might become unresponsive.": [\n null,\n "Seu navegador pode parar de responder."\n ],\n "Could not verify this user\'s identify.": [\n null,\n "Não foi possível verificar a identidade deste usuário."\n ],\n "Minimize this chat box": [\n null,\n ""\n ],\n "Personal message": [\n null,\n "Mensagem pessoal"\n ],\n "me": [\n null,\n "eu"\n ],\n "Show this menu": [\n null,\n "Mostrar o menu"\n ],\n "Write in the third person": [\n null,\n "Escrever em terceira pessoa"\n ],\n "Remove messages": [\n null,\n "Remover mensagens"\n ],\n "Are you sure you want to clear the messages from this chat box?": [\n null,\n "Tem certeza que deseja limpar as mensagens dessa caixa?"\n ],\n "Your message could not be sent": [\n null,\n "Sua mensagem não pode ser enviada"\n ],\n "We received an unencrypted message": [\n null,\n "Recebemos uma mensagem não-criptografada"\n ],\n "We received an unreadable encrypted message": [\n null,\n "Recebemos uma mensagem não-criptografada ilegível"\n ],\n "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n null,\n "Aqui estão as assinaturas digitais, por favor confirme elas com %1$s, fora deste chat.\\n\\nAssinatura para você, %2$s: %3$s\\n\\nAssinatura para %1$s: %4$s\\n\\nSe você tiver confirmado que as assinaturas conferem, clique OK, caso contrário, clique Cancelar."\n ],\n "What is your security question?": [\n null,\n "Qual é a sua pergunta de segurança?"\n ],\n "What is the answer to the security question?": [\n null,\n "Qual é a resposta para a pergunta de segurança?"\n ],\n "Invalid authentication scheme provided": [\n null,\n "Schema de autenticação fornecido é inválido"\n ],\n "Your messages are not encrypted anymore": [\n null,\n "Suas mensagens não estão mais criptografadas"\n ],\n "Your messages are not encrypted. Click here to enable OTR encryption.": [\n null,\n "Suas mensagens não estão criptografadas. Clique aqui para habilitar criptografia OTR."\n ],\n "End encrypted conversation": [\n null,\n "Finalizar conversa criptografada"\n ],\n "Insert a smiley": [\n null,\n ""\n ],\n "Hide the list of occupants": [\n null,\n ""\n ],\n "Refresh encrypted conversation": [\n null,\n "Atualizar conversa criptografada"\n ],\n "Start a call": [\n null,\n ""\n ],\n "Start encrypted conversation": [\n null,\n "Iniciar conversa criptografada"\n ],\n "Verify with fingerprints": [\n null,\n "Verificar com assinatura digital"\n ],\n "Verify with SMP": [\n null,\n "Verificar com SMP"\n ],\n "What\'s this?": [\n null,\n "O que é isso?"\n ],\n "Online": [\n null,\n "Online"\n ],\n "Busy": [\n null,\n "Ocupado"\n ],\n "Away": [\n null,\n "Ausente"\n ],\n "Offline": [\n null,\n "Offline"\n ],\n "Contact name": [\n null,\n "Nome do contato"\n ],\n "Search": [\n null,\n "Procurar"\n ],\n "e.g. user@example.com": [\n null,\n ""\n ],\n "Add": [\n null,\n "Adicionar"\n ],\n "Click to add new chat contacts": [\n null,\n "Clique para adicionar novos contatos ao chat"\n ],\n "Add a contact": [\n null,\n "Adicionar contato"\n ],\n "No users found": [\n null,\n "Não foram encontrados usuários"\n ],\n "Click to add as a chat contact": [\n null,\n "Clique para adicionar como um contato do chat"\n ],\n "Room name": [\n null,\n "Nome da sala"\n ],\n "Nickname": [\n null,\n "Apelido"\n ],\n "Server": [\n null,\n "Server"\n ],\n "Show rooms": [\n null,\n "Mostar salas"\n ],\n "Rooms": [\n null,\n "Salas"\n ],\n "No rooms on %1$s": [\n null,\n "Sem salas em %1$s"\n ],\n "Rooms on %1$s": [\n null,\n "Salas em %1$s"\n ],\n "Click to open this room": [\n null,\n "CLique para abrir a sala"\n ],\n "Show more information on this room": [\n null,\n "Mostrar mais informações nessa sala"\n ],\n "Description:": [\n null,\n "Descrição:"\n ],\n "Occupants:": [\n null,\n "Ocupantes:"\n ],\n "Features:": [\n null,\n "Recursos:"\n ],\n "Requires authentication": [\n null,\n "Requer autenticação"\n ],\n "Hidden": [\n null,\n "Escondido"\n ],\n "Requires an invitation": [\n null,\n "Requer um convite"\n ],\n "Moderated": [\n null,\n "Moderado"\n ],\n "Non-anonymous": [\n null,\n "Não anônimo"\n ],\n "Open room": [\n null,\n "Sala aberta"\n ],\n "Permanent room": [\n null,\n "Sala permanente"\n ],\n "Public": [\n null,\n "Público"\n ],\n "Semi-anonymous": [\n null,\n "Semi anônimo"\n ],\n "Temporary room": [\n null,\n "Sala temporária"\n ],\n "Unmoderated": [\n null,\n "Sem moderação"\n ],\n "This user is a moderator": [\n null,\n "Esse usuário é o moderador"\n ],\n "This user can send messages in this room": [\n null,\n "Esse usuário pode enviar mensagens nessa sala"\n ],\n "This user can NOT send messages in this room": [\n null,\n "Esse usuário NÃO pode enviar mensagens nessa sala"\n ],\n "Invite...": [\n null,\n ""\n ],\n "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n null,\n ""\n ],\n "You may optionally include a message, explaining the reason for the invitation.": [\n null,\n ""\n ],\n "Message": [\n null,\n "Mensagem"\n ],\n "Error: could not execute the command": [\n null,\n ""\n ],\n "Error: the \\"": [\n null,\n ""\n ],\n "Change user\'s affiliation to admin": [\n null,\n ""\n ],\n "Change user role to occupant": [\n null,\n ""\n ],\n "Grant membership to a user": [\n null,\n ""\n ],\n "Remove user\'s ability to post messages": [\n null,\n ""\n ],\n "Change your nickname": [\n null,\n ""\n ],\n "Grant moderator role to user": [\n null,\n ""\n ],\n "Revoke user\'s membership": [\n null,\n ""\n ],\n "Allow muted user to post messages": [\n null,\n ""\n ],\n "Save": [\n null,\n "Salvar"\n ],\n "Cancel": [\n null,\n "Cancelar"\n ],\n "An error occurred while trying to save the form.": [\n null,\n "Ocorreu um erro enquanto tentava salvar o formulário"\n ],\n "This chatroom requires a password": [\n null,\n "Esse chat precisa de senha"\n ],\n "Password: ": [\n null,\n "Senha: "\n ],\n "Submit": [\n null,\n "Enviar"\n ],\n "This room is not anonymous": [\n null,\n "Essa sala não é anônima"\n ],\n "This room now shows unavailable members": [\n null,\n "Agora esta sala mostra membros indisponíveis"\n ],\n "This room does not show unavailable members": [\n null,\n "Essa sala não mostra membros indisponíveis"\n ],\n "Non-privacy-related room configuration has changed": [\n null,\n "Configuraçõs não relacionadas à privacidade mudaram"\n ],\n "Room logging is now enabled": [\n null,\n "O log da sala está ativado"\n ],\n "Room logging is now disabled": [\n null,\n "O log da sala está desativado"\n ],\n "This room is now non-anonymous": [\n null,\n "Esse sala é não anônima"\n ],\n "This room is now semi-anonymous": [\n null,\n "Essa sala agora é semi anônima"\n ],\n "This room is now fully-anonymous": [\n null,\n "Essa sala agora é totalmente anônima"\n ],\n "A new room has been created": [\n null,\n "Uma nova sala foi criada"\n ],\n "You have been banned from this room": [\n null,\n "Você foi banido dessa sala"\n ],\n "You have been kicked from this room": [\n null,\n "Você foi expulso dessa sala"\n ],\n "You have been removed from this room because of an affiliation change": [\n null,\n "Você foi removido da sala devido a uma mudança de associação"\n ],\n "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n null,\n "Você foi removido da sala porque ela foi mudada para somente membrose você não é um membro"\n ],\n "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n null,\n "Você foi removido da sala devido a MUC (Multi-user chat)o serviço está sendo desligado"\n ],\n "<strong>%1$s</strong> has been banned": [\n null,\n "<strong>%1$s</strong> foi banido"\n ],\n "<strong>%1$s</strong> has been kicked out": [\n null,\n "<strong>%1$s</strong> foi expulso"\n ],\n "<strong>%1$s</strong> has been removed because of an affiliation change": [\n null,\n "<srtong>%1$s</strong> foi removido por causa de troca de associação"\n ],\n "<strong>%1$s</strong> has been removed for not being a member": [\n null,\n "<strong>%1$s</strong> foi removido por não ser um membro"\n ],\n "The reason given is: \\"": [\n null,\n ""\n ],\n "You are not on the member list of this room": [\n null,\n "Você não é membro dessa sala"\n ],\n "No nickname was specified": [\n null,\n "Você não escolheu um apelido "\n ],\n "You are not allowed to create new rooms": [\n null,\n "Você não tem permitição de criar novas salas"\n ],\n "Your nickname doesn\'t conform to this room\'s policies": [\n null,\n "Seu apelido não está de acordo com as regras da sala"\n ],\n "Your nickname is already taken": [\n null,\n "Seu apelido já foi escolhido"\n ],\n "This room does not (yet) exist": [\n null,\n "A sala não existe (ainda)"\n ],\n "This room has reached it\'s maximum number of occupants": [\n null,\n "A sala atingiu o número máximo de ocupantes"\n ],\n "Topic set by %1$s to: %2$s": [\n null,\n "Topico definido por %1$s para: %2$s"\n ],\n "%1$s has invited you to join a chat room: %2$s": [\n null,\n ""\n ],\n "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n null,\n ""\n ],\n "Minimized": [\n null,\n "Minimizado"\n ],\n "Click to remove this contact": [\n null,\n "Clique para remover o contato"\n ],\n "Click to chat with this contact": [\n null,\n "Clique para conversar com o contato"\n ],\n "Name": [\n null,\n ""\n ],\n "Sorry, there was an error while trying to remove ": [\n null,\n ""\n ],\n "Sorry, there was an error while trying to add ": [\n null,\n ""\n ],\n "This client does not allow presence subscriptions": [\n null,\n ""\n ],\n "Type to filter": [\n null,\n ""\n ],\n "I am %1$s": [\n null,\n "Estou %1$s"\n ],\n "Click here to write a custom status message": [\n null,\n "Clique aqui para customizar a mensagem de status"\n ],\n "Click to change your chat status": [\n null,\n "Clique para mudar seu status no chat"\n ],\n "Custom status": [\n null,\n "Status customizado"\n ],\n "online": [\n null,\n "online"\n ],\n "busy": [\n null,\n "ocupado"\n ],\n "away for long": [\n null,\n "ausente a bastante tempo"\n ],\n "away": [\n null,\n "ausente"\n ],\n "Your XMPP provider\'s domain name:": [\n null,\n ""\n ],\n "Fetch registration form": [\n null,\n ""\n ],\n "Tip: A list of public XMPP providers is available": [\n null,\n ""\n ],\n "here": [\n null,\n ""\n ],\n "Register": [\n null,\n ""\n ],\n "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n null,\n ""\n ],\n "Requesting a registration form from the XMPP server": [\n null,\n ""\n ],\n "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n null,\n ""\n ],\n "Now logging you in": [\n null,\n ""\n ],\n "Registered successfully": [\n null,\n ""\n ],\n "Return": [\n null,\n ""\n ],\n "The provider rejected your registration attempt. Please check the values you entered for correctness.": [\n null,\n ""\n ],\n "Password:": [\n null,\n "Senha:"\n ],\n "Log In": [\n null,\n "Entrar"\n ],\n "user@server": [\n null,\n ""\n ],\n "Sign in": [\n null,\n "Conectar-se"\n ],\n "Toggle chat": [\n null,\n "Alternar bate-papo"\n ]\n }\n }\n}'}),define("text!ru",[],function(){return'{\n "domain": "converse",\n "locale_data": {\n "converse": {\n "": {\n "domain": "converse",\n "lang": "ru"\n },\n " e.g. conversejs.org": [\n null,\n ""\n ],\n "unencrypted": [\n null,\n "не зашифровано"\n ],\n "unverified": [\n null,\n "непроверено"\n ],\n "verified": [\n null,\n "проверено"\n ],\n "finished": [\n null,\n "закончено"\n ],\n "This contact is busy": [\n null,\n "Занят"\n ],\n "This contact is online": [\n null,\n "В сети"\n ],\n "This contact is offline": [\n null,\n "Не в сети"\n ],\n "This contact is unavailable": [\n null,\n "Не доступен"\n ],\n "This contact is away for an extended period": [\n null,\n "На долго отошёл"\n ],\n "This contact is away": [\n null,\n "Отошёл"\n ],\n "My contacts": [\n null,\n "Контакты"\n ],\n "Pending contacts": [\n null,\n "Собеседники ожидающие авторизации"\n ],\n "Contact requests": [\n null,\n "Запросы на авторизацию"\n ],\n "Ungrouped": [\n null,\n ""\n ],\n "Contacts": [\n null,\n "Контакты"\n ],\n "Groups": [\n null,\n ""\n ],\n "Attempting to reconnect in 5 seconds": [\n null,\n ""\n ],\n "Error": [\n null,\n "Ошибка"\n ],\n "Connecting": [\n null,\n "Соединение"\n ],\n "Authenticating": [\n null,\n "Авторизация"\n ],\n "Authentication Failed": [\n null,\n "Не удалось авторизоваться"\n ],\n "Re-establishing encrypted session": [\n null,\n ""\n ],\n "Generating private key.": [\n null,\n ""\n ],\n "Your browser might become unresponsive.": [\n null,\n ""\n ],\n "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n null,\n ""\n ],\n "Could not verify this user\'s identify.": [\n null,\n ""\n ],\n "Exchanging private key with contact.": [\n null,\n ""\n ],\n "Minimize this chat box": [\n null,\n ""\n ],\n "Personal message": [\n null,\n "Введите сообщение"\n ],\n "me": [\n null,\n "Я"\n ],\n "is typing": [\n null,\n ""\n ],\n "has stopped typing": [\n null,\n ""\n ],\n "Show this menu": [\n null,\n "Показать это меню"\n ],\n "Write in the third person": [\n null,\n ""\n ],\n "Remove messages": [\n null,\n "Удалить сообщения"\n ],\n "Are you sure you want to clear the messages from this chat box?": [\n null,\n ""\n ],\n "Your message could not be sent": [\n null,\n "Ваше сообщение не послано"\n ],\n "We received an unencrypted message": [\n null,\n ""\n ],\n "We received an unreadable encrypted message": [\n null,\n ""\n ],\n "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n null,\n ""\n ],\n "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n null,\n ""\n ],\n "What is your security question?": [\n null,\n ""\n ],\n "What is the answer to the security question?": [\n null,\n ""\n ],\n "Invalid authentication scheme provided": [\n null,\n ""\n ],\n "Your messages are not encrypted anymore": [\n null,\n "Ваши сообщения больше не шифруются"\n ],\n "Your contact has ended encryption on their end, you should do the same.": [\n null,\n ""\n ],\n "Your messages are not encrypted. Click here to enable OTR encryption.": [\n null,\n "Ваши сообщения не шифруются. Нажмите здесь чтобы настроить шифрование."\n ],\n "Your contact has closed their end of the private session, you should do the same": [\n null,\n ""\n ],\n "End encrypted conversation": [\n null,\n ""\n ],\n "Insert a smiley": [\n null,\n ""\n ],\n "Hide the list of occupants": [\n null,\n ""\n ],\n "Refresh encrypted conversation": [\n null,\n ""\n ],\n "Start a call": [\n null,\n ""\n ],\n "Start encrypted conversation": [\n null,\n ""\n ],\n "Verify with fingerprints": [\n null,\n ""\n ],\n "Verify with SMP": [\n null,\n ""\n ],\n "What\'s this?": [\n null,\n "Что это?"\n ],\n "Online": [\n null,\n "В сети"\n ],\n "Busy": [\n null,\n "Занят"\n ],\n "Away": [\n null,\n "Отошёл"\n ],\n "Offline": [\n null,\n "Не в сети"\n ],\n "Contact name": [\n null,\n "Имя контакта"\n ],\n "Search": [\n null,\n "Поиск"\n ],\n "e.g. user@example.com": [\n null,\n ""\n ],\n "Add": [\n null,\n "Добавить"\n ],\n "Click to add new chat contacts": [\n null,\n "Добавить новую конференцию"\n ],\n "Add a contact": [\n null,\n "Добавть контакт"\n ],\n "No users found": [\n null,\n "Пользователи не найдены"\n ],\n "Click to add as a chat contact": [\n null,\n "Добавить контакт"\n ],\n "Room name": [\n null,\n "Имя конференции"\n ],\n "Nickname": [\n null,\n "Псевдоним"\n ],\n "Server": [\n null,\n "Сервер"\n ],\n "Show rooms": [\n null,\n "Обновить"\n ],\n "Rooms": [\n null,\n "Конфер."\n ],\n "No rooms on %1$s": [\n null,\n "Нет доступных конференций %1$s"\n ],\n "Rooms on %1$s": [\n null,\n "Конференции %1$s:"\n ],\n "Click to open this room": [\n null,\n "Зайти в конференцию"\n ],\n "Show more information on this room": [\n null,\n "Показать больше информации об этой конференции"\n ],\n "Description:": [\n null,\n "Описание:"\n ],\n "Occupants:": [\n null,\n "Участники:"\n ],\n "Features:": [\n null,\n "Свойства:"\n ],\n "Requires authentication": [\n null,\n "Требуется авторизация"\n ],\n "Hidden": [\n null,\n "Скрыто"\n ],\n "Requires an invitation": [\n null,\n "Требуется приглашение"\n ],\n "Moderated": [\n null,\n "Модерируемая"\n ],\n "Non-anonymous": [\n null,\n "Не анонимная"\n ],\n "Open room": [\n null,\n "Открыть конференцию"\n ],\n "Permanent room": [\n null,\n "Перманентная конференция"\n ],\n "Public": [\n null,\n "Публичный"\n ],\n "Semi-anonymous": [\n null,\n "Частично анонимная"\n ],\n "Temporary room": [\n null,\n "Временная конференция"\n ],\n "Unmoderated": [\n null,\n "Немодерируемая"\n ],\n "This user is a moderator": [\n null,\n "Модератор"\n ],\n "This user can send messages in this room": [\n null,\n "Собеседник"\n ],\n "This user can NOT send messages in this room": [\n null,\n "Пользователь не может посылать сообщения в эту комнату"\n ],\n "Invite...": [\n null,\n ""\n ],\n "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n null,\n ""\n ],\n "You may optionally include a message, explaining the reason for the invitation.": [\n null,\n ""\n ],\n "Message": [\n null,\n "Сообщение"\n ],\n "Error: could not execute the command": [\n null,\n ""\n ],\n "Error: the \\"": [\n null,\n ""\n ],\n "Change user\'s affiliation to admin": [\n null,\n ""\n ],\n "Change user role to occupant": [\n null,\n ""\n ],\n "Write in 3rd person": [\n null,\n ""\n ],\n "Grant membership to a user": [\n null,\n ""\n ],\n "Remove user\'s ability to post messages": [\n null,\n ""\n ],\n "Change your nickname": [\n null,\n ""\n ],\n "Grant moderator role to user": [\n null,\n ""\n ],\n "Revoke user\'s membership": [\n null,\n ""\n ],\n "Allow muted user to post messages": [\n null,\n ""\n ],\n "Save": [\n null,\n "Сохранить"\n ],\n "Cancel": [\n null,\n "Отменить"\n ],\n "An error occurred while trying to save the form.": [\n null,\n "При сохранение формы произошла ошибка."\n ],\n "This chatroom requires a password": [\n null,\n "Для доступа в конфер. необходим пароль."\n ],\n "Password: ": [\n null,\n "Пароль: "\n ],\n "Submit": [\n null,\n "Отправить"\n ],\n "This room is not anonymous": [\n null,\n "Эта комната не анонимная"\n ],\n "This room now shows unavailable members": [\n null,\n "Эта комната показывает доступных собеседников"\n ],\n "This room does not show unavailable members": [\n null,\n "Эта комната не показывает недоступных собеседников"\n ],\n "Non-privacy-related room configuration has changed": [\n null,\n ""\n ],\n "Room logging is now enabled": [\n null,\n ""\n ],\n "Room logging is now disabled": [\n null,\n ""\n ],\n "This room is now non-anonymous": [\n null,\n "Эта комната не анонимная"\n ],\n "This room is now semi-anonymous": [\n null,\n "Эта комната частично анонимная"\n ],\n "This room is now fully-anonymous": [\n null,\n "Эта комната стала полностью анонимной"\n ],\n "A new room has been created": [\n null,\n "Новая комната была создана"\n ],\n "You have been banned from this room": [\n null,\n "Вам запрещено подключатся к этой конференции"\n ],\n "You have been kicked from this room": [\n null,\n "Вам запрещено подключатся к этой конференции"\n ],\n "You have been removed from this room because of an affiliation change": [\n null,\n "<strong>%1$s</strong> удалён потому что изменились права"\n ],\n "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n null,\n "Вы отключены от этой конференции потому что режим изменился: только-участники"\n ],\n "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n null,\n "Вы отключены от этой конференции потому что сервись конференций выключен."\n ],\n "<strong>%1$s</strong> has been banned": [\n null,\n "<strong>%1$s</strong> забанен"\n ],\n "<strong>%1$s</strong> has been kicked out": [\n null,\n "<strong>%1$s</strong> выдворен"\n ],\n "<strong>%1$s</strong> has been removed because of an affiliation change": [\n null,\n "<strong>%1$s</strong> has been removed because of an affiliation change"\n ],\n "<strong>%1$s</strong> has been removed for not being a member": [\n null,\n "<strong>%1$s</strong> удалён потому что не участник"\n ],\n "The reason given is: \\"": [\n null,\n ""\n ],\n "You are not on the member list of this room": [\n null,\n "Вас нет в списке этой конференции"\n ],\n "No nickname was specified": [\n null,\n "Вы не указали псевдоним"\n ],\n "You are not allowed to create new rooms": [\n null,\n "Вы не имеете права создавать конфер."\n ],\n "Your nickname doesn\'t conform to this room\'s policies": [\n null,\n "Псевдоним не согласуется с правилами конфер."\n ],\n "Your nickname is already taken": [\n null,\n "Ваш ник уже используется другим пользователем"\n ],\n "This room does not (yet) exist": [\n null,\n "Эта комната не существует"\n ],\n "This room has reached it\'s maximum number of occupants": [\n null,\n "Конференция достигла максимального количества участников"\n ],\n "Topic set by %1$s to: %2$s": [\n null,\n "Тема %2$s устатновлена %1$s"\n ],\n "%1$s has invited you to join a chat room: %2$s": [\n null,\n ""\n ],\n "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n null,\n ""\n ],\n "Minimized": [\n null,\n ""\n ],\n "Click to remove this contact": [\n null,\n "Удалить контакт"\n ],\n "Click to chat with this contact": [\n null,\n "Начать общение"\n ],\n "Name": [\n null,\n ""\n ],\n "Sorry, there was an error while trying to remove ": [\n null,\n ""\n ],\n "Sorry, there was an error while trying to add ": [\n null,\n ""\n ],\n "This client does not allow presence subscriptions": [\n null,\n ""\n ],\n "Type to filter": [\n null,\n ""\n ],\n "I am %1$s": [\n null,\n "%1$s"\n ],\n "Click here to write a custom status message": [\n null,\n "Редактировать произвольный статус"\n ],\n "Click to change your chat status": [\n null,\n "Изменить ваш статус"\n ],\n "Custom status": [\n null,\n "Произвольный статус"\n ],\n "online": [\n null,\n "на связи"\n ],\n "busy": [\n null,\n "занят"\n ],\n "away for long": [\n null,\n "отошёл на долго"\n ],\n "away": [\n null,\n "отошёл"\n ],\n "Your XMPP provider\'s domain name:": [\n null,\n ""\n ],\n "Fetch registration form": [\n null,\n ""\n ],\n "Tip: A list of public XMPP providers is available": [\n null,\n ""\n ],\n "here": [\n null,\n ""\n ],\n "Register": [\n null,\n ""\n ],\n "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n null,\n ""\n ],\n "Requesting a registration form from the XMPP server": [\n null,\n ""\n ],\n "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n null,\n ""\n ],\n "Now logging you in": [\n null,\n ""\n ],\n "Registered successfully": [\n null,\n ""\n ],\n "Return": [\n null,\n ""\n ],\n "The provider rejected your registration attempt. Please check the values you entered for correctness.": [\n null,\n ""\n ],\n "Password:": [\n null,\n "Пароль:"\n ],\n "Log In": [\n null,\n "Войти"\n ],\n "user@server": [\n null,\n ""\n ],\n "Sign in": [\n null,\n "Подписать"\n ],\n "Toggle chat": [\n null,\n ""\n ]\n }\n }\n}'}),define("text!uk",[],function(){return'{\n "domain": "converse",\n "locale_data": {\n "converse": {\n "": {\n "domain": "converse",\n "plural_forms": "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);",\n "lang": "uk"\n },\n " e.g. conversejs.org": [\n null,\n " напр. conversejs.org"\n ],\n "unencrypted": [\n null,\n "некриптовано"\n ],\n "unverified": [\n null,\n "неперевірено"\n ],\n "verified": [\n null,\n "перевірено"\n ],\n "finished": [\n null,\n "завершено"\n ],\n "This contact is busy": [\n null,\n "Цей контакт зайнятий"\n ],\n "This contact is online": [\n null,\n "Цей контакт на зв\'язку"\n ],\n "This contact is offline": [\n null,\n "Цей контакт поза мережею"\n ],\n "This contact is unavailable": [\n null,\n "Цей контакт недоступний"\n ],\n "This contact is away for an extended period": [\n null,\n "Цей контакт відсутній тривалий час"\n ],\n "This contact is away": [\n null,\n "Цей контакт відсутній"\n ],\n "Click to hide these contacts": [\n null,\n "Клацніть, щоб приховати ці контакти"\n ],\n "My contacts": [\n null,\n "Мої контакти"\n ],\n "Pending contacts": [\n null,\n "Контакти в очікуванні"\n ],\n "Contact requests": [\n null,\n "Запити контакту"\n ],\n "Ungrouped": [\n null,\n "Негруповані"\n ],\n "Contacts": [\n null,\n "Контакти"\n ],\n "Groups": [\n null,\n "Групи"\n ],\n "Attempting to reconnect in 5 seconds": [\n null,\n ""\n ],\n "Error": [\n null,\n "Помилка"\n ],\n "Connecting": [\n null,\n "Під\'єднуюсь"\n ],\n "Authenticating": [\n null,\n "Автентикуюсь"\n ],\n "Authentication Failed": [\n null,\n "Автентикація невдала"\n ],\n "Re-establishing encrypted session": [\n null,\n "Перевстановлюю криптований сеанс"\n ],\n "Generating private key.": [\n null,\n "Генерація приватного ключа."\n ],\n "Your browser might become unresponsive.": [\n null,\n "Ваш браузер може підвиснути."\n ],\n "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n null,\n "Запит автентикації від %1$s\\n\\nВаш контакт в чаті намагається встановити Вашу особу і просить відповісти на питання нижче.\\n\\n%2$s"\n ],\n "Could not verify this user\'s identify.": [\n null,\n "Не можу перевірити автентичність цього користувача."\n ],\n "Exchanging private key with contact.": [\n null,\n "Обмін приватним ключем з контактом."\n ],\n "Minimize this chat box": [\n null,\n ""\n ],\n "Personal message": [\n null,\n "Персональна вісточка"\n ],\n "Are you sure you want to clear the messages from this room?": [\n null,\n "Ви впевнені, що хочете очистити повідомлення з цієї кімнати?"\n ],\n "me": [\n null,\n "я"\n ],\n "is typing": [\n null,\n "друкує"\n ],\n "has stopped typing": [\n null,\n "припинив друкувати"\n ],\n "has gone away": [\n null,\n "пішов геть"\n ],\n "Show this menu": [\n null,\n "Показати це меню"\n ],\n "Write in the third person": [\n null,\n "Писати від третьої особи"\n ],\n "Remove messages": [\n null,\n "Видалити повідомлення"\n ],\n "Are you sure you want to clear the messages from this chat box?": [\n null,\n "Ви впевнені, що хочете очистити повідомлення з цього вікна чату?"\n ],\n "Your message could not be sent": [\n null,\n "Ваше повідомлення не може бути надіслане"\n ],\n "We received an unencrypted message": [\n null,\n "Ми отримали некриптоване повідомлення"\n ],\n "We received an unreadable encrypted message": [\n null,\n "Ми отримали нечитабельне криптоване повідомлення"\n ],\n "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n null,\n "Ось відбитки, будь-ласка, підтвердіть їх з %1$s, за межами цього чату.\\n\\nВідбиток для Вас, %2$s: %3$s\\n\\nВідбиток для %1$s: %4$s\\n\\nЯкщо Ви підтверджуєте відповідність відбитка, клацніть Гаразд, інакше клацніть Відміна."\n ],\n "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n null,\n "Вас запитають таємне питання і відповідь на нього.\\n\\nПотім Вашого контакта запитають те саме питання, і якщо вони введуть ту саму відповідь (враховуючи регістр), їх особи будуть перевірені."\n ],\n "What is your security question?": [\n null,\n "Яке Ваше таємне питання?"\n ],\n "What is the answer to the security question?": [\n null,\n "Яка відповідь на таємне питання?"\n ],\n "Invalid authentication scheme provided": [\n null,\n "Надана некоректна схема автентикації"\n ],\n "has gone offline": [\n null,\n "тепер поза мережею"\n ],\n "is busy": [\n null,\n "зайнятий"\n ],\n "Your messages are not encrypted anymore": [\n null,\n "Ваші повідомлення більше не криптуються"\n ],\n "Your messages are now encrypted but your contact\'s identity has not been verified.": [\n null,\n "Ваші повідомлення вже криптуються, але особа Вашого контакту не перевірена."\n ],\n "Your contact\'s identify has been verified.": [\n null,\n "Особу Вашого контакту перевірено."\n ],\n "Your contact has ended encryption on their end, you should do the same.": [\n null,\n "Ваш контакт припинив криптування зі свого боку, Вам слід зробити те саме."\n ],\n "Your messages are not encrypted. Click here to enable OTR encryption.": [\n null,\n "Ваші повідомлення не криптуються. Клацніть тут, щоб увімкнути OTR-криптування."\n ],\n "Your messages are encrypted, but your contact has not been verified.": [\n null,\n "Ваші повідомлення криптуються, але Ваш контакт не був перевірений."\n ],\n "Your messages are encrypted and your contact verified.": [\n null,\n "Ваші повідомлення криптуються і Ваш контакт перевірено."\n ],\n "Your contact has closed their end of the private session, you should do the same": [\n null,\n "Ваш контакт закрив зі свого боку приватну сесію, Вам слід зробити те ж саме"\n ],\n "Clear all messages": [\n null,\n "Очистити всі повідомлення"\n ],\n "End encrypted conversation": [\n null,\n "Завершити криптовану розмову"\n ],\n "Insert a smiley": [\n null,\n ""\n ],\n "Refresh encrypted conversation": [\n null,\n "Оновити криптовану розмову"\n ],\n "Start a call": [\n null,\n "Почати виклик"\n ],\n "Start encrypted conversation": [\n null,\n "Почати криптовану розмову"\n ],\n "Verify with fingerprints": [\n null,\n "Перевірити за відбитками"\n ],\n "Verify with SMP": [\n null,\n "Перевірити за SMP"\n ],\n "What\'s this?": [\n null,\n "Що це?"\n ],\n "Online": [\n null,\n "На зв\'язку"\n ],\n "Busy": [\n null,\n "Зайнятий"\n ],\n "Away": [\n null,\n "Далеко"\n ],\n "Offline": [\n null,\n "Поза мережею"\n ],\n "Log out": [\n null,\n "Вийти"\n ],\n "Contact name": [\n null,\n "Назва контакту"\n ],\n "Search": [\n null,\n "Пошук"\n ],\n "e.g. user@example.com": [\n null,\n ""\n ],\n "Add": [\n null,\n "Додати"\n ],\n "Click to add new chat contacts": [\n null,\n "Клацніть, щоб додати нові контакти до чату"\n ],\n "Add a contact": [\n null,\n "Додати контакт"\n ],\n "No users found": [\n null,\n "Жодного користувача не знайдено"\n ],\n "Click to add as a chat contact": [\n null,\n "Клацніть, щоб додати як чат-контакт"\n ],\n "Room name": [\n null,\n "Назва кімнати"\n ],\n "Nickname": [\n null,\n "Прізвисько"\n ],\n "Server": [\n null,\n "Сервер"\n ],\n "Join Room": [\n null,\n "Приєднатися до кімнати"\n ],\n "Show rooms": [\n null,\n "Показати кімнати"\n ],\n "Rooms": [\n null,\n "Кімнати"\n ],\n "No rooms on %1$s": [\n null,\n "Жодної кімнати на %1$s"\n ],\n "Rooms on %1$s": [\n null,\n "Кімнати на %1$s"\n ],\n "Click to open this room": [\n null,\n "Клацніть, щоб увійти в цю кімнату"\n ],\n "Show more information on this room": [\n null,\n "Показати більше інформації про цю кімату"\n ],\n "Description:": [\n null,\n "Опис:"\n ],\n "Occupants:": [\n null,\n "Присутні:"\n ],\n "Features:": [\n null,\n "Особливості:"\n ],\n "Requires authentication": [\n null,\n "Вимагає автентикації"\n ],\n "Hidden": [\n null,\n "Прихована"\n ],\n "Requires an invitation": [\n null,\n "Вимагає запрошення"\n ],\n "Moderated": [\n null,\n "Модерована"\n ],\n "Non-anonymous": [\n null,\n "Не-анонімні"\n ],\n "Open room": [\n null,\n "Увійти в кімнату"\n ],\n "Permanent room": [\n null,\n "Постійна кімната"\n ],\n "Public": [\n null,\n "Публічна"\n ],\n "Semi-anonymous": [\n null,\n "Напів-анонімна"\n ],\n "Temporary room": [\n null,\n "Тимчасова кімната"\n ],\n "Unmoderated": [\n null,\n "Немодерована"\n ],\n "This user is a moderator": [\n null,\n "Цей користувач є модератором"\n ],\n "This user can send messages in this room": [\n null,\n "Цей користувач може слати повідомлення в цій кімнаті"\n ],\n "This user can NOT send messages in this room": [\n null,\n "Цей користувач НЕ МОЖЕ слати повідомлення в цій кімнаті"\n ],\n "Invite...": [\n null,\n "Запросіть..."\n ],\n "Occupants": [\n null,\n "Учасники"\n ],\n "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n null,\n "Ви запрошуєте %1$s до чату \\"%2$s\\". "\n ],\n "You may optionally include a message, explaining the reason for the invitation.": [\n null,\n "Ви можете опціонально додати повідомлення, щоб пояснити причину запрошення."\n ],\n "Message": [\n null,\n "Повідомлення"\n ],\n "Error: could not execute the command": [\n null,\n "Помилка: Не можу виконати команду"\n ],\n "Error: the \\"": [\n null,\n ""\n ],\n "Change user\'s affiliation to admin": [\n null,\n "Призначити користувача адміністратором"\n ],\n "Ban user from room": [\n null,\n "Заблокувати і викинути з кімнати"\n ],\n "Kick user from room": [\n null,\n "Викинути з кімнати"\n ],\n "Write in 3rd person": [\n null,\n "Писати в 3-й особі"\n ],\n "Grant membership to a user": [\n null,\n "Надати членство користувачу"\n ],\n "Remove user\'s ability to post messages": [\n null,\n "Забрати можливість слати повідомлення"\n ],\n "Change your nickname": [\n null,\n "Змінити Ваше прізвисько"\n ],\n "Grant moderator role to user": [\n null,\n "Надати права модератора"\n ],\n "Grant ownership of this room": [\n null,\n "Передати у власність цю кімнату"\n ],\n "Revoke user\'s membership": [\n null,\n "Забрати членство в користувача"\n ],\n "Set room topic": [\n null,\n "Встановити тему кімнати"\n ],\n "Allow muted user to post messages": [\n null,\n "Дозволити безголосому користувачу слати повідомлення"\n ],\n "Save": [\n null,\n "Зберегти"\n ],\n "Cancel": [\n null,\n "Відміна"\n ],\n "An error occurred while trying to save the form.": [\n null,\n "Трапилася помилка при спробі зберегти форму."\n ],\n "This chatroom requires a password": [\n null,\n "Ця кімната вимагає пароль"\n ],\n "Password: ": [\n null,\n "Пароль:"\n ],\n "Submit": [\n null,\n "Надіслати"\n ],\n "This room is not anonymous": [\n null,\n "Ця кімната не є анонімною"\n ],\n "This room now shows unavailable members": [\n null,\n "Ця кімната вже показує недоступних учасників"\n ],\n "This room does not show unavailable members": [\n null,\n "Ця кімната не показує недоступних учасників"\n ],\n "Non-privacy-related room configuration has changed": [\n null,\n "Змінено конфігурацію кімнати, не повязану з приватністю"\n ],\n "Room logging is now enabled": [\n null,\n "Журналювання кімнати тепер ввімкнено"\n ],\n "Room logging is now disabled": [\n null,\n "Журналювання кімнати тепер вимкнено"\n ],\n "This room is now non-anonymous": [\n null,\n "Ця кімната тепер не-анонімна"\n ],\n "This room is now semi-anonymous": [\n null,\n "Ця кімната тепер напів-анонімна"\n ],\n "This room is now fully-anonymous": [\n null,\n "Ця кімната тепер повністю анонімна"\n ],\n "A new room has been created": [\n null,\n "Створено нову кімнату"\n ],\n "You have been banned from this room": [\n null,\n "Вам заблокували доступ до цієї кімнати"\n ],\n "You have been kicked from this room": [\n null,\n "Вас викинули з цієї кімнати"\n ],\n "You have been removed from this room because of an affiliation change": [\n null,\n "Вас видалено з кімнати у зв\'язку зі змінами власності кімнати"\n ],\n "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n null,\n "Вас видалено з цієї кімнати, оскільки вона тепер вимагає членства, а Ви ним не є її членом"\n ],\n "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n null,\n "Вас видалено з цієї кімнати, тому що MUC (Чат-сервіс) припиняє роботу."\n ],\n "<strong>%1$s</strong> has been banned": [\n null,\n "<strong>%1$s</strong> заблоковано"\n ],\n "<strong>%1$s</strong>\'s nickname has changed": [\n null,\n "Прізвисько <strong>%1$s</strong> змінено"\n ],\n "<strong>%1$s</strong> has been kicked out": [\n null,\n "<strong>%1$s</strong> було викинуто звідси"\n ],\n "<strong>%1$s</strong> has been removed because of an affiliation change": [\n null,\n "<strong>%1$s</strong> було видалено через зміни власності кімнати"\n ],\n "<strong>%1$s</strong> has been removed for not being a member": [\n null,\n "<strong>%1$s</strong> було виделано через відсутність членства"\n ],\n "Your nickname has been automatically changed to: <strong>%1$s</strong>": [\n null,\n "Ваше прізвисько було автоматично змінене на: <strong>%1$s</strong>"\n ],\n "Your nickname has been changed to: <strong>%1$s</strong>": [\n null,\n "Ваше прізвисько було змінене на: <strong>%1$s</strong>"\n ],\n "The reason given is: \\"": [\n null,\n "Причиною вказано: \\""\n ],\n "You are not on the member list of this room": [\n null,\n "Ви не є у списку членів цієї кімнати"\n ],\n "No nickname was specified": [\n null,\n "Не вказане прізвисько"\n ],\n "You are not allowed to create new rooms": [\n null,\n "Вам не дозволено створювати нові кімнати"\n ],\n "Your nickname doesn\'t conform to this room\'s policies": [\n null,\n "Ваше прізвисько не відповідає політиці кімнати"\n ],\n "Your nickname is already taken": [\n null,\n "Таке прізвисько вже зайняте"\n ],\n "This room does not (yet) exist": [\n null,\n "Такої кімнати (поки) не існує"\n ],\n "This room has reached it\'s maximum number of occupants": [\n null,\n "Ця кімната досягнула максимуму учасників"\n ],\n "Topic set by %1$s to: %2$s": [\n null,\n "Тема встановлена %1$s: %2$s"\n ],\n "%1$s has invited you to join a chat room: %2$s": [\n null,\n "%1$s запрошує вас приєднатись до чату: %2$s"\n ],\n "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n null,\n "%1$s запрошує Вас приєднатись до чату: %2$s, аргументує ось як: \\"%3$s\\""\n ],\n "Click to restore this chat": [\n null,\n "Клацніть, щоб відновити цей чат"\n ],\n "Minimized": [\n null,\n "Мінімізовано"\n ],\n "Click to remove this contact": [\n null,\n "Клацніть, щоб видалити цей контакт"\n ],\n "Click to accept this contact request": [\n null,\n "Клацніть, щоб прийняти цей запит контакту"\n ],\n "Click to decline this contact request": [\n null,\n "Клацніть, щоб відхилити цей запит контакту"\n ],\n "Click to chat with this contact": [\n null,\n "Клацніть, щоб почати розмову з цим контактом"\n ],\n "Name": [\n null,\n ""\n ],\n "Are you sure you want to remove this contact?": [\n null,\n "Ви впевнені, що хочете видалити цей контакт?"\n ],\n "Sorry, there was an error while trying to remove ": [\n null,\n ""\n ],\n "Are you sure you want to decline this contact request?": [\n null,\n "Ви впевнені, що хочете відхилити цей запит контакту?"\n ],\n "Sorry, there was an error while trying to add ": [\n null,\n ""\n ],\n "This client does not allow presence subscriptions": [\n null,\n ""\n ],\n "Type to filter": [\n null,\n "Друкуйте для фільтру"\n ],\n "I am %1$s": [\n null,\n "Я %1$s"\n ],\n "Click here to write a custom status message": [\n null,\n "Клацніть тут, щоб створити власний статус"\n ],\n "Click to change your chat status": [\n null,\n "Клацніть, щоб змінити статус в чаті"\n ],\n "Custom status": [\n null,\n "Власний статус"\n ],\n "online": [\n null,\n "на зв\'язку"\n ],\n "busy": [\n null,\n "зайнятий"\n ],\n "away for long": [\n null,\n "давно відсутній"\n ],\n "away": [\n null,\n "відсутній"\n ],\n "Your XMPP provider\'s domain name:": [\n null,\n "Домен Вашого провайдера XMPP:"\n ],\n "Fetch registration form": [\n null,\n "Отримати форму реєстрації"\n ],\n "Tip: A list of public XMPP providers is available": [\n null,\n "Порада: доступний перелік публічних XMPP-провайдерів"\n ],\n "here": [\n null,\n "тут"\n ],\n "Register": [\n null,\n "Реєстрація"\n ],\n "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n null,\n "Вибачте, вказаний провайдер не підтримує реєстрації онлайн. Спробуйте іншого провайдера."\n ],\n "Requesting a registration form from the XMPP server": [\n null,\n "Запитую форму реєстрації з XMPP сервера"\n ],\n "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n null,\n "Щось пішло не так при встановленні зв\'язку з \\"%1$s\\". Ви впевнені, що такий існує?"\n ],\n "Now logging you in": [\n null,\n "Входимо"\n ],\n "Registered successfully": [\n null,\n "Успішно зареєстровано"\n ],\n "Return": [\n null,\n "Вернутися"\n ],\n "XMPP Username:": [\n null,\n "XMPP адреса:"\n ],\n "Password:": [\n null,\n "Пароль:"\n ],\n "Log In": [\n null,\n "Ввійти"\n ],\n "user@server": [\n null,\n ""\n ],\n "Sign in": [\n null,\n "Вступити"\n ],\n "Toggle chat": [\n null,\n "Включити чат"\n ]\n }\n }\n}'}),define("text!zh",[],function(){return'{\n "domain": "converse",\n "locale_data": {\n "converse": {\n "": {\n "domain": "converse",\n "lang": "zh"\n },\n " e.g. conversejs.org": [\n null,\n ""\n ],\n "unencrypted": [\n null,\n "未加密"\n ],\n "unverified": [\n null,\n "未验证"\n ],\n "verified": [\n null,\n "已验证"\n ],\n "finished": [\n null,\n "结束了"\n ],\n "This contact is busy": [\n null,\n "对方忙碌中"\n ],\n "This contact is online": [\n null,\n "对方在线中"\n ],\n "This contact is offline": [\n null,\n "对方已下线"\n ],\n "This contact is unavailable": [\n null,\n "对方免打扰"\n ],\n "This contact is away for an extended period": [\n null,\n "对方暂时离开"\n ],\n "This contact is away": [\n null,\n "对方离开"\n ],\n "My contacts": [\n null,\n "我的好友列表"\n ],\n "Pending contacts": [\n null,\n "保留中的联系人"\n ],\n "Contact requests": [\n null,\n "来自好友的请求"\n ],\n "Ungrouped": [\n null,\n ""\n ],\n "Contacts": [\n null,\n "联系人"\n ],\n "Groups": [\n null,\n ""\n ],\n "Attempting to reconnect in 5 seconds": [\n null,\n ""\n ],\n "Error": [\n null,\n "错误"\n ],\n "Connecting": [\n null,\n "连接中"\n ],\n "Authenticating": [\n null,\n "验证中"\n ],\n "Authentication Failed": [\n null,\n "验证失败"\n ],\n "Re-establishing encrypted session": [\n null,\n "重新建立加密会话"\n ],\n "Generating private key.": [\n null,\n "正在生成私钥"\n ],\n "Your browser might become unresponsive.": [\n null,\n "您的浏览器可能会暂时无响应"\n ],\n "Could not verify this user\'s identify.": [\n null,\n "无法验证对方信息。"\n ],\n "Minimize this chat box": [\n null,\n ""\n ],\n "Personal message": [\n null,\n "私信"\n ],\n "me": [\n null,\n "我"\n ],\n "is typing": [\n null,\n ""\n ],\n "has stopped typing": [\n null,\n ""\n ],\n "Show this menu": [\n null,\n "显示此项菜单"\n ],\n "Write in the third person": [\n null,\n "以第三者身份写"\n ],\n "Remove messages": [\n null,\n "移除消息"\n ],\n "Are you sure you want to clear the messages from this chat box?": [\n null,\n "你确定清除此次的聊天记录吗?"\n ],\n "Your message could not be sent": [\n null,\n "您的消息无法送出"\n ],\n "We received an unencrypted message": [\n null,\n "我们收到了一条未加密的信息"\n ],\n "We received an unreadable encrypted message": [\n null,\n "我们收到一条无法读取的信息"\n ],\n "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n null,\n "这里是指纹。请与 %1$s 确认。\\n\\n您的 %2$s 指纹: %3$s\\n\\n%1$s 的指纹: %4$s\\n\\n如果确认符合,请点击OK,否则点击取消"\n ],\n "What is your security question?": [\n null,\n "您的安全问题是?"\n ],\n "What is the answer to the security question?": [\n null,\n "此安全问题的答案是?"\n ],\n "Invalid authentication scheme provided": [\n null,\n "非法的认证方式"\n ],\n "Your messages are not encrypted anymore": [\n null,\n "您的消息将不再被加密"\n ],\n "Your messages are not encrypted. Click here to enable OTR encryption.": [\n null,\n "您的消息未加密。点击这里来启用OTR加密"\n ],\n "End encrypted conversation": [\n null,\n "结束加密的会话"\n ],\n "Insert a smiley": [\n null,\n ""\n ],\n "Hide the list of occupants": [\n null,\n ""\n ],\n "Refresh encrypted conversation": [\n null,\n "刷新加密的会话"\n ],\n "Start a call": [\n null,\n ""\n ],\n "Start encrypted conversation": [\n null,\n "开始加密的会话"\n ],\n "Verify with fingerprints": [\n null,\n "验证指纹"\n ],\n "Verify with SMP": [\n null,\n "验证SMP"\n ],\n "What\'s this?": [\n null,\n "这是什么?"\n ],\n "Online": [\n null,\n "在线"\n ],\n "Busy": [\n null,\n "忙碌中"\n ],\n "Away": [\n null,\n "离开"\n ],\n "Offline": [\n null,\n "离线"\n ],\n "Contact name": [\n null,\n "联系人名称"\n ],\n "Search": [\n null,\n "搜索"\n ],\n "e.g. user@example.com": [\n null,\n ""\n ],\n "Add": [\n null,\n "添加"\n ],\n "Click to add new chat contacts": [\n null,\n "点击添加新联系人"\n ],\n "Add a contact": [\n null,\n "添加联系人"\n ],\n "No users found": [\n null,\n "未找到用户"\n ],\n "Click to add as a chat contact": [\n null,\n "点击添加为好友"\n ],\n "Room name": [\n null,\n "聊天室名称"\n ],\n "Nickname": [\n null,\n "昵称"\n ],\n "Server": [\n null,\n "服务器"\n ],\n "Show rooms": [\n null,\n "显示所有聊天室"\n ],\n "Rooms": [\n null,\n "聊天室"\n ],\n "No rooms on %1$s": [\n null,\n "%1$s 上没有聊天室"\n ],\n "Rooms on %1$s": [\n null,\n "%1$s 上的聊天室"\n ],\n "Click to open this room": [\n null,\n "打开聊天室"\n ],\n "Show more information on this room": [\n null,\n "显示次聊天室的更多信息"\n ],\n "Description:": [\n null,\n "描述: "\n ],\n "Occupants:": [\n null,\n "成员:"\n ],\n "Features:": [\n null,\n "特性:"\n ],\n "Requires authentication": [\n null,\n "需要验证"\n ],\n "Hidden": [\n null,\n "隐藏的"\n ],\n "Requires an invitation": [\n null,\n "需要被邀请"\n ],\n "Moderated": [\n null,\n "发言受限"\n ],\n "Non-anonymous": [\n null,\n "非匿名"\n ],\n "Open room": [\n null,\n "打开聊天室"\n ],\n "Permanent room": [\n null,\n "永久聊天室"\n ],\n "Public": [\n null,\n "公开的"\n ],\n "Semi-anonymous": [\n null,\n "半匿名"\n ],\n "Temporary room": [\n null,\n "临时聊天室"\n ],\n "Unmoderated": [\n null,\n "无发言限制"\n ],\n "This user is a moderator": [\n null,\n "此用户是主持人"\n ],\n "This user can send messages in this room": [\n null,\n "此用户在这房间里可发消息"\n ],\n "This user can NOT send messages in this room": [\n null,\n "此用户不可在此房间发消息"\n ],\n "Invite...": [\n null,\n ""\n ],\n "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n null,\n ""\n ],\n "You may optionally include a message, explaining the reason for the invitation.": [\n null,\n ""\n ],\n "Message": [\n null,\n "信息"\n ],\n "Error: could not execute the command": [\n null,\n ""\n ],\n "Error: the \\"": [\n null,\n ""\n ],\n "Change user\'s affiliation to admin": [\n null,\n ""\n ],\n "Change user role to occupant": [\n null,\n ""\n ],\n "Grant membership to a user": [\n null,\n ""\n ],\n "Remove user\'s ability to post messages": [\n null,\n ""\n ],\n "Change your nickname": [\n null,\n ""\n ],\n "Grant moderator role to user": [\n null,\n ""\n ],\n "Revoke user\'s membership": [\n null,\n ""\n ],\n "Allow muted user to post messages": [\n null,\n ""\n ],\n "Save": [\n null,\n "保存"\n ],\n "Cancel": [\n null,\n "取消"\n ],\n "An error occurred while trying to save the form.": [\n null,\n "保存表单是出错。"\n ],\n "This chatroom requires a password": [\n null,\n "此聊天室需要密码"\n ],\n "Password: ": [\n null,\n "密码:"\n ],\n "Submit": [\n null,\n "发送"\n ],\n "This room is not anonymous": [\n null,\n "此为非匿名聊天室"\n ],\n "This room now shows unavailable members": [\n null,\n "此聊天室显示不可用用户"\n ],\n "This room does not show unavailable members": [\n null,\n "此聊天室不显示不可用用户"\n ],\n "Non-privacy-related room configuration has changed": [\n null,\n "此聊天室设置(非私密性)已改变"\n ],\n "Room logging is now enabled": [\n null,\n "聊天室聊天记录已启用"\n ],\n "Room logging is now disabled": [\n null,\n "聊天室聊天记录已禁用"\n ],\n "This room is now non-anonymous": [\n null,\n "此聊天室非匿名"\n ],\n "This room is now semi-anonymous": [\n null,\n "此聊天室半匿名"\n ],\n "This room is now fully-anonymous": [\n null,\n "此聊天室完全匿名"\n ],\n "A new room has been created": [\n null,\n "新聊天室已创建"\n ],\n "You have been banned from this room": [\n null,\n "您已被此聊天室禁止入内"\n ],\n "You have been kicked from this room": [\n null,\n "您已被踢出次房间"\n ],\n "You have been removed from this room because of an affiliation change": [\n null,\n "由于关系变化,您已被移除此房间"\n ],\n "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n null,\n "您已被移除此房间因为此房间更改为只允许成员加入,而您非成员"\n ],\n "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n null,\n "由于服务不可用,您已被移除此房间。"\n ],\n "<strong>%1$s</strong> has been banned": [\n null,\n "<strong>%1$s</strong> 已被禁止"\n ],\n "<strong>%1$s</strong> has been kicked out": [\n null,\n "<strong>%1$s</strong> 已被踢出"\n ],\n "<strong>%1$s</strong> has been removed because of an affiliation change": [\n null,\n "由于关系解除、<strong>%1$s</strong> 已被移除"\n ],\n "<strong>%1$s</strong> has been removed for not being a member": [\n null,\n "由于不是成员、<strong>%1$s</strong> 已被移除"\n ],\n "The reason given is: \\"": [\n null,\n ""\n ],\n "You are not on the member list of this room": [\n null,\n "您并非此房间成员"\n ],\n "No nickname was specified": [\n null,\n "未指定昵称"\n ],\n "You are not allowed to create new rooms": [\n null,\n "您可此创建新房间了"\n ],\n "Your nickname doesn\'t conform to this room\'s policies": [\n null,\n "您的昵称不符合此房间标准"\n ],\n "Your nickname is already taken": [\n null,\n "您的昵称已被占用"\n ],\n "This room does not (yet) exist": [\n null,\n "此房间不存在"\n ],\n "This room has reached it\'s maximum number of occupants": [\n null,\n "此房间人数已达上线"\n ],\n "Topic set by %1$s to: %2$s": [\n null,\n "%1$s 设置话题为: %2$s"\n ],\n "%1$s has invited you to join a chat room: %2$s": [\n null,\n ""\n ],\n "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n null,\n ""\n ],\n "Minimized": [\n null,\n "最小化的"\n ],\n "Click to remove this contact": [\n null,\n "点击移除联系人"\n ],\n "Click to chat with this contact": [\n null,\n "点击与对方交谈"\n ],\n "Name": [\n null,\n ""\n ],\n "Sorry, there was an error while trying to remove ": [\n null,\n ""\n ],\n "Sorry, there was an error while trying to add ": [\n null,\n ""\n ],\n "This client does not allow presence subscriptions": [\n null,\n ""\n ],\n "Type to filter": [\n null,\n ""\n ],\n "I am %1$s": [\n null,\n "我现在%1$s"\n ],\n "Click here to write a custom status message": [\n null,\n "点击这里,填写状态信息"\n ],\n "Click to change your chat status": [\n null,\n "点击这里改变聊天状态"\n ],\n "Custom status": [\n null,\n "DIY状态"\n ],\n "online": [\n null,\n "在线"\n ],\n "busy": [\n null,\n "忙碌"\n ],\n "away for long": [\n null,\n "长时间离开"\n ],\n "away": [\n null,\n "离开"\n ],\n "Your XMPP provider\'s domain name:": [\n null,\n ""\n ],\n "Fetch registration form": [\n null,\n ""\n ],\n "Tip: A list of public XMPP providers is available": [\n null,\n ""\n ],\n "here": [\n null,\n ""\n ],\n "Register": [\n null,\n ""\n ],\n "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n null,\n ""\n ],\n "Requesting a registration form from the XMPP server": [\n null,\n ""\n ],\n "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n null,\n ""\n ],\n "Now logging you in": [\n null,\n ""\n ],\n "Registered successfully": [\n null,\n ""\n ],\n "Return": [\n null,\n ""\n ],\n "The provider rejected your registration attempt. Please check the values you entered for correctness.": [\n null,\n ""\n ],\n "Password:": [\n null,\n "密码:"\n ],\n "Log In": [\n null,\n "登录"\n ],\n "user@server": [\n null,\n ""\n ],\n "Sign in": [\n null,\n "登录"\n ],\n "Toggle chat": [\n null,\n "折叠聊天窗口"\n ]\n }\n }\n}'}),function(e,t){define("locales",["jquery","jed","text!af","text!de","text!en","text!es","text!fr","text!he","text!hu","text!id","text!it","text!ja","text!nb","text!nl","text!pl","text!pt_BR","text!ru","text!uk","text!zh"],function(t,n){return e.locales={af:arguments[2],de:arguments[3],en:arguments[4],es:arguments[5],fr:arguments[6],he:arguments[7],hu:arguments[8],id:arguments[9],it:arguments[10],ja:arguments[11],nb:arguments[12],nl:arguments[13],pl:arguments[14],"pt-br":arguments[15],ru:arguments[16],uk:arguments[17],zh:arguments[18]},e.locales})}(this),function(e,t){typeof define=="function"&&define.amd?define("utils",["jquery","underscore","converse-templates","locales"],t):e.utils=t(jQuery,_,templates)}(this,function(e,t,n,r){"use strict";var i={"text-private":"password","text-single":"text",fixed:"label","boolean":"checkbox",hidden:"hidden","jid-multi":"textarea","list-single":"dropdown","list-multi":"dropdown"};e.expr[":"].emptyVal=function(e){return e.value===""},e.fn.hasScrollBar=function(){return e.contains(document,this.get(0))?this.parent().height()<this.get(0).scrollHeight?!0:!1:!1},e.fn.addHyperlinks=function(){return this.length>0&&this.each(function(t,n){var r=e(n).html(),i=r.match(/\b(https?:\/\/|www\.|https?:\/\/www\.)[^\s<]{2,200}\b/g);if(i)for(t=0;t<i.length;t++){var s=i[t].indexOf("http://")===0||i[t].indexOf("https://")===0?"":"http://",o=encodeURI(decodeURI(i[t])).replace(/[!'()]/g,escape).replace(/\*/g,"%2A");r=r.replace(i[t],"<a target='_blank' href='"+s+o+"'>"+i[t]+"</a>")}e(n).html(r)}),this},e.fn.addEmoticons=function(t){return t&&this.length>0&&this.each(function(t,n){var r=e(n).html();r=r.replace(/>:\)/g,'<span class="emoticon icon-evil"></span>'),r=r.replace(/:\)/g,'<span class="emoticon icon-smiley"></span>'),r=r.replace(/:\-\)/g,'<span class="emoticon icon-smiley"></span>'),r=r.replace(/;\)/g,'<span class="emoticon icon-wink"></span>'),r=r.replace(/;\-\)/g,'<span class="emoticon icon-wink"></span>'),r=r.replace(/:D/g,'<span class="emoticon icon-grin"></span>'),r=r.replace(/:\-D/g,'<span class="emoticon icon-grin"></span>'),r=r.replace(/:P/g,'<span class="emoticon icon-tongue"></span>'),r=r.replace(/:\-P/g,'<span class="emoticon icon-tongue"></span>'),r=r.replace(/:p/g,'<span class="emoticon icon-tongue"></span>'),r=r.replace(/:\-p/g,'<span class="emoticon icon-tongue"></span>'),r=r.replace(/8\)/g,'<span class="emoticon icon-cool"></span>'),r=r.replace(/:S/g,'<span class="emoticon icon-confused"></span>'),r=r.replace(/:\\/g,'<span class="emoticon icon-wondering"></span>'),r=r.replace(/:\/ /g,'<span class="emoticon icon-wondering"></span>'),r=r.replace(/>:\(/g,'<span class="emoticon icon-angry"></span>'),r=r.replace(/:\(/g,'<span class="emoticon icon-sad"></span>'),r=r.replace(/:\-\(/g,'<span class="emoticon icon-sad"></span>'),r=r.replace(/:O/g,'<span class="emoticon icon-shocked"></span>'),r=r.replace(/:\-O/g,'<span class="emoticon icon-shocked"></span>'),r=r.replace(/\=\-O/g,'<span class="emoticon icon-shocked"></span>'),r=r.replace(/\(\^.\^\)b/g,'<span class="emoticon icon-thumbs-up"></span>'),r=r.replace(/<3/g,'<span class="emoticon icon-heart"></span>'),e(n).html(r)}),this};var s={__:function(t){typeof this.i18n=="undefined"&&(this.i18n=r.en),typeof this.i18n=="string"&&(this.i18n=e.parseJSON(this.i18n)),typeof this.jed=="undefined"&&(this.jed=new Jed(this.i18n));var n=this.jed.translate(t);return arguments.length>1?n.fetch.apply(n,[].slice.call(arguments,1)):n.fetch()},___:function(e){return e},webForm2xForm:function(t){var r=e(t),i;if(r.is("[type=checkbox]"))i=r.is(":checked")&&1||0;else if(r.is("textarea")){i=[];var s=r.val().split("\n");for(var o=0;o<s.length;o++){var u=e.trim(s[o]);if(u==="")continue;i.push(u)}}else i=r.val();return e(n.field({name:r.attr("name"),value:i}))[0]},xForm2webForm:function(r,s){var o=[],u,a,f,l,c;if(r.attr("type")==="list-single"||r.attr("type")==="list-multi"){c=[],f=r.children("value");for(u=0;u<f.length;u++)c.push(e(f[u]).text());a=r.children("option");for(u=0;u<a.length;u++)l=e(a[u]).find("value").text(),o.push(n.select_option({value:l,label:e(a[u]).attr("label"),selected:c.indexOf(l)>=0,required:r.find("required").length}));return n.form_select({name:r.attr("var"),label:r.attr("label"),options:o.join(""),multiple:r.attr("type")==="list-multi",required:r.find("required").length})}if(r.attr("type")==="fixed")return e('<p class="form-help">').text(r.find("value").text());if(r.attr("type")==="jid-multi")return n.form_textarea({name:r.attr("var"),label:r.attr("label")||"",value:r.find("value").text(),required:r.find("required").length});if(r.attr("type")==="boolean")return n.form_checkbox({name:r.attr("var"),type:i[r.attr("type")],label:r.attr("label")||"",checked:r.find("value").text()==="1"&&'checked="1"'||"",required:r.find("required").length});if(r.attr("type")&&r.attr("var")==="username")return n.form_username({domain:" @"+this.domain,name:r.attr("var"),type:i[r.attr("type")],label:r.attr("label")||"",value:r.find("value").text(),required:r.find("required").length});if(r.attr("type"))return n.form_input({name:r.attr("var"),type:i[r.attr("type")],label:r.attr("label")||"",value:r.find("value").text(),required:r.find("required").length});if(r.attr("var")==="ocr")return t.reduce(t.map(r.find("uri"),e.proxy(function(e){return n.form_captcha({label:this.$field.attr("label"),name:this.$field.attr("var"),data:this.$stanza.find('data[cid="'+e.textContent.replace(/^cid:/,"")+'"]').text(),type:e.getAttribute("type"),required:this.$field.find("required").length})},{$stanza:s,$field:r})),function(e,t){return e+t},"")}};return s}),function(e){typeof define=="function"&&define.amd?define("jquery.browser",["jquery"],function(t){return e(t)}):typeof module=="object"&&typeof module.exports=="object"?module.exports=e(require("jquery")):e(window.jQuery)}(function(e){"use strict";function t(e){e===undefined&&(e=window.navigator.userAgent),e=e.toLowerCase();var t=/(edge)\/([\w.]+)/.exec(e)||/(opr)[\/]([\w.]+)/.exec(e)||/(chrome)[ \/]([\w.]+)/.exec(e)||/(version)(applewebkit)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+).*(version)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("trident")>=0&&/(rv)(?::| )([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[],n=/(ipad)/.exec(e)||/(ipod)/.exec(e)||/(iphone)/.exec(e)||/(kindle)/.exec(e)||/(silk)/.exec(e)||/(android)/.exec(e)||/(windows phone)/.exec(e)||/(win)/.exec(e)||/(mac)/.exec(e)||/(linux)/.exec(e)||/(cros)/.exec(e)||/(playbook)/.exec(e)||/(bb)/.exec(e)||/(blackberry)/.exec(e)||[],r={},i={browser:t[5]||t[3]||t[1]||"",version:t[2]||t[4]||"0",versionNumber:t[4]||t[2]||"0",platform:n[0]||""};i.browser&&(r[i.browser]=!0,r.version=i.version,r.versionNumber=parseInt(i.versionNumber,10)),i.platform&&(r[i.platform]=!0);if(r.android||r.bb||r.blackberry||r.ipad||r.iphone||r.ipod||r.kindle||r.playbook||r.silk||r["windows phone"])r.mobile=!0;if(r.cros||r.mac||r.linux||r.win)r.desktop=!0;if(r.chrome||r.opr||r.safari)r.webkit=!0;if(r.rv||r.edge){var s="msie";i.browser=s,r[s]=!0}if(r.safari&&r.blackberry){var o="blackberry";i.browser=o,r[o]=!0}if(r.safari&&r.playbook){var u="playbook";i.browser=u,r[u]=!0}if(r.bb){var a="blackberry";i.browser=a,r[a]=!0}if(r.opr){var f="opera";i.browser=f,r[f]=!0}if(r.safari&&r.android){var l="android";i.browser=l,r[l]=!0}if(r.safari&&r.kindle){var c="kindle";i.browser=c,r[c]=!0}if(r.safari&&r.silk){var h="silk";i.browser=h,r[h]=!0}return r.name=i.browser,r.platform=i.platform,r}return window.jQBrowser=t(window.navigator.userAgent),window.jQBrowser.uaMatch=t,e&&(e.browser=window.jQBrowser),window.jQBrowser});var CryptoJS=CryptoJS||function(e,t){var n={},r=n.lib={},i=r.Base=function(){function e(){}return{extend:function(t){e.prototype=this;var n=new e;return t&&n.mixIn(t),n.hasOwnProperty("init")||(n.init=function(){n.$super.init.apply(this,arguments)}),n.init.prototype=n,n.$super=this,n},create:function(){var e=this.extend();return e.init.apply(e,arguments),e},init:function(){},mixIn:function(e){for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t]);e.hasOwnProperty("toString")&&(this.toString=e.toString)},clone:function(){return this.init.prototype.extend(this)}}}(),s=r.WordArray=i.extend({init:function(e,n){e=this.words=e||[],n!=t?this.sigBytes=n:this.sigBytes=e.length*4},toString:function(e){return(e||u).stringify(this)},concat:function(e){var t=this.words,n=e.words,r=this.sigBytes,i=e.sigBytes;this.clamp();if(r%4)for(var s=0;s<i;s++){var o=n[s>>>2]>>>24-s%4*8&255;t[r+s>>>2]|=o<<24-(r+s)%4*8}else if(n.length>65535)for(var s=0;s<i;s+=4)t[r+s>>>2]=n[s>>>2];else t.push.apply(t,n);return this.sigBytes+=i,this},clamp:function(){var t=this.words,n=this.sigBytes;t[n>>>2]&=4294967295<<32-n%4*8,t.length=e.ceil(n/4)},clone:function(){var e=i.clone.call(this);return e.words=this.words.slice(0),e},random:function(t){var n=[];for(var r=0;r<t;r+=4)n.push(e.random()*4294967296|0);return new s.init(n,t)}}),o=n.enc={},u=o.Hex={stringify:function(e){var t=e.words,n=e.sigBytes,r=[];for(var i=0;i<n;i++){var s=t[i>>>2]>>>24-i%4*8&255;r.push((s>>>4).toString(16)),r.push((s&15).toString(16))}return r.join("")},parse:function(e){var t=e.length,n=[];for(var r=0;r<t;r+=2)n[r>>>3]|=parseInt(e.substr(r,2),16)<<24-r%8*4;return new s.init(n,t/2)}},a=o.Latin1={stringify:function(e){var t=e.words,n=e.sigBytes,r=[];for(var i=0;i<n;i++){var s=t[i>>>2]>>>24-i%4*8&255;r.push(String.fromCharCode(s))}return r.join("")},parse:function(e){var t=e.length,n=[];for(var r=0;r<t;r++)n[r>>>2]|=(e.charCodeAt(r)&255)<<24-r%4*8;return new s.init(n,t)}},f=o.Utf8={stringify:function(e){try{return decodeURIComponent(escape(a.stringify(e)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(e){return a.parse(unescape(encodeURIComponent(e)))}},l=r.BufferedBlockAlgorithm=i.extend({reset:function(){this._data=new s.init,this._nDataBytes=0},_append:function(e){typeof e=="string"&&(e=f.parse(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes},_process:function(t){var n=this._data,r=n.words,i=n.sigBytes,o=this.blockSize,u=o*4,a=i/u;t?a=e.ceil(a):a=e.max((a|0)-this._minBufferSize,0);var f=a*o,l=e.min(f*4,i);if(f){for(var c=0;c<f;c+=o)this._doProcessBlock(r,c);var h=r.splice(0,f);n.sigBytes-=l}return new s.init(h,l)},clone:function(){var e=i.clone.call(this);return e._data=this._data.clone(),e},_minBufferSize:0}),c=r.Hasher=l.extend({cfg:i.extend(),init:function(e){this.cfg=this.cfg.extend(e),this.reset()},reset:function(){l.reset.call(this),this._doReset()},update:function(e){return this._append(e),this._process(),this},finalize:function(e){e&&this._append(e);var t=this._doFinalize();return t},blockSize:16,_createHelper:function(e){return function(t,n){return(new e.init(n)).finalize(t)}},_createHmacHelper:function(e){return function(t,n){return(new h.HMAC.init(e,n)).finalize(t)}}}),h=n.algo={};return n}(Math);define("crypto.core",function(){}),function(){var e=CryptoJS,t=e.lib,n=t.WordArray,r=e.enc,i=r.Base64={stringify:function(e){var t=e.words,n=e.sigBytes,r=this._map;e.clamp();var i=[];for(var s=0;s<n;s+=3){var o=t[s>>>2]>>>24-s%4*8&255,u=t[s+1>>>2]>>>24-(s+1)%4*8&255,a=t[s+2>>>2]>>>24-(s+2)%4*8&255,f=o<<16|u<<8|a;for(var l=0;l<4&&s+l*.75<n;l++)i.push(r.charAt(f>>>6*(3-l)&63))}var c=r.charAt(64);if(c)while(i.length%4)i.push(c);return i.join("")},parse:function(e){var t=e.length,r=this._map,i=r.charAt(64);if(i){var s=e.indexOf(i);s!=-1&&(t=s)}var o=[],u=0;for(var a=0;a<t;a++)if(a%4){var f=r.indexOf(e.charAt(a-1))<<a%4*2,l=r.indexOf(e.charAt(a))>>>6-a%4*2;o[u>>>2]|=(f|l)<<24-u%4*8,u++}return n.create(o,u)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}}(),define("crypto.enc-base64",["crypto.core"],function(){}),function(e){function a(e,t,n,r,i,s,o){var u=e+(t&n|~t&r)+i+o;return(u<<s|u>>>32-s)+t}function f(e,t,n,r,i,s,o){var u=e+(t&r|n&~r)+i+o;return(u<<s|u>>>32-s)+t}function l(e,t,n,r,i,s,o){var u=e+(t^n^r)+i+o;return(u<<s|u>>>32-s)+t}function c(e,t,n,r,i,s,o){var u=e+(n^(t|~r))+i+o;return(u<<s|u>>>32-s)+t}var t=CryptoJS,n=t.lib,r=n.WordArray,i=n.Hasher,s=t.algo,o=[];(function(){for(var t=0;t<64;t++)o[t]=e.abs(e.sin(t+1))*4294967296|0})();var u=s.MD5=i.extend({_doReset:function(){this._hash=new r.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(e,t){for(var n=0;n<16;n++){var r=t+n,i=e[r];e[r]=(i<<8|i>>>24)&16711935|(i<<24|i>>>8)&4278255360}var s=this._hash.words,u=e[t+0],h=e[t+1],p=e[t+2],d=e[t+3],v=e[t+4],m=e[t+5],g=e[t+6],y=e[t+7],b=e[t+8],w=e[t+9],E=e[t+10],S=e[t+11],x=e[t+12],N=e[t+13],C=e[t+14],k=e[t+15],L=s[0],A=s[1],O=s[2],M=s[3];L=a(L,A,O,M,u,7,o[0]),M=a(M,L,A,O,h,12,o[1]),O=a(O,M,L,A,p,17,o[2]),A=a(A,O,M,L,d,22,o[3]),L=a(L,A,O,M,v,7,o[4]),M=a(M,L,A,O,m,12,o[5]),O=a(O,M,L,A,g,17,o[6]),A=a(A,O,M,L,y,22,o[7]),L=a(L,A,O,M,b,7,o[8]),M=a(M,L,A,O,w,12,o[9]),O=a(O,M,L,A,E,17,o[10]),A=a(A,O,M,L,S,22,o[11]),L=a(L,A,O,M,x,7,o[12]),M=a(M,L,A,O,N,12,o[13]),O=a(O,M,L,A,C,17,o[14]),A=a(A,O,M,L,k,22,o[15]),L=f(L,A,O,M,h,5,o[16]),M=f(M,L,A,O,g,9,o[17]),O=f(O,M,L,A,S,14,o[18]),A=f(A,O,M,L,u,20,o[19]),L=f(L,A,O,M,m,5,o[20]),M=f(M,L,A,O,E,9,o[21]),O=f(O,M,L,A,k,14,o[22]),A=f(A,O,M,L,v,20,o[23]),L=f(L,A,O,M,w,5,o[24]),M=f(M,L,A,O,C,9,o[25]),O=f(O,M,L,A,d,14,o[26]),A=f(A,O,M,L,b,20,o[27]),L=f(L,A,O,M,N,5,o[28]),M=f(M,L,A,O,p,9,o[29]),O=f(O,M,L,A,y,14,o[30]),A=f(A,O,M,L,x,20,o[31]),L=l(L,A,O,M,m,4,o[32]),M=l(M,L,A,O,b,11,o[33]),O=l(O,M,L,A,S,16,o[34]),A=l(A,O,M,L,C,23,o[35]),L=l(L,A,O,M,h,4,o[36]),M=l(M,L,A,O,v,11,o[37]),O=l(O,M,L,A,y,16,o[38]),A=l(A,O,M,L,E,23,o[39]),L=l(L,A,O,M,N,4,o[40]),M=l(M,L,A,O,u,11,o[41]),O=l(O,M,L,A,d,16,o[42]),A=l(A,O,M,L,g,23,o[43]),L=l(L,A,O,M,w,4,o[44]),M=l(M,L,A,O,x,11,o[45]),O=l(O,M,L,A,k,16,o[46]),A=l(A,O,M,L,p,23,o[47]),L=c(L,A,O,M,u,6,o[48]),M=c(M,L,A,O,y,10,o[49]),O=c(O,M,L,A,C,15,o[50]),A=c(A,O,M,L,m,21,o[51]),L=c(L,A,O,M,x,6,o[52]),M=c(M,L,A,O,d,10,o[53]),O=c(O,M,L,A,E,15,o[54]),A=c(A,O,M,L,h,21,o[55]),L=c(L,A,O,M,b,6,o[56]),M=c(M,L,A,O,k,10,o[57]),O=c(O,M,L,A,g,15,o[58]),A=c(A,O,M,L,N,21,o[59]),L=c(L,A,O,M,v,6,o[60]),M=c(M,L,A,O,S,10,o[61]),O=c(O,M,L,A,p,15,o[62]),A=c(A,O,M,L,w,21,o[63]),s[0]=s[0]+L|0,s[1]=s[1]+A|0,s[2]=s[2]+O|0,s[3]=s[3]+M|0},_doFinalize:function(){var t=this._data,n=t.words,r=this._nDataBytes*8,i=t.sigBytes*8;n[i>>>5]|=128<<24-i%32;var s=e.floor(r/4294967296),o=r;n[(i+64>>>9<<4)+15]=(s<<8|s>>>24)&16711935|(s<<24|s>>>8)&4278255360,n[(i+64>>>9<<4)+14]=(o<<8|o>>>24)&16711935|(o<<24|o>>>8)&4278255360,t.sigBytes=(n.length+1)*4,this._process();var u=this._hash,a=u.words;for(var f=0;f<4;f++){var l=a[f];a[f]=(l<<8|l>>>24)&16711935|(l<<24|l>>>8)&4278255360}return u},clone:function(){var e=i.clone.call(this);return e._hash=this._hash.clone(),e}});t.MD5=i._createHelper(u),t.HmacMD5=i._createHmacHelper(u)}(Math),define("crypto.md5",["crypto.core"],function(){}),function(){var e=CryptoJS,t=e.lib,n=t.Base,r=t.WordArray,i=e.algo,s=i.MD5,o=i.EvpKDF=n.extend({cfg:n.extend({keySize:4,hasher:s,iterations:1}),init:function(e){this.cfg=this.cfg.extend(e)},compute:function(e,t){var n=this.cfg,i=n.hasher.create(),s=r.create(),o=s.words,u=n.keySize,a=n.iterations;while(o.length<u){f&&i.update(f);var f=i.update(e).finalize(t);i.reset();for(var l=1;l<a;l++)f=i.finalize(f),i.reset();s.concat(f)}return s.sigBytes=u*4,s}});e.EvpKDF=function(e,t,n){return o.create(n).compute(e,t)}}(),define("crypto.evpkdf",["crypto.md5"],function(){}),CryptoJS.lib.Cipher||function(e){var t=CryptoJS,n=t.lib,r=n.Base,i=n.WordArray,s=n.BufferedBlockAlgorithm,o=t.enc,u=o.Utf8,a=o.Base64,f=t.algo,l=f.EvpKDF,c=n.Cipher=s.extend({cfg:r.extend(),createEncryptor:function(e,t){return this.create(this._ENC_XFORM_MODE,e,t)},createDecryptor:function(e,t){return this.create(this._DEC_XFORM_MODE,e,t)},init:function(e,t,n){this.cfg=this.cfg.extend(n),this._xformMode=e,this._key=t,this.reset()},reset:function(){s.reset.call(this),this._doReset()},process:function(e){return this._append(e),this._process()},finalize:function(e){e&&this._append(e);var t=this._doFinalize();return t},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(){function e(e){return typeof e=="string"?N:S}return function(t){return{encrypt:function(n,r,i){return e(r).encrypt(t,n,r,i)},decrypt:function(n,r,i){return e(r).decrypt(t,n,r,i)}}}}()}),h=n.StreamCipher=c.extend({_doFinalize:function(){var e=this._process(!0);return e},blockSize:1}),p=t.mode={},d=n.BlockCipherMode=r.extend({createEncryptor:function(e,t){return this.Encryptor.create(e,t)},createDecryptor:function(e,t){return this.Decryptor.create(e,t)},init:function(e,t){this._cipher=e,this._iv=t}}),v=p.CBC=function(){function n(t,n,r){var i=this._iv;if(i){var s=i;this._iv=e}else var s=this._prevBlock;for(var o=0;o<r;o++)t[n+o]^=s[o]}var t=d.extend();return t.Encryptor=t.extend({processBlock:function(e,t){var r=this._cipher,i=r.blockSize;n.call(this,e,t,i),r.encryptBlock(e,t),this._prevBlock=e.slice(t,t+i)}}),t.Decryptor=t.extend({processBlock:function(e,t){var r=this._cipher,i=r.blockSize,s=e.slice(t,t+i);r.decryptBlock(e,t),n.call(this,e,t,i),this._prevBlock=s}}),t}(),m=t.pad={},g=m.Pkcs7={pad:function(e,t){var n=t*4,r=n-e.sigBytes%n,s=r<<24|r<<16|r<<8|r,o=[];for(var u=0;u<r;u+=4)o.push(s);var a=i.create(o,r);e.concat(a)},unpad:function(e){var t=e.words[e.sigBytes-1>>>2]&255;e.sigBytes-=t}},y=n.BlockCipher=c.extend({cfg:c.cfg.extend({mode:v,padding:g}),reset:function(){c.reset.call(this);var e=this.cfg,t=e.iv,n=e.mode;if(this._xformMode==this._ENC_XFORM_MODE)var r=n.createEncryptor;else{var r=n.createDecryptor;this._minBufferSize=1}this._mode=r.call(n,this,t&&t.words)},_doProcessBlock:function(e,t){this._mode.processBlock(e,t)},_doFinalize:function(){var e=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){e.pad(this._data,this.blockSize);var t=this._process(!0)}else{var t=this._process(!0);e.unpad(t)}return t},blockSize:4}),b=n.CipherParams=r.extend({init:function(e){this.mixIn(e)},toString:function(e){return(e||this.formatter).stringify(this)}}),w=t.format={},E=w.OpenSSL={stringify:function(e){var t=e.ciphertext,n=e.salt;if(n)var r=i.create([1398893684,1701076831]).concat(n).concat(t);else var r=t;return r.toString(a)},parse:function(e){var t=a.parse(e),n=t.words;if(n[0]==1398893684&&n[1]==1701076831){var r=i.create(n.slice(2,4));n.splice(0,4),t.sigBytes-=16}return b.create({ciphertext:t,salt:r})}},S=n.SerializableCipher=r.extend({cfg:r.extend({format:E}),encrypt:function(e,t,n,r){r=this.cfg.extend(r);var i=e.createEncryptor(n,r),s=i.finalize(t),o=i.cfg;return b.create({ciphertext:s,key:n,iv:o.iv,algorithm:e,mode:o.mode,padding:o.padding,blockSize:e.blockSize,formatter:r.format})},decrypt:function(e,t,n,r){r=this.cfg.extend(r),t=this._parse(t,r.format);var i=e.createDecryptor(n,r).finalize(t.ciphertext);return i},_parse:function(e,t){return typeof e=="string"?t.parse(e,this):e}}),x=t.kdf={},T=x.OpenSSL={execute:function(e,t,n,r){r||(r=i.random(8));var s=l.create({keySize:t+n}).compute(e,r),o=i.create(s.words.slice(t),n*4);return s.sigBytes=t*4,b.create({key:s,iv:o,salt:r})}},N=n.PasswordBasedCipher=S.extend({cfg:S.cfg.extend({kdf:T}),encrypt:function(e,t,n,r){r=this.cfg.extend(r);var i=r.kdf.execute(n,e.keySize,e.ivSize);r.iv=i.iv;var s=S.encrypt.call(this,e,t,i.key,r);return s.mixIn(i),s},decrypt:function(e,t,n,r){r=this.cfg.extend(r),t=this._parse(t,r.format);var i=r.kdf.execute(n,e.keySize,e.ivSize,t.salt);r.iv=i.iv;var s=S.decrypt.call(this,e,t,i.key,r);return s}})}(),define("crypto.cipher-core",["crypto.enc-base64","crypto.evpkdf"],function(){}),function(){var e=CryptoJS,t=e.lib,n=t.BlockCipher,r=e.algo,i=[],s=[],o=[],u=[],a=[],f=[],l=[],c=[],h=[],p=[];(function(){var e=[];for(var t=0;t<256;t++)t<128?e[t]=t<<1:e[t]=t<<1^283;var n=0,r=0;for(var t=0;t<256;t++){var d=r^r<<1^r<<2^r<<3^r<<4;d=d>>>8^d&255^99,i[n]=d,s[d]=n;var v=e[n],m=e[v],g=e[m],y=e[d]*257^d*16843008;o[n]=y<<24|y>>>8,u[n]=y<<16|y>>>16,a[n]=y<<8|y>>>24,f[n]=y;var y=g*16843009^m*65537^v*257^n*16843008;l[d]=y<<24|y>>>8,c[d]=y<<16|y>>>16,h[d]=y<<8|y>>>24,p[d]=y,n?(n=v^e[e[e[g^v]]],r^=e[e[r]]):n=r=1}})();var d=[0,1,2,4,8,16,32,64,128,27,54],v=r.AES=n.extend({_doReset:function(){var e=this._key,t=e.words,n=e.sigBytes/4,r=this._nRounds=n+6,s=(r+1)*4,o=this._keySchedule=[];for(var u=0;u<s;u++)if(u<n)o[u]=t[u];else{var a=o[u-1];u%n?n>6&&u%n==4&&(a=i[a>>>24]<<24|i[a>>>16&255]<<16|i[a>>>8&255]<<8|i[a&255]):(a=a<<8|a>>>24,a=i[a>>>24]<<24|i[a>>>16&255]<<16|i[a>>>8&255]<<8|i[a&255],a^=d[u/n|0]<<24),o[u]=o[u-n]^a}var f=this._invKeySchedule=[];for(var v=0;v<s;v++){var u=s-v;if(v%4)var a=o[u];else var a=o[u-4];v<4||u<=4?f[v]=a:f[v]=l[i[a>>>24]]^c[i[a>>>16&255]]^h[i[a>>>8&255]]^p[i[a&255]]}},encryptBlock:function(e,t){this._doCryptBlock(e,t,this._keySchedule,o,u,a,f,i)},decryptBlock:function(e,t){var n=e[t+1];e[t+1]=e[t+3],e[t+3]=n,this._doCryptBlock(e,t,this._invKeySchedule,l,c,h,p,s);var n=e[t+1];e[t+1]=e[t+3],e[t+3]=n},_doCryptBlock:function(e,t,n,r,i,s,o,u){var a=this._nRounds,f=e[t]^n[0],l=e[t+1]^n[1],c=e[t+2]^n[2],h=e[t+3]^n[3],p=4;for(var d=1;d<a;d++){var v=r[f>>>24]^i[l>>>16&255]^s[c>>>8&255]^o[h&255]^n[p++],m=r[l>>>24]^i[c>>>16&255]^s[h>>>8&255]^o[f&255]^n[p++],g=r[c>>>24]^i[h>>>16&255]^s[f>>>8&255]^o[l&255]^n[p++],y=r[h>>>24]^i[f>>>16&255]^s[l>>>8&255]^o[c&255]^n[p++];f=v,l=m,c=g,h=y}var v=(u[f>>>24]<<24|u[l>>>16&255]<<16|u[c>>>8&255]<<8|u[h&255])^n[p++],m=(u[l>>>24]<<24|u[c>>>16&255]<<16|u[h>>>8&255]<<8|u[f&255])^n[p++],g=(u[c>>>24]<<24|u[h>>>16&255]<<16|u[f>>>8&255]<<8|u[l&255])^n[p++],y=(u[h>>>24]<<24|u[f>>>16&255]<<16|u[l>>>8&255]<<8|u[c&255])^n[p++];e[t]=v,e[t+1]=m,e[t+2]=g,e[t+3]=y},keySize:8});e.AES=n._createHelper(v)}(),define("crypto.aes",["crypto.cipher-core"],function(){}),function(){var e=CryptoJS,t=e.lib,n=t.WordArray,r=t.Hasher,i=e.algo,s=[],o=i.SHA1=r.extend({_doReset:function(){this._hash=new n.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(e,t){var n=this._hash.words,r=n[0],i=n[1],o=n[2],u=n[3],a=n[4];for(var f=0;f<80;f++){if(f<16)s[f]=e[t+f]|0;else{var l=s[f-3]^s[f-8]^s[f-14]^s[f-16];s[f]=l<<1|l>>>31}var c=(r<<5|r>>>27)+a+s[f];f<20?c+=(i&o|~i&u)+1518500249:f<40?c+=(i^o^u)+1859775393:f<60?c+=(i&o|i&u|o&u)-1894007588:c+=(i^o^u)-899497514,a=u,u=o,o=i<<30|i>>>2,i=r,r=c}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+o|0,n[3]=n[3]+u|0,n[4]=n[4]+a|0},_doFinalize:function(){var e=this._data,t=e.words,n=this._nDataBytes*8,r=e.sigBytes*8;return t[r>>>5]|=128<<24-r%32,t[(r+64>>>9<<4)+14]=Math.floor(n/4294967296),t[(r+64>>>9<<4)+15]=n,e.sigBytes=t.length*4,this._process(),this._hash},clone:function(){var e=r.clone.call(this);return e._hash=this._hash.clone(),e}});e.SHA1=r._createHelper(o),e.HmacSHA1=r._createHmacHelper(o)}(),define("crypto.sha1",["crypto.core"],function(){}),function(e){var t=CryptoJS,n=t.lib,r=n.WordArray,i=n.Hasher,s=t.algo,o=[],u=[];(function(){function t(t){var n=e.sqrt(t);for(var r=2;r<=n;r++)if(!(t%r))return!1;return!0}function n(e){return(e-(e|0))*4294967296|0}var r=2,i=0;while(i<64)t(r)&&(i<8&&(o[i]=n(e.pow(r,.5))),u[i]=n(e.pow(r,1/3)),i++),r++})();var a=[],f=s.SHA256=i.extend({_doReset:function(){this._hash=new r.init(o.slice(0))},_doProcessBlock:function(e,t){var n=this._hash.words,r=n[0],i=n[1],s=n[2],o=n[3],f=n[4],l=n[5],c=n[6],h=n[7];for(var p=0;p<64;p++){if(p<16)a[p]=e[t+p]|0;else{var d=a[p-15],v=(d<<25|d>>>7)^(d<<14|d>>>18)^d>>>3,m=a[p-2],g=(m<<15|m>>>17)^(m<<13|m>>>19)^m>>>10;a[p]=v+a[p-7]+g+a[p-16]}var y=f&l^~f&c,b=r&i^r&s^i&s,w=(r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22),E=(f<<26|f>>>6)^(f<<21|f>>>11)^(f<<7|f>>>25),S=h+E+y+u[p]+a[p],x=w+b;h=c,c=l,l=f,f=o+S|0,o=s,s=i,i=r,r=S+x|0}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+s|0,n[3]=n[3]+o|0,n[4]=n[4]+f|0,n[5]=n[5]+l|0,n[6]=n[6]+c|0,n[7]=n[7]+h|0},_doFinalize:function(){var t=this._data,n=t.words,r=this._nDataBytes*8,i=t.sigBytes*8;return n[i>>>5]|=128<<24-i%32,n[(i+64>>>9<<4)+14]=e.floor(r/4294967296),n[(i+64>>>9<<4)+15]=r,t.sigBytes=n.length*4,this._process(),this._hash},clone:function(){var e=i.clone.call(this);return e._hash=this._hash.clone(),e}});t.SHA256=i._createHelper(f),t.HmacSHA256=i._createHmacHelper(f)}(Math),define("crypto.sha256",["crypto.core"],function(){}),function(){var e=CryptoJS,t=e.lib,n=t.Base,r=e.enc,i=r.Utf8,s=e.algo,o=s.HMAC=n.extend({init:function(e,t){e=this._hasher=new e.init,typeof t=="string"&&(t=i.parse(t));var n=e.blockSize,r=n*4;t.sigBytes>r&&(t=e.finalize(t)),t.clamp();var s=this._oKey=t.clone(),o=this._iKey=t.clone(),u=s.words,a=o.words;for(var f=0;f<n;f++)u[f]^=1549556828,a[f]^=909522486;s.sigBytes=o.sigBytes=r,this.reset()},reset:function(){var e=this._hasher;e.reset(),e.update(this._iKey)},update:function(e){return this._hasher.update(e),this},finalize:function(e){var t=this._hasher,n=t.finalize(e);t.reset();var r=t.finalize(this._oKey.clone().concat(n));return r}})}(),define("crypto.hmac",["crypto.core"],function(){}),CryptoJS.pad.NoPadding={pad:function(){},unpad:function(){}},define("crypto.pad-nopadding",["crypto.cipher-core"],function(){}),CryptoJS.mode.CTR=function(){var e=CryptoJS.lib.BlockCipherMode.extend(),t=e.Encryptor=e.extend({processBlock:function(e,t){var n=this._cipher,r=n.blockSize,i=this._iv,s=this._counter;i&&(s=this._counter=i.slice(0),this._iv=undefined);var o=s.slice(0);n.encryptBlock(o,0),s[r-1]=s[r-1]+1|0;for(var u=0;u<r;u++)e[t+u]^=o[u]}});return e.Decryptor=t,e}(),define("crypto.mode-ctr",["crypto.cipher-core"],function(){}),function(e,t){typeof define=="function"&&define.amd?define("crypto",["crypto.core","crypto.enc-base64","crypto.md5","crypto.evpkdf","crypto.cipher-core","crypto.aes","crypto.sha1","crypto.sha256","crypto.hmac","crypto.pad-nopadding","crypto.mode-ctr"],function(){return CryptoJS}):e.CryptoJS=t()}(this),function(e,t){typeof define=="function"&&define.amd?define("bigint",[],t.bind(e,e.crypto||e.msCrypto)):typeof module!="undefined"&&module.exports?module.exports=t(require("crypto")):e.BigInt=t(e.crypto||e.msCrypto)}(this,function(e){function G(e){var t,n,r,i;n=new Array(e);for(t=0;t<e;t++)n[t]=0;n[0]=2,r=0;for(;n[r]<e;){for(t=n[r]*n[r];t<e;t+=n[r])n[t]=1;r++,n[r]=n[r-1]+1;for(;n[r]<e&&n[n[r]];n[r]++);}i=new Array(r);for(t=0;t<r;t++)i[t]=n[t];return i}function Y(e,t){return y.length!=e.length&&(y=Pt(e),b=Pt(e),w=Pt(e)),Bt(w,t),Z(e,w)}function Z(e,n){var r,i,s,o;y.length!=e.length&&(y=Pt(e),b=Pt(e),w=Pt(e)),Ht(w,n),Ht(b,e),Ht(y,e),jt(b,-1),jt(y,-1);if(_t(b))return 0;for(s=0;b[s]==0;s++);for(r=1,i=2;b[s]%i==0;i*=2,r++);o=s*t+r-1,o&&Ft(b,o),en(w,b,e);if(!Ot(w,1)&&!Mt(w,y)){i=1;while(i<=o-1&&!Mt(w,y)){Yt(w,e);if(Ot(w,1))return 0;i++}if(!Mt(w,y))return 0}return 1}function et(e){var n,r,i;for(n=e.length-1;e[n]==0&&n>0;n--);for(r=0,i=e[n];i;i>>=1,r++);return r+=t*n,r}function tt(e,n){var r=Lt(0,(e.length>n?e.length:n)*t,0);return Ht(r,e),r}function nt(e){var t=Lt(0,e,0);return pt(t,e),Zt(t,1)}function rt(e){return e>=600?it(e,2):e>=550?it(e,4):e>=500?it(e,5):e>=400?it(e,6):e>=350?it(e,7):e>=300?it(e,9):e>=250?it(e,12):e>=200?it(e,15):e>=150?it(e,18):e>=100?it(e,27):it(e,40)}function it(e,t){var n,r,i,s;s=3e4,n=Lt(0,e,0),P.length==0&&(P=G(3e4)),Q.length!=n.length&&(Q=Pt(n));for(;;){vt(n,e,0),n[0]|=1,i=0;for(r=0;r<P.length&&P[r]<=s;r++)if(kt(n,P[r])==0&&!Ot(n,P[r])){i=1;break}for(r=0;r<t&&!i;r++){vt(Q,e,0);while(!Tt(n,Q))vt(Q,e,0);Z(n,Q)||(i=1)}if(!i)return n}}function st(e,t){var n=Pt(e);return Qt(n,t),Zt(n,1)}function ot(e,t){var n=tt(e,e.length+1);return jt(n,t),Zt(n,1)}function ut(e,t){var n=tt(e,e.length+t.length);return Kt(n,t),Zt(n,1)}function at(e,t,n){var r=tt(e,n.length);return en(r,Zt(t,2),Zt(n,2),0),Zt(r,1)}function ft(e,t){var n=tt(e,e.length>t.length?e.length+1:t.length+1);return $t(n,t),Zt(n,1)}function lt(e,t){var n=tt(e,e.length>t.length?e.length+1:t.length+1);return Jt(n,t),Zt(n,1)}function ct(e,t){var n=tt(e,t.length),r;return r=yt(n,t),r?Zt(n,1):null}function ht(e,t,n){var r=tt(e,n.length);return Gt(r,t,n),Zt(r,1)}function pt(e,n){var r,i,s,o,u,a,f,l,c,h,p,d,v;P.length==0&&(P=G(3e4));if(H.length==0){H=new Array(512);for(a=0;a<512;a++)H[a]=Math.pow(2,a/511-1)}r=.1,s=20,v=20,j.length!=e.length&&(j=Pt(e),F=Pt(e),R=Pt(e),z=Pt(e),V=Pt(e),$=Pt(e),J=Pt(e),X=Pt(e),W=Pt(e),B=Pt(e),I=Pt(e),q=Pt(e),U=Pt(e),K=Pt(e));if(n<=v){o=(1<<(n+2>>1))-1,Bt(e,0);for(u=1;u;){u=0,e[0]=1|1<<n-1|hn(n);for(a=1;a<P.length&&(P[a]&o)==P[a];a++)if(0==e[0]%P[a]){u=1;break}}Ct(e);return}l=r*n*n;if(n>2*s)for(f=1;n-n*f<=s;)f=H[hn(9)];else f=.5;d=Math.floor(f*n)+1,pt(q,d),Bt(j,0),j[Math.floor((n-2)/t)]|=1<<(n-2)%t,Nt(j,q,B,I),h=et(B);for(;;){for(;;){vt(F,h,0);if(Tt(B,F))break}jt(F,1),Jt(F,B),Ht(W,q),Kt(W,F),Rt(W,2),jt(W,1),Ht(z,F),Rt(z,2);for(c=0,a=0;a<P.length&&P[a]<l;a++)if(kt(W,P[a])==0&&!Ot(W,P[a])){c=1;break}c||Y(W,2)||(c=1);if(!c){jt(W,-3);for(a=W.length-1;W[a]==0&&a>0;a--);for(p=0,i=W[a];i;i>>=1,p++);p+=t*a;for(;;){vt(U,p,0);if(Tt(W,U))break}jt(W,3),jt(U,2),Ht(X,U),Ht(R,W),jt(R,-1),en(X,R,W),jt(X,-1);if(_t(X)){Ht(X,U),en(X,z,W),jt(X,-1),Ht(K,W),Ht(V,X),gt(V,W);if(Ot(V,1)){Ht(e,K);return}}}}}function dt(e,n){var r,i;return r=Math.floor((e-1)/t)+2,i=Lt(0,0,r),vt(i,e,n),i}function vt(e,n,r){var i,s;for(i=0;i<e.length;i++)e[i]=0;s=Math.floor((n-1)/t)+1;for(i=0;i<s;i++)e[i]=hn(t);e[s-1]&=(2<<(n-1)%t)-1,r==1&&(e[s-1]|=1<<(n-1)%t)}function mt(e,t){var n,r;return n=Pt(e),r=Pt(t),gt(n,r),n}function gt(e,t){var n,r,i,s,u,a,f,l,c,h;m.length!=e.length&&(m=Pt(e)),c=1;while(c){c=0;for(n=1;n<t.length;n++)if(t[n]){c=1;break}if(!c)break;for(n=e.length;!e[n]&&n>=0;n--);r=e[n],i=t[n],s=1,u=0,a=0,f=1;while(i+a&&i+f){l=Math.floor((r+s)/(i+a)),h=Math.floor((r+u)/(i+f));if(l!=h)break;o=s-l*a,s=a,a=o,o=u-l*f,u=f,f=o,o=r-l*i,r=i,i=o}u?(Ht(m,e),zt(e,t,s,u),zt(t,m,f,a)):(Qt(e,t),Ht(m,e),Ht(e,t),Ht(t,m))}if(t[0]==0)return;o=kt(e,t[0]),Bt(e,t[0]),t[0]=o;while(t[0])e[0]%=t[0],o=e[0],e[0]=t[0],t[0]=o}function yt(e,t){var n=1+2*Math.max(e.length,t.length);if(!(e[0]&1)&&!(t[0]&1))return Bt(e,0),0;S.length!=n&&(S=new Array(n),E=new Array(n),x=new Array(n),T=new Array(n),N=new Array(n),C=new Array(n)),Ht(S,e),Ht(E,t),Bt(x,1),Bt(T,0),Bt(N,0),Bt(C,1);for(;;){while(!(S[0]&1))It(S),!(x[0]&1)&&!(T[0]&1)?(It(x),It(T)):(Jt(x,t),It(x),$t(T,e),It(T));while(!(E[0]&1))It(E),!(N[0]&1)&&!(C[0]&1)?(It(N),It(C)):(Jt(N,t),It(N),$t(C,e),It(C));Tt(E,S)?($t(E,S),$t(N,x),$t(C,T)):($t(S,E),$t(x,N),$t(T,C));if(Ot(S,0)){while(St(N))Jt(N,t);return Ht(e,N),Ot(E,1)?1:(Bt(e,0),0)}}}function bt(e,t){var n=1,r=0,i;for(;;){if(e==1)return n;if(e==0)return 0;r-=n*Math.floor(t/e),t%=e;if(t==1)return r;if(t==0)return 0;n-=r*Math.floor(e/t),e%=t}}function wt(e,t){return bt(e,t)}function Et(e,t,n,r,i){var s=0,o=Math.max(e.length,t.length);S.length!=o&&(S=new Array(o),x=new Array(o),T=new Array(o),N=new Array(o),C=new Array(o));while(!(e[0]&1)&&!(t[0]&1))It(e),It(t),s++;Ht(S,e),Ht(n,t),Bt(x,1),Bt(T,0),Bt(N,0),Bt(C,1);for(;;){while(!(S[0]&1))It(S),!(x[0]&1)&&!(T[0]&1)?(It(x),It(T)):(Jt(x,t),It(x),$t(T,e),It(T));while(!(n[0]&1))It(n),!(N[0]&1)&&!(C[0]&1)?(It(N),It(C)):(Jt(N,t),It(N),$t(C,e),It(C));Tt(n,S)?($t(n,S),$t(N,x),$t(C,T)):($t(S,n),$t(x,N),$t(T,C));if(Ot(S,0)){while(St(N))Jt(N,t),$t(C,e);Rt(C,-1),Ht(r,N),Ht(i,C),qt(n,s);return}}}function St(e){return e[e.length-1]>>t-1&1}function xt(e,t,n){var r,i=e.length,s=t.length,o=i+n<s?i+n:s;for(r=s-1-n;r<i&&r>=0;r++)if(e[r]>0)return 1;for(r=i-1+n;r<s;r++)if(t[r]>0)return 0;for(r=o-1;r>=n;r--){if(e[r-n]>t[r])return 1;if(e[r-n]<t[r])return 0}return 0}function Tt(e,t){var n,r=e.length<t.length?e.length:t.length;for(n=e.length;n<t.length;n++)if(t[n])return 0;for(n=t.length;n<e.length;n++)if(e[n])return 1;for(n=r-1;n>=0;n--){if(e[n]>t[n])return 1;if(e[n]<t[n])return 0}return 0}function Nt(e,i,s,o){var u,a,f,l,c,h,p,d,v;Ht(o,e);for(a=i.length;i[a-1]==0;a--);v=i[a-1];for(d=0;v;d++)v>>=1;d=t-d,qt(i,d),qt(o,d);for(u=o.length;o[u-1]==0&&u>a;u--);Bt(s,0);while(!xt(i,o,u-a))Vt(o,i,u-a),s[u-a]++;for(f=u-1;f>=a;f--){o[f]==i[a-1]?s[f-a]=r:s[f-a]=Math.floor((o[f]*n+o[f-1])/i[a-1]);for(;;){h=(a>1?i[a-2]:0)*s[f-a],p=h,h&=r,p=(p-h)/n,c=p+s[f-a]*i[a-1],p=c,c&=r,p=(p-c)/n;if(!(p==o[f]?c==o[f-1]?h>(f>1?o[f-2]:0):c>o[f-1]:p>o[f]))break;s[f-a]--}Wt(o,i,-s[f-a],f-a),St(o)&&(Xt(o,i,f-a),s[f-a]--)}Ft(i,d),Ft(o,d)}function Ct(e){var t,i,s,o;i=e.length,s=0;for(t=0;t<i;t++)s+=e[t],o=0,s<0&&(o=s&r,o=-((s-o)/n),s+=o*n),e[t]=s&r,s=(s-e[t])/n-o}function kt(e,t){var r,i=0;for(r=e.length-1;r>=0;r--)i=(i*n+e[r])%t;return i}function Lt(e,n,r){var i,s,o;return s=Math.ceil(n/t)+1,s=r>s?r:s,o=new Array(s),Bt(o,e),o}function At(e,t,n){var r,s,o,u,a,f,l=e.length;if(t==-1){u=new Array(0);for(;;){a=new Array(u.length+1);for(s=0;s<u.length;s++)a[s+1]=u[s];a[0]=parseInt(e,10),u=a,r=e.indexOf(",",0);if(r<1)break;e=e.substring(r+1);if(e.length==0)break}return u.length<n?(a=new Array(n),Ht(a,u),a):u}var c=t,h=0,p=t==1?l:0;while(c>1)c&1&&(h=1),p+=l,c>>=1;p+=h*l,u=Lt(0,p,0);for(s=0;s<l;s++){r=i.indexOf(e.substring(s,s+1),0),t<=36&&r>=36&&(r-=26);if(r>=t||r<0)break;Rt(u,t),jt(u,r)}for(l=u.length;l>0&&!u[l-1];l--);l=n>l+1?n:l+1,a=new Array(l),f=l<u.length?l:u.length;for(s=0;s<f;s++)a[s]=u[s];for(;s<l;s++)a[s]=0;return a}function Ot(e,t){var n;if(e[0]!=t)return 0;for(n=1;n<e.length;n++)if(e[n])return 0;return 1}function Mt(e,t){var n,r=e.length<t.length?e.length:t.length;for(n=0;n<r;n++)if(e[n]!=t[n])return 0;if(e.length>t.length){for(;n<e.length;n++)if(e[n])return 0}else for(;n<t.length;n++)if(t[n])return 0;return 1}function _t(e){var t;for(t=0;t<e.length;t++)if(e[t])return 0;return 1}function Dt(e,t){var n,r,s="";d.length!=e.length?d=Pt(e):Ht(d,e);if(t==-1){for(n=e.length-1;n>0;n--)s+=e[n]+",";s+=e[0]}else while(!_t(d))r=Ut(d,t),s=i.substring(r,r+1)+s;return s.length==0&&(s="0"),s}function Pt(e){var t,n;return n=new Array(e.length),Ht(n,e),n}function Ht(e,t){var n,r=e.length<t.length?e.length:t.length;for(n=0;n<r;n++)e[n]=t[n];for(n=r;n<e.length;n++)e[n]=0}function Bt(e,n){var i,s;for(s=n,i=0;i<e.length;i++)e[i]=s&r,s>>=t}function jt(e,t){var i,s,o,u;e[0]+=t,s=e.length,o=0;for(i=0;i<s;i++){o+=e[i],u=0,o<0&&(u=o&r,u=-((o-u)/n),o+=u*n),e[i]=o&r,o=(o-e[i])/n-u;if(!o)return}}function Ft(e,n){var i,s=Math.floor(n/t);if(s){for(i=0;i<e.length-s;i++)e[i]=e[i+s];for(;i<e.length;i++)e[i]=0;n%=t}for(i=0;i<e.length-1;i++)e[i]=r&(e[i+1]<<t-n|e[i]>>n);e[i]>>=n}function It(e){var i;for(i=0;i<e.length-1;i++)e[i]=r&(e[i+1]<<t-1|e[i]>>1);e[i]=e[i]>>1|e[i]&n>>1}function qt(e,n){var i,s=Math.floor(n/t);if(s){for(i=e.length;i>=s;i--)e[i]=e[i-s];for(;i>=0;i--)e[i]=0;n%=t}if(!n)return;for(i=e.length-1;i>0;i--)e[i]=r&(e[i]<<n|e[i-1]>>t-n);e[i]=r&e[i]<<n}function Rt(e,t){var i,s,o,u;if(!t)return;s=e.length,o=0;for(i=0;i<s;i++)o+=e[i]*t,u=0,o<0&&(u=o&r,u=-((o-u)/n),o+=u*n),e[i]=o&r,o=(o-e[i])/n-u}function Ut(e,t){var r,i=0,s;for(r=e.length-1;r>=0;r--)s=i*n+e[r],e[r]=Math.floor(s/t),i=s%t;return i}function zt(e,t,i,s){var o,u,a,f;a=e.length<t.length?e.length:t.length,f=e.length;for(u=0,o=0;o<a;o++)u+=i*e[o]+s*t[o],e[o]=u&r,u=(u-e[o])/n;for(o=a;o<f;o++)u+=i*e[o],e[o]=u&r,u=(u-e[o])/n}function Wt(e,t,i,s){var o,u,a,f;a=e.length<s+t.length?e.length:s+t.length,f=e.length;for(u=0,o=s;o<a;o++)u+=e[o]+i*t[o-s],e[o]=u&r,u=(u-e[o])/n;for(o=a;u&&o<f;o++)u+=e[o],e[o]=u&r,u=(u-e[o])/n}function Xt(e,t,i){var s,o,u,a;u=e.length<i+t.length?e.length:i+t.length,a=e.length;for(o=0,s=i;s<u;s++)o+=e[s]+t[s-i],e[s]=o&r,o=(o-e[s])/n;for(s=u;o&&s<a;s++)o+=e[s],e[s]=o&r,o=(o-e[s])/n}function Vt(e,t,i){var s,o,u,a;u=e.length<i+t.length?e.length:i+t.length,a=e.length;for(o=0,s=i;s<u;s++)o+=e[s]-t[s-i],e[s]=o&r,o=(o-e[s])/n;for(s=u;o&&s<a;s++)o+=e[s],e[s]=o&r,o=(o-e[s])/n}function $t(e,t){var i,s,o,u;o=e.length<t.length?e.length:t.length;for(s=0,i=0;i<o;i++)s+=e[i]-t[i],e[i]=s&r,s=(s-e[i])/n;for(i=o;s&&i<e.length;i++)s+=e[i],e[i]=s&r,s=(s-e[i])/n}function Jt(e,t){var i,s,o,u;o=e.length<t.length?e.length:t.length;for(s=0,i=0;i<o;i++)s+=e[i]+t[i],e[i]=s&r,s=(s-e[i])/n;for(i=o;s&&i<e.length;i++)s+=e[i],e[i]=s&r,s=(s-e[i])/n}function Kt(e,t){var n;u.length!=2*e.length&&(u=new Array(2*e.length)),Bt(u,0);for(n=0;n<t.length;n++)t[n]&&Wt(u,e,t[n],n);Ht(e,u)}function Qt(e,t){h.length!=e.length?h=Pt(e):Ht(h,e),p.length!=e.length&&(p=Pt(e)),Nt(h,t,p,e)}function Gt(e,t,n){var r;a.length!=2*e.length&&(a=new Array(2*e.length)),Bt(a,0);for(r=0;r<t.length;r++)t[r]&&Wt(a,e,t[r],r);Qt(a,n),Ht(e,a)}function Yt(e,t){var i,s,o,u,f,l,c;for(f=e.length;f>0&&!e[f-1];f--);c=f>t.length?2*f:2*t.length,a.length!=c&&(a=new Array(c)),Bt(a,0);for(i=0;i<f;i++){u=a[2*i]+e[i]*e[i],a[2*i]=u&r,u=(u-a[2*i])/n;for(s=i+1;s<f;s++)u=a[i+s]+2*e[i]*e[s]+u,a[i+s]=u&r,u=(u-a[i+s])/n;a[i+f]=u}Qt(a,t),Ht(e,a)}function Zt(e,t){var n,r;for(n=e.length;n>0&&!e[n-1];n--);return r=new Array(n+t),Ht(r,e),r}function en(e,r,i){var o,u,a,f;v.length!=i.length&&(v=Pt(i));if((i[0]&1)==0){Ht(v,e),Bt(e,1);while(!Ot(r,0))r[0]&1&&Gt(e,v,i),Ut(r,2),Yt(v,i);return}Bt(v,0);for(a=i.length;a>0&&!i[a-1];a--);f=n-bt(kt(i,n),n),v[a]=1,Gt(e,v,i),c.length!=e.length?c=Pt(e):Ht(c,e);for(o=r.length-1;o>0&!r[o];o--);if(r[o]==0){Bt(e,1);return}for(u=1<<t-1;u&&!(r[o]&u);u>>=1);for(;;){if(!(u>>=1)){o--;if(o<0){tn(e,s,i,f);return}u=1<<t-1}tn(e,e,i,f),u&r[o]&&tn(e,c,i,f)}}function tn(e,t,i,s){var o,u,a,f,l,c,h,p=i.length,d=t.length;g.length!=p&&(g=new Array(p)),Bt(g,0);for(;p>0&&i[p-1]==0;p--);for(;d>0&&t[d-1]==0;d--);h=g.length-1;for(o=0;o<p;o++){l=g[0]+e[o]*t[0],f=(l&r)*s&r,a=l+f*i[0],a=(a-(a&r))/n,l=e[o],u=1;for(;u<d-4;)a+=g[u]+f*i[u]+l*t[u],c=g[u-1]=a&r,a=(a-c)/n,u++,a+=g[u]+f*i[u]+l*t[u],c=g[u-1]=a&r,a=(a-c)/n,u++,a+=g[u]+f*i[u]+l*t[u],c=g[u-1]=a&r,a=(a-c)/n,u++,a+=g[u]+f*i[u]+l*t[u],c=g[u-1]=a&r,a=(a-c)/n,u++,a+=g[u]+f*i[u]+l*t[u],c=g[u-1]=a&r,a=(a-c)/n,u++;for(;u<d;)a+=g[u]+f*i[u]+l*t[u],c=g[u-1]=a&r,a=(a-c)/n,u++;for(;u<p-4;)a+=g[u]+f*i[u],c=g[u-1]=a&r,a=(a-c)/n,u++,a+=g[u]+f*i[u],c=g[u-1]=a&r,a=(a-c)/n,u++,a+=g[u]+f*i[u],c=g[u-1]=a&r,a=(a-c)/n,u++,a+=g[u]+f*i[u],c=g[u-1]=a&r,a=(a-c)/n,u++,a+=g[u]+f*i[u],c=g[u-1]=a&r,a=(a-c)/n,u++;for(;u<p;)a+=g[u]+f*i[u],c=g[u-1]=a&r,a=(a-c)/n,u++;for(;u<h;)a+=g[u],c=g[u-1]=a&r,a=(a-c)/n,u++;g[u-1]=a&r}Tt(i,g)||$t(g,i),Ht(e,g)}function nn(e,t,n){return ht(e,ct(t,n),n)}function rn(e,t,n){return e=st(e,n),t=st(t,n),Tt(t,e)&&(e=lt(e,n)),ft(e,t)}function sn(e){var n=Math.floor(e/t)+2,r=new Array(n);for(var i=0;i<n;i++)r[i]=0;return r[n-2]=1<<e%t,r}function un(e,t){t||(t=0),e=Pt(e);var n="";while(!_t(e))n=on[e[0]&255]+n,Ft(e,8);while(n.length<t)n="\0"+n;return n}function an(e){var t=At("0",10,e.length);return e.forEach(function(e,n){n&&qt(t,8),t[0]|=e}),t}function ln(){return fn(40)}function cn(){return fn(1)[0]}function hn(e){if(e>31)throw new Error("Too many bits.");var t=0,n=0,r=Math.floor(e/8),i=(1<<e%8)-1;i&&(n=cn()&i);for(;t<r;t++)n=256*n+cn();return n}var t=26,n=1<<t,r=n-1,i="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\'\"+-",s=Lt(1,1,1),o=new Array(0),u=o,a=o,f=o,l=o,c=o,h=o,p=o,d=o,v=o,m=o,g=o,y=o,b=o,w=o,E=o,S=o,x=o,T=o,N=o,C=o,k=o,L=o,A=o,O=o,M=o,_=o,D=o,P=o,H=o,B=o,j=o,F=o,I=o,q=o,R=o,U=o,z=o,W=o,X=o,V=o,$=o,J=o,K=o,Q=o,on=function(){var e=0,t={};for(;e<256;++e)t[e]=String.fromCharCode(e);return t}(),fn=function(){if(typeof e!="undefined"&&typeof e.randomBytes=="function")return function(t){try{var n=e.randomBytes(t)}catch(r){throw r}return Array.prototype.slice.call(n,0)};if(typeof e!="undefined"&&typeof e.getRandomValues=="function")return function(t){var n=new Uint8Array(t);return e.getRandomValues(n),Array.prototype.slice.call(n,0)};console.log("Keys should not be generated without CSPRNG.");return}();return{str2bigInt:At,bigInt2str:Dt,int2bigInt:Lt,multMod:ht,powMod:at,inverseMod:ct,randBigInt:dt,randBigInt_:vt,equals:Mt,equalsInt:Ot,sub:ft,mod:st,modInt:kt,mult:ut,divInt_:Ut,rightShift_:Ft,dup:Pt,greater:Tt,add:lt,isZero:_t,bitSize:et,millerRabin:Z,divide_:Nt,trim:Zt,primes:P,findPrimes:G,getSeed:ln,divMod:nn,subMod:rn,twoToThe:sn,bigInt2bits:un,ba2bigInt:an}}),function(){"use strict";function e(){}function n(e,t){var n=e.length;while(n--)if(e[n].listener===t)return n;return-1}function r(e){return function(){return this[e].apply(this,arguments)}}var t=e.prototype;t.getListeners=function(t){var n=this._getEvents(),r,i;if(typeof t=="object"){r={};for(i in n)n.hasOwnProperty(i)&&t.test(i)&&(r[i]=n[i])}else r=n[t]||(n[t]=[]);return r},t.flattenListeners=function(t){var n=[],r;for(r=0;r<t.length;r+=1)n.push(t[r].listener);return n},t.getListenersAsObject=function(t){var n=this.getListeners(t),r;return n instanceof Array&&(r={},r[t]=n),r||n},t.addListener=function(t,r){var i=this.getListenersAsObject(t),s=typeof r=="object",o;for(o in i)i.hasOwnProperty(o)&&n(i[o],r)===-1&&i[o].push(s?r:{listener:r,once:!1});return this},t.on=r("addListener"),t.addOnceListener=function(t,n){return this.addListener(t,{listener:n,once:!0})},t.once=r("addOnceListener"),t.defineEvent=function(t){return this.getListeners(t),this},t.defineEvents=function(t){for(var n=0;n<t.length;n+=1)this.defineEvent(t[n]);return this},t.removeListener=function(t,r){var i=this.getListenersAsObject(t),s,o;for(o in i)i.hasOwnProperty(o)&&(s=n(i[o],r),s!==-1&&i[o].splice(s,1));return this},t.off=r("removeListener"),t.addListeners=function(t,n){return this.manipulateListeners(!1,t,n)},t.removeListeners=function(t,n){return this.manipulateListeners(!0,t,n)},t.manipulateListeners=function(t,n,r){var i,s,o=t?this.removeListener:this.addListener,u=t?this.removeListeners:this.addListeners;if(typeof n!="object"||n instanceof RegExp){i=r.length;while(i--)o.call(this,n,r[i])}else for(i in n)n.hasOwnProperty(i)&&(s=n[i])&&(typeof s=="function"?o.call(this,i,s):u.call(this,i,s));return this},t.removeEvent=function(t){var n=typeof t,r=this._getEvents(),i;if(n==="string")delete r[t];else if(n==="object")for(i in r)r.hasOwnProperty(i)&&t.test(i)&&delete r[i];else delete this._events;return this},t.emitEvent=function(t,n){var r=this.getListenersAsObject(t),i,s,o,u;for(o in r)if(r.hasOwnProperty(o)){s=r[o].length;while(s--)i=r[o][s],i.once===!0&&this.removeListener(t,i.listener),u=i.listener.apply(this,n||[]),u===this._getOnceReturnValue()&&this.removeListener(t,i.listener)}return this},t.trigger=r("emitEvent"),t.emit=function(t){var n=Array.prototype.slice.call(arguments,1);return this.emitEvent(t,n)},t.setOnceReturnValue=function(t){return this._onceReturnValue=t,this},t._getOnceReturnValue=function(){return this.hasOwnProperty("_onceReturnValue")?this._onceReturnValue:!0},t._getEvents=function(){return this._events||(this._events={})},typeof define=="function"&&define.amd?define("eventemitter",[],function(){return e}):typeof module=="object"&&module.exports?module.exports=e:this.EventEmitter=e}.call(this),function(e,t){typeof define=="function"&&define.amd?define("otr",["jquery","jquery.browser","bigint","crypto","eventemitter"],function(e,n,r,i,s){if(e.browser.msie)return undefined;var o={BigInt:r,CryptoJS:i,EventEmitter:s,OTR:{},DSA:{}};return t.call(o)}):(e.OTR={},e.DSA={},t.call(e))}(this,function(){return function(){"use strict";var e=this,t={N:"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFF",G:"2",MSGSTATE_PLAINTEXT:0,MSGSTATE_ENCRYPTED:1,MSGSTATE_FINISHED:2,AUTHSTATE_NONE:0,AUTHSTATE_AWAITING_DHKEY:1,AUTHSTATE_AWAITING_REVEALSIG:2,AUTHSTATE_AWAITING_SIG:3,WHITESPACE_TAG:" ",WHITESPACE_TAG_V2:" ",WHITESPACE_TAG_V3:" ",OTR_TAG:"?OTR",OTR_VERSION_1:"\0\ 1",OTR_VERSION_2:"\0\ 2",OTR_VERSION_3:"\0\ 3",SMPSTATE_EXPECT0:0,SMPSTATE_EXPECT1:1,SMPSTATE_EXPECT2:2,SMPSTATE_EXPECT3:3,SMPSTATE_EXPECT4:4,STATUS_SEND_QUERY:0,STATUS_AKE_INIT:1,STATUS_AKE_SUCCESS:2,STATUS_END_OTR:3};typeof module!="undefined"&&module.exports?module.exports=t:e.OTR.CONST=t}.call(this),function(){"use strict";var e=this,t={},n,r;typeof module!="undefined"&&module.exports?(module.exports=t={},n=require("../vendor/crypto.js"),r=require("../vendor/bigint.js")):(e.OTR&&(e.OTR.HLP=t),e.DSA&&(e.DSA.HLP=t),n=e.CryptoJS,r=e.BigInt);var i={BYTE:1,SHORT:2,INT:4,CTR:8,MAC:20,SIG:40},s="?OTR",o=".",u=r.str2bigInt("2",10);t.debug=function(e){this.debug&&typeof this.debug!="function"&&typeof console!="undefined"&&console.log(e)},t.extend=function(e,t){function r(){this.constructor=e}for(var n in t)Object.hasOwnProperty.call(t,n)&&(e[n]=t[n]);r.prototype=t.prototype,e.prototype=new r,e.__super__=t.prototype},t.compare=function(e,t){if(e.length!==t.length)return!1;var n=0,r=0;for(;n<e.length;n++)r|=e[n].charCodeAt(0)^t[n].charCodeAt(0);return r===0},t.randomExponent=function(){return r.randBigInt(1536)},t.smpHash=function(e,r,s){var o=n.algo.SHA256.create();o.update(n.enc.Latin1.parse(t.packBytes(e,i.BYTE))),o.update(n.enc.Latin1.parse(t.packMPI(r))),s&&o.update(n.enc.Latin1.parse(t.packMPI(s)));var u=o.finalize();return t.bits2bigInt(u.toString(n.enc.Latin1))},t.makeMac=function(e,r){var i=n.enc.Latin1.parse(r),s=n.HmacSHA256(n.enc.Latin1.parse(e),i);return t.mask(s.toString(n.enc.Latin1),0,160)},t.make1Mac=function(e,t){var r=n.enc.Latin1.parse(t),i=n.HmacSHA1(n.enc.Latin1.parse(e),r);return i.toString(n.enc.Latin1)},t.encryptAes=function(e,t,r){var i={mode:n.mode.CTR,iv:n.enc.Latin1.parse(r),padding:n.pad.NoPadding},s=n.AES.encrypt(e,n.enc.Latin1.parse(t),i),o=n.enc.Base64.parse(s.toString());return n.enc.Latin1.stringify(o)},t.decryptAes=function(e,t,r){e=n.enc.Latin1.parse(e);var i={mode:n.mode.CTR,iv:n.enc.Latin1.parse(r),padding:n.pad.NoPadding};return n.AES.decrypt(n.enc.Base64.stringify(e),n.enc.Latin1.parse(t),i)},t.multPowMod=function(e,t,n,i,s){return r.multMod(r.powMod(e,t,s),r.powMod(n,i,s),s)},t.ZKP=function(e,n,i,s){return r.equals(n,t.smpHash(e,i,s))},t.GTOE=function(e,t){return r.equals(e,t)||r.greater(e,t)},t.between=function(e,t,n){return r.greater(e,t)&&r.greater(n,e)},t.checkGroup=function(e,n){return t.GTOE(e,u)&&t.GTOE(n,e)},t.h1=function(e,t){var r=n.algo.SHA1.create();return r.update(n.enc.Latin1.parse(e)),r.update(n.enc.Latin1.parse(t)),r.finalize().toString(n.enc.Latin1)},t.h2=function(e,t){var r=n.algo.SHA256.create();return r.update(n.enc.Latin1.parse(e)),r.update(n.enc.Latin1.parse(t)),r.finalize().toString(n.enc.Latin1)},t.mask=function(e,t,n){return e.substr(t/8,n/8)};var a=String.fromCharCode;t.packBytes=function(e,t){e=e.toString(16);var n,r="";for(;t>0;t--)n=e.length?e.substr(-2,2):"0",e=e.substr(0,e.length-2),r=a(parseInt(n,16))+r;return r},t.packINT=function(e){return t.packBytes(e,i.INT)},t.packCtr=function(e){return t.padCtr(t.packBytes(e,i.CTR))},t.padCtr=function(e){return e+"\0\0\0\0\0\0\0\0"},t.unpackCtr=function(e){return e=t.toByteArray(e.substring(0,8)),t.unpack(e)},t.unpack=function(e){var t=0,n=0,r=e.length;for(;n<r;n++)t=t*256+e[n];return t},t.packData=function(e){return t.packINT(e.length)+e},t.bits2bigInt=function(e){return e=t.toByteArray(e),r.ba2bigInt(e)},t.packMPI=function(e){return t.packData(r.bigInt2bits(r.trim(e,0)))},t.packSHORT=function(e){return t.packBytes(e,i.SHORT)},t.unpackSHORT=function(e){return e=t.toByteArray(e),t.unpack(e)},t.packTLV=function(e,n){return t.packSHORT(e)+t.packSHORT(n.length)+n},t.readLen=function(e){return e=t.toByteArray(e.substring(0,4)),t.unpack(e)},t.readData=function(e){var n=t.unpack(e.splice(0,4));return[n,e]},t.readMPI=function(e){return e=t.toByteArray(e),e=t.readData(e),r.ba2bigInt(e[1])},t.packMPIs=function(e){return e.reduce(function(e,n){return e+t.packMPI(n)},"")},t.unpackMPIs=function(e,n){var r=0,i=[];for(;r<e;r++)i.push("MPI");return t.splitype(i,n).map(function(e){return t.readMPI(e)})},t.wrapMsg=function(e,r,i,u,a){e=n.enc.Base64.stringify(n.enc.Latin1.parse(e)),e=s+":"+e+o;var f;i&&(f="|",f+=t.readLen(u).toString(16),f+="|",f+=t.readLen(a).toString(16));if(!r)return[null,e];var l=Math.ceil(e.length/r);if(l>65535)return["Too many fragments"];if(l==1)return[null,e];var c,h,p,d,v,m=[];for(c=1;c<=l;c++)h=(c-1)*r,p=c*r,d=e.slice(h,p),v=s,i&&(v+=f),v+=","+c+",",v+=l+",",v+=d+",",m.push(v);return[null,m]},t.splitype=function l(e,n){var r=[];return e.forEach(function(e){var s;switch(e){case"PUBKEY":s=l(["SHORT","MPI","MPI","MPI","MPI"],n).join("");break;case"DATA":case"MPI":s=n.substring(0,t.readLen(n)+4);break;default:s=n.substring(0,i[e])}r.push(s),n=n.substring(s.length)}),r};var f=function(){var e=0,t={};for(;e<256;++e)t[String.fromCharCode(e)]=e;for(e=128;e<256;++e)t[String.fromCharCode(63232+e)]=e;return t}();t.toByteArray=function(e){var t=[],n=e.split(""),r=-1,i=n.length,s=i%8;while(s--)++r,t[r]=f[n[r]];s=i>>3;while(s--)t.push(f[n[++r]],f[n[++r]],f[n[++r]],f[n[++r]],f[n[++r]],f[n[++r]],f[n[++r]],f[n[++r]]);return t}}.call(this),function(){"use strict";function c(){var e=(new Date).getTime();return function(t){if(!l||typeof console=="undefined")return;var n=(new Date).getTime();console.log(t+": "+(n-e)),e=n}}function h(e,t){var r=n.randBigInt(n.bitSize(t));return s.between(r,e,t)?r:h(e,t)}function d(e,t){var r,i=3e4,s=n.bitSize(e),o=n.primes;o.length===0&&(o=n.findPrimes(i)),p.length!=e.length&&(p=n.dup(e));for(r=0;r<o.length&&o[r]<=i;r++)if(n.modInt(e,o[r])===0&&!n.equalsInt(e,o[r]))return 0;for(r=0;r<t;r++){n.randBigInt_(p,s,0);while(!n.greater(e,p))n.randBigInt_(p,s,0);if(!n.millerRabin(e,p))return 0}return 1}function g(e){var t=c(),r=v[e].repeat,i=v[e].N,s=n.twoToThe(e-1),o=4*e,f=!1,l,h,p,g;for(;;){l=n.randBigInt(i,1),l[0]|=1;if(!d(l,r))continue;t("q");for(g=0;g<o;g++){h=n.randBigInt(e,1),h[0]|=1,p=n.mod(h,l),p=n.sub(p,u),h=n.sub(h,p);if(n.greater(s,h))continue;if(!d(h,r))continue;t("p"),m[e]={p:h,q:l},f=!0;break}if(f)break}var y=n.dup(a),b=n.sub(h,u),w=n.multMod(b,n.inverseMod(l,h),h),E;for(;;){E=n.powMod(y,w,h);if(n.equals(E,u)){y=n.add(y,u);continue}m[e].g=E,t("g");return}throw new Error("Unreachable!")}function y(e,t){if(!(this instanceof y))return new y(e,t);t=t||{};if(e){var r=this;["p","q","g","y","x"].forEach(function(t){r[t]=e[t]}),this.type=e.type||f;return}var i=parseInt(t.bit_length?t.bit_length:1024,10);if(!v[i])throw new Error("Unsupported bit length.");m[i]||g(i),this.p=m[i].p,this.q=m[i].q,this.g=m[i].g,this.type=f,this.x=h(o,this.q),this.y=n.powMod(this.g,this.x,this.p),t.nocache&&(m[i]=null)}function b(e){var t,n;t=e.indexOf("("),n=e.lastIndexOf(")");if(t<0||n<0)throw new Error("Malformed S-Expression");e=e.substring(t+1,n);var r=e.search(/\s/),i={type:e.substring(0,r),val:[]};e=e.substring(r+1,n),t=e.indexOf("(");if(t<0)i.val.push(e);else{var s,o,u,a;while(t>-1){s=t+1,o=e.length;for(u=1,a=0;s<o&&a<u;s++)e[s]==="("&&u++,e[s]===")"&&a++;i.val.push(b(e.substring(t,++s))),e=e.substring(++s),t=e.indexOf("(")}}return i}function w(e){if(!e.type)throw new Error("Parse error.");var t,r;return e.type==="privkeys"?(t=[],e.val.forEach(function(e){t.push(w(e))}),t):(t={},e.val.forEach(function(e){r=e.val[0],typeof r=="string"?r.indexOf("#")===0&&(r=r.substring(1,r.lastIndexOf("#")),r=n.str2bigInt(r,16)):r=w(e),t[e.type]=r}),t)}var e=this,t,n,r,i,s;typeof module!="undefined"&&module.exports?(module.exports=y,t=require("../vendor/crypto.js"),n=require("../vendor/bigint.js"),i=require("path").join(__dirname,"/dsa-webworker.js"),s=require("./helpers.js")):(Object.keys(e.DSA).forEach(function(t){y[t]=e.DSA[t]}),e.DSA=y,t=e.CryptoJS,n=e.BigInt,r=e.Worker,i="dsa-webworker.js",s=y.HLP);var o=n.str2bigInt("0",10),u=n.str2bigInt("1",10),a=n.str2bigInt("2",10),f="\0\0",l=!1,p=[],v={1024:{N:160,repeat:40},2048:{N:224,repeat:56}},m={};y.prototype={constructor:y,packPublic:function(){var e=this.type;return e+=s.packMPI(this.p),e+=s.packMPI(this.q),e+=s.packMPI(this.g),e+=s.packMPI(this.y),e},packPrivate:function(){var e=this.packPublic()+s.packMPI(this.x);return e=t.enc.Latin1.parse(e),e.toString(t.enc.Base64)},generateNonce:function(e){var r=n.bigInt2bits(n.trim(this.x,0)),i=n.bigInt2bits(n.randBigInt(256)),u=t.algo.SHA256.create();u.update(t.enc.Latin1.parse(r)),u.update(e),u.update(t.enc.Latin1.parse(i));var a=u.finalize();return a=s.bits2bigInt(a.toString(t.enc.Latin1)),n.rightShift_(a,256-n.bitSize(this.q)),s.between(a,o,this.q)?a:this.generateNonce(e)},sign:function(e){e=t.enc.Latin1.parse(e);var r=n.str2bigInt(e.toString(t.enc.Hex),16),i,s=o,u=o;while(n.isZero(u)||n.isZero(s)){i=this.generateNonce(e),s=n.mod(n.powMod(this.g,i,this.p),this.q);if(n.isZero(s))continue;u=n.inverseMod(i,this.q),u=n.mult(u,n.add(r,n.mult(this.x,s))),u=n.mod(u,this.q)}return[s,u]},fingerprint:function(){var e=this.packPublic();return this.type===f&&(e=e.substring(2)),e=t.enc.Latin1.parse(e),t.SHA1(e).toString(t.enc.Hex)}},y.parsePublic=function(e,t){var n=["SHORT","MPI","MPI","MPI","MPI"];t&&n.push("MPI"),e=s.splitype(n,e);var r={type:e[0],p:s.readMPI(e[1]),q:s.readMPI(e[2]),g:s.readMPI(e[3]),y:s.readMPI(e[4])};return t&&(r.x=s.readMPI(e[5])),new y(r)},y.parsePrivate=function(e,n){return n?w(b(e))[0]["private-key"].dsa:(e=t.enc.Base64.parse(e),e=e.toString(t.enc.Latin1),y.parsePublic(e,!0))},y.verify=function(e,r,i,u){if(!s.between(i,o,e.q)||!s.between(u,o,e.q))return!1;var a=t.enc.Latin1.parse(r);a=n.str2bigInt(a.toString(t.enc.Hex),16);var f=n.inverseMod(u,e.q),l=n.multMod(a,f,e.q),c=n.multMod(i,f,e.q);l=n.powMod(e.g,l,e.p),c=n.powMod(e.y,c,e.p);var h=n.mod(n.multMod(l,c,e.p),e.q);return n.equals(h,i)},y.createInWebWorker=function(e,t){var s={path:i,seed:n.getSeed};e&&typeof e=="object"&&Object.keys(e).forEach(function(t){s[t]=e[t]}),typeof module!="undefined"&&module.exports&&(r=require("webworker-threads").Worker);var o=new r(s.path);o.onmessage=function(e){var n=e.data;switch(n.type){case"debug":if(!l||typeof console=="undefined")return;console.log(n.val);break;case"data":o.terminate(),t(y.parsePrivate(n.val));break;default:throw new Error("Unrecognized type.")}},o.postMessage({seed:s.seed(),imports:s.imports,debug:l})}}.call(this),function(){"use strict";var e=this,t={},n,r,i;typeof module!="undefined"&&module.exports?(module.exports=t,n=require("../vendor/crypto.js"),r=require("./const.js"),i=require("./helpers.js")):(e.OTR.Parse=t,n=e.CryptoJS,r=e.OTR.CONST,i=e.OTR.HLP);var s={};s[r.WHITESPACE_TAG_V2]=r.OTR_VERSION_2,s[r.WHITESPACE_TAG_V3]=r.OTR_VERSION_3,t.parseMsg=function(e,t){var o=[],u=t.indexOf(r.OTR_TAG);if(!~u){this.initFragment(e),l=t.indexOf(r.WHITESPACE_TAG);if(~l){t=t.split(""),t.splice(l,16);var a,f=t.length;for(;l<f;){a=t.slice(l,l+8).join("");if(Object.hasOwnProperty.call(s,a)){t.splice(l,8),o.push(s[a]);continue}l+=8}t=t.join("")}return{msg:t,ver:o}}var l=u+r.OTR_TAG.length,c=t[l];if(c===","||c==="|")return this.msgFragment(e,t.substring(l+1),c==="|");this.initFragment(e);if(~["?","v"].indexOf(c)){t[l]==="?"&&(o.push(r.OTR_VERSION_1),l+=1);var h={2:r.OTR_VERSION_2,3:r.OTR_VERSION_3},p=t.substring(l+1),d=p.indexOf("?");return d>=1&&(p=p.substring(0,d).split(""),t[l]==="v"&&p.forEach(function(e){Object.hasOwnProperty.call(h,e)&&o.push(h[e])})),{cls:"query",ver:o}}if(c===":"){l+=1;var v=t.substring(l,l+4);if(v.length<4)return{msg:t};v=n.enc.Base64.parse(v).toString(n.enc.Latin1);var m=v.substring(0,2),g=v.substring(2);if(!e["ALLOW_V"+i.unpackSHORT(m)])return{msg:t};l+=4;var y=t.substring(l).indexOf(".");if(!~y)return{msg:t};t=n.enc.Base64.parse(t.substring(l,l+y)),t=n.enc.Latin1.stringify(t);var b;m===r.OTR_VERSION_3&&(b=t.substring(0,8),t=t.substring(8));var w;return~["\ 2","\n","\11","\12"].indexOf(g)?w="ake":g==="\ 3"&&(w="data"),{version:m,type:g,msg:t,cls:w,instance_tags:b}}return t.substring(l,l+7)===" Error:"?(e.ERROR_START_AKE&&e.sendQueryMsg(),{msg:t.substring(l+7),cls:"error"}):{msg:t}},t.initFragment=function(e){e.fragment={s:"",j:0,k:0}},t.msgFragment=function(e,t,n){t=t.split(",");if(n){var r=t.shift().split("|"),s=i.packINT(parseInt(r[0],16)),o=i.packINT(parseInt(r[1],16));if(e.checkInstanceTags(s+o))return}if(t.length<4||isNaN(parseInt(t[0],10))||isNaN(parseInt(t[1],10)))return;var u=parseInt(t[0],10),a=parseInt(t[1],10);t=t[2];if(a<u||a===0||u===0){this.initFragment(e);return}u===1?(this.initFragment(e),e.fragment={k:1,n:a,s:t}):a===e.fragment.n&&u===e.fragment.k+1?(e.fragment.s+=t,e.fragment.k+=1):this.initFragment(e);if(a===u)return t=e.fragment.s,this.initFragment(e),this.parseMsg(e,t);return}}.call(this),function(){"use strict";function a(e,n,r,s,o){var u=t.enc.Latin1.parse(o),a=t.algo.HMAC.create(t.algo.SHA256,u);return a.update(t.enc.Latin1.parse(i.packMPI(e))),a.update(t.enc.Latin1.parse(i.packMPI(n))),a.update(t.enc.Latin1.parse(r)),a.update(t.enc.Latin1.parse(s)),a.finalize().toString(t.enc.Latin1)}function f(e){if(!(this instanceof f))return new f(e);this.otr=e,this.our_dh=e.our_old_dh,this.our_keyid=e.our_keyid-1,this.their_y=null,this.their_keyid=null,this.their_priv_pk=null,this.ssid=null,this.transmittedRS=!1,this.r=null;var t=this;["sendMsg"].forEach(function(e){t[e]=t[e].bind(t)})}var e=this,t,n,r,i,s;typeof module!="undefined"&&module.exports?(module.exports=f,t=require("../vendor/crypto.js"),n=require("../vendor/bigint.js"),r=require("./const.js"),i=require("./helpers.js"),s=require("./dsa.js")):(e.OTR.AKE=f,t=e.CryptoJS,n=e.BigInt,r=e.OTR.CONST,i=e.OTR.HLP,s=e.DSA);var o=n.str2bigInt(r.N,16),u=n.sub(o,n.str2bigInt("2",10));f.prototype={constructor:f,createKeys:function(e){var t=n.powMod(e,this.our_dh.privateKey,o),r=i.packMPI(t);this.ssid=i.mask(i.h2("\0",r),0,64);var s=i.h2("\ 1",r);this.c=i.mask(s,0,128),this.c_prime=i.mask(s,128,128),this.m1=i.h2("\ 2",r),this.m2=i.h2("\ 3",r),this.m1_prime=i.h2("\ 4",r),this.m2_prime=i.h2("\ 5",r)},verifySignMac:function(e,n,r,o,u,f,l,c){var h=i.makeMac(n,r);if(!i.compare(e,h))return["MACs do not match."];var p=i.decryptAes(n.substring(4),o,c);p=i.splitype(["PUBKEY","INT","SIG"],p.toString(t.enc.Latin1));var d=a(u,f,p[0],p[1],l),v=s.parsePublic(p[0]),m=i.bits2bigInt(p[2].substring(0,20)),g=i.bits2bigInt(p[2].substring(20));return s.verify(v,d,m,g)?[null,i.readLen(p[1]),v]:["Cannot verify signature of m."]},makeM:function(e,r,s,o){var u=this.otr.priv.packPublic(),f=i.packINT(this.our_keyid),l=a(this.our_dh.publicKey,e,u,f,r);l=this.otr.priv.sign(l);var c=u+f;c+=n.bigInt2bits(l[0],20),c+=n.bigInt2bits(l[1],20),c=t.enc.Latin1.parse(c);var h=i.packData(i.encryptAes(c,s,i.packCtr(0))),p=i.makeMac(h,o);return h+p},akeSuccess:function(e){i.debug.call(this.otr,"success");if(n.equals(this.their_y,this.our_dh.publicKey))return this.otr.error("equal keys - we have a problem.",!0);this.otr.our_old_dh=this.our_dh,this.otr.their_priv_pk=this.their_priv_pk,this.their_keyid===this.otr.their_keyid&&n.equals(this.their_y,this.otr.their_y)||this.their_keyid===this.otr.their_keyid-1&&n.equals(this.their_y,this.otr.their_old_y)||(this.otr.their_y=this.their_y,this.otr.their_old_y=null,this.otr.their_keyid=this.their_keyid,this.otr.sessKeys[0]=[new this.otr.DHSession(this.otr.our_dh,this.otr.their_y),null],this.otr.sessKeys[1]=[new this.otr.DHSession(this.otr.our_old_dh,this.otr.their_y),null]),this.otr.ssid=this.ssid,this.otr.transmittedRS=this.transmittedRS,this.otr_version=e,this.otr.authstate=r.AUTHSTATE_NONE,this.otr.msgstate=r.MSGSTATE_ENCRYPTED,this.r=null,this.myhashed=null,this.dhcommit=null,this.encrypted=null,this.hashed=null,this.otr.trigger("status",[r.STATUS_AKE_SUCCESS]),this.otr.sendStored()},handleAKE:function(e){var s,o,a,f=e.version;switch(e.type){case"\ 2":i.debug.call(this.otr,"d-h key message"),e=i.splitype(["DATA","DATA"],e.msg);if(this.otr.authstate===r.AUTHSTATE_AWAITING_DHKEY){var l=i.readMPI(this.myhashed),c=i.readMPI(e[1]);if(n.greater(l,c)){a="\ 2",s=this.dhcommit;break}this.our_dh=this.otr.dh(),this.otr.authstate=r.AUTHSTATE_NONE,this.r=null,this.myhashed=null}else this.otr.authstate===r.AUTHSTATE_AWAITING_SIG&&(this.our_dh=this.otr.dh());this.otr.authstate=r.AUTHSTATE_AWAITING_REVEALSIG,this.encrypted=e[0].substring(4),this.hashed=e[1].substring(4),a="\n",s=i.packMPI(this.our_dh.publicKey);break;case"\n":i.debug.call(this.otr,"reveal signature message"),e=i.splitype(["MPI"],e.msg);if(this.otr.authstate!==r.AUTHSTATE_AWAITING_DHKEY){if(this.otr.authstate!==r.AUTHSTATE_AWAITING_SIG)return;if(!n.equals(this.their_y,i.readMPI(e[0])))return}this.otr.authstate=r.AUTHSTATE_AWAITING_SIG,this.their_y=i.readMPI(e[0]);if(!i.checkGroup(this.their_y,u))return this.otr.error("Illegal g^y.",!0);this.createKeys(this.their_y),a="\11",s=i.packMPI(this.r),s+=this.makeM(this.their_y,this.m1,this.c,this.m2),this.m1=null,this.m2=null,this.c=null;break;case"\11":i.debug.call(this.otr,"signature message");if(this.otr.authstate!==r.AUTHSTATE_AWAITING_REVEALSIG)return;e=i.splitype(["DATA","DATA","MAC"],e.msg),this.r=i.readMPI(e[0]);var h=t.enc.Hex.parse(n.bigInt2str(this.r,16));h=t.enc.Latin1.stringify(h);var p=i.decryptAes(this.encrypted,h,i.packCtr(0));p=p.toString(t.enc.Latin1),this.their_y=i.readMPI(p);var d=t.SHA256(t.enc.Latin1.parse(p));if(!i.compare(this.hashed,d.toString(t.enc.Latin1)))return this.otr.error("Hashed g^x does not match.",!0);if(!i.checkGroup(this.their_y,u))return this.otr.error("Illegal g^x.",!0);this.createKeys(this.their_y),o=this.verifySignMac(e[2],e[1],this.m2,this.c,this.their_y,this.our_dh.publicKey,this.m1,i.packCtr(0));if(o[0])return this.otr.error(o[0],!0);this.their_keyid=o[1],this.their_priv_pk=o[2],s=this.makeM(this.their_y,this.m1_prime,this.c_prime,this.m2_prime),this.m1=null,this.m2=null,this.m1_prime=null,this.m2_prime=null,this.c=null,this.c_prime=null,this.sendMsg(f,"\12",s),this.akeSuccess(f);return;case"\12":i.debug.call(this.otr,"data message");if(this.otr.authstate!==r.AUTHSTATE_AWAITING_SIG)return;e=i.splitype(["DATA","MAC"],e.msg),o=this.verifySignMac(e[1],e[0],this.m2_prime,this.c_prime,this.their_y,this.our_dh.publicKey,this.m1_prime,i.packCtr(0));if(o[0])return this.otr.error(o[0],!0);this.their_keyid=o[1],this.their_priv_pk=o[2],this.m1_prime=null,this.m2_prime=null,this.c_prime=null,this.transmittedRS=!0,this.akeSuccess(f);return;default:return}this.sendMsg(f,a,s)},sendMsg:function(e,t,n){var s=e+t,o=e===r.OTR_VERSION_3;o&&(i.debug.call(this.otr,"instance tags"),s+=this.otr.our_instance_tag,s+=this.otr.their_instance_tag),s+=n,s=i.wrapMsg(s,this.otr.fragment_size,o,this.otr.our_instance_tag,this.otr.their_instance_tag);if(s[0])return this.otr.error(s[0]);this.otr.io(s[1])},initiateAKE:function(e){i.debug.call(this.otr,"d-h commit message"),this.otr.trigger("status",[r.STATUS_AKE_INIT]),this.otr.authstate=r.AUTHSTATE_AWAITING_DHKEY;var s=i.packMPI(this.our_dh.publicKey);s=t.enc.Latin1.parse(s),this.r=n.randBigInt(128);var o=t.enc.Hex.parse(n.bigInt2str(this.r,16));o=t.enc.Latin1.stringify(o),this.myhashed=t.SHA256(s),this.myhashed=i.packData(this.myhashed.toString(t.enc.Latin1)),this.dhcommit=i.packData(i.encryptAes(s,o,i.packCtr(0))),this.dhcommit+=this.myhashed,this.sendMsg(e,"\ 2",this.dhcommit)}}}.call(this),function(){"use strict";function l(e){if(!(this instanceof l))return new l(e);this.version=1,this.our_fp=e.our_fp,this.their_fp=e.their_fp,this.ssid=e.ssid,this.debug=!!e.debug,this.init()}var e=this,t,n,r,i,s;typeof module!="undefined"&&module.exports?(module.exports=l,t=require("../vendor/crypto.js"),n=require("../vendor/bigint.js"),r=require("../vendor/eventemitter.js"),i=require("./const.js"),s=require("./helpers.js")):(e.OTR.SM=l,t=e.CryptoJS,n=e.BigInt,r=e.EventEmitter,i=e.OTR.CONST,s=e.OTR.HLP);var o=n.str2bigInt(i.G,10),u=n.str2bigInt(i.N,16),a=n.sub(u,n.str2bigInt("2",10)),f=n.sub(u,n.str2bigInt("1",10));n.divInt_(f,2),s.extend(l,r),l.prototype.init=function(){this.smpstate=i.SMPSTATE_EXPECT1,this.secret=null},l.prototype.makeSecret=function(e,n){var r=t.algo.SHA256.create();r.update(t.enc.Latin1.parse(s.packBytes(this.version,1))),r.update(t.enc.Hex.parse(e?this.our_fp:this.their_fp)),r.update(t.enc.Hex.parse(e?this.their_fp:this.our_fp)),r.update(t.enc.Latin1.parse(this.ssid)),r.update(t.enc.Latin1.parse(n));var i=r.finalize();this.secret=s.bits2bigInt(i.toString(t.enc.Latin1))},l.prototype.makeG2s=function(){this.a2=s.randomExponent(),this.a3=s.randomExponent(),this.g2a=n.powMod(o,this.a2,u),this.g3a=n.powMod(o,this.a3,u),(!s.checkGroup(this.g2a,a)||!s.checkGroup(this.g3a,a))&&this.makeG2s()},l.prototype.computeGs=function(e,t){this.g2=n.powMod(e,this.a2,u),this.g3=n.powMod(t,this.a3,u)},l.prototype.computePQ=function(e){this.p=n.powMod(this.g3,e,u),this.q=s.multPowMod(o,e,this.g2,this.secret,u)},l.prototype.computeR=function(){this.r=n.powMod(this.QoQ,this.a3,u)},l.prototype.computeRab=function(e){return n.powMod(e,this.a3,u)},l.prototype.computeC=function(e,t){return s.smpHash(e,n.powMod(o,t,u))},l.prototype.computeD=function(e,t,r){return n.subMod(e,n.multMod(t,r,f),f)},l.prototype.handleSM=function(e){var r,f,l,c,h,p,d,v,m,g,y,b,w,E,S={2:i.SMPSTATE_EXPECT1,3:i.SMPSTATE_EXPECT2,4:i.SMPSTATE_EXPECT3,5:i.SMPSTATE_EXPECT4,7:i.SMPSTATE_EXPECT1};if(e.type===6){this.init(),this.trigger("abort");return}if(this.smpstate!==S[e.type])return this.abort();switch(this.smpstate){case i.SMPSTATE_EXPECT1:s.debug.call(this,"smp tlv 2");var x,T;e.type===7&&(x=e.msg.indexOf("\0"),T=e.msg.substring(0,x),e.msg=e.msg.substring(x+1)),w=s.readLen(e.msg.substr(0,4));if(w!==6)return this.abort();e=s.unpackMPIs(6,e.msg.substring(4));if(!s.checkGroup(e[0],a)||!s.checkGroup(e[3],a))return this.abort();if(!s.ZKP(1,e[1],s.multPowMod(o,e[2],e[0],e[1],u)))return this.abort();if(!s.ZKP(2,e[4],s.multPowMod(o,e[5],e[3],e[4],u)))return this.abort();this.g3ao=e[3],this.makeG2s(),f=s.randomExponent(),l=s.randomExponent(),this.c2=this.computeC(3,f),this.c3=this.computeC(4,l),this.d2=this.computeD(f,this.a2,this.c2),this.d3=this.computeD(l,this.a3,this.c3),this.computeGs(e[0],e[3]),this.smpstate=i.SMPSTATE_EXPECT0,T=t.enc.Latin1.parse(T).toString(t.enc.Utf8),this.trigger("question",[T]);return;case i.SMPSTATE_EXPECT2:s.debug.call(this,"smp tlv 3"),w=s.readLen(e.msg.substr(0,4));if(w!==11)return this.abort();e=s.unpackMPIs(11,e.msg.substring(4));if(!s.checkGroup(e[0],a)||!s.checkGroup(e[3],a)||!s.checkGroup(e[6],a)||!s.checkGroup(e[7],a))return this.abort();if(!s.ZKP(3,e[1],s.multPowMod(o,e[2],e[0],e[1],u)))return this.abort();if(!s.ZKP(4,e[4],s.multPowMod(o,e[5],e[3],e[4],u)))return this.abort();this.g3ao=e[3],this.computeGs(e[0],e[3]),h=s.multPowMod(this.g3,e[9],e[6],e[8],u),p=s.multPowMod(o,e[9],this.g2,e[10],u),p=n.multMod(p,n.powMod(e[7],e[8],u),u);if(!s.ZKP(5,e[8],h,p))return this.abort();var C=s.randomExponent();this.computePQ(C);var k=s.randomExponent(),L=s.randomExponent(),A=s.multPowMod(o,k,this.g2,L,u),O=s.smpHash(6,n.powMod(this.g3,k,u),A),M=this.computeD(k,C,O),_=this.computeD(L,this.secret,O);this.QoQ=n.divMod(this.q,e[7],u),this.PoP=n.divMod(this.p,e[6],u),this.computeR(),c=s.randomExponent(),g=n.powMod(this.QoQ,c,u),y=s.smpHash(7,n.powMod(o,c,u),g),b=this.computeD(c,this.a3,y),this.smpstate=i.SMPSTATE_EXPECT4,r=s.packINT(8)+s.packMPIs([this.p,this.q,O,M,_,this.r,y,b]),r=s.packTLV(4,r);break;case i.SMPSTATE_EXPECT3:s.debug.call(this,"smp tlv 4"),w=s.readLen(e.msg.substr(0,4));if(w!==8)return this.abort();e=s.unpackMPIs(8,e.msg.substring(4));if(!s.checkGroup(e[0],a)||!s.checkGroup(e[1],a)||!s.checkGroup(e[5],a))return this.abort();h=s.multPowMod(this.g3,e[3],e[0],e[2],u),p=s.multPowMod(o,e[3],this.g2,e[4],u),p=n.multMod(p,n.powMod(e[1],e[2],u),u);if(!s.ZKP(6,e[2],h,p))return this.abort();d=s.multPowMod(o,e[7],this.g3ao,e[6],u),this.QoQ=n.divMod(e[1],this.q,u),v=s.multPowMod(this.QoQ,e[7],e[5],e[6],u);if(!s.ZKP(7,e[6],d,v))return this.abort();this.computeR(),c=s.randomExponent(),g=n.powMod(this.QoQ,c,u),y=s.smpHash(8,n.powMod(o,c,u),g),b=this.computeD(c,this.a3,y),r=s.packINT(3)+s.packMPIs([this.r,y,b]),r=s.packTLV(5,r),m=this.computeRab(e[5]),E=!!n.equals(m,n.divMod(e[0],this.p,u)),this.trigger("trust",[E,"answered"]),this.init();break;case i.SMPSTATE_EXPECT4:s.debug.call(this,"smp tlv 5"),w=s.readLen(e.msg.substr(0,4));if(w!==3)return this.abort();e=s.unpackMPIs(3,e.msg.substring(4));if(!s.checkGroup(e[0],a))return this.abort();d=s.multPowMod(o,e[2],this.g3ao,e[1],u),v=s.multPowMod(this.QoQ,e[2],e[0],e[1],u);if(!s.ZKP(8,e[1],d,v))return this.abort();m=this.computeRab(e[0]),E=!!n.equals(m,this.PoP),this.trigger("trust",[E,"asked"]),this.init();return}this.sendMsg(r)},l.prototype.sendMsg=function(e){this.trigger("send",[this.ssid,"\0"+e])},l.prototype.rcvSecret=function(e,t){s.debug.call(this,"receive secret");var n,r=!1;this.smpstate===i.SMPSTATE_EXPECT0?n=this.answer:(n=this.initiate,r=!0),this.makeSecret(r,e),n.call(this,t)},l.prototype.answer=function(){s.debug.call(this,"smp answer");var e=s.randomExponent();this.computePQ(e);var t=s.randomExponent(),r=s.randomExponent(),a=s.multPowMod(o,t,this.g2,r,u),f=s.smpHash(5,n.powMod(this.g3,t,u),a),l=this.computeD(t,e,f),c=this.computeD(r,this.secret,f);this.smpstate=i.SMPSTATE_EXPECT3;var h=s.packINT(11)+s.packMPIs([this.g2a,this.c2,this.d2,this.g3a,this.c3,this.d3,this.p,this.q,f,l,c]);this.sendMsg(s.packTLV(3,h))},l.prototype.initiate=function(e){s.debug.call(this,"smp initiate"),this.smpstate!==i.SMPSTATE_EXPECT1&&this.abort(),this.makeG2s();var t=s.randomExponent(),n=s.randomExponent();this.c2=this.computeC(1,t),this.c3=this.computeC(2,n),this.d2=this.computeD(t,this.a2,this.c2),this.d3=this.computeD(n,this.a3,this.c3),this.smpstate=i.SMPSTATE_EXPECT2;var r="",o=2;e&&(r+=e,r+="\0",o=7),r+=s.packINT(6)+s.packMPIs([this.g2a,this.c2,this.d2,this.g3a,this.c3,this.d3]),this.sendMsg(s.packTLV(o,r))},l.prototype.abort=function(){this.init(),this.sendMsg(s.packTLV(6,"")),this.trigger("abort")}}.call(this),function(){"use strict";function m(e){if(!(this instanceof m))return new m(e);e=e||{};if(!(!e.priv||e.priv instanceof c))throw new Error("Requires long-lived DSA key.");this.priv=e.priv?e.priv:new c,this.fragment_size=e.fragment_size||0;if(this.fragment_size<0)throw new Error("Fragment size must be a positive integer.");this.send_interval=e.send_interval||0;if(this.send_interval<0)throw new Error("Send interval must be a positive integer.");this.outgoing=[],this.our_instance_tag=e.instance_tag||m.makeInstanceTag(),this.debug=!!e.debug,this.smw=e.smw,this.init();var t=this;["sendMsg","receiveMsg"].forEach(function(e){t[e]=t[e].bind(t)}),r.call(this)}var e=this,t,n,r,i,s,o,u,a,f,l,c;typeof module!="undefined"&&module.exports?(module.exports=m,t=require("../vendor/crypto.js"),n=require("../vendor/bigint.js"),r=require("../vendor/eventemitter.js"),s=require("path").join(__dirname,"/sm-webworker.js"),o=require("./const.js"),u=require("./helpers.js"),a=require("./parse.js"),f=require("./ake.js"),l=require("./sm.js"),c=require("./dsa.js"),m.CONST=o):(Object.keys(e.OTR).forEach(function(t){m[t]=e.OTR[t]}),e.OTR=m,t=e.CryptoJS,n=e.BigInt,r=e.EventEmitter,i=e.Worker,s="sm-webworker.js",o=m.CONST,u=m.HLP,a=m.Parse,f=m.AKE,l=m.SM,c=e.DSA);var h=n.str2bigInt(o.G,10),p=n.str2bigInt(o.N,16),d=Math.pow(2,53)-1,v=Math.pow(2,31)-1;u.extend(m,r),m.prototype.init=function(){this.msgstate=o.MSGSTATE_PLAINTEXT,this.authstate=o.AUTHSTATE_NONE,this.ALLOW_V2=!0,this.ALLOW_V3=!0,this.REQUIRE_ENCRYPTION=!1,this.SEND_WHITESPACE_TAG=!1,this.WHITESPACE_START_AKE=!1,this.ERROR_START_AKE=!1,a.initFragment(this),this.their_y=null,this.their_old_y=null,this.their_keyid=0,this.their_priv_pk=null,this.their_instance_tag="\0\0\0\0",this.our_dh=this.dh(),this.our_old_dh=this.dh(),this.our_keyid=2,this.sessKeys=[new Array(2),new Array(2)],this.storedMgs=[],this.oldMacKeys=[],this.sm=null,this._akeInit(),this.receivedPlaintext=!1},m.prototype._akeInit=function(){this.ake=new f(this),this.transmittedRS=!1,this.ssid=null},m.prototype._SMW=function(e,t){this.otr=e;var r={path:s,seed:n.getSeed};typeof e.smw=="object"&&Object.keys(e.smw).forEach(function(t){r[t]=e.smw[t]}),typeof module!="undefined"&&module.exports&&(i=require("webworker-threads").Worker),this.worker=new i(r.path);var o=this;this.worker.onmessage=function(e){var t=e.data;if(!t)return;o.trigger(t.method,t.args)},this.worker.postMessage({type:"seed",seed:r.seed(),imports:r.imports}),this.worker.postMessage({type:"init",reqs:t})},u.extend(m.prototype._SMW,r),["handleSM","rcvSecret","abort"].forEach(function(e){m.prototype._SMW.prototype[e]=function(){this.worker.postMessage({type:"method",method:e,args:Array.prototype.slice.call(arguments,0)})}}),m.prototype._smInit=function(){var e={ssid:this.ssid,our_fp:this.priv.fingerprint(),their_fp:this.their_priv_pk.fingerprint(),debug:this.debug};this.smw?(this.sm&&this.sm.worker.terminate(),this.sm=new this._SMW(this,e)):this.sm=new l(e);var t=this;["trust","abort","question"].forEach(function(e){t.sm.on(e,function(){t.trigger("smp",[e].concat(Array.prototype.slice.call(arguments)))})}),this.sm.on("send",function(e,n){t.ssid===e&&(n=t.prepareMsg(n),t.io(n))})},m.prototype.io=function(e,t){e=[].concat(e).map(function(e){return{msg:e,meta:t}}),this.outgoing=this.outgoing.concat(e);var n=this;(function r(e){if(!e){if(!n.outgoing.length)return;var t=n.outgoing.shift();n.trigger("io",[t.msg,t.meta])}setTimeout(r,e?0:n.send_interval)})(!0)},m.prototype.dh=function(){var t={privateKey:n.randBigInt(320)};return t.publicKey=n.powMod(h,t.privateKey,p),t},m.prototype.DHSession=function g(e,r){if(!(this instanceof g))return new g(e,r);var i=n.powMod(r,e.privateKey,p),s=u.packMPI(i);this.id=u.mask(u.h2("\0",s),0,64);var o=n.greater(e.publicKey,r),a=o?"\ 1":"\ 2",f=o?"\ 2":"\ 1";this.sendenc=u.mask(u.h1(a,s),0,128),this.sendmac=t.SHA1(t.enc.Latin1.parse(this.sendenc)),this.sendmac=this.sendmac.toString(t.enc.Latin1),this.rcvenc=u.mask(u.h1(f,s),0,128),this.rcvmac=t.SHA1(t.enc.Latin1.parse(this.rcvenc)),this.rcvmac=this.rcvmac.toString(t.enc.Latin1),this.rcvmacused=!1,this.extra_symkey=u.h2("ÿ",s),this.send_counter=0,this.rcv_counter=0},m.prototype.rotateOurKeys=function(){var e=this;this.sessKeys[1].forEach(function(t){t&&t.rcvmacused&&e.oldMacKeys.push(t.rcvmac)}),this.our_old_dh=this.our_dh,this.our_dh=this.dh(),this.our_keyid+=1,this.sessKeys[1][0]=this.sessKeys[0][0],this.sessKeys[1][1]=this.sessKeys[0][1],this.sessKeys[0]=[this.their_y?new this.DHSession(this.our_dh,this.their_y):null,this.their_old_y?new this.DHSession(this.our_dh,this.their_old_y):null]},m.prototype.rotateTheirKeys=function(e){this.their_keyid+=1;var t=this;this.sessKeys.forEach(function(e){e[1]&&e[1].rcvmacused&&t.oldMacKeys.push(e[1].rcvmac)}),this.their_old_y=this.their_y,this.sessKeys[0][1]=this.sessKeys[0][0],this.sessKeys[1][1]=this.sessKeys[1][0],this.their_y=e,this.sessKeys[0][0]=new this.DHSession(this.our_dh,this.their_y),this.sessKeys[1][0]=new this.DHSession(this.our_old_dh,this.their_y)},m.prototype.prepareMsg=function(e,n){if(this.msgstate!==o.MSGSTATE_ENCRYPTED||this.their_keyid===0)return this.error("Not ready to encrypt.");var r=this.sessKeys[1][0];if(r.send_counter>=d)return this.error("Should have rekeyed by now.");r.send_counter+=1;var i=u.packCtr(r.send_counter),s=this.ake.otr_version+"\ 3",a=this.ake.otr_version===o.OTR_VERSION_3;a&&(s+=this.our_instance_tag,s+=this.their_instance_tag),s+="\0",s+=u.packINT(this.our_keyid-1),s+=u.packINT(this.their_keyid),s+=u.packMPI(this.our_dh.publicKey),s+=i.substring(0,8);if(Math.ceil(e.length/8)>=v)return this.error("Message is too long.");var f=u.encryptAes(t.enc.Latin1.parse(e),r.sendenc,i);return s+=u.packData(f),s+=u.make1Mac(s,r.sendmac),s+=u.packData(this.oldMacKeys.splice(0).join("")),s=u.wrapMsg(s,this.fragment_size,a,this.our_instance_tag,this.their_instance_tag),s[0]?this.error(s[0]):(n&&this.trigger("file",["send",r.extra_symkey,n]),s[1])},m.prototype.handleDataMsg=function(e){var n=e.version+e.type;this.ake.otr_version===o.OTR_VERSION_3&&(n+=e.instance_tags);var r=["BYTE","INT","INT","MPI","CTR","DATA","MAC","DATA"];e=u.splitype(r,e.msg);var i=e[0]==="\ 1";if(this.msgstate!==o.MSGSTATE_ENCRYPTED||e.length!==8){i||this.error("Received an unreadable encrypted message.",!0);return}var s=this.our_keyid-u.readLen(e[2]),a=this.their_keyid-u.readLen(e[1]);if(s<0||s>1){i||this.error("Not of our latest keys.",!0);return}if(a<0||a>1){i||this.error("Not of your latest keys.",!0);return}var f=a?this.their_old_y:this.their_y;if(a===1&&!f){i||this.error("Do not have that key.");return}var l=this.sessKeys[s][a],c=u.unpackCtr(e[4]);if(c<=l.rcv_counter){i||this.error("Counter in message is not larger.");return}l.rcv_counter=c,n+=e.slice(0,6).join("");var h=u.make1Mac(n,l.rcvmac);if(!u.compare(e[6],h)){i||this.error("MACs do not match.");return}l.rcvmacused=!0;var p=u.decryptAes(e[5].substring(4),l.rcvenc,u.padCtr(e[4]));p=p.toString(t.enc.Latin1),s||this.rotateOurKeys(),a||this.rotateTheirKeys(u.readMPI(e[3]));var d=p.indexOf("\0");return~d&&(this.handleTLVs(p.substring(d+1),l),p=p.substring(0,d)),p=t.enc.Latin1.parse(p),p.toString(t.enc.Utf8)},m.prototype.handleTLVs=function(e,n){var r,i,s;for(;e.length;){r=u.unpackSHORT(e.substr(0,2)),i=u.unpackSHORT(e.substr(2,2)),s=e.substr(4,i);if(s.length<i)break;switch(r){case 1:this.msgstate=o.MSGSTATE_FINISHED,this.trigger("status",[o.STATUS_END_OTR]);break;case 2:case 3:case 4:case 5:case 6:case 7:if(this.msgstate!==o.MSGSTATE_ENCRYPTED){this.sm&&this.sm.abort();return}this.sm||this._smInit(),this.sm.handleSM({msg:s,type:r});break;case 8:s=s.substring(4),s=t.enc.Latin1.parse(s),s=s.toString(t.enc.Utf8),this.trigger("file",["receive",n.extra_symkey,s])}e=e.substring(4+i)}},m.prototype.smpSecret=function(e,n){if(this.msgstate!==o.MSGSTATE_ENCRYPTED)return this.error("Must be encrypted for SMP.");if(typeof e!="string"||e.length<1)return this.error("Secret is required.");this.sm||this._smInit(),e=t.enc.Utf8.parse(e).toString(t.enc.Latin1),n=t.enc.Utf8.parse(n).toString(t.enc.Latin1),this.sm.rcvSecret(e,n)},m.prototype.sendQueryMsg=function(){var e={},t=o.OTR_TAG;this.ALLOW_V2&&(e[2]=!0),this.ALLOW_V3&&(e[3]=!0);var n=Object.keys(e);n.length&&(t+="v",n.forEach(function(e){e!=="1"&&(t+=e)}),t+="?"),this.io(t),this.trigger("status",[o.STATUS_SEND_QUERY])},m.prototype.sendMsg=function(e,n){if(this.REQUIRE_ENCRYPTION||this.msgstate!==o.MSGSTATE_PLAINTEXT)e=t.enc.Utf8.parse(e),e=e.toString(t.enc.Latin1);switch(this.msgstate){case o.MSGSTATE_PLAINTEXT:if(this.REQUIRE_ENCRYPTION){this.storedMgs.push({msg:e,meta:n}),this.sendQueryMsg();return}this.SEND_WHITESPACE_TAG&&!this.receivedPlaintext&&(e+=o.WHITESPACE_TAG,this.ALLOW_V3&&(e+=o.WHITESPACE_TAG_V3),this.ALLOW_V2&&(e+=o.WHITESPACE_TAG_V2));break;case o.MSGSTATE_FINISHED:this.storedMgs.push({msg:e,meta:n}),this.error("Message cannot be sent at this time.");return;case o.MSGSTATE_ENCRYPTED:e=this.prepareMsg(e);break;default:throw new Error("Unknown message state.")}e&&this.io(e,n)},m.prototype.receiveMsg=function(e){e=a.parseMsg(this,e);if(!e)return;switch(e.cls){case"error":this.error(e.msg);return;case"ake":if(e.version===o.OTR_VERSION_3&&this.checkInstanceTags(e.instance_tags))return;this.ake.handleAKE(e);return;case"data":if(e.version===o.OTR_VERSION_3&&this.checkInstanceTags(e.instance_tags))return;e.msg=this.handleDataMsg(e),e.encrypted=!0;break;case"query":this.msgstate===o.MSGSTATE_ENCRYPTED&&this._akeInit(),this.doAKE(e);break;default:(this.REQUIRE_ENCRYPTION||this.msgstate!==o.MSGSTATE_PLAINTEXT)&&this.error("Received an unencrypted message."),this.receivedPlaintext=!0,this.WHITESPACE_START_AKE&&e.ver.length>0&&this.doAKE(e)}e.msg&&this.trigger("ui",[e.msg,!!e.encrypted])},m.prototype.checkInstanceTags=function(e){var t=u.readLen(e.substr(0,4)),n=u.readLen(e.substr(4,4));if(n&&n!==u.readLen(this.our_instance_tag))return!0;if(u.readLen(this.their_instance_tag)){if(u.readLen(this.their_instance_tag)!==t)return!0}else{if(t<100)return!0;this.their_instance_tag=u.packINT(t)}},m.prototype.doAKE=function(e){this.ALLOW_V3&&~e.ver.indexOf(o.OTR_VERSION_3)?this.ake.initiateAKE(o.OTR_VERSION_3):this.ALLOW_V2&&~e.ver.indexOf(o.OTR_VERSION_2)?this.ake.initiateAKE(o.OTR_VERSION_2):this.error("OTR conversation requested, but no compatible protocol version found.")},m.prototype.error=function(e,t){if(t){this.debug||(e="An OTR error has occurred."),e="?OTR Error:"+e,this.io(e);return}this.trigger("error",[e])},m.prototype.sendStored=function(){var e=this;this.storedMgs.splice(0).forEach(function(t){var n=e.prepareMsg(t.msg);e.io(n,t.meta)})},m.prototype.sendFile=function(e){if(this.msgstate!==o.MSGSTATE_ENCRYPTED)return this.error("Not ready to encrypt.");if(this.ake.otr_version!==o.OTR_VERSION_3)return this.error("Protocol v3 required.");if(!e)return this.error("Please specify a filename.");var n=t.enc.Utf8.parse(e);n=n.toString(t.enc.Latin1);if(n.length>=65532)return this.error("filename is too long.");var r="\0";r+="\0\b",r+=u.packSHORT(4+n.length),r+="\0\0\0\ 1",r+=n,r=this.prepareMsg(r,e),this.io(r)},m.prototype.endOtr=function(){this.msgstate===o.MSGSTATE_ENCRYPTED&&(this.sendMsg("\0\0\ 1\0\0"),this.sm&&(this.smw&&this.sm.worker.terminate(),this.sm=null)),this.msgstate=o.MSGSTATE_PLAINTEXT,this.receivedPlaintext=!1,this.trigger("status",[o.STATUS_END_OTR])},m.makeInstanceTag=function(){var e=n.randBigInt(32);return n.greater(n.str2bigInt("100",16),e)?m.makeInstanceTag():u.packINT(parseInt(n.bigInt2str(e,10),10))}}.call(this),{OTR:this.OTR,DSA:this.DSA}}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?module.exports=t():typeof define=="function"&&define.amd?define("moment",t):e.moment=t()}(this,function(){"use strict";function t(){return e.apply(null,arguments)}function n(t){e=t}function r(e){return Object.prototype.toString.call(e)==="[object Array]"}function i(e){return e instanceof Date||Object.prototype.toString.call(e)==="[object Date]"}function s(e,t){var n=[],r;for(r=0;r<e.length;++r)n.push(t(e[r],r));return n}function o(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function u(e,t){for(var n in t)o(t,n)&&(e[n]=t[n]);return o(t,"toString")&&(e.toString=t.toString),o(t,"valueOf")&&(e.valueOf=t.valueOf),e}function a(e,t,n,r){return gn(e,t,n,r,!0).utc()}function f(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function l(e){return e._pf==null&&(e._pf=f()),e._pf}function c(e){if(e._isValid==null){var t=l(e);e._isValid=!isNaN(e._d.getTime())&&t.overflow<0&&!t.empty&&!t.invalidMonth&&!t.invalidWeekday&&!t.nullInput&&!t.invalidFormat&&!t.userInvalidated,e._strict&&(e._isValid=e._isValid&&t.charsLeftOver===0&&t.unusedTokens.length===0&&t.bigHour===undefined)}return e._isValid}function h(e){var t=a(NaN);return e!=null?u(l(t),e):l(t).userInvalidated=!0,t}function d(e,t){var n,r,i;typeof t._isAMomentObject!="undefined"&&(e._isAMomentObject=t._isAMomentObject),typeof t._i!="undefined"&&(e._i=t._i),typeof t._f!="undefined"&&(e._f=t._f),typeof t._l!="undefined"&&(e._l=t._l),typeof t._strict!="undefined"&&(e._strict=t._strict),typeof t._tzm!="undefined"&&(e._tzm=t._tzm),typeof t._isUTC!="undefined"&&(e._isUTC=t._isUTC),typeof t._offset!="undefined"&&(e._offset=t._offset),typeof t._pf!="undefined"&&(e._pf=l(t)),typeof t._locale!="undefined"&&(e._locale=t._locale);if(p.length>0)for(n in p)r=p[n],i=t[r],typeof i!="undefined"&&(e[r]=i);return e}function m(e){d(this,e),this._d=new Date(e._d!=null?e._d.getTime():NaN),v===!1&&(v=!0,t.updateOffset(this),v=!1)}function g(e){return e instanceof m||e!=null&&e._isAMomentObject!=null}function y(e){return e<0?Math.ceil(e):Math.floor(e)}function b(e){var t=+e,n=0;return t!==0&&isFinite(t)&&(n=y(t)),n}function w(e,t,n){var r=Math.min(e.length,t.length),i=Math.abs(e.length-t.length),s=0,o;for(o=0;o<r;o++)(n&&e[o]!==t[o]||!n&&b(e[o])!==b(t[o]))&&s++;return s+i}function E(){}function T(e){return e?e.toLowerCase().replace("_","-"):e}function N(e){var t=0,n,r,i,s;while(t<e.length){s=T(e[t]).split("-"),n=s.length,r=T(e[t+1]),r=r?r.split("-"):null;while(n>0){i=C(s.slice(0,n).join("-"));if(i)return i;if(r&&r.length>=n&&w(s,r,!0)>=n-1)break;n--}t++}return null}function C(e){var t=null;if(!S[e]&&typeof module!="undefined"&&module&&module.exports)try{t=x._abbr,require("./locale/"+e),k(t)}catch(n){}return S[e]}function k(e,t){var n;return e&&(typeof t=="undefined"?n=A(e):n=L(e,t),n&&(x=n)),x._abbr}function L(e,t){return t!==null?(t.abbr=e,S[e]=S[e]||new E,S[e].set(t),k(e),S[e]):(delete S[e],null)}function A(e){var t;e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr);if(!e)return x;if(!r(e)){t=C(e);if(t)return t;e=[e]}return N(e)}function M(e,t){var n=e.toLowerCase();O[n]=O[n+"s"]=O[t]=e}function _(e){return typeof e=="string"?O[e]||O[e.toLowerCase()]:undefined}function D(e){var t={},n,r;for(r in e)o(e,r)&&(n=_(r),n&&(t[n]=e[r]));return t}function P(e,n){return function(r){return r!=null?(B(this,e,r),t.updateOffset(this,n),this):H(this,e)}}function H(e,t){return e._d["get"+(e._isUTC?"UTC":"")+t]()}function B(e,t,n){return e._d["set"+(e._isUTC?"UTC":"")+t](n)}function j(e,t){var n;if(typeof e=="object")for(n in e)this.set(n,e[n]);else{e=_(e);if(typeof this[e]=="function")return this[e](t)}return this}function F(e,t,n){var r=""+Math.abs(e),i=t-r.length,s=e>=0;return(s?n?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+r}function z(e,t,n,r){var i=r;typeof r=="string"&&(i=function(){return this[r]()}),e&&(U[e]=i),t&&(U[t[0]]=function(){return F(i.apply(this,arguments),t[1],t[2])}),n&&(U[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function W(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function X(e){var t=e.match(I),n,r;for(n=0,r=t.length;n<r;n++)U[t[n]]?t[n]=U[t[n]]:t[n]=W(t[n]);return function(i){var s="";for(n=0;n<r;n++)s+=t[n]instanceof Function?t[n].call(i,e):t[n];return s}}function V(e,t){return e.isValid()?(t=$(t,e.localeData()),R[t]=R[t]||X(t),R[t](e)):e.localeData().invalidDate()}function $(e,t){function r(e){return t.longDateFormat(e)||e}var n=5;q.lastIndex=0;while(n>=0&&q.test(e))e=e.replace(q,r),q.lastIndex=0,n-=1;return e}function ft(e){return typeof e=="function"&&Object.prototype.toString.call(e)==="[object Function]"}function lt(e,t,n){at[e]=ft(t)?t:function(e){return e&&n?n:t}}function ct(e,t){return o(at,e)?at[e](t._strict,t._locale):new RegExp(ht(e))}function ht(e){return e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,n,r,i){return t||n||r||i}).replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function dt(e,t){var n,r=t;typeof e=="string"&&(e=[e]),typeof t=="number"&&(r=function(e,n){n[t]=b(e)});for(n=0;n<e.length;n++)pt[e[n]]=r}function vt(e,t){dt(e,function(e,n,r,i){r._w=r._w||{},t(e,r._w,r,i)})}function mt(e,t,n){t!=null&&o(pt,e)&&pt[e](t,n._a,n,e)}function Tt(e,t){return(new Date(Date.UTC(e,t+1,0))).getUTCDate()}function Ct(e){return this._months[e.month()]}function Lt(e){return this._monthsShort[e.month()]}function At(e,t,n){var r,i,s;this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]);for(r=0;r<12;r++){i=a([2e3,r]),n&&!this._longMonthsParse[r]&&(this._longMonthsParse[r]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[r]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),!n&&!this._monthsParse[r]&&(s="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[r]=new RegExp(s.replace(".",""),"i"));if(n&&t==="MMMM"&&this._longMonthsParse[r].test(e))return r;if(n&&t==="MMM"&&this._shortMonthsParse[r].test(e))return r;if(!n&&this._monthsParse[r].test(e))return r}}function Ot(e,t){var n;if(typeof t=="string"){t=e.localeData().monthsParse(t);if(typeof t!="number")return e}return n=Math.min(e.date(),Tt(e.year(),t)),e._d["set"+(e._isUTC?"UTC":"")+"Month"](t,n),e}function Mt(e){return e!=null?(Ot(this,e),t.updateOffset(this,!0),this):H(this,"Month")}function _t(){return Tt(this.year(),this.month())}function Dt(e){var t,n=e._a;return n&&l(e).overflow===-2&&(t=n[yt]<0||n[yt]>11?yt:n[bt]<1||n[bt]>Tt(n[gt],n[yt])?bt:n[wt]<0||n[wt]>24||n[wt]===24&&(n[Et]!==0||n[St]!==0||n[xt]!==0)?wt:n[Et]<0||n[Et]>59?Et:n[St]<0||n[St]>59?St:n[xt]<0||n[xt]>999?xt:-1,l(e)._overflowDayOfYear&&(t<gt||t>bt)&&(t=bt),l(e).overflow=t),e}function Pt(e){t.suppressDeprecationWarnings===!1&&typeof console!="undefined"&&console.warn&&console.warn("Deprecation warning: "+e)}function Ht(e,t){var n=!0;return u(function(){return n&&(Pt(e+"\n"+(new Error).stack),n=!1),t.apply(this,arguments)},t)}function jt(e,t){Bt[e]||(Pt(t),Bt[e]=!0)}function Ut(e){var t,n,r=e._i,i=Ft.exec(r);if(i){l(e).iso=!0;for(t=0,n=It.length;t<n;t++)if(It[t][1].exec(r)){e._f=It[t][0];break}for(t=0,n=qt.length;t<n;t++)if(qt[t][1].exec(r)){e._f+=(i[6]||" ")+qt[t][0];break}r.match(st)&&(e._f+="Z"),ln(e)}else e._isValid=!1}function zt(e){var n=Rt.exec(e._i);if(n!==null){e._d=new Date(+n[1]);return}Ut(e),e._isValid===!1&&(delete e._isValid,t.createFromInputFallback(e))}function Wt(e,t,n,r,i,s,o){var u=new Date(e,t,n,r,i,s,o);return e<1970&&u.setFullYear(e),u}function Xt(e){var t=new Date(Date.UTC.apply(null,arguments));return e<1970&&t.setUTCFullYear(e),t}function Vt(e){return $t(e)?366:365}function $t(e){return e%4===0&&e%100!==0||e%400===0}function Kt(){return $t(this.year())}function Qt(e,t,n){var r=n-t,i=n-e.day(),s;return i>r&&(i-=7),i<r-7&&(i+=7),s=yn(e).add(i,"d"),{week:Math.ceil(s.dayOfYear()/7),year:s.year()}}function Gt(e){return Qt(e,this._week.dow,this._week.doy).week}function Zt(){return this._week.dow}function en(){return this._week.doy}function tn(e){var t=this.localeData().week(this);return e==null?t:this.add((e-t)*7,"d")}function nn(e){var t=Qt(this,1,4).week;return e==null?t:this.add((e-t)*7,"d")}function rn(e,t,n,r,i){var s=6+i-r,o=Xt(e,0,1+s),u=o.getUTCDay(),a;return u<i&&(u+=7),n=n!=null?1*n:i,a=1+s+7*(t-1)-u+n,{year:a>0?e:e-1,dayOfYear:a>0?a:Vt(e-1)+a}}function sn(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return e==null?t:this.add(e-t,"d")}function on(e,t,n){return e!=null?e:t!=null?t:n}function un(e){var t=new Date;return e._useUTC?[t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate()]:[t.getFullYear(),t.getMonth(),t.getDate()]}function an(e){var t,n,r=[],i,s;if(e._d)return;i=un(e),e._w&&e._a[bt]==null&&e._a[yt]==null&&fn(e),e._dayOfYear&&(s=on(e._a[gt],i[gt]),e._dayOfYear>Vt(s)&&(l(e)._overflowDayOfYear=!0),n=Xt(s,0,e._dayOfYear),e._a[yt]=n.getUTCMonth(),e._a[bt]=n.getUTCDate());for(t=0;t<3&&e._a[t]==null;++t)e._a[t]=r[t]=i[t];for(;t<7;t++)e._a[t]=r[t]=e._a[t]==null?t===2?1:0:e._a[t];e._a[wt]===24&&e._a[Et]===0&&e._a[St]===0&&e._a[xt]===0&&(e._nextDay=!0,e._a[wt]=0),e._d=(e._useUTC?Xt:Wt).apply(null,r),e._tzm!=null&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[wt]=24)}function fn(e){var t,n,r,i,s,o,u;t=e._w,t.GG!=null||t.W!=null||t.E!=null?(s=1,o=4,n=on(t.GG,e._a[gt],Qt(yn(),1,4).year),r=on(t.W,1),i=on(t.E,1)):(s=e._locale._week.dow,o=e._locale._week.doy,n=on(t.gg,e._a[gt],Qt(yn(),s,o).year),r=on(t.w,1),t.d!=null?(i=t.d,i<s&&++r):t.e!=null?i=t.e+s:i=s),u=rn(n,r,i,o,s),e._a[gt]=u.year,e._dayOfYear=u.dayOfYear}function ln(e){if(e._f===t.ISO_8601){Ut(e);return}e._a=[],l(e).empty=!0;var n=""+e._i,r,i,s,o,u,a=n.length,f=0;s=$(e._f,e._locale).match(I)||[];for(r=0;r<s.length;r++)o=s[r],i=(n.match(ct(o,e))||[])[0],i&&(u=n.substr(0,n.indexOf(i)),u.length>0&&l(e).unusedInput.push(u),n=n.slice(n.indexOf(i)+i.length),f+=i.length),U[o]?(i?l(e).empty=!1:l(e).unusedTokens.push(o),mt(o,i,e)):e._strict&&!i&&l(e).unusedTokens.push(o);l(e).charsLeftOver=a-f,n.length>0&&l(e).unusedInput.push(n),l(e).bigHour===!0&&e._a[wt]<=12&&e._a[wt]>0&&(l(e).bigHour=undefined),e._a[wt]=cn(e._locale,e._a[wt],e._meridiem),an(e),Dt(e)}function cn(e,t,n){var r;return n==null?t:e.meridiemHour!=null?e.meridiemHour(t,n):e.isPM!=null?(r=e.isPM(n),r&&t<12&&(t+=12),!r&&t===12&&(t=0),t):t}function hn(e){var t,n,r,i,s;if(e._f.length===0){l(e).invalidFormat=!0,e._d=new Date(NaN);return}for(i=0;i<e._f.length;i++){s=0,t=d({},e),e._useUTC!=null&&(t._useUTC=e._useUTC),t._f=e._f[i],ln(t);if(!c(t))continue;s+=l(t).charsLeftOver,s+=l(t).unusedTokens.length*10,l(t).score=s;if(r==null||s<r)r=s,n=t}u(e,n||t)}function pn(e){if(e._d)return;var t=D(e._i);e._a=[t.year,t.month,t.day||t.date,t.hour,t.minute,t.second,t.millisecond],an(e)}function dn(e){var t=new m(Dt(vn(e)));return t._nextDay&&(t.add(1,"d"),t._nextDay=undefined),t}function vn(e){var t=e._i,n=e._f;return e._locale=e._locale||A(e._l),t===null||n===undefined&&t===""?h({nullInput:!0}):(typeof t=="string"&&(e._i=t=e._locale.preparse(t)),g(t)?new m(Dt(t)):(r(n)?hn(e):n?ln(e):i(t)?e._d=t:mn(e),e))}function mn(e){var n=e._i;n===undefined?e._d=new Date:i(n)?e._d=new Date(+n):typeof n=="string"?zt(e):r(n)?(e._a=s(n.slice(0),function(e){return parseInt(e,10)}),an(e)):typeof n=="object"?pn(e):typeof n=="number"?e._d=new Date(n):t.createFromInputFallback(e)}function gn(e,t,n,r,i){var s={};return typeof n=="boolean"&&(r=n,n=undefined),s._isAMomentObject=!0,s._useUTC=s._isUTC=i,s._l=n,s._i=e,s._f=t,s._strict=r,dn(s)}function yn(e,t,n,r){return gn(e,t,n,r,!1)}function En(e,t){var n,i;t.length===1&&r(t[0])&&(t=t[0]);if(!t.length)return yn();n=t[0];for(i=1;i<t.length;++i)if(!t[i].isValid()||t[i][e](n))n=t[i];return n}function Sn(){var e=[].slice.call(arguments,0);return En("isBefore",e)}function xn(){var e=[].slice.call(arguments,0);return En("isAfter",e)}function Tn(e){var t=D(e),n=t.year||0,r=t.quarter||0,i=t.month||0,s=t.week||0,o=t.day||0,u=t.hour||0,a=t.minute||0,f=t.second||0,l=t.millisecond||0;this._milliseconds=+l+f*1e3+a*6e4+u*36e5,this._days=+o+s*7,this._months=+i+r*3+n*12,this._data={},this._locale=A(),this._bubble()}function Nn(e){return e instanceof Tn}function Cn(e,t){z(e,0,0,function(){var e=this.utcOffset(),n="+";return e<0&&(e=-e,n="-"),n+F(~~(e/60),2)+t+F(~~e%60,2)})}function Ln(e){var t=(e||"").match(st)||[],n=t[t.length-1]||[],r=(n+"").match(kn)||["-",0,0],i=+(r[1]*60)+b(r[2]);return r[0]==="+"?i:-i}function An(e,n){var r,s;return n._isUTC?(r=n.clone(),s=(g(e)||i(e)?+e:+yn(e))- +r,r._d.setTime(+r._d+s),t.updateOffset(r,!1),r):yn(e).local()}function On(e){return-Math.round(e._d.getTimezoneOffset()/15)*15}function Mn(e,n){var r=this._offset||0,i;return e!=null?(typeof e=="string"&&(e=Ln(e)),Math.abs(e)<16&&(e*=60),!this._isUTC&&n&&(i=On(this)),this._offset=e,this._isUTC=!0,i!=null&&this.add(i,"m"),r!==e&&(!n||this._changeInProgress?Kn(this,Wn(e-r,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,t.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?r:On(this)}function _n(e,t){return e!=null?(typeof e!="string"&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}function Dn(e){return this.utcOffset(0,e)}function Pn(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e&&this.subtract(On(this),"m")),this}function Hn(){return this._tzm?this.utcOffset(this._tzm):typeof this._i=="string"&&this.utcOffset(Ln(this._i)),this}function Bn(e){return e=e?yn(e).utcOffset():0,(this.utcOffset()-e)%60===0}function jn(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Fn(){if(typeof this._isDSTShifted!="undefined")return this._isDSTShifted;var e={};d(e,this),e=vn(e);if(e._a){var t=e._isUTC?a(e._a):yn(e._a);this._isDSTShifted=this.isValid()&&w(e._a,t.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function In(){return!this._isUTC}function qn(){return this._isUTC}function Rn(){return this._isUTC&&this._offset===0}function Wn(e,t){var n=e,r=null,i,s,u;return Nn(e)?n={ms:e._milliseconds,d:e._days,M:e._months}:typeof e=="number"?(n={},t?n[t]=e:n.milliseconds=e):(r=Un.exec(e))?(i=r[1]==="-"?-1:1,n={y:0,d:b(r[bt])*i,h:b(r[wt])*i,m:b(r[Et])*i,s:b(r[St])*i,ms:b(r[xt])*i}):(r=zn.exec(e))?(i=r[1]==="-"?-1:1,n={y:Xn(r[2],i),M:Xn(r[3],i),d:Xn(r[4],i),h:Xn(r[5],i),m:Xn(r[6],i),s:Xn(r[7],i),w:Xn(r[8],i)}):n==null?n={}:typeof n=="object"&&("from"in n||"to"in n)&&(u=$n(yn(n.from),yn(n.to)),n={},n.ms=u.milliseconds,n.M=u.months),s=new Tn(n),Nn(e)&&o(e,"_locale")&&(s._locale=e._locale),s}function Xn(e,t){var n=e&&parseFloat(e.replace(",","."));return(isNaN(n)?0:n)*t}function Vn(e,t){var n={milliseconds:0,months:0};return n.months=t.month()-e.month()+(t.year()-e.year())*12,e.clone().add(n.months,"M").isAfter(t)&&--n.months,n.milliseconds=+t- +e.clone().add(n.months,"M"),n}function $n(e,t){var n;return t=An(t,e),e.isBefore(t)?n=Vn(e,t):(n=Vn(t,e),n.milliseconds=-n.milliseconds,n.months=-n.months),n}function Jn(e,t){return function(n,r){var i,s;return r!==null&&!isNaN(+r)&&(jt(t,"moment()."+t+"(period, number) is deprecated. Please use moment()."+t+"(number, period)."),s=n,n=r,r=s),n=typeof n=="string"?+n:n,i=Wn(n,r),Kn(this,i,e),this}}function Kn(e,n,r,i){var s=n._milliseconds,o=n._days,u=n._months;i=i==null?!0:i,s&&e._d.setTime(+e._d+s*r),o&&B(e,"Date",H(e,"Date")+o*r),u&&Ot(e,H(e,"Month")+u*r),i&&t.updateOffset(e,o||u)}function Yn(e,t){var n=e||yn(),r=An(n,this).startOf("day"),i=this.diff(r,"days",!0),s=i<-6?"sameElse":i<-1?"lastWeek":i<0?"lastDay":i<1?"sameDay":i<2?"nextDay":i<7?"nextWeek":"sameElse";return this.format(t&&t[s]||this.localeData().calendar(s,this,yn(n)))}function Zn(){return new m(this)}function er(e,t){var n;return t=_(typeof t!="undefined"?t:"millisecond"),t==="millisecond"?(e=g(e)?e:yn(e),+this>+e):(n=g(e)?+e:+yn(e),n<+this.clone().startOf(t))}function tr(e,t){var n;return t=_(typeof t!="undefined"?t:"millisecond"),t==="millisecond"?(e=g(e)?e:yn(e),+this<+e):(n=g(e)?+e:+yn(e),+this.clone().endOf(t)<n)}function nr(e,t,n){return this.isAfter(e,n)&&this.isBefore(t,n)}function rr(e,t){var n;return t=_(t||"millisecond"),t==="millisecond"?(e=g(e)?e:yn(e),+this===+e):(n=+yn(e),+this.clone().startOf(t)<=n&&n<=+this.clone().endOf(t))}function ir(e,t,n){var r=An(e,this),i=(r.utcOffset()-this.utcOffset())*6e4,s,o;return t=_(t),t==="year"||t==="month"||t==="quarter"?(o=sr(this,r),t==="quarter"?o/=3:t==="year"&&(o/=12)):(s=this-r,o=t==="second"?s/1e3:t==="minute"?s/6e4:t==="hour"?s/36e5:t==="day"?(s-i)/864e5:t==="week"?(s-i)/6048e5:s),n?o:y(o)}function sr(e,t){var n=(t.year()-e.year())*12+(t.month()-e.month()),r=e.clone().add(n,"months"),i,s;return t-r<0?(i=e.clone().add(n-1,"months"),s=(t-r)/(r-i)):(i=e.clone().add(n+1,"months"),s=(t-r)/(i-r)),-(n+s)}function or(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function ur(){var e=this.clone().utc();return 0<e.year()&&e.year()<=9999?"function"==typeof Date.prototype.toISOString?this.toDate().toISOString():V(e,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):V(e,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}function ar(e){var n=V(this,e||t.defaultFormat);return this.localeData().postformat(n)}function fr(e,t){return this.isValid()?Wn({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function lr(e){return this.from(yn(),e)}function cr(e,t){return this.isValid()?Wn({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function hr(e){return this.to(yn(),e)}function pr(e){var t;return e===undefined?this._locale._abbr:(t=A(e),t!=null&&(this._locale=t),this)}function vr(){return this._locale}function mr(e){e=_(e);switch(e){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return e==="week"&&this.weekday(0),e==="isoWeek"&&this.isoWeekday(1),e==="quarter"&&this.month(Math.floor(this.month()/3)*3),this}function gr(e){return e=_(e),e===undefined||e==="millisecond"?this:this.startOf(e).add(1,e==="isoWeek"?"week":e).subtract(1,"ms")}function yr(){return+this._d-(this._offset||0)*6e4}function br(){return Math.floor(+this/1e3)}function wr(){return this._offset?new Date(+this):this._d}function Er(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]}function Sr(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}}function xr(){return c(this)}function Tr(){return u({},l(this))}function Nr(){return l(this).overflow}function Cr(e,t){z(0,[e,e.length],0,t)}function kr(e,t,n){return Qt(yn([e,11,31+t-n]),t,n).week}function Lr(e){var t=Qt(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return e==null?t:this.add(e-t,"y")}function Ar(e){var t=Qt(this,1,4).year;return e==null?t:this.add(e-t,"y")}function Or(){return kr(this.year(),1,4)}function Mr(){var e=this.localeData()._week;return kr(this.year(),e.dow,e.doy)}function _r(e){return e==null?Math.ceil((this.month()+1)/3):this.month((e-1)*3+this.month()%3)}function Pr(e,t){return typeof e!="string"?e:isNaN(e)?(e=t.weekdaysParse(e),typeof e=="number"?e:null):parseInt(e,10)}function Br(e){return this._weekdays[e.day()]}function Fr(e){return this._weekdaysShort[e.day()]}function qr(e){return this._weekdaysMin[e.day()]}function Rr(e){var t,n,r;this._weekdaysParse=this._weekdaysParse||[];for(t=0;t<7;t++){this._weekdaysParse[t]||(n=yn([2e3,1]).day(t),r="^"+this.weekdays(n,"")+"|^"+this.weekdaysShort(n,"")+"|^"+this.weekdaysMin(n,""),this._weekdaysParse[t]=new RegExp(r.replace(".",""),"i"));if(this._weekdaysParse[t].test(e))return t}}function Ur(e){var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return e!=null?(e=Pr(e,this.localeData()),this.add(e-t,"d")):t}function zr(e){var t=(this.day()+7-this.localeData()._week.dow)%7;return e==null?t:this.add(e-t,"d")}function Wr(e){return e==null?this.day()||7:this.day(this.day()%7?e:e-7)}function Xr(e,t){z(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function Vr(e,t){return t._meridiemParse}function $r(e){return(e+"").toLowerCase().charAt(0)==="p"}function Kr(e,t,n){return e>11?n?"pm":"PM":n?"am":"AM"}function ei(e,t){t[xt]=b(("0."+e)*1e3)}function ni(){return this._isUTC?"UTC":""}function ri(){return this._isUTC?"Coordinated Universal Time":""}function oi(e){return yn(e*1e3)}function ui(){return yn.apply(null,arguments).parseZone()}function fi(e,t,n){var r=this._calendar[e];return typeof r=="function"?r.call(t,n):r}function ci(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.replace(/MMMM|MM|DD|dddd/g,function(e){return e.slice(1)}),this._longDateFormat[e])}function pi(){return this._invalidDate}function mi(e){return this._ordinal.replace("%d",e)}function gi(e){return e}function bi(e,t,n,r){var i=this._relativeTime[n];return typeof i=="function"?i(e,t,n,r):i.replace(/%d/i,e)}function wi(e,t){var n=this._relativeTime[e>0?"future":"past"];return typeof n=="function"?n(t):n.replace(/%s/i,t)}function Ei(e){var t,n;for(n in e)t=e[n],typeof t=="function"?this[n]=t:this["_"+n]=t;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)}function xi(e,t,n,r){var i=A(),s=a().set(r,t);return i[n](s,e)}function Ti(e,t,n,r,i){typeof e=="number"&&(t=e,e=undefined),e=e||"";if(t!=null)return xi(e,t,n,i);var s,o=[];for(s=0;s<r;s++)o[s]=xi(e,s,n,i);return o}function Ni(e,t){return Ti(e,t,"months",12,"month")}function Ci(e,t){return Ti(e,t,"monthsShort",12,"month")}function ki(e,t){return Ti(e,t,"weekdays",7,"day")}function Li(e,t){return Ti(e,t,"weekdaysShort",7,"day")}function Ai(e,t){return Ti(e,t,"weekdaysMin",7,"day")}function Mi(){var e=this._data;return this._milliseconds=Oi(this._milliseconds),this._days=Oi(this._days),this._months=Oi(this._months),e.milliseconds=Oi(e.milliseconds),e.seconds=Oi(e.seconds),e.minutes=Oi(e.minutes),e.hours=Oi(e.hours),e.months=Oi(e.months),e.years=Oi(e.years),this}function _i(e,t,n,r){var i=Wn(t,n);return e._milliseconds+=r*i._milliseconds,e._days+=r*i._days,e._months+=r*i._months,e._bubble()}function Di(e,t){return _i(this,e,t,1)}function Pi(e,t){return _i(this,e,t,-1)}function Hi(e){return e<0?Math.floor(e):Math.ceil(e)}function Bi(){var e=this._milliseconds,t=this._days,n=this._months,r=this._data,i,s,o,u,a;return e>=0&&t>=0&&n>=0||e<=0&&t<=0&&n<=0||(e+=Hi(Fi(n)+t)*864e5,t=0,n=0),r.milliseconds=e%1e3,i=y(e/1e3),r.seconds=i%60,s=y(i/60),r.minutes=s%60,o=y(s/60),r.hours=o%24,t+=y(o/24),a=y(ji(t)),n+=a,t-=Hi(Fi(a)),u=y(n/12),n%=12,r.days=t,r.months=n,r.years=u,this}function ji(e){return e*4800/146097}function Fi(e){return e*146097/4800}function Ii(e){var t,n,r=this._milliseconds;e=_(e);if(e==="month"||e==="year")return t=this._days+r/864e5,n=this._months+ji(t),e==="month"?n:n/12;t=this._days+Math.round(Fi(this._months));switch(e){case"week":return t/7+r/6048e5;case"day":return t+r/864e5;case"hour":return t*24+r/36e5;case"minute":return t*1440+r/6e4;case"second":return t*86400+r/1e3;case"millisecond":return Math.floor(t*864e5)+r;default:throw new Error("Unknown unit "+e)}}function qi(){return this._milliseconds+this._days*864e5+this._months%12*2592e6+b(this._months/12)*31536e6}function Ri(e){return function(){return this.as(e)}}function Qi(e){return e=_(e),this[e+"s"]()}function Gi(e){return function(){return this._data[e]}}function ss(){return y(this.days()/7)}function as(e,t,n,r,i){return i.relativeTime(t||1,!!n,e,r)}function fs(e,t,n){var r=Wn(e).abs(),i=os(r.as("s")),s=os(r.as("m")),o=os(r.as("h")),u=os(r.as("d")),a=os(r.as("M")),f=os(r.as("y")),l=i<us.s&&["s",i]||s===1&&["m"]||s<us.m&&["mm",s]||o===1&&["h"]||o<us.h&&["hh",o]||u===1&&["d"]||u<us.d&&["dd",u]||a===1&&["M"]||a<us.M&&["MM",a]||f===1&&["y"]||["yy",f];return l[2]=t,l[3]=+e>0,l[4]=n,as.apply(null,l)}function ls(e,t){return us[e]===undefined?!1:t===undefined?us[e]:(us[e]=t,!0)}function cs(e){var t=this.localeData(),n=fs(this,!e,t);return e&&(n=t.pastFuture(+this,n)),t.postformat(n)}function ps(){var e=hs(this._milliseconds)/1e3,t=hs(this._days),n=hs(this._months),r,i,s;r=y(e/60),i=y(r/60),e%=60,r%=60,s=y(n/12),n%=12;var o=s,u=n,a=t,f=i,l=r,c=e,h=this.asSeconds();return h?(h<0?"-":"")+"P"+(o?o+"Y":"")+(u?u+"M":"")+(a?a+"D":"")+(f||l||c?"T":"")+(f?f+"H":"")+(l?l+"M":"")+(c?c+"S":""):"P0D"}var e,p=t.momentProperties=[],v=!1,S={},x,O={},I=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,q=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,R={},U={},J=/\d/,K=/\d\d/,Q=/\d{3}/,G=/\d{4}/,Y=/[+-]?\d{6}/,Z=/\d\d?/,et=/\d{1,3}/,tt=/\d{1,4}/,nt=/[+-]?\d{1,6}/,rt=/\d+/,it=/[+-]?\d+/,st=/Z|[+-]\d\d:?\d\d/gi,ot=/[+-]?\d+(\.\d{1,3})?/,ut=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,at={},pt={},gt=0,yt=1,bt=2,wt=3,Et=4,St=5,xt=6;z("M",["MM",2],"Mo",function(){return this.month()+1}),z("MMM",0,0,function(e){return this.localeData().monthsShort(this,e)}),z("MMMM",0,0,function(e){return this.localeData().months(this,e)}),M("month","M"),lt("M",Z),lt("MM",Z,K),lt("MMM",ut),lt("MMMM",ut),dt(["M","MM"],function(e,t){t[yt]=b(e)-1}),dt(["MMM","MMMM"],function(e,t,n,r){var i=n._locale.monthsParse(e,r,n._strict);i!=null?t[yt]=i:l(n).invalidMonth=e});var Nt="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),kt="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),Bt={};t.suppressDeprecationWarnings=!1;var Ft=/^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,It=[["YYYYYY-MM-DD",/[+-]\d{6}-\d{2}-\d{2}/],["YYYY-MM-DD",/\d{4}-\d{2}-\d{2}/],["GGGG-[W]WW-E",/\d{4}-W\d{2}-\d/],["GGGG-[W]WW",/\d{4}-W\d{2}/],["YYYY-DDD",/\d{4}-\d{3}/]],qt=[["HH:mm:ss.SSSS",/(T| )\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],Rt=/^\/?Date\((\-?\d+)/i;t.createFromInputFallback=Ht("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(e){e._d=new Date(e._i+(e._useUTC?" UTC":""))}),z(0,["YY",2],0,function(){return this.year()%100}),z(0,["YYYY",4],0,"year"),z(0,["YYYYY",5],0,"year"),z(0,["YYYYYY",6,!0],0,"year"),M("year","y"),lt("Y",it),lt("YY",Z,K),lt("YYYY",tt,G),lt("YYYYY",nt,Y),lt("YYYYYY",nt,Y),dt(["YYYYY","YYYYYY"],gt),dt("YYYY",function(e,n){n[gt]=e.length===2?t.parseTwoDigitYear(e):b(e)}),dt("YY",function(e,n){n[gt]=t.parseTwoDigitYear(e)}),t.parseTwoDigitYear=function(e){return b(e)+(b(e)>68?1900:2e3)};var Jt=P("FullYear",!1);z("w",["ww",2],"wo","week"),z("W",["WW",2],"Wo","isoWeek"),M("week","w"),M("isoWeek","W"),lt("w",Z),lt("ww",Z,K),lt("W",Z),lt("WW",Z,K),vt(["w","ww","W","WW"],function(e,t,n,r){t[r.substr(0,1)]=b(e)});var Yt={dow:0,doy:6};z("DDD",["DDDD",3],"DDDo","dayOfYear"),M("dayOfYear","DDD"),lt("DDD",et),lt("DDDD",Q),dt(["DDD","DDDD"],function(e,t,n){n._dayOfYear=b(e)}),t.ISO_8601=function(){};var bn=Ht("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(){var e=yn.apply(null,arguments);return e<this?this:e}),wn=Ht("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(){var e=yn.apply(null,arguments);return e>this?this:e});Cn("Z",":"),Cn("ZZ",""),lt("Z",st),lt("ZZ",st),dt(["Z","ZZ"],function(e,t,n){n._useUTC=!0,n._tzm=Ln(e)});var kn=/([\+\-]|\d\d)/gi;t.updateOffset=function(){};var Un=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,zn=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/;Wn.fn=Tn.prototype;var Qn=Jn(1,"add"),Gn=Jn(-1,"subtract");t.defaultFormat="YYYY-MM-DDTHH:mm:ssZ";var dr=Ht("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return e===undefined?this.localeData():this.locale(e)});z(0,["gg",2],0,function(){return this.weekYear()%100}),z(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Cr("gggg","weekYear"),Cr("ggggg","weekYear"),Cr("GGGG","isoWeekYear"),Cr("GGGGG","isoWeekYear"),M("weekYear","gg"),M("isoWeekYear","GG"),lt("G",it),lt("g",it),lt("GG",Z,K),lt("gg",Z,K),lt("GGGG",tt,G),lt("gggg",tt,G),lt("GGGGG",nt,Y),lt("ggggg",nt,Y),vt(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,r){t[r.substr(0,2)]=b(e)}),vt(["gg","GG"],function(e,n,r,i){n[i]=t.parseTwoDigitYear(e)}),z("Q",0,0,"quarter"),M("quarter","Q"),lt("Q",J),dt("Q",function(e,t){t[yt]=(b(e)-1)*3}),z("D",["DD",2],"Do","date"),M("date","D"),lt("D",Z),lt("DD",Z,K),lt("Do",function(e,t){return e?t._ordinalParse:t._ordinalParseLenient}),dt(["D","DD"],bt),dt("Do",function(e,t){t[bt]=b(e.match(Z)[0],10)});var Dr=P("Date",!0);z("d",0,"do","day"),z("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),z("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),z("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),z("e",0,0,"weekday"),z("E",0,0,"isoWeekday"),M("day","d"),M("weekday","e"),M("isoWeekday","E"),lt("d",Z),lt("e",Z),lt("E",Z),lt("dd",ut),lt("ddd",ut),lt("dddd",ut),vt(["dd","ddd","dddd"],function(e,t,n){var r=n._locale.weekdaysParse(e);r!=null?t.d=r:l(n).invalidWeekday=e}),vt(["d","e","E"],function(e,t,n,r){t[r]=b(e)});var Hr="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),jr="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Ir="Su_Mo_Tu_We_Th_Fr_Sa".split("_");z("H",["HH",2],0,"hour"),z("h",["hh",2],0,function(){return this.hours()%12||12}),Xr("a",!0),Xr("A",!1),M("hour","h"),lt("a",Vr),lt("A",Vr),lt("H",Z),lt("h",Z),lt("HH",Z,K),lt("hh",Z,K),dt(["H","HH"],wt),dt(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),dt(["h","hh"],function(e,t,n){t[wt]=b(e),l(n).bigHour=!0});var Jr=/[ap]\.?m?\.?/i,Qr=P("Hours",!0);z("m",["mm",2],0,"minute"),M("minute","m"),lt("m",Z),lt("mm",Z,K),dt(["m","mm"],Et);var Gr=P("Minutes",!1);z("s",["ss",2],0,"second"),M("second","s"),lt("s",Z),lt("ss",Z,K),dt(["s","ss"],St);var Yr=P("Seconds",!1);z("S",0,0,function(){return~~(this.millisecond()/100)}),z(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),z(0,["SSS",3],0,"millisecond"),z(0,["SSSS",4],0,function(){return this.millisecond()*10}),z(0,["SSSSS",5],0,function(){return this.millisecond()*100}),z(0,["SSSSSS",6],0,function(){return this.millisecond()*1e3}),z(0,["SSSSSSS",7],0,function(){return this.millisecond()*1e4}),z(0,["SSSSSSSS",8],0,function(){return this.millisecond()*1e5}),z(0,["SSSSSSSSS",9],0,function(){return this.millisecond()*1e6}),M("millisecond","ms"),lt("S",et,J),lt("SS",et,K),lt("SSS",et,Q);var Zr;for(Zr="SSSS";Zr.length<=9;Zr+="S")lt(Zr,rt);for(Zr="S";Zr.length<=9;Zr+="S")dt(Zr,ei);var ti=P("Milliseconds",!1);z("z",0,0,"zoneAbbr"),z("zz",0,0,"zoneName");var ii=m.prototype;ii.add=Qn,ii.calendar=Yn,ii.clone=Zn,ii.diff=ir,ii.endOf=gr,ii.format=ar,ii.from=fr,ii.fromNow=lr,ii.to=cr,ii.toNow=hr,ii.get=j,ii.invalidAt=Nr,ii.isAfter=er,ii.isBefore=tr,ii.isBetween=nr,ii.isSame=rr,ii.isValid=xr,ii.lang=dr,ii.locale=pr,ii.localeData=vr,ii.max=wn,ii.min=bn,ii.parsingFlags=Tr,ii.set=j,ii.startOf=mr,ii.subtract=Gn,ii.toArray=Er,ii.toObject=Sr,ii.toDate=wr,ii.toISOString=ur,ii.toJSON=ur,ii.toString=or,ii.unix=br,ii.valueOf=yr,ii.year=Jt,ii.isLeapYear=Kt,ii.weekYear=Lr,ii.isoWeekYear=Ar,ii.quarter=ii.quarters=_r,ii.month=Mt,ii.daysInMonth=_t,ii.week=ii.weeks=tn,ii.isoWeek=ii.isoWeeks=nn,ii.weeksInYear=Mr,ii.isoWeeksInYear=Or,ii.date=Dr,ii.day=ii.days=Ur,ii.weekday=zr,ii.isoWeekday=Wr,ii.dayOfYear=sn,ii.hour=ii.hours=Qr,ii.minute=ii.minutes=Gr,ii.second=ii.seconds=Yr,ii.millisecond=ii.milliseconds=ti,ii.utcOffset=Mn,ii.utc=Dn,ii.local=Pn,ii.parseZone=Hn,ii.hasAlignedHourOffset=Bn,ii.isDST=jn,ii.isDSTShifted=Fn,ii.isLocal=In,ii.isUtcOffset=qn,ii.isUtc=Rn,ii.isUTC=Rn,ii.zoneAbbr=ni,ii.zoneName=ri,ii.dates=Ht("dates accessor is deprecated. Use date instead.",Dr),ii.months=Ht("months accessor is deprecated. Use month instead",Mt),ii.years=Ht("years accessor is deprecated. Use year instead",Jt),ii.zone=Ht("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",_n);var si=ii,ai={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},li={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},hi="Invalid date",di="%d",vi=/\d{1,2}/,yi={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},Si=E.prototype;Si._calendar=ai,Si.calendar=fi,Si._longDateFormat=li,Si.longDateFormat=ci,Si._invalidDate=hi,Si.invalidDate=pi,Si._ordinal=di,Si.ordinal=mi,Si._ordinalParse=vi,Si.preparse=gi,Si.postformat=gi,Si._relativeTime=yi,Si.relativeTime=bi,Si.pastFuture=wi,Si.set=Ei,Si.months=Ct,Si._months=Nt,Si.monthsShort=Lt,Si._monthsShort=kt,Si.monthsParse=At,Si.week=Gt,Si._week=Yt,Si.firstDayOfYear=en,Si.firstDayOfWeek=Zt,Si.weekdays=Br,Si._weekdays=Hr,Si.weekdaysMin=qr,Si._weekdaysMin=Ir,Si.weekdaysShort=Fr,Si._weekdaysShort=jr,Si.weekdaysParse=Rr,Si.isPM=$r,Si._meridiemParse=Jr,Si.meridiem=Kr,k("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10,n=b(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+n}}),t.lang=Ht("moment.lang is deprecated. Use moment.locale instead.",k),t.langData=Ht("moment.langData is deprecated. Use moment.localeData instead.",A);var Oi=Math.abs,Ui=Ri("ms"),zi=Ri("s"),Wi=Ri("m"),Xi=Ri("h"),Vi=Ri("d"),$i=Ri("w"),Ji=Ri("M"),Ki=Ri("y"),Yi=Gi("milliseconds"),Zi=Gi("seconds"),es=Gi("minutes"),ts=Gi("hours"),ns=Gi("days"),rs=Gi("months"),is=Gi("years"),os=Math.round,us={s:45,m:45,h:22,d:26,M:11},hs=Math.abs,ds=Tn.prototype;ds.abs=Mi,ds.add=Di,ds.subtract=Pi,ds.as=Ii,ds.asMilliseconds=Ui,ds.asSeconds=zi,ds.asMinutes=Wi,ds.asHours=Xi,ds.asDays=Vi,ds.asWeeks=$i,ds.asMonths=Ji,ds.asYears=Ki,ds.valueOf=qi,ds._bubble=Bi,ds.get=Qi,ds.milliseconds=Yi,ds.seconds=Zi,ds.minutes=es,ds.hours=ts,ds.days=ns,ds.weeks=ss,ds.months=rs,ds.years=is,ds.humanize=cs,ds.toISOString=ps,ds.toString=ps,ds.toJSON=ps,ds.locale=pr,ds.localeData=vr,ds.toIsoString=Ht("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",ps),ds.lang=dr,z("X",0,0,"unix"),z("x",0,0,"valueOf"),lt("x",it),lt("X",ot),dt("X",function(e,t,n){n._d=new Date(parseFloat(e,10)*1e3)}),dt("x",function(e,t,n){n._d=new Date(b(e))}),t.version="2.10.6",n(yn),t.fn=si,t.min=Sn,t.max=xn,t.utc=a,t.unix=oi,t.months=Ni,t.isDate=i,t.locale=k,t.invalid=h,t.duration=Wn,t.isMoment=g,t.weekdays=ki,t.parseZone=ui,t.localeData=A,t.isDuration=Nn,t.monthsShort=Ci,t.weekdaysMin=Ai,t.defineLocale=L,t.weekdaysShort=Li,t.normalizeUnits=_,t.relativeTimeThreshold=ls;var vs=t;return vs}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_af",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t=e.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(e){return/^nm$/i.test(e)},meridiem:function(e,t,n){return e<12?n?"vm":"VM":n?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(e===1||e===8||e>=20?"ste":"de")},week:{dow:1,doy:4}});return t}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_de",["moment"],t):t(e.moment)}(this,function(e){"use strict";function t(e,t,n,r){var i={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?i[n][0]:i[n][1]}var n=e.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[Heute um] LT [Uhr]",sameElse:"L",nextDay:"[Morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[Gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,M:t,MM:t,y:t,yy:t},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return n}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_es",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t="Ene._Feb._Mar._Abr._May._Jun._Jul._Ago._Sep._Oct._Nov._Dic.".split("_"),n="Ene_Feb_Mar_Abr_May_Jun_Jul_Ago_Sep_Oct_Nov_Dic".split("_"),r=e.defineLocale("es",{months:"Enero_Febrero_Marzo_Abril_Mayo_Junio_Julio_Agosto_Septiembre_Octubre_Noviembre_Diciembre".split("_"),monthsShort:function(e,r){return/-MMM-/.test(r)?n[e.month()]:t[e.month()]},weekdays:"Domingo_Lunes_Martes_Miércoles_Jueves_Viernes_Sábado".split("_"),weekdaysShort:"Dom._Lun._Mar._Mié._Jue._Vie._Sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(this.hours()!==1?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(this.hours()!==1?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(this.hours()!==1?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(this.hours()!==1?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(this.hours()!==1?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return r}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_fr",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t=e.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(e){return e+(e===1?"er":"")},week:{dow:1,doy:4}});return t}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_he",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t=e.defineLocale("he",{months:"ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳".split("_"),weekdays:"ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"א_ב_ג_ד_ה_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY HH:mm",LLLL:"dddd, D [ב]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[היום ב־]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[אתמול ב־]LT",lastWeek:"[ביום] dddd [האחרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(e){return e===2?"שעתיים":e+" שעות"},d:"יום",dd:function(e){return e===2?"יומיים":e+" ימים"},M:"חודש",MM:function(e){return e===2?"חודשיים":e+" חודשים"},y:"שנה",yy:function(e){return e===2?"שנתיים":e%10===0&&e!==10?e+" שנה":e+" שנים"}}});return t}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_hu",["moment"],t):t(e.moment)}(this,function(e){"use strict";function n(e,t,n,r){var i=e,s;switch(n){case"s":return r||t?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(r||t?" perc":" perce");case"mm":return i+(r||t?" perc":" perce");case"h":return"egy"+(r||t?" óra":" órája");case"hh":return i+(r||t?" óra":" órája");case"d":return"egy"+(r||t?" nap":" napja");case"dd":return i+(r||t?" nap":" napja");case"M":return"egy"+(r||t?" hónap":" hónapja");case"MM":return i+(r||t?" hónap":" hónapja");case"y":return"egy"+(r||t?" év":" éve");case"yy":return i+(r||t?" év":" éve")}return""}function r(e){return(e?"":"[múlt] ")+"["+t[this.day()]+"] LT[-kor]"}var t="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" "),i=e.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(e){return e.charAt(1).toLowerCase()==="u"},meridiem:function(e,t,n){return e<12?n===!0?"de":"DE":n===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return r.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return r.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return i}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_id",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t=e.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(e,t){e===12&&(e=0);if(t==="pagi")return e;if(t==="siang")return e>=11?e:e+12;if(t==="sore"||t==="malam")return e+12},meridiem:function(e,t,n){return e<11?"pagi":e<15?"siang":e<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}});return t}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_it",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t=e.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return t}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_ja",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t=e.defineLocale("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",LTS:"Ah時m分s秒",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah時m分",LLLL:"YYYY年M月D日Ah時m分 dddd"},meridiemParse:/午前|午後/i,isPM:function(e){return e==="午後"},meridiem:function(e,t,n){return e<12?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[来週]dddd LT",lastDay:"[昨日] LT",lastWeek:"[前週]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%s前",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}});return t}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_nb",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t=e.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tirs_ons_tors_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"H.mm",LTS:"H.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H.mm",LLLL:"dddd D. MMMM YYYY [kl.] H.mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en måned",MM:"%d måneder",y:"ett år",yy:"%d år"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return t}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_nl",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),n="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),r=e.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,r){return/-MMM-/.test(r)?n[e.month()]:t[e.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(e===1||e===8||e>=20?"ste":"de")},week:{dow:1,doy:4}});return r}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_pl",["moment"],t):t(e.moment)}(this,function(e){"use strict";function r(e){return e%10<5&&e%10>1&&~~(e/10)%10!==1}function i(e,t,n){var i=e+" ";switch(n){case"m":return t?"minuta":"minutę";case"mm":return i+(r(e)?"minuty":"minut");case"h":return t?"godzina":"godzinę";case"hh":return i+(r(e)?"godziny":"godzin");case"MM":return i+(r(e)?"miesiące":"miesięcy");case"yy":return i+(r(e)?"lata":"lat")}}var t="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),n="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_"),s=e.defineLocale("pl",{months:function(e,r){return r===""?"("+n[e.month()]+"|"+t[e.month()]+")":/D MMMM/.test(r)?n[e.month()]:t[e.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"nie_pon_wt_śr_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:i,mm:i,h:i,hh:i,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:i,y:"rok",yy:i},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_pt-br",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t=e.defineLocale("pt-br",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [às] HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return this.day()===0||this.day()===6?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"poucos segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº"});return t}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_ru",["moment"],t):t(e.moment)}(this,function(e){"use strict";function t(e,t){var n=e.split("_");return t%10===1&&t%100!==11?n[0]:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?n[1]:n[2]}function n(e,n,r){var i={mm:n?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",MM:"месяц_месяца_месяцев",yy:"год_года_лет"};return r==="m"?n?"минута":"минуту":e+" "+t(i[r],+e)}function r(e,t){var n={nominative:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),accusative:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_")},r=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(t)?"accusative":"nominative";return n[r][e.month()]}function i(e,t){var n={nominative:"янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек".split("_"),accusative:"янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек".split("_")},r=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(t)?"accusative":"nominative";return n[r][e.month()]}function s(e,t){var n={nominative:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),accusative:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_")},r=/\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/.test(t)?"accusative":"nominative";return n[r][e.day()]}var o=e.defineLocale("ru",{months:r,monthsShort:i,weekdays:s,weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|я]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., HH:mm",LLLL:"dddd, D MMMM YYYY г., HH:mm"},calendar:{sameDay:"[Сегодня в] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(){return this.day()===2?"[Во] dddd [в] LT":"[В] dddd [в] LT"},lastWeek:function(e){if(e.week()===this.week())return this.day()===2?"[Во] dddd [в] LT":"[В] dddd [в] LT";switch(this.day()){case 0:return"[В прошлое] dddd [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",m:n,mm:n,h:"час",hh:n,d:"день",dd:n,M:"месяц",MM:n,y:"год",yy:n},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(e){return/^(дня|вечера)$/.test(e)},meridiem:function(e,t,n){return e<4?"ночи":e<12?"утра":e<17?"дня":"вечера"},ordinalParse:/\d{1,2}-(й|го|я)/,ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":return e+"-й";case"D":return e+"-го";case"w":case"W":return e+"-я";default:return e}},week:{dow:1,doy:7}});return o}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_uk",["moment"],t):t(e.moment)}(this,function(e){"use strict";function t(e,t){var n=e.split("_");return t%10===1&&t%100!==11?n[0]:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?n[1]:n[2]}function n(e,n,r){var i={mm:"хвилина_хвилини_хвилин",hh:"година_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"};return r==="m"?n?"хвилина":"хвилину":r==="h"?n?"година":"годину":e+" "+t(i[r],+e)}function r(e,t){var n={nominative:"січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень".split("_"),accusative:"січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня".split("_")},r=/D[oD]? *MMMM?/.test(t)?"accusative":"nominative";return n[r][e.month()]}function i(e,t){var n={nominative:"неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота".split("_"),accusative:"неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу".split("_"),genitive:"неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи".split("_")},r=/(\[[ВвУу]\]) ?dddd/.test(t)?"accusative":/\[?(?:минулої|наступної)? ?\] ?dddd/.test(t)?"genitive":"nominative";return n[r][e.day()]}function s(e){return function(){return e+"о"+(this.hours()===11?"б":"")+"] LT"}}var o=e.defineLocale("uk",{months:r,monthsShort:"січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),weekdays:i,weekdaysShort:"нд_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY р.",LLL:"D MMMM YYYY р., HH:mm",LLLL:"dddd, D MMMM YYYY р., HH:mm"},calendar:{sameDay:s("[Сьогодні "),nextDay:s("[Завтра "),lastDay:s("[Вчора "),nextWeek:s("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return s("[Минулої] dddd [").call(this);case 1:case 2:case 4:return s("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька секунд",m:n,mm:n,h:"годину",hh:n,d:"день",dd:n,M:"місяць",MM:n,y:"рік",yy:n},meridiemParse:/ночі|ранку|дня|вечора/,isPM:function(e){return/^(дня|вечора)$/.test(e)},meridiem:function(e,t,n){return e<4?"ночі":e<12?"ранку":e<17?"дня":"вечора"},ordinalParse:/\d{1,2}-(й|го)/,ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":case"w":case"W":return e+"-й";case"D":return e+"-го";default:return e}},week:{dow:1,doy:7}});return o}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_zh",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t=e.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"Ah点mm分",LTS:"Ah点m分s秒",L:"YYYY-MM-DD",LL:"YYYY年MMMD日",LLL:"YYYY年MMMD日Ah点mm分",LLLL:"YYYY年MMMD日ddddAh点mm分",l:"YYYY-MM-DD",ll:"YYYY年MMMD日",lll:"YYYY年MMMD日Ah点mm分",llll:"YYYY年MMMD日ddddAh点mm分"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){return e===12&&(e=0),t==="凌晨"||t==="早上"||t==="上午"?e:t==="下午"||t==="晚上"?e+12:e>=11?e:e+12},meridiem:function(e,t,n){var r=e*100+t;return r<600?"凌晨":r<900?"早上":r<1130?"上午":r<1230?"中午":r<1800?"下午":"晚上"},calendar:{sameDay:function(){return this.minutes()===0?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return this.minutes()===0?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return this.minutes()===0?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var t,n;return t=e().startOf("week"),n=this.unix()-t.unix()>=604800?"[下]":"[本]",this.minutes()===0?n+"dddAh点整":n+"dddAh点mm"},lastWeek:function(){var t,n;return t=e().startOf("week"),n=this.unix()<t.unix()?"[上]":"[本]",this.minutes()===0?n+"dddAh点整":n+"dddAh点mm"},sameElse:"LL"},ordinalParse:/\d{1,2}(日|月|周)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"周";default:return e}},relativeTime:{future:"%s内",past:"%s前",s:"几秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},week:{dow:1,doy:4}});return t}),function(e,t){define("moment_with_locales",["moment","moment_af","moment_de","moment_es","moment_fr","moment_he","moment_hu","moment_id","moment_it","moment_ja","moment_nb","moment_nl","moment_pl","moment_pt-br","moment_ru","moment_uk","moment_zh"],function(e){return e})}(this),function(e,t){typeof define=="function"&&define.amd?define("strophe-sha1",[],function(){return t()}):e.SHA1=t()}(this,function(){function e(e,r){e[r>>5]|=128<<24-r%32,e[(r+64>>9<<4)+15]=r;var o=new Array(80),u=1732584193,a=-271733879,f=-1732584194,l=271733878,c=-1009589776,h,p,d,v,m,g,y,b;for(h=0;h<e.length;h+=16){v=u,m=a,g=f,y=l,b=c;for(p=0;p<80;p++)p<16?o[p]=e[h+p]:o[p]=s(o[p-3]^o[p-8]^o[p-14]^o[p-16],1),d=i(i(s(u,5),t(p,a,f,l)),i(i(c,o[p]),n(p))),c=l,l=f,f=s(a,30),a=u,u=d;u=i(u,v),a=i(a,m),f=i(f,g),l=i(l,y),c=i(c,b)}return[u,a,f,l,c]}function t(e,t,n,r){return e<20?t&n|~t&r:e<40?t^n^r:e<60?t&n|t&r|n&r:t^n^r}function n(e){return e<20?1518500249:e<40?1859775393:e<60?-1894007588:-899497514}function r(t,n){var r=o(t);r.length>16&&(r=e(r,t.length*8));var i=new Array(16),s=new Array(16);for(var u=0;u<16;u++)i[u]=r[u]^909522486,s[u]=r[u]^1549556828;var a=e(i.concat(o(n)),512+n.length*8);return e(s.concat(a),672)}function i(e,t){var n=(e&65535)+(t&65535),r=(e>>16)+(t>>16)+(n>>16);return r<<16|n&65535}function s(e,t){return e<<t|e>>>32-t}function o(e){var t=[],n=255;for(var r=0;r<e.length*8;r+=8)t[r>>5]|=(e.charCodeAt(r/8)&n)<<24-r%32;return t}function u(e){var t="",n=255;for(var r=0;r<e.length*32;r+=8)t+=String.fromCharCode(e[r>>5]>>>24-r%32&n);return t}function a(e){var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n="",r,i;for(var s=0;s<e.length*4;s+=3){r=(e[s>>2]>>8*(3-s%4)&255)<<16|(e[s+1>>2]>>8*(3-(s+1)%4)&255)<<8|e[s+2>>2]>>8*(3-(s+2)%4)&255;for(i=0;i<4;i++)s*8+i*6>e.length*32?n+="=":n+=t.charAt(r>>6*(3-i)&63)}return n}return{b64_hmac_sha1:function(e,t){return a(r(e,t))},b64_sha1:function(t){return a(e(o(t),t.length*8))},binb2str:u,core_hmac_sha1:r,str_hmac_sha1:function(e,t){return u(r(e,t))},str_sha1:function(t){return u(e(o(t),t.length*8))}}}),function(e,t){typeof define=="function"&&define.amd?define("strophe-base64",[],function(){return t()}):e.Base64=t()}(this,function(){var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",t={encode:function(t){var n="",r,i,s,o,u,a,f,l=0;do r=t.charCodeAt(l++),i=t.charCodeAt(l++),s=t.charCodeAt(l++),o=r>>2,u=(r&3)<<4|i>>4,a=(i&15)<<2|s>>6,f=s&63,isNaN(i)?(u=(r&3)<<4,a=f=64):isNaN(s)&&(f=64),n=n+e.charAt(o)+e.charAt(u)+e.charAt(a)+e.charAt(f);while(l<t.length);return n},decode:function(t){var n="",r,i,s,o,u,a,f,l=0;t=t.replace(/[^A-Za-z0-9\+\/\=]/g,"");do o=e.indexOf(t.charAt(l++)),u=e.indexOf(t.charAt(l++)),a=e.indexOf(t.charAt(l++)),f=e.indexOf(t.charAt(l++)),r=o<<2|u>>4,i=(u&15)<<4|a>>2,s=(a&3)<<6|f,n+=String.fromCharCode(r),a!=64&&(n+=String.fromCharCode(i)),f!=64&&(n+=String.fromCharCode(s));while(l<t.length);return n}};return t}),function(e,t){typeof define=="function"&&define.amd?define("strophe-md5",[],function(){return t()}):e.MD5=t()}(this,function(e){var t=function(e,t){var n=(e&65535)+(t&65535),r=(e>>16)+(t>>16)+(n>>16);return r<<16|n&65535},n=function(e,t){return e<<t|e>>>32-t},r=function(e){var t=[];for(var n=0;n<e.length*8;n+=8)t[n>>5]|=(e.charCodeAt(n/8)&255)<<n%32;return t},i=function(e){var t="";for(var n=0;n<e.length*32;n+=8)t+=String.fromCharCode(e[n>>5]>>>n%32&255);return t},s=function(e){var t="0123456789abcdef",n="";for(var r=0;r<e.length*4;r++)n+=t.charAt(e[r>>2]>>r%4*8+4&15)+t.charAt(e[r>>2]>>r%4*8&15);return n},o=function(e,r,i,s,o,u){return t(n(t(t(r,e),t(s,u)),o),i)},u=function(e,t,n,r,i,s,u){return o(t&n|~t&r,e,t,i,s,u)},a=function(e,t,n,r,i,s,u){return o(t&r|n&~r,e,t,i,s,u)},f=function(e,t,n,r,i,s,u){return o(t^n^r,e,t,i,s,u)},l=function(e,t,n,r,i,s,u){return o(n^(t|~r),e,t,i,s,u)},c=function(e,n){e[n>>5]|=128<<n%32,e[(n+64>>>9<<4)+14]=n;var r=1732584193,i=-271733879,s=-1732584194,o=271733878,c,h,p,d;for(var v=0;v<e.length;v+=16)c=r,h=i,p=s,d=o,r=u(r,i,s,o,e[v+0],7,-680876936),o=u(o,r,i,s,e[v+1],12,-389564586),s=u(s,o,r,i,e[v+2],17,606105819),i=u(i,s,o,r,e[v+3],22,-1044525330),r=u(r,i,s,o,e[v+4],7,-176418897),o=u(o,r,i,s,e[v+5],12,1200080426),s=u(s,o,r,i,e[v+6],17,-1473231341),i=u(i,s,o,r,e[v+7],22,-45705983),r=u(r,i,s,o,e[v+8],7,1770035416),o=u(o,r,i,s,e[v+9],12,-1958414417),s=u(s,o,r,i,e[v+10],17,-42063),i=u(i,s,o,r,e[v+11],22,-1990404162),r=u(r,i,s,o,e[v+12],7,1804603682),o=u(o,r,i,s,e[v+13],12,-40341101),s=u(s,o,r,i,e[v+14],17,-1502002290),i=u(i,s,o,r,e[v+15],22,1236535329),r=a(r,i,s,o,e[v+1],5,-165796510),o=a(o,r,i,s,e[v+6],9,-1069501632),s=a(s,o,r,i,e[v+11],14,643717713),i=a(i,s,o,r,e[v+0],20,-373897302),r=a(r,i,s,o,e[v+5],5,-701558691),o=a(o,r,i,s,e[v+10],9,38016083),s=a(s,o,r,i,e[v+15],14,-660478335),i=a(i,s,o,r,e[v+4],20,-405537848),r=a(r,i,s,o,e[v+9],5,568446438),o=a(o,r,i,s,e[v+14],9,-1019803690),s=a(s,o,r,i,e[v+3],14,-187363961),i=a(i,s,o,r,e[v+8],20,1163531501),r=a(r,i,s,o,e[v+13],5,-1444681467),o=a(o,r,i,s,e[v+2],9,-51403784),s=a(s,o,r,i,e[v+7],14,1735328473),i=a(i,s,o,r,e[v+12],20,-1926607734),r=f(r,i,s,o,e[v+5],4,-378558),o=f(o,r,i,s,e[v+8],11,-2022574463),s=f(s,o,r,i,e[v+11],16,1839030562),i=f(i,s,o,r,e[v+14],23,-35309556),r=f(r,i,s,o,e[v+1],4,-1530992060),o=f(o,r,i,s,e[v+4],11,1272893353),s=f(s,o,r,i,e[v+7],16,-155497632),i=f(i,s,o,r,e[v+10],23,-1094730640),r=f(r,i,s,o,e[v+13],4,681279174),o=f(o,r,i,s,e[v+0],11,-358537222),s=f(s,o,r,i,e[v+3],16,-722521979),i=f(i,s,o,r,e[v+6],23,76029189),r=f(r,i,s,o,e[v+9],4,-640364487),o=f(o,r,i,s,e[v+12],11,-421815835),s=f(s,o,r,i,e[v+15],16,530742520),i=f(i,s,o,r,e[v+2],23,-995338651),r=l(r,i,s,o,e[v+0],6,-198630844),o=l(o,r,i,s,e[v+7],10,1126891415),s=l(s,o,r,i,e[v+14],15,-1416354905),i=l(i,s,o,r,e[v+5],21,-57434055),r=l(r,i,s,o,e[v+12],6,1700485571),o=l(o,r,i,s,e[v+3],10,-1894986606),s=l(s,o,r,i,e[v+10],15,-1051523),i=l(i,s,o,r,e[v+1],21,-2054922799),r=l(r,i,s,o,e[v+8],6,1873313359),o=l(o,r,i,s,e[v+15],10,-30611744),s=l(s,o,r,i,e[v+6],15,-1560198380),i=l(i,s,o,r,e[v+13],21,1309151649),r=l(r,i,s,o,e[v+4],6,-145523070),o=l(o,r,i,s,e[v+11],10,-1120210379),s=l(s,o,r,i,e[v+2],15,718787259),i=l(i,s,o,r,e[v+9],21,-343485551),r=t(r,c),i=t(i,h),s=t(s,p),o=t(o,d);return[r,i,s,o]},h={hexdigest:function(e){return s(c(r(e),e.length*8))},hash:function(e){return i(c(r(e),e.length*8))}};return h}),Function.prototype.bind||(Function.prototype.bind=function(e){var t=this,n=Array.prototype.slice,r=Array.prototype.concat,i=n.call(arguments,1);return function(){return t.apply(e?e:this,r.call(i,n.call(arguments,0)))}}),Array.isArray||(Array.isArray=function(e){return Object.prototype.toString.call(e)==="[object Array]"}),Array.prototype.indexOf||(Array.prototype.indexOf=function(e){var t=this.length,n=Number(arguments[1])||0;n=n<0?Math.ceil(n):Math.floor(n),n<0&&(n+=t);for(;n<t;n++)if(n in this&&this[n]===e)return n;return-1}),define("strophe-polyfill",function(){}),function(e,t){if(typeof define=="function"&&define.amd)define("strophe-core",["strophe-sha1","strophe-base64","strophe-md5","strophe-polyfill"],function(){return t.apply(this,arguments)});else{var n=t(e.SHA1,e.Base64,e.MD5);window.Strophe=n.Strophe,window.$build=n.$build,window.$iq=n.$iq,window.$msg=n.$msg,window.$pres=n.$pres,window.SHA1=n.SHA1,window.Base64=n.Base64,window.MD5=n.MD5,window.b64_hmac_sha1=n.SHA1.b64_hmac_sha1,window.b64_sha1=n.SHA1.b64_sha1,window.str_hmac_sha1=n.SHA1.str_hmac_sha1,window.str_sha1=n.SHA1.str_sha1}}(this,function(e,t,n){function i(e,t){return new r.Builder(e,t)}function s(e){return new r.Builder("message",e)}function o(e){return new r.Builder("iq",e)}function u(e){return new r.Builder("presence",e)}var r;return r={VERSION:"@VERSION@",NS:{HTTPBIND:"http://jabber.org/protocol/httpbind",BOSH:"urn:xmpp:xbosh",CLIENT:"jabber:client",AUTH:"jabber:iq:auth",ROSTER:"jabber:iq:roster",PROFILE:"jabber:iq:profile",DISCO_INFO:"http://jabber.org/protocol/disco#info",DISCO_ITEMS:"http://jabber.org/protocol/disco#items",MUC:"http://jabber.org/protocol/muc",SASL:"urn:ietf:params:xml:ns:xmpp-sasl",STREAM:"http://etherx.jabber.org/streams",FRAMING:"urn:ietf:params:xml:ns:xmpp-framing",BIND:"urn:ietf:params:xml:ns:xmpp-bind",SESSION:"urn:ietf:params:xml:ns:xmpp-session",VERSION:"jabber:iq:version",STANZAS:"urn:ietf:params:xml:ns:xmpp-stanzas",XHTML_IM:"http://jabber.org/protocol/xhtml-im",XHTML:"http://www.w3.org/1999/xhtml"},XHTML:{tags:["a","blockquote","br","cite","em","img","li","ol","p","span","strong","ul","body"],attributes:{a:["href"],blockquote:["style"],br:[],cite:["style"],em:[],img:["src","alt","style","height","width"],li:["style"],ol:["style"],p:["style"],span:["style"],strong:[],ul:["style"],body:[]},css:["background-color","color","font-family","font-size","font-style","font-weight","margin-left","margin-right","text-align","text-decoration"],validTag:function(e){for(var t=0;t<r.XHTML.tags.length;t++)if(e==r.XHTML.tags[t])return!0;return!1},validAttribute:function(e,t){if(typeof r.XHTML.attributes[e]!="undefined"&&r.XHTML.attributes[e].length>0)for(var n=0;n<r.XHTML.attributes[e].length;n++)if(t==r.XHTML.attributes[e][n])return!0;return!1},validCSS:function(e){for(var t=0;t<r.XHTML.css.length;t++)if(e==r.XHTML.css[t])return!0;return!1}},Status:{ERROR:0,CONNECTING:1,CONNFAIL:2,AUTHENTICATING:3,AUTHFAIL:4,CONNECTED:5,DISCONNECTED:6,DISCONNECTING:7,ATTACHED:8,REDIRECT:9},LogLevel:{DEBUG:0,INFO:1,WARN:2,ERROR:3,FATAL:4},ElementType:{NORMAL:1,TEXT:3,CDATA:4,FRAGMENT:11},TIMEOUT:1.1,SECONDARY_TIMEOUT:.1,addNamespace:function(e,t){r.NS[e]=t},forEachChild:function(e,t,n){var i,s;for(i=0;i<e.childNodes.length;i++)s=e.childNodes[i],s.nodeType==r.ElementType.NORMAL&&(!t||this.isTagEqual(s,t))&&n(s)},isTagEqual:function(e,t){return e.tagName==t},_xmlGenerator:null,_makeGenerator:function(){var e;return document.implementation.createDocument===undefined||document.implementation.createDocument&&document.documentMode&&document.documentMode<10?(e=this._getIEXmlDom(),e.appendChild(e.createElement("strophe"))):e=document.implementation.createDocument("jabber:client","strophe",null),e},xmlGenerator:function(){return r._xmlGenerator||(r._xmlGenerator=r._makeGenerator()),r._xmlGenerator},_getIEXmlDom:function(){var e=null,t=["Msxml2.DOMDocument.6.0","Msxml2.DOMDocument.5.0","Msxml2.DOMDocument.4.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument","MSXML.DOMDocument","Microsoft.XMLDOM"];for(var n=0;n<t.length;n++){if(e!==null)break;try{e=new ActiveXObject(t[n])}catch(r){e=null}}return e},xmlElement:function(e){if(!e)return null;var t=r.xmlGenerator().createElement(e),n,i,s;for(n=1;n<arguments.length;n++){var o=arguments[n];if(!o)continue;if(typeof o=="string"||typeof o=="number")t.appendChild(r.xmlTextNode(o));else if(typeof o=="object"&&typeof o.sort=="function")for(i=0;i<o.length;i++){var u=o[i];typeof u=="object"&&typeof u.sort=="function"&&u[1]!==undefined&&u[1]!==null&&t.setAttribute(u[0],u[1])}else if(typeof o=="object")for(s in o)o.hasOwnProperty(s)&&o[s]!==undefined&&o[s]!==null&&t.setAttribute(s,o[s])}return t},xmlescape:function(e){return e=e.replace(/\&/g,"&"),e=e.replace(/</g,"<"),e=e.replace(/>/g,">"),e=e.replace(/'/g,"'"),e=e.replace(/"/g,"""),e},xmlunescape:function(e){return e=e.replace(/\&/g,"&"),e=e.replace(/</g,"<"),e=e.replace(/>/g,">"),e=e.replace(/'/g,"'"),e=e.replace(/"/g,'"'),e},xmlTextNode:function(e){return r.xmlGenerator().createTextNode(e)},xmlHtmlNode:function(e){var t;if(window.DOMParser){var n=new DOMParser;t=n.parseFromString(e,"text/xml")}else t=new ActiveXObject("Microsoft.XMLDOM"),t.async="false",t.loadXML(e);return t},getText:function(e){if(!e)return null;var t="";e.childNodes.length===0&&e.nodeType==r.ElementType.TEXT&&(t+=e.nodeValue);for(var n=0;n<e.childNodes.length;n++)e.childNodes[n].nodeType==r.ElementType.TEXT&&(t+=e.childNodes[n].nodeValue);return r.xmlescape(t)},copyElement:function(e){var t,n;if(e.nodeType==r.ElementType.NORMAL){n=r.xmlElement(e.tagName);for(t=0;t<e.attributes.length;t++)n.setAttribute(e.attributes[t].nodeName,e.attributes[t].value);for(t=0;t<e.childNodes.length;t++)n.appendChild(r.copyElement(e.childNodes[t]))}else e.nodeType==r.ElementType.TEXT&&(n=r.xmlGenerator().createTextNode(e.nodeValue));return n},createHtml:function(e){var t,n,i,s,o,u,a,f,l,c,h;if(e.nodeType==r.ElementType.NORMAL){s=e.nodeName.toLowerCase();if(r.XHTML.validTag(s))try{n=r.xmlElement(s);for(t=0;t<r.XHTML.attributes[s].length;t++){o=r.XHTML.attributes[s][t],u=e.getAttribute(o);if(typeof u=="undefined"||u===null||u===""||u===!1||u===0)continue;o=="style"&&typeof u=="object"&&typeof u.cssText!="undefined"&&(u=u.cssText);if(o=="style"){a=[],f=u.split(";");for(i=0;i<f.length;i++)l=f[i].split(":"),c=l[0].replace(/^\s*/,"").replace(/\s*$/,"").toLowerCase(),r.XHTML.validCSS(c)&&(h=l[1].replace(/^\s*/,"").replace(/\s*$/,""),a.push(c+": "+h));a.length>0&&(u=a.join("; "),n.setAttribute(o,u))}else n.setAttribute(o,u)}for(t=0;t<e.childNodes.length;t++)n.appendChild(r.createHtml(e.childNodes[t]))}catch(p){n=r.xmlTextNode("")}else{n=r.xmlGenerator().createDocumentFragment();for(t=0;t<e.childNodes.length;t++)n.appendChild(r.createHtml(e.childNodes[t]))}}else if(e.nodeType==r.ElementType.FRAGMENT){n=r.xmlGenerator().createDocumentFragment();for(t=0;t<e.childNodes.length;t++)n.appendChild(r.createHtml(e.childNodes[t]))}else e.nodeType==r.ElementType.TEXT&&(n=r.xmlTextNode(e.nodeValue));return n},escapeNode:function(e){return typeof e!="string"?e:e.replace(/^\s+|\s+$/g,"").replace(/\\/g,"\\5c").replace(/ /g,"\\20").replace(/\"/g,"\\22").replace(/\&/g,"\\26").replace(/\'/g,"\\27").replace(/\//g,"\\2f").replace(/:/g,"\\3a").replace(/</g,"\\3c").replace(/>/g,"\\3e").replace(/@/g,"\\40")},unescapeNode:function(e){return typeof e!="string"?e:e.replace(/\\20/g," ").replace(/\\22/g,'"').replace(/\\26/g,"&").replace(/\\27/g,"'").replace(/\\2f/g,"/").replace(/\\3a/g,":").replace(/\\3c/g,"<").replace(/\\3e/g,">").replace(/\\40/g,"@").replace(/\\5c/g,"\\")},getNodeFromJid:function(e){return e.indexOf("@")<0?null:e.split("@")[0]},getDomainFromJid:function(e){var t=r.getBareJidFromJid(e);if(t.indexOf("@")<0)return t;var n=t.split("@");return n.splice(0,1),n.join("@")},getResourceFromJid:function(e){var t=e.split("/");return t.length<2?null:(t.splice(0,1),t.join("/"))},getBareJidFromJid:function(e){return e?e.split("/")[0]:null},log:function(e,t){return},debug:function(e){this.log(this.LogLevel.DEBUG,e)},info:function(e){this.log(this.LogLevel.INFO,e)},warn:function(e){this.log(this.LogLevel.WARN,e)},error:function(e){this.log(this.LogLevel.ERROR,e)},fatal:function(e){this.log(this.LogLevel.FATAL,e)},serialize:function(e){var t;if(!e)return null;typeof e.tree=="function"&&(e=e.tree());var n=e.nodeName,i,s;e.getAttribute("_realname")&&(n=e.getAttribute("_realname")),t="<"+n;for(i=0;i<e.attributes.length;i++)e.attributes[i].nodeName!="_realname"&&(t+=" "+e.attributes[i].nodeName+"='"+e.attributes[i].value.replace(/&/g,"&").replace(/\'/g,"'").replace(/>/g,">").replace(/</g,"<")+"'");if(e.childNodes.length>0){t+=">";for(i=0;i<e.childNodes.length;i++){s=e.childNodes[i];switch(s.nodeType){case r.ElementType.NORMAL:t+=r.serialize(s);break;case r.ElementType.TEXT:t+=r.xmlescape(s.nodeValue);break;case r.ElementType.CDATA:t+="<![CDATA["+s.nodeValue+"]]>"}}t+="</"+n+">"}else t+="/>";return t},_requestId:0,_connectionPlugins:{},addConnectionPlugin:function(e,t){r._connectionPlugins[e]=t}},r.Builder=function(e,t){if(e=="presence"||e=="message"||e=="iq")t&&!t.xmlns?t.xmlns=r.NS.CLIENT:t||(t={xmlns:r.NS.CLIENT});this.nodeTree=r.xmlElement(e,t),this.node=this.nodeTree},r.Builder.prototype={tree:function(){return this.nodeTree},toString:function(){return r.serialize(this.nodeTree)},up:function(){return this.node=this.node.parentNode,this},attrs:function(e){for(var t in e)e.hasOwnProperty(t)&&(e[t]===undefined?this.node.removeAttribute(t):this.node.setAttribute(t,e[t]));return this},c:function(e,t,n){var i=r.xmlElement(e,t,n);return this.node.appendChild(i),typeof n!="string"&&(this.node=i),this},cnode:function(e){var t,n=r.xmlGenerator();try{t=n.importNode!==undefined}catch(i){t=!1}var s=t?n.importNode(e,!0):r.copyElement(e);return this.node.appendChild(s),this.node=s,this},t:function(e){var t=r.xmlTextNode(e);return this.node.appendChild(t),this},h:function(e){var t=document.createElement("body");t.innerHTML=e;var n=r.createHtml(t);while(n.childNodes.length>0)this.node.appendChild(n.childNodes[0]);return this}},r.Handler=function(e,t,n,i,s,o,u){this.handler=e,this.ns=t,this.name=n,this.type=i,this.id=s,this.options=u||{matchBare:!1},this.options.matchBare||(this.options.matchBare=!1),this.options.matchBare?this.from=o?r.getBareJidFromJid(o):null:this.from=o,this.user=!0},r.Handler.prototype={isMatch:function(e){var t,n=null;this.options.matchBare?n=r.getBareJidFromJid(e.getAttribute("from")):n=e.getAttribute("from"),t=!1;if(!this.ns)t=!0;else{var i=this;r.forEachChild(e,null,function(e){e.getAttribute("xmlns")==i.ns&&(t=!0)}),t=t||e.getAttribute("xmlns")==this.ns}var s=e.getAttribute("type");return!t||!!this.name&&!r.isTagEqual(e,this.name)||!!this.type&&(Array.isArray(this.type)?this.type.indexOf(s)==-1:s!=this.type)||!!this.id&&e.getAttribute("id")!=this.id||!!this.from&&n!=this.from?!1:!0},run:function(e){var t=null;try{t=this.handler(e)}catch(n){throw n.sourceURL?r.fatal("error: "+this.handler+" "+n.sourceURL+":"+n.line+" - "+n.name+": "+n.message):n.fileName?(typeof console!="undefined"&&(console.trace(),console.error(this.handler," - error - ",n,n.message)),r.fatal("error: "+this.handler+" "+n.fileName+":"+n.lineNumber+" - "+n.name+": "+n.message)):r.fatal("error: "+n.message+"\n"+n.stack),n}return t},toString:function(){return"{Handler: "+this.handler+"("+this.name+","+this.id+","+this.ns+")}"}},r.TimedHandler=function(e,t){this.period=e,this.handler=t,this.lastCalled=(new Date).getTime(),this.user=!0},r.TimedHandler.prototype={run:function(){return this.lastCalled=(new Date).getTime(),this.handler()},reset:function(){this.lastCalled=(new Date).getTime()},toString:function(){return"{TimedHandler: "+this.handler+"("+this.period+")}"}},r.Connection=function(e,t){this.service=e,this.options=t||{};var n=this.options.protocol||"";e.indexOf("ws:")===0||e.indexOf("wss:")===0||n.indexOf("ws")===0?this._proto=new r.Websocket(this):this._proto=new r.Bosh(this),this.jid="",this.domain=null,this.features=null,this._sasl_data={},this.do_session=!1,this.do_bind=!1,this.timedHandlers=[],this.handlers=[],this.removeTimeds=[],this.removeHandlers=[],this.addTimeds=[],this.addHandlers=[],this._authentication={},this._idleTimeout=null,this._disconnectTimeout=null,this.authenticated=!1,this.connected=!1,this.disconnecting=!1,this.do_authentication=!0,this.paused=!1,this.restored=!1,this._data=[],this._uniqueId=0,this._sasl_success_handler=null,this._sasl_failure_handler=null,this._sasl_challenge_handler=null,this.maxRetries=5,this._idleTimeout=setTimeout(this._onIdle.bind(this),100);for(var i in r._connectionPlugins)if(r._connectionPlugins.hasOwnProperty(i)){var s=r._connectionPlugins[i],o=function(){};o.prototype=s,this[i]=new o,this[i].init(this)}},r.Connection.prototype={reset:function(){this._proto._reset(),this.do_session=!1,this.do_bind=!1,this.timedHandlers=[],this.handlers=[],this.removeTimeds=[],this.removeHandlers=[],this.addTimeds=[],this.addHandlers=[],this._authentication={},this.authenticated=!1,this.connected=!1,this.disconnecting=!1,this.restored=!1,this._data=[],this._requests=[],this._uniqueId=0},pause:function(){this.paused=!0},resume:function(){this.paused=!1},getUniqueId:function(e){var t="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=Math.random()*16|0,n=e=="x"?t:t&3|8;return n.toString(16)});return typeof e=="string"||typeof e=="number"?t+":"+e:t+""},connect:function(e,t,n,i,s,o,u){this.jid=e,this.authzid=r.getBareJidFromJid(this.jid),this.authcid=u||r.getNodeFromJid(this.jid),this.pass=t,this.servtype="xmpp",this.connect_callback=n,this.disconnecting=!1,this.connected=!1,this.authenticated=!1,this.restored=!1,this.domain=r.getDomainFromJid(this.jid),this._changeConnectStatus(r.Status.CONNECTING,null),this._proto._connect(i,s,o)},attach:function(e,t,n,i,s,o,u){if(!(this._proto instanceof r.Bosh))throw{name:"StropheSessionError",message:'The "attach" method can only be used with a BOSH connection.'};this._proto._attach(e,t,n,i,s,o,u)},restore:function(e,t,n,r,i){if(!this._sessionCachingSupported())throw{name:"StropheSessionError",message:'The "restore" method can only be used with a BOSH connection.'};this._proto._restore(e,t,n,r,i)},_sessionCachingSupported:function(){if(this._proto instanceof r.Bosh){if(!JSON)return!1;try{window.sessionStorage.setItem("_strophe_","_strophe_"),window.sessionStorage.removeItem("_strophe_")}catch(e){return!1}return!0}return!1},xmlInput:function(e){return},xmlOutput:function(e){return},rawInput:function(e){return},rawOutput:function(e){return},nextValidRid:function(e){return},send:function(e){if(e===null)return;if(typeof e.sort=="function")for(var t=0;t<e.length;t++)this._queueData(e[t]);else typeof e.tree=="function"?this._queueData(e.tree()):this._queueData(e);this._proto._send()},flush:function(){clearTimeout(this._idleTimeout),this._onIdle()},sendIQ:function(e,t,n,i){var s=null,o=this;typeof e.tree=="function"&&(e=e.tree());var u=e.getAttribute("id");u||(u=this.getUniqueId("sendIQ"),e.setAttribute("id",u));var a=e.getAttribute("to"),f=this.jid,l=this.addHandler(function(e){s&&o.deleteTimedHandler(s);var i=!1,u=e.getAttribute("from");if(u===a||a===null&&(u===r.getBareJidFromJid(f)||u===r.getDomainFromJid(f)||u===f))i=!0;if(!i)throw{name:"StropheError",message:"Got answer to IQ from wrong jid:"+u+"\nExpected jid: "+a};var l=e.getAttribute("type");if(l=="result")t&&t(e);else{if(l!="error")throw{name:"StropheError",message:"Got bad IQ type of "+l};n&&n(e)}},null,"iq",["error","result"],u);return i&&(s=this.addTimedHandler(i,function(){return o.deleteHandler(l),n&&n(null),!1})),this.send(e),u},_queueData:function(e){if(e===null||!e.tagName||!e.childNodes)throw{name:"StropheError",message:"Cannot queue non-DOMElement."};this._data.push(e)},_sendRestart:function(){this._data.push("restart"),this._proto._sendRestart(),this._idleTimeout=setTimeout(this._onIdle.bind(this),100)},addTimedHandler:function(e,t){var n=new r.TimedHandler(e,t);return this.addTimeds.push(n),n},deleteTimedHandler:function(e){this.removeTimeds.push(e)},addHandler:function(e,t,n,i,s,o,u){var a=new r.Handler(e,t,n,i,s,o,u);return this.addHandlers.push(a),a},deleteHandler:function(e){this.removeHandlers.push(e);var t=this.addHandlers.indexOf(e);t>=0&&this.addHandlers.splice(t,1)},disconnect:function(e){this._changeConnectStatus(r.Status.DISCONNECTING,e),r.info("Disconnect was called because: "+e);if(this.connected){var t=!1;this.disconnecting=!0,this.authenticated&&(t=u({xmlns:r.NS.CLIENT,type:"unavailable"})),this._disconnectTimeout=this._addSysTimedHandler(3e3,this._onDisconnectTimeout.bind(this)),this._proto._disconnect(t)}else r.info("Disconnect was called before Strophe connected to the server"),this._proto._abortAllRequests()},_changeConnectStatus:function(e,t){for(var n in r._connectionPlugins)if(r._connectionPlugins.hasOwnProperty(n)){var i=this[n];if(i.statusChanged)try{i.statusChanged(e,t)}catch(s){r.error(""+n+" plugin caused an exception "+"changing status: "+s)}}if(this.connect_callback)try{this.connect_callback(e,t)}catch(o){r.error("User connection callback caused an exception: "+o)}},_doDisconnect:function(e){typeof this._idleTimeout=="number"&&clearTimeout(this._idleTimeout),this._disconnectTimeout!==null&&(this.deleteTimedHandler(this._disconnectTimeout),this._disconnectTimeout=null),r.info("_doDisconnect was called"),this._proto._doDisconnect(),this.authenticated=!1,this.disconnecting=!1,this.restored=!1,this.handlers=[],this.timedHandlers=[],this.removeTimeds=[],this.removeHandlers=[],this.addTimeds=[],this.addHandlers=[],this._changeConnectStatus(r.Status.DISCONNECTED,e),this.connected=!1},_dataRecv:function(e,t){r.info("_dataRecv called");var n=this._proto._reqToData(e);if(n===null)return;this.xmlInput!==r.Connection.prototype.xmlInput&&(n.nodeName===this._proto.strip&&n.childNodes.length?this.xmlInput(n.childNodes[0]):this.xmlInput(n)),this.rawInput!==r.Connection.prototype.rawInput&&(t?this.rawInput(t):this.rawInput(r.serialize(n)));var i,s;while(this.removeHandlers.length>0)s=this.removeHandlers.pop(),i=this.handlers.indexOf(s),i>=0&&this.handlers.splice(i,1);while(this.addHandlers.length>0)this.handlers.push(this.addHandlers.pop());if(this.disconnecting&&this._proto._emptyQueue()){this._doDisconnect();return}var o=n.getAttribute("type"),u,a;if(o!==null&&o=="terminate"){if(this.disconnecting)return;u=n.getAttribute("condition"),a=n.getElementsByTagName("conflict"),u!==null?(u=="remote-stream-error"&&a.length>0&&(u="conflict"),this._changeConnectStatus(r.Status.CONNFAIL,u)):this._changeConnectStatus(r.Status.CONNFAIL,"unknown"),this._doDisconnect(u);return}var f=this;r.forEachChild(n,null,function(e){var t,n;n=f.handlers,f.handlers=[];for(t=0;t<n.length;t++){var i=n[t];try{i.isMatch(e)&&(f.authenticated||!i.user)?i.run(e)&&f.handlers.push(i):f.handlers.push(i)}catch(s){r.warn("Removing Strophe handlers due to uncaught exception: "+s.message)}}})},mechanisms:{},_connect_cb:function(e,t,n){r.info("_connect_cb was called"),this.connected=!0;var i=this._proto._reqToData(e);if(!i)return;this.xmlInput!==r.Connection.prototype.xmlInput&&(i.nodeName===this._proto.strip&&i.childNodes.length?this.xmlInput(i.childNodes[0]):this.xmlInput(i)),this.rawInput!==r.Connection.prototype.rawInput&&(n?this.rawInput(n):this.rawInput(r.serialize(i)));var s=this._proto._connect_cb(i);if(s===r.Status.CONNFAIL)return;this._authentication.sasl_scram_sha1=!1,this._authentication.sasl_plain=!1,this._authentication.sasl_digest_md5=!1,this._authentication.sasl_anonymous=!1,this._authentication.legacy_auth=!1;var o;i.getElementsByTagNameNS?o=i.getElementsByTagNameNS(r.NS.STREAM,"features").length>0:o=i.getElementsByTagName("stream:features").length>0||i.getElementsByTagName("features").length>0;var u=i.getElementsByTagName("mechanism"),a=[],f,l,c=!1;if(!o){this._proto._no_auth_received(t);return}if(u.length>0)for(f=0;f<u.length;f++)l=r.getText(u[f]),this.mechanisms[l]&&a.push(this.mechanisms[l]);this._authentication.legacy_auth=i.getElementsByTagName("auth").length>0,c=this._authentication.legacy_auth||a.length>0;if(!c){this._proto._no_auth_received(t);return}this.do_authentication!==!1&&this.authenticate(a)},authenticate:function(e){var n;for(n=0;n<e.length-1;++n){var s=n;for(var u=n+1;u<e.length;++u)e[u].prototype.priority>e[s].prototype.priority&&(s=u);if(s!=n){var a=e[n];e[n]=e[s],e[s]=a}}var f=!1;for(n=0;n<e.length;++n){if(!e[n].test(this))continue;this._sasl_success_handler=this._addSysHandler(this._sasl_success_cb.bind(this),null,"success",null,null),this._sasl_failure_handler=this._addSysHandler(this._sasl_failure_cb.bind(this),null,"failure",null,null),this._sasl_challenge_handler=this._addSysHandler(this._sasl_challenge_cb.bind(this),null,"challenge",null,null),this._sasl_mechanism=new e[n],this._sasl_mechanism.onStart(this);var l=i("auth",{xmlns:r.NS.SASL,mechanism:this._sasl_mechanism.name});if(this._sasl_mechanism.isClientFirst){var c=this._sasl_mechanism.onChallenge(this,null);l.t(t.encode(c))}this.send(l.tree()),f=!0;break}f||(r.getNodeFromJid(this.jid)===null?(this._changeConnectStatus(r.Status.CONNFAIL,"x-strophe-bad-non-anon-jid"),this.disconnect("x-strophe-bad-non-anon-jid")):(this._changeConnectStatus(r.Status.AUTHENTICATING,null),this._addSysHandler(this._auth1_cb.bind(this),null,null,null,"_auth_1"),this.send(o({type:"get",to:this.domain,id:"_auth_1"}).c("query",{xmlns:r.NS.AUTH}).c("username",{}).t(r.getNodeFromJid(this.jid)).tree())))},_sasl_challenge_cb:function(e){var n=t.decode(r.getText(e)),s=this._sasl_mechanism.onChallenge(this,n),o=i("response",{xmlns:r.NS.SASL});return s!==""&&o.t(t.encode(s)),this.send(o.tree()),!0},_auth1_cb:function(e){var t=o({type:"set",id:"_auth_2"}).c("query",{xmlns:r.NS.AUTH}).c("username",{}).t(r.getNodeFromJid(this.jid)).up().c("password").t(this.pass);return r.getResourceFromJid(this.jid)||(this.jid=r.getBareJidFromJid(this.jid)+"/strophe"),t.up().c("resource",{}).t(r.getResourceFromJid(this.jid)),this._addSysHandler(this._auth2_cb.bind(this),null,null,null,"_auth_2"),this.send(t.tree()),!1},_sasl_success_cb:function(e){if(this._sasl_data["server-signature"]){var n,i=t.decode(r.getText(e)),s=/([a-z]+)=([^,]+)(,|$)/,o=i.match(s);o[1]=="v"&&(n=o[2]);if(n!=this._sasl_data["server-signature"])return this.deleteHandler(this._sasl_failure_handler),this._sasl_failure_handler=null,this._sasl_challenge_handler&&(this.deleteHandler(this._sasl_challenge_handler),this._sasl_challenge_handler=null),this._sasl_data={},this._sasl_failure_cb(null)}r.info("SASL authentication succeeded."),this._sasl_mechanism&&this._sasl_mechanism.onSuccess(),this.deleteHandler(this._sasl_failure_handler),this._sasl_failure_handler=null,this._sasl_challenge_handler&&(this.deleteHandler(this._sasl_challenge_handler),this._sasl_challenge_handler=null);var u=[],a=function(e,t){while(e.length)this.deleteHandler(e.pop());return this._sasl_auth1_cb.bind(this)(t),!1};return u.push(this._addSysHandler(function(e){a.bind(this)(u,e)}.bind(this),null,"stream:features",null,null)),u.push(this._addSysHandler(function(e){a.bind(this)(u,e)}.bind(this),r.NS.STREAM,"features",null,null)),this._sendRestart(),!1},_sasl_auth1_cb:function(e){this.features=e;var t,n;for(t=0;t<e.childNodes.length;t++)n=e.childNodes[t],n.nodeName=="bind"&&(this.do_bind=!0),n.nodeName=="session"&&(this.do_session=!0);if(!this.do_bind)return this._changeConnectStatus(r.Status.AUTHFAIL,null),!1;this._addSysHandler(this._sasl_bind_cb.bind(this),null,null,null,"_bind_auth_2");var i=r.getResourceFromJid(this.jid);return i?this.send(o({type:"set",id:"_bind_auth_2"}).c("bind",{xmlns:r.NS.BIND}).c("resource",{}).t(i).tree()):this.send(o({type:"set",id:"_bind_auth_2"}).c("bind",{xmlns:r.NS.BIND}).tree()),!1},_sasl_bind_cb:function(e){if(e.getAttribute("type")=="error"){r.info("SASL binding failed.");var t=e.getElementsByTagName("conflict"),n;return t.length>0&&(n="conflict"),this._changeConnectStatus(r.Status.AUTHFAIL,n),!1}var i=e.getElementsByTagName("bind"),s;if(!(i.length>0))return r.info("SASL binding failed."),this._changeConnectStatus(r.Status.AUTHFAIL,null),!1;s=i[0].getElementsByTagName("jid"),s.length>0&&(this.jid=r.getText(s[0]),this.do_session?(this._addSysHandler(this._sasl_session_cb.bind(this),null,null,null,"_session_auth_2"),this.send(o({type:"set",id:"_session_auth_2"}).c("session",{xmlns:r.NS.SESSION}).tree())):(this.authenticated=!0,this._changeConnectStatus(r.Status.CONNECTED,null)))},_sasl_session_cb:function(e){if(e.getAttribute("type")=="result")this.authenticated=!0,this._changeConnectStatus(r.Status.CONNECTED,null);else if(e.getAttribute("type")=="error")return r.info("Session creation failed."),this._changeConnectStatus(r.Status.AUTHFAIL,null),!1;return!1},_sasl_failure_cb:function(e){return this._sasl_success_handler&&(this.deleteHandler(this._sasl_success_handler),this._sasl_success_handler=null),this._sasl_challenge_handler&&(this.deleteHandler(this._sasl_challenge_handler),this._sasl_challenge_handler=null),this._sasl_mechanism&&this._sasl_mechanism.onFailure(),this._changeConnectStatus(r.Status.AUTHFAIL,null),!1},_auth2_cb:function(e){return e.getAttribute("type")=="result"?(this.authenticated=!0,this._changeConnectStatus(r.Status.CONNECTED,null)):e.getAttribute("type")=="error"&&(this._changeConnectStatus(r.Status.AUTHFAIL,null),this.disconnect("authentication failed")),!1},_addSysTimedHandler:function(e,t){var n=new r.TimedHandler(e,t);return n.user=!1,this.addTimeds.push(n),n},_addSysHandler:function(e,t,n,i,s){var o=new r.Handler(e,t,n,i,s);return o.user=!1,this.addHandlers.push(o),o},_onDisconnectTimeout:function(){return r.info("_onDisconnectTimeout was called"),this._proto._onDisconnectTimeout(),this._doDisconnect(),!1},_onIdle:function(){var e,t,n,r;while(this.addTimeds.length>0)this.timedHandlers.push(this.addTimeds.pop());while(this.removeTimeds.length>0)t=this.removeTimeds.pop(),e=this.timedHandlers.indexOf(t),e>=0&&this.timedHandlers.splice(e,1);var i=(new Date).getTime();r=[];for(e=0;e<this.timedHandlers.length;e++){t=this.timedHandlers[e];if(this.authenticated||!t.user)n=t.lastCalled+t.period,n-i<=0?t.run()&&r.push(t):r.push(t)}this.timedHandlers=r,clearTimeout(this._idleTimeout),this._proto._onIdle(),this.connected&&(this._idleTimeout=setTimeout(this._onIdle.bind(this),100))}},r.SASLMechanism=function(e,t,n){this.name=e,this.isClientFirst=t,this.priority=n},r.SASLMechanism.prototype={test:function(e){return!0},onStart:function(e){this._connection=e},onChallenge:function(e,t){throw new Error("You should implement challenge handling!")},onFailure:function(){this._connection=null},onSuccess:function(){this._connection=null}},r.SASLAnonymous=function(){},r.SASLAnonymous.prototype=new r.SASLMechanism("ANONYMOUS",!1,10),r.SASLAnonymous.test=function(e){return e.authcid===null},r.Connection.prototype.mechanisms[r.SASLAnonymous.prototype.name]=r.SASLAnonymous,r.SASLPlain=function(){},r.SASLPlain.prototype=new r.SASLMechanism("PLAIN",!0,20),r.SASLPlain.test=function(e){return e.authcid!==null},r.SASLPlain.prototype.onChallenge=function(e){var t=e.authzid;return t+="\0",t+=e.authcid,t+="\0",t+=e.pass,t},r.Connection.prototype.mechanisms[r.SASLPlain.prototype.name]=r.SASLPlain,r.SASLSHA1=function(){},r.SASLSHA1.prototype=new r.SASLMechanism("SCRAM-SHA-1",!0,40),r.SASLSHA1.test=function(e){return e.authcid!==null},r.SASLSHA1.prototype.onChallenge=function(r,i,s){var o=s||n.hexdigest(Math.random()*1234567890),u="n="+r.authcid;return u+=",r=",u+=o,r._sasl_data.cnonce=o,r._sasl_data["client-first-message-bare"]=u,u="n,,"+u,this.onChallenge=function(n,r){var i,s,o,u,a,f,l,c,h,p,d,v="c=biws,",m=n._sasl_data["client-first-message-bare"]+","+r+",",g=n._sasl_data.cnonce,y=/([a-z]+)=([^,]+)(,|$)/;while(r.match(y)){var b=r.match(y);r=r.replace(b[0],"");switch(b[1]){case"r":i=b[2];break;case"s":s=b[2];break;case"i":o=b[2]}}if(i.substr(0,g.length)!==g)return n._sasl_data={},n._sasl_failure_cb();v+="r="+i,m+=v,s=t.decode(s),s+="\0\0\0\ 1",u=f=e.core_hmac_sha1(n.pass,s);for(l=1;l<o;l++){a=e.core_hmac_sha1(n.pass,e.binb2str(f));for(c=0;c<5;c++)u[c]^=a[c];f=a}u=e.binb2str(u),h=e.core_hmac_sha1(u,"Client Key"),p=e.str_hmac_sha1(u,"Server Key"),d=e.core_hmac_sha1(e.str_sha1(e.binb2str(h)),m),n._sasl_data["server-signature"]=e.b64_hmac_sha1(p,m);for(c=0;c<5;c++)h[c]^=d[c];return v+=",p="+t.encode(e.binb2str(h)),v}.bind(this),u},r.Connection.prototype.mechanisms[r.SASLSHA1.prototype.name]=r.SASLSHA1,r.SASLMD5=function(){},r.SASLMD5.prototype=new r.SASLMechanism("DIGEST-MD5",!1,30),r.SASLMD5.test=function(e){return e.authcid!==null},r.SASLMD5.prototype._quote=function(e){return'"'+e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')+'"'},r.SASLMD5.prototype.onChallenge=function(e,t,r){var i=/([a-z]+)=("[^"]+"|[^,"]+)(?:,|$)/,s=r||n.hexdigest(""+Math.random()*1234567890),o="",u=null,a="",f="",l;while(t.match(i)){l=t.match(i),t=t.replace(l[0],""),l[2]=l[2].replace(/^"(.+)"$/,"$1");switch(l[1]){case"realm":o=l[2];break;case"nonce":a=l[2];break;case"qop":f=l[2];break;case"host":u=l[2]}}var c=e.servtype+"/"+e.domain;u!==null&&(c=c+"/"+u);var h=n.hash(e.authcid+":"+o+":"+this._connection.pass)+":"+a+":"+s,p="AUTHENTICATE:"+c,d="";return d+="charset=utf-8,",d+="username="+this._quote(e.authcid)+",",d+="realm="+this._quote(o)+",",d+="nonce="+this._quote(a)+",",d+="nc=00000001,",d+="cnonce="+this._quote(s)+",",d+="digest-uri="+this._quote(c)+",",d+="response="+n.hexdigest(n.hexdigest(h)+":"+a+":00000001:"+s+":auth:"+n.hexdigest(p))+",",d+="qop=auth",this.onChallenge=function(){return""}.bind(this),d},r.Connection.prototype.mechanisms[r.SASLMD5.prototype.name]=r.SASLMD5,{Strophe:r,$build:i,$msg:s,$iq:o,$pres:u,SHA1:e,Base64:t,MD5:n}}),function(e,t){if(typeof define!="function"||!define.amd)return t(Strophe,$build);define("strophe-bosh",["strophe-core"],function(e){return t(e.Strophe,e.$build)})}(this,function(e,t){return e.Request=function(t,n,r,i){this.id=++e._requestId,this.xmlData=t,this.data=e.serialize(t),this.origFunc=n,this.func=n,this.rid=r,this.date=NaN,this.sends=i||0,this.abort=!1,this.dead=null,this.age=function(){if(!this.date)return 0;var e=new Date;return(e-this.date)/1e3},this.timeDead=function(){if(!this.dead)return 0;var e=new Date;return(e-this.dead)/1e3},this.xhr=this._newXHR()},e.Request.prototype={getResponse:function(){var t=null;if(this.xhr.responseXML&&this.xhr.responseXML.documentElement){t=this.xhr.responseXML.documentElement;if(t.tagName=="parsererror")throw e.error("invalid response received"),e.error("responseText: "+this.xhr.responseText),e.error("responseXML: "+e.serialize(this.xhr.responseXML)),"parsererror"}else this.xhr.responseText&&(e.error("invalid response received"),e.error("responseText: "+this.xhr.responseText),e.error("responseXML: "+e.serialize(this.xhr.responseXML)));return t},_newXHR:function(){var e=null;return window.XMLHttpRequest?(e=new XMLHttpRequest,e.overrideMimeType&&e.overrideMimeType("text/xml; charset=utf-8")):window.ActiveXObject&&(e=new ActiveXObject("Microsoft.XMLHTTP")),e.onreadystatechange=this.func.bind(null,this),e}},e.Bosh=function(e){this._conn=e,this.rid=Math.floor(Math.random()*4294967295),this.sid=null,this.hold=1,this.wait=60,this.window=5,this.errors=0,this._requests=[]},e.Bosh.prototype={strip:null,_buildBody:function(){var n=t("body",{rid:this.rid++,xmlns:e.NS.HTTPBIND});return this.sid!==null&&n.attrs({sid:this.sid}),this._conn.options.keepalive&&this._cacheSession(),n},_reset:function(){this.rid=Math.floor(Math.random()*4294967295),this.sid=null,this.errors=0,window.sessionStorage.removeItem("strophe-bosh-session"),this._conn.nextValidRid(this.rid)},_connect:function(t,n,r){this.wait=t||this.wait,this.hold=n||this.hold,this.errors=0;var i=this._buildBody().attrs({to:this._conn.domain,"xml:lang":"en",wait:this.wait,hold:this.hold,content:"text/xml; charset=utf-8",ver:"1.6","xmpp:version":"1.0","xmlns:xmpp":e.NS.BOSH});r&&i.attrs({route:r});var s=this._conn._connect_cb;this._requests.push(new e.Request(i.tree(),this._onRequestStateChange.bind(this,s.bind(this._conn)),i.tree().getAttribute("rid"))),this._throttledRequestHandler()},_attach:function(t,n,r,i,s,o,u){this._conn.jid=t,this.sid=n,this.rid=r,this._conn.connect_callback=i,this._conn.domain=e.getDomainFromJid(this._conn.jid),this._conn.authenticated=!0,this._conn.connected=!0,this.wait=s||this.wait,this.hold=o||this.hold,this.window=u||this.window,this._conn._changeConnectStatus(e.Status.ATTACHED,null)},_restore:function(t,n,r,i,s){var o=JSON.parse(window.sessionStorage.getItem("strophe-bosh-session"));if(!(typeof o!="undefined"&&o!==null&&o.rid&&o.sid&&o.jid)||typeof t!="undefined"&&t!=="null"&&e.getBareJidFromJid(o.jid)!=e.getBareJidFromJid(t))throw{name:"StropheSessionError",message:"_restore: no restoreable session."};this._conn.restored=!0,this._attach(o.jid,o.sid,o.rid,n,r,i,s)},_cacheSession:function(){this._conn.authenticated?this._conn.jid&&this.rid&&this.sid&&window.sessionStorage.setItem("strophe-bosh-session",JSON.stringify({jid:this._conn.jid,rid:this.rid,sid:this.sid})):window.sessionStorage.removeItem("strophe-bosh-session")},_connect_cb:function(t){var n=t.getAttribute("type"),r,i;if(n!==null&&n=="terminate")return r=t.getAttribute("condition"),e.error("BOSH-Connection failed: "+r),i=t.getElementsByTagName("conflict"),r!==null?(r=="remote-stream-error"&&i.length>0&&(r="conflict"),this._conn._changeConnectStatus(e.Status.CONNFAIL,r)):this._conn._changeConnectStatus(e.Status.CONNFAIL,"unknown"),this._conn._doDisconnect(r),e.Status.CONNFAIL;this.sid||(this.sid=t.getAttribute("sid"));var s=t.getAttribute("requests");s&&(this.window=parseInt(s,10));var o=t.getAttribute("hold");o&&(this.hold=parseInt(o,10));var u=t.getAttribute("wait");u&&(this.wait=parseInt(u,10))},_disconnect:function(e){this._sendTerminate(e)},_doDisconnect:function(){this.sid=null,this.rid=Math.floor(Math.random()*4294967295),window.sessionStorage.removeItem("strophe-bosh-session"),this._conn.nextValidRid(this.rid)},_emptyQueue:function(){return this._requests.length===0},_hitError:function(t){this.errors++,e.warn("request errored, status: "+t+", number of errors: "+this.errors),this.errors>4&&this._conn._onDisconnectTimeout()},_no_auth_received:function(t){t?t=t.bind(this._conn):t=this._conn._connect_cb.bind(this._conn);var n=this._buildBody();this._requests.push(new e.Request(n.tree(),this._onRequestStateChange.bind(this,t.bind(this._conn)),n.tree().getAttribute("rid"))),this._throttledRequestHandler()},_onDisconnectTimeout:function(){this._abortAllRequests()},_abortAllRequests:function(){var t;while(this._requests.length>0)t=this._requests.pop(),t.abort=!0,t.xhr.abort(),t.xhr.onreadystatechange=function(){}},_onIdle:function(){var t=this._conn._data;this._conn.authenticated&&this._requests.length===0&&t.length===0&&!this._conn.disconnecting&&(e.info("no requests during idle cycle, sending blank request"),t.push(null));if(this._conn.paused)return;if(this._requests.length<2&&t.length>0){var n=this._buildBody();for(var r=0;r<t.length;r++)t[r]!==null&&(t[r]==="restart"?n.attrs({to:this._conn.domain,"xml:lang":"en","xmpp:restart":"true","xmlns:xmpp":e.NS.BOSH}):n.cnode(t[r]).up());delete this._conn._data,this._conn._data=[],this._requests.push(new e.Request(n.tree(),this._onRequestStateChange.bind(this,this._conn._dataRecv.bind(this._conn)),n.tree().getAttribute("rid"))),this._throttledRequestHandler()}if(this._requests.length>0){var i=this._requests[0].age();this._requests[0].dead!==null&&this._requests[0].timeDead()>Math.floor(e.SECONDARY_TIMEOUT*this.wait)&&this._throttledRequestHandler(),i>Math.floor(e.TIMEOUT*this.wait)&&(e.warn("Request "+this._requests[0].id+" timed out, over "+Math.floor(e.TIMEOUT*this.wait)+" seconds since last activity"),this._throttledRequestHandler())}},_onRequestStateChange:function(t,n){e.debug("request id "+n.id+"."+n.sends+" state changed to "+n.xhr.readyState);if(n.abort){n.abort=!1;return}var r;if(n.xhr.readyState==4){r=0;try{r=n.xhr.status}catch(i){}typeof r=="undefined"&&(r=0);if(this.disconnecting&&r>=400){this._hitError(r);return}var s=this._requests[0]==n,o=this._requests[1]==n;if(r>0&&r<500||n.sends>5)this._removeRequest(n),e.debug("request id "+n.id+" should now be removed");if(r==200)(o||s&&this._requests.length>0&&this._requests[0].age()>Math.floor(e.SECONDARY_TIMEOUT*this.wait))&&this._restartRequest(0),this._conn.nextValidRid(Number(n.rid)+1),e.debug("request id "+n.id+"."+n.sends+" got 200"),t(n),this.errors=0;else{e.error("request id "+n.id+"."+n.sends+" error "+r+" happened");if(r===0||r>=400&&r<600||r>=12e3)this._hitError(r),r>=400&&r<500&&(this._conn._changeConnectStatus(e.Status.DISCONNECTING,null),this._conn._doDisconnect())}r>0&&r<500||n.sends>5||this._throttledRequestHandler()}},_processRequest:function(t){var n=this,r=this._requests[t],i=-1;try{r.xhr.readyState==4&&(i=r.xhr.status)}catch(s){e.error("caught an error in _requests["+t+"], reqStatus: "+i)}typeof i=="undefined"&&(i=-1);if(r.sends>this._conn.maxRetries){this._conn._onDisconnectTimeout();return}var o=r.age(),u=!isNaN(o)&&o>Math.floor(e.TIMEOUT*this.wait),a=r.dead!==null&&r.timeDead()>Math.floor(e.SECONDARY_TIMEOUT*this.wait),f=r.xhr.readyState==4&&(i<1||i>=500);if(u||a||f)a&&e.error("Request "+this._requests[t].id+" timed out (secondary), restarting"),r.abort=!0,r.xhr.abort(),r.xhr.onreadystatechange=function(){},this._requests[t]=new e.Request(r.xmlData,r.origFunc,r.rid,r.sends),r=this._requests[t];if(r.xhr.readyState===0){e.debug("request id "+r.id+"."+r.sends+" posting");try{r.xhr.open("POST",this._conn.service,this._conn.options.sync?!1:!0),r.xhr.setRequestHeader("Content-Type","text/xml; charset=utf-8")}catch(l){e.error("XHR open failed."),this._conn.connected||this._conn._changeConnectStatus(e.Status.CONNFAIL,"bad-service"),this._conn.disconnect();return}var c=function(){r.date=new Date;if(n._conn.options.customHeaders){var e=n._conn.options.customHeaders;for(var t in e)e.hasOwnProperty(t)&&r.xhr.setRequestHeader(t,e[t])}r.xhr.send(r.data)};if(r.sends>1){var h=Math.min(Math.floor(e.TIMEOUT*this.wait),Math.pow(r.sends,3))*1e3;setTimeout(c,h)}else c();r.sends++,this._conn.xmlOutput!==e.Connection.prototype.xmlOutput&&(r.xmlData.nodeName===this.strip&&r.xmlData.childNodes.length?this._conn.xmlOutput(r.xmlData.childNodes[0]):this._conn.xmlOutput(r.xmlData)),this._conn.rawOutput!==e.Connection.prototype.rawOutput&&this._conn.rawOutput(r.data)}else e.debug("_processRequest: "+(t===0?"first":"second")+" request has readyState of "+r.xhr.readyState)},_removeRequest:function(t){e.debug("removing request");var n;for(n=this._requests.length-1;n>=0;n--)t==this._requests[n]&&this._requests.splice(n,1);t.xhr.onreadystatechange=function(){},this._throttledRequestHandler()},_restartRequest:function(e){var t=this._requests[e];t.dead===null&&(t.dead=new Date),this._processRequest(e)},_reqToData:function(e){try{return e.getResponse()}catch(t){if(t!="parsererror")throw t;this._conn.disconnect("strophe-parsererror")}},_sendTerminate:function(t){e.info("_sendTerminate was called");var n=this._buildBody().attrs({type:"terminate"});t&&n.cnode(t.tree());var r=new e.Request(n.tree(),this._onRequestStateChange.bind(this,this._conn._dataRecv.bind(this._conn)),n.tree().getAttribute("rid"));this._requests.push(r),this._throttledRequestHandler()},_send:function(){clearTimeout(this._conn._idleTimeout),this._throttledRequestHandler(),this._conn._idleTimeout=setTimeout(this._conn._onIdle.bind(this._conn),100)},_sendRestart:function(){this._throttledRequestHandler(),clearTimeout(this._conn._idleTimeout)},_throttledRequestHandler:function(){this._requests?e.debug("_throttledRequestHandler called with "+this._requests.length+" requests"):e.debug("_throttledRequestHandler called with undefined requests");if(!this._requests||this._requests.length===0)return;this._requests.length>0&&this._processRequest(0),this._requests.length>1&&Math.abs(this._requests[0].rid-this._requests[1].rid)<this.window&&this._processRequest(1)}},e}),function(e,t){if(typeof define!="function"||!define.amd)return t(Strophe,$build);define("strophe-websocket",["strophe-core"],function(e){return t(e.Strophe,e.$build)})}(this,function(e,t){return e.Websocket=function(e){this._conn=e,this.strip="wrapper";var t=e.service;if(t.indexOf("ws:")!==0&&t.indexOf("wss:")!==0){var n="";e.options.protocol==="ws"&&window.location.protocol!=="https:"?n+="ws":n+="wss",n+="://"+window.location.host,t.indexOf("/")!==0?n+=window.location.pathname+t:n+=t,e.service=n}},e.Websocket.prototype={_buildStream:function(){return t("open",{xmlns:e.NS.FRAMING,to:this._conn.domain,version:"1.0"})},_check_streamerror:function(t,n){var r;t.getElementsByTagNameNS?r=t.getElementsByTagNameNS(e.NS.STREAM,"error"):r=t.getElementsByTagName("stream:error");if(r.length===0)return!1;var i=r[0],s="",o="",u="urn:ietf:params:xml:ns:xmpp-streams";for(var a=0;a<i.childNodes.length;a++){var f=i.childNodes[a];if(f.getAttribute("xmlns")!==u)break;f.nodeName==="text"?o=f.textContent:s=f.nodeName}var l="WebSocket stream error: ";return s?l+=s:l+="unknown",o&&(l+=" - "+s),e.error(l),this._conn._changeConnectStatus(n,s),this._conn._doDisconnect(),!0},_reset:function(){return},_connect:function(){this._closeSocket(),this.socket=new WebSocket(this._conn.service,"xmpp"),this.socket.onopen=this._onOpen.bind(this),this.socket.onerror=this._onError.bind(this),this.socket.onclose=this._onClose.bind(this),this.socket.onmessage=this._connect_cb_wrapper.bind(this)},_connect_cb:function(t){var n=this._check_streamerror(t,e.Status.CONNFAIL);if(n)return e.Status.CONNFAIL},_handleStreamStart:function(t){var n=!1,r=t.getAttribute("xmlns");typeof r!="string"?n="Missing xmlns in <open />":r!==e.NS.FRAMING&&(n="Wrong xmlns in <open />: "+r);var i=t.getAttribute("version");return typeof i!="string"?n="Missing version in <open />":i!=="1.0"&&(n="Wrong version in <open />: "+i),n?(this._conn._changeConnectStatus(e.Status.CONNFAIL,n),this._conn._doDisconnect(),!1):!0},_connect_cb_wrapper:function(t){if(t.data.indexOf("<open ")===0||t.data.indexOf("<?xml")===0){var n=t.data.replace(/^(<\?.*?\?>\s*)*/,"");if(n==="")return;var r=(new DOMParser).parseFromString(n,"text/xml").documentElement;this._conn.xmlInput(r),this._conn.rawInput(t.data),this._handleStreamStart(r)&&this._connect_cb(r)}else if(t.data.indexOf("<close ")===0){this._conn.rawInput(t.data),this._conn.xmlInput(t);var i=t.getAttribute("see-other-uri");i?(this._conn._changeConnectStatus(e.Status.REDIRECT,"Received see-other-uri, resetting connection"),this._conn.reset(),this._conn.service=i,this._connect()):(this._conn._changeConnectStatus(e.Status.CONNFAIL,"Received closing stream"),this._conn._doDisconnect())}else{var s=this._streamWrap(t.data),o=(new DOMParser).parseFromString(s,"text/xml").documentElement;this.socket.onmessage=this._onMessage.bind(this),this._conn._connect_cb(o,null,t.data)}},_disconnect:function(n){if(this.socket&&this.socket.readyState!==WebSocket.CLOSED){n&&this._conn.send(n);var r=t("close",{xmlns:e.NS.FRAMING});this._conn.xmlOutput(r);var i=e.serialize(r);this._conn.rawOutput(i);try{this.socket.send(i)}catch(s){e.info("Couldn't send <close /> tag.")}}this._conn._doDisconnect()},_doDisconnect:function(){e.info("WebSockets _doDisconnect was called"),this._closeSocket()},_streamWrap:function(e){return"<wrapper>"+e+"</wrapper>"},_closeSocket:function(){if(this.socket)try{this.socket.close()}catch(e){}this.socket=null},_emptyQueue:function(){return!0},_onClose:function(){this._conn.connected&&!this._conn.disconnecting?(e.error("Websocket closed unexcectedly"),this._conn._doDisconnect()):e.info("Websocket closed")},_no_auth_received:function(t){e.error("Server did not send any auth methods"),this._conn._changeConnectStatus(e.Status.CONNFAIL,"Server did not send any auth methods"),t&&(t=t.bind(this._conn),t()),this._conn._doDisconnect()},_onDisconnectTimeout:function(){},_abortAllRequests:function(){},_onError:function(t){e.error("Websocket error "+t),this._conn._changeConnectStatus(e.Status.CONNFAIL,"The WebSocket connection could not be established was disconnected."),this._disconnect()},_onIdle:function(){var t=this._conn._data;if(t.length>0&&!this._conn.paused){for(var n=0;n<t.length;n++)if(t[n]!==null){var r,i;t[n]==="restart"?r=this._buildStream().tree():r=t[n],i=e.serialize(r),this._conn.xmlOutput(r),this._conn.rawOutput(i),this.socket.send(i)}this._conn._data=[]}},_onMessage:function(t){var n,r,i='<close xmlns="urn:ietf:params:xml:ns:xmpp-framing" />';if(t.data===i){this._conn.rawInput(i),this._conn.xmlInput(t),this._conn.disconnecting||this._conn._doDisconnect();return}if(t.data.search("<open ")===0){n=(new DOMParser).parseFromString(t.data,"text/xml").documentElement;if(!this._handleStreamStart(n))return}else r=this._streamWrap(t.data),n=(new DOMParser).parseFromString(r,"text/xml").documentElement;if(this._check_streamerror(n,e.Status.ERROR))return;if(this._conn.disconnecting&&n.firstChild.nodeName==="presence"&&n.firstChild.getAttribute("type")==="unavailable"){this._conn.xmlInput(n),this._conn.rawInput(e.serialize(n));return}this._conn._dataRecv(n,t.data)},_onOpen:function(){e.info("Websocket open");var t=this._buildStream();this._conn.xmlOutput(t.tree());var n=e.serialize(t);this._conn.rawOutput(n),this.socket.send(n)},_reqToData:function(e){return e},_send:function(){this._conn.flush()},_sendRestart:function(){clearTimeout(this._conn._idleTimeout),this._conn._onIdle.bind(this._conn)()}},e}),define("strophe",["strophe-core","strophe-bosh","strophe-websocket"],function(e){return e}),function(e,t){typeof define=="function"&&define.amd?define("strophe.disco",["strophe"],function(e){return t(e.Strophe,e.$build,e.$iq,e.$msg,e.$pres),e}):t(e.Strophe,e.$build,e.$iq,e.$msg,e.$pres)}(this,function(e,t,n,r,i){e.addConnectionPlugin("disco",{_connection:null,_identities:[],_features:[],_items:[],init:function(t){this._connection=t,this._identities=[],this._features=[],this._items=[],t.addHandler(this._onDiscoInfo.bind(this),e.NS.DISCO_INFO,"iq","get",null,null),t.addHandler(this._onDiscoItems.bind(this),e.NS.DISCO_ITEMS,"iq","get",null,null)},addIdentity:function(e,t,n,r){for(var i=0;i<this._identities.length;i++)if(this._identities[i].category==e&&this._identities[i].type==t&&this._identities[i].name==n&&this._identities[i].lang==r)return!1;return this._identities.push({category:e,type:t,name:n,lang:r}),!0},addFeature:function(e){for(var t=0;t<this._features.length;t++)if(this._features[t]==e)return!1;return this._features.push(e),!0},removeFeature:function(e){for(var t=0;t<this._features.length;t++)if(this._features[t]===e)return this._features.splice(t,1),!0;return!1},addItem:function(e,t,n,r){return n&&!r?!1:(this._items.push({jid:e,name:t,node:n,call_back:r}),!0)},info:function(t,r,i,s,o){var u={xmlns:e.NS.DISCO_INFO};r&&(u.node=r);var a=n({from:this._connection.jid,to:t,type:"get"}).c("query",u);this._connection.sendIQ(a,i,s,o)},items:function(t,r,i,s,o){var u={xmlns:e.NS.DISCO_ITEMS};r&&(u.node=r);var a=n({from:this._connection.jid,to:t,type:"get"}).c("query",u);this._connection.sendIQ(a,i,s,o)},_buildIQResult:function(e,t){var r=e.getAttribute("id"),i=e.getAttribute("from"),s=n({type:"result",id:r});return i!==null&&s.attrs({to:i}),s.c("query",t)},_onDiscoInfo:function(t){var n=t.getElementsByTagName("query")[0].getAttribute("node"),r={xmlns:e.NS.DISCO_INFO},i;n&&(r.node=n);var s=this._buildIQResult(t,r);for(i=0;i<this._identities.length;i++)r={category:this._identities[i].category,type:this._identities[i].type},this._identities[i].name&&(r.name=this._identities[i].name),this._identities[i].lang&&(r["xml:lang"]=this._identities[i].lang),s.c("identity",r).up();for(i=0;i<this._features.length;i++)s.c("feature",{"var":this._features[i]}).up();return this._connection.send(s.tree()),!0},_onDiscoItems:function(t){var n={xmlns:e.NS.DISCO_ITEMS},r=t.getElementsByTagName("query")[0].getAttribute("node"),i,s;if(r){n.node=r,i=[];for(s=0;s<this._items.length;s++)if(this._items[s].node==r){i=this._items[s].call_back(t);break}}else i=this._items;var o=this._buildIQResult(t,n);for(s=0;s<i.length;s++){var u={jid:i[s].jid};i[s].name&&(u.name=i[s].name),i[s].node&&(u.node=i[s].node),o.c("item",u).up()}return this._connection.send(o.tree()),!0}})}),function(e,t){typeof define=="function"&&define.amd?define("strophe.ping",["strophe"],function(e){return t(e.Strophe,e.$build,e.$iq,e.$msg,e.$pres),e}):t(e.Strophe,e.$build,e.$iq,e.$msg,e.$pres)}(this,function(e,t,n,r,i){e.addConnectionPlugin("ping",{_c:null,init:function(t){this._c=t,e.addNamespace("PING","urn:xmpp:ping")},ping:function(t,r,i,s){var o=this._c.getUniqueId("ping"),u=n({type:"get",to:t,id:o}).c("ping",{xmlns:e.NS.PING});this._c.sendIQ(u,r,i,s)},pong:function(e){var t=e.getAttribute("from"),r=e.getAttribute("id"),i=n({type:"result",to:t,id:r});this._c.sendIQ(i)},addPingHandler:function(t){return this._c.addHandler(t,e.NS.PING,"iq","get")}})}),function(e,t){typeof define=="function"&&define.amd?define("strophe.rsm",["strophe"],function(e){return t(e.Strophe,e.$build,e.$iq,e.$msg,e.$pres),e}):t(e.Strophe,e.$build,e.$iq,e.$msg,e.$pres)}(this,function(e,t,n,r,i){e.addNamespace("RSM","http://jabber.org/protocol/rsm"),e.RSM=function(e){this.attribs=["max","first","last","after","before","index","count"];if(typeof e.xml!="undefined")this.fromXMLElement(e.xml);else for(var t=0;t<this.attribs.length;t++){var n=this.attribs[t];this[n]=e[n]}},e.RSM.prototype={toXML:function(){var n=t("set",{xmlns:e.NS.RSM});for(var r=0;r<this.attribs.length;r++){var i=this.attribs[r];typeof this[i]!="undefined"&&(n=n.c(i).t(this[i].toString()).up())}return n.tree()},next:function(t){var n=new e.RSM({max:t,after:this.last});return n},previous:function(t){var n=new e.RSM({max:t,before:this.first});return n},fromXMLElement:function(t){for(var n=0;n<this.attribs.length;n++){var r=this.attribs[n],i=t.getElementsByTagName(r)[0];typeof i!="undefined"&&i!==null&&(this[r]=e.getText(i),r=="first"&&(this.index=i.getAttribute("index")))}}}}),function(e,t){typeof define=="function"&&define.amd?define("strophe.vcard",["strophe"],function(e){return t(e.Strophe,e.$build,e.$iq,e.$msg,e.$pres),e}):t(e.Strophe,e.$build,e.$iq,e.$msg,e.$pres)}(this,function(e,t,n,r,i){var s=function(t,r,i){var s=n(r?{type:t,to:r}:{type:t});return s.c("vCard",{xmlns:e.NS.VCARD}),i&&s.cnode(i),s};e.addConnectionPlugin("vcard",{_connection:null,init:function(t){return this._connection=t,e.addNamespace("VCARD","vcard-temp")},get:function(e,t,n){var r=s("get",t);return this._connection.sendIQ(r,e,n)},set:function(e,t,n,r){var i=s("set",n,t);return this._connection.sendIQ(i,e,r)}})}),function(e,t){if(typeof define=="function"&&define.amd)define("backbone",["underscore","jquery","exports"],function(n,r,i){e.Backbone=t(e,i,n,r)});else if(typeof exports!="undefined"){var n=require("underscore");t(e,exports,n)}else e.Backbone=t(e,{},e._,e.jQuery||e.Zepto||e.ender||e.$)}(this,function(e,t,n,r){var i=e.Backbone,s=[],o=s.push,u=s.slice,a=s.splice;t.VERSION="1.1.2",t.$=r,t.noConflict=function(){return e.Backbone=i,this},t.emulateHTTP=!1,t.emulateJSON=!1;var f=t.Events={on:function(e,t,n){if(!c(this,"on",e,[t,n])||!t)return this;this._events||(this._events={});var r=this._events[e]||(this._events[e]=[]);return r.push({callback:t,context:n,ctx:n||this}),this},once:function(e,t,r){if(!c(this,"once",e,[t,r])||!t)return this;var i=this,s=n.once(function(){i.off(e,s),t.apply(this,arguments)});return s._callback=t,this.on(e,s,r)},off:function(e,t,r){var i,s,o,u,a,f,l,h;if(!this._events||!c(this,"off",e,[t,r]))return this;if(!e&&!t&&!r)return this._events=void 0,this;u=e?[e]:n.keys(this._events);for(a=0,f=u.length;a<f;a++){e=u[a];if(o=this._events[e]){this._events[e]=i=[];if(t||r)for(l=0,h=o.length;l<h;l++)s=o[l],(t&&t!==s.callback&&t!==s.callback._callback||r&&r!==s.context)&&i.push(s);i.length||delete this._events[e]}}return this},trigger:function(e){if(!this._events)return this;var t=u.call(arguments,1);if(!c(this,"trigger",e,t))return this;var n=this._events[e],r=this._events.all;return n&&h(n,t),r&&h(r,arguments),this},stopListening:function(e,t,r){var i=this._listeningTo;if(!i)return this;var s=!t&&!r;!r&&typeof t=="object"&&(r=this),e&&((i={})[e._listenId]=e);for(var o in i)e=i[o],e.off(t,r,this),(s||n.isEmpty(e._events))&&delete this._listeningTo[o];return this}},l=/\s+/,c=function(e,t,n,r){if(!n)return!0;if(typeof n=="object"){for(var i in n)e[t].apply(e,[i,n[i]].concat(r));return!1}if(l.test(n)){var s=n.split(l);for(var o=0,u=s.length;o<u;o++)e[t].apply(e,[s[o]].concat(r));return!1}return!0},h=function(e,t){var n,r=-1,i=e.length,s=t[0],o=t[1],u=t[2];switch(t.length){case 0:while(++r<i)(n=e[r]).callback.call(n.ctx);return;case 1:while(++r<i)(n=e[r]).callback.call(n.ctx,s);return;case 2:while(++r<i)(n=e[r]).callback.call(n.ctx,s,o);return;case 3:while(++r<i)(n=e[r]).callback.call(n.ctx,s,o,u);return;default:while(++r<i)(n=e[r]).callback.apply(n.ctx,t);return}},p={listenTo:"on",listenToOnce:"once"};n.each(p,function(e,t){f[t]=function(t,r,i){var s=this._listeningTo||(this._listeningTo={}),o=t._listenId||(t._listenId=n.uniqueId("l"));return s[o]=t,!i&&typeof r=="object"&&(i=this),t[e](r,i,this),this}}),f.bind=f.on,f.unbind=f.off,n.extend(t,f);var d=t.Model=function(e,t){var r=e||{};t||(t={}),this.cid=n.uniqueId("c"),this.attributes={},t.collection&&(this.collection=t.collection),t.parse&&(r=this.parse(r,t)||{}),r=n.defaults({},r,n.result(this,"defaults")),this.set(r,t),this.changed={},this.initialize.apply(this,arguments)};n.extend(d.prototype,f,{changed:null,validationError:null,idAttribute:"id",initialize:function(){},toJSON:function(e){return n.clone(this.attributes)},sync:function(){return t.sync.apply(this,arguments)},get:function(e){return this.attributes[e]},escape:function(e){return n.escape(this.get(e))},has:function(e){return this.get(e)!=null},set:function(e,t,r){var i,s,o,u,a,f,l,c;if(e==null)return this;typeof e=="object"?(s=e,r=t):(s={})[e]=t,r||(r={});if(!this._validate(s,r))return!1;o=r.unset,a=r.silent,u=[],f=this._changing,this._changing=!0,f||(this._previousAttributes=n.clone(this.attributes),this.changed={}),c=this.attributes,l=this._previousAttributes,this.idAttribute in s&&(this.id=s[this.idAttribute]);for(i in s)t=s[i],n.isEqual(c[i],t)||u.push(i),n.isEqual(l[i],t)?delete this.changed[i]:this.changed[i]=t,o?delete c[i]:c[i]=t;if(!a){u.length&&(this._pending=r);for(var h=0,p=u.length;h<p;h++)this.trigger("change:"+u[h],this,c[u[h]],r)}if(f)return this;if(!a)while(this._pending)r=this._pending,this._pending=!1,this.trigger("change",this,r);return this._pending=!1,this._changing=!1,this},unset:function(e,t){return this.set(e,void 0,n.extend({},t,{unset:!0}))},clear:function(e){var t={};for(var r in this.attributes)t[r]=void 0;return this.set(t,n.extend({},e,{unset:!0}))},hasChanged:function(e){return e==null?!n.isEmpty(this.changed):n.has(this.changed,e)},changedAttributes:function(e){if(!e)return this.hasChanged()?n.clone(this.changed):!1;var t,r=!1,i=this._changing?this._previousAttributes:this.attributes;for(var s in e){if(n.isEqual(i[s],t=e[s]))continue;(r||(r={}))[s]=t}return r},previous:function(e){return e==null||!this._previousAttributes?null:this._previousAttributes[e]},previousAttributes:function(){return n.clone(this._previousAttributes)},fetch:function(e){e=e?n.clone(e):{},e.parse===void 0&&(e.parse=!0);var t=this,r=e.success;return e.success=function(n){if(!t.set(t.parse(n,e),e))return!1;r&&r(t,n,e),t.trigger("sync",t,n,e)},I(this,e),this.sync("read",this,e)},save:function(e,t,r){var i,s,o,u=this.attributes;e==null||typeof e=="object"?(i=e,r=t):(i={})[e]=t,r=n.extend({validate:!0},r);if(i&&!r.wait){if(!this.set(i,r))return!1}else if(!this._validate(i,r))return!1;i&&r.wait&&(this.attributes=n.extend({},u,i)),r.parse===void 0&&(r.parse=!0);var a=this,f=r.success;return r.success=function(e){a.attributes=u;var t=a.parse(e,r);r.wait&&(t=n.extend(i||{},t));if(n.isObject(t)&&!a.set(t,r))return!1;f&&f(a,e,r),a.trigger("sync",a,e,r)},I(this,r),s=this.isNew()?"create":r.patch?"patch":"update",s==="patch"&&(r.attrs=i),o=this.sync(s,this,r),i&&r.wait&&(this.attributes=u),o},destroy:function(e){e=e?n.clone(e):{};var t=this,r=e.success,i=function(){t.trigger("destroy",t,t.collection,e)};e.success=function(n){(e.wait||t.isNew())&&i(),r&&r(t,n,e),t.isNew()||t.trigger("sync",t,n,e)};if(this.isNew())return e.success(),!1;I(this,e);var s=this.sync("delete",this,e);return e.wait||i(),s},url:function(){var e=n.result(this,"urlRoot")||n.result(this.collection,"url")||F();return this.isNew()?e:e.replace(/([^\/])$/,"$1/")+encodeURIComponent(this.id)},parse:function(e,t){return e},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return!this.has(this.idAttribute)},isValid:function(e){return this._validate({},n.extend(e||{},{validate:!0}))},_validate:function(e,t){if(!t.validate||!this.validate)return!0;e=n.extend({},this.attributes,e);var r=this.validationError=this.validate(e,t)||null;return r?(this.trigger("invalid",this,r,n.extend(t,{validationError:r})),!1):!0}});var v=["keys","values","pairs","invert","pick","omit"];n.each(v,function(e){d.prototype[e]=function(){var t=u.call(arguments);return t.unshift(this.attributes),n[e].apply(n,t)}});var m=t.Collection=function(e,t){t||(t={}),t.model&&(this.model=t.model),t.comparator!==void 0&&(this.comparator=t.comparator),this._reset(),this.initialize.apply(this,arguments),e&&this.reset(e,n.extend({silent:!0},t))},g={add:!0,remove:!0,merge:!0},y={add:!0,remove:!1};n.extend(m.prototype,f,{model:d,initialize:function(){},toJSON:function(e){return this.map(function(t){return t.toJSON(e)})},sync:function(){return t.sync.apply(this,arguments)},add:function(e,t){return this.set(e,n.extend({merge:!1},t,y))},remove:function(e,t){var r=!n.isArray(e);e=r?[e]:n.clone(e),t||(t={});var i,s,o,u;for(i=0,s=e.length;i<s;i++){u=e[i]=this.get(e[i]);if(!u)continue;delete this._byId[u.id],delete this._byId[u.cid],o=this.indexOf(u),this.models.splice(o,1),this.length--,t.silent||(t.index=o,u.trigger("remove",u,this,t)),this._removeReference(u,t)}return r?e[0]:e},set:function(e,t){t=n.defaults({},t,g),t.parse&&(e=this.parse(e,t));var r=!n.isArray(e);e=r?e?[e]:[]:n.clone(e);var i,s,o,u,a,f,l,c=t.at,h=this.model,p=this.comparator&&c==null&&t.sort!==!1,v=n.isString(this.comparator)?this.comparator:null,m=[],y=[],b={},w=t.add,E=t.merge,S=t.remove,x=!p&&w&&S?[]:!1;for(i=0,s=e.length;i<s;i++){a=e[i]||{},a instanceof d?o=u=a:o=a[h.prototype.idAttribute||"id"];if(f=this.get(o))S&&(b[f.cid]=!0),E&&(a=a===u?u.attributes:a,t.parse&&(a=f.parse(a,t)),f.set(a,t),p&&!l&&f.hasChanged(v)&&(l=!0)),e[i]=f;else if(w){u=e[i]=this._prepareModel(a,t);if(!u)continue;m.push(u),this._addReference(u,t)}u=f||u,x&&(u.isNew()||!b[u.id])&&x.push(u),b[u.id]=!0}if(S){for(i=0,s=this.length;i<s;++i)b[(u=this.models[i]).cid]||y.push(u);y.length&&this.remove(y,t)}if(m.length||x&&x.length){p&&(l=!0),this.length+=m.length;if(c!=null)for(i=0,s=m.length;i<s;i++)this.models.splice(c+i,0,m[i]);else{x&&(this.models.length=0);var T=x||m;for(i=0,s=T.length;i<s;i++)this.models.push(T[i])}}l&&this.sort({silent:!0});if(!t.silent){for(i=0,s=m.length;i<s;i++)(u=m[i]).trigger("add",u,this,t);(l||x&&x.length)&&this.trigger("sort",this,t)}return r?e[0]:e},reset:function(e,t){t||(t={});for(var r=0,i=this.models.length;r<i;r++)this._removeReference(this.models[r],t);return t.previousModels=this.models,this._reset(),e=this.add(e,n.extend({silent:!0},t)),t.silent||this.trigger("reset",this,t),e},push:function(e,t){return this.add(e,n.extend({at:this.length},t))},pop:function(e){var t=this.at(this.length-1);return this.remove(t,e),t},unshift:function(e,t){return this.add(e,n.extend({at:0},t))},shift:function(e){var t=this.at(0);return this.remove(t,e),t},slice:function(){return u.apply(this.models,arguments)},get:function(e){return e==null?void 0:this._byId[e]||this._byId[e.id]||this._byId[e.cid]},at:function(e){return this.models[e]},where:function(e,t){return n.isEmpty(e)?t?void 0:[]:this[t?"find":"filter"](function(t){for(var n in e)if(e[n]!==t.get(n))return!1;return!0})},findWhere:function(e){return this.where(e,!0)},sort:function(e){if(!this.comparator)throw new Error("Cannot sort a set without a comparator");return e||(e={}),n.isString(this.comparator)||this.comparator.length===1?this.models=this.sortBy(this.comparator,this):this.models.sort(n.bind(this.comparator,this)),e.silent||this.trigger("sort",this,e),this},pluck:function(e){return n.invoke(this.models,"get",e)},fetch:function(e){e=e?n.clone(e):{},e.parse===void 0&&(e.parse=!0);var t=e.success,r=this;return e.success=function(n){var i=e.reset?"reset":"set";r[i](n,e),t&&t(r,n,e),r.trigger("sync",r,n,e)},I(this,e),this.sync("read",this,e)},create:function(e,t){t=t?n.clone(t):{};if(!(e=this._prepareModel(e,t)))return!1;t.wait||this.add(e,t);var r=this,i=t.success;return t.success=function(e,n){t.wait&&r.add(e,t),i&&i(e,n,t)},e.save(null,t),e},parse:function(e,t){return e},clone:function(){return new this.constructor(this.models)},_reset:function(){this.length=0,this.models=[],this._byId={}},_prepareModel:function(e,t){if(e instanceof d)return e;t=t?n.clone(t):{},t.collection=this;var r=new this.model(e,t);return r.validationError?(this.trigger("invalid",this,r.validationError,t),!1):r},_addReference:function(e,t){this._byId[e.cid]=e,e.id!=null&&(this._byId[e.id]=e),e.collection||(e.collection=this),e.on("all",this._onModelEvent,this)},_removeReference:function(e,t){this===e.collection&&delete e.collection,e.off("all",this._onModelEvent,this)},_onModelEvent:function(e,t,n,r){if((e==="add"||e==="remove")&&n!==this)return;e==="destroy"&&this.remove(t,r),t&&e==="change:"+t.idAttribute&&(delete this._byId[t.previous(t.idAttribute)],t.id!=null&&(this._byId[t.id]=t)),this.trigger.apply(this,arguments)}});var b=["forEach","each","map","collect","reduce","foldl","inject","reduceRight","foldr","find","detect","filter","select","reject","every","all","some","any","include","contains","invoke","max","min","toArray","size","first","head","take","initial","rest","tail","drop","last","without","difference","indexOf","shuffle","lastIndexOf","isEmpty","chain","sample"];n.each(b,function(e){m.prototype[e]=function(){var t=u.call(arguments);return t.unshift(this.models),n[e].apply(n,t)}});var w=["groupBy","countBy","sortBy","indexBy"];n.each(w,function(e){m.prototype[e]=function(t,r){var i=n.isFunction(t)?t:function(e){return e.get(t)};return n[e](this.models,i,r)}});var E=t.View=function(e){this.cid=n.uniqueId("view"),e||(e={}),n.extend(this,n.pick(e,x)),this._ensureElement(),this.initialize.apply(this,arguments),this.delegateEvents()},S=/^(\S+)\s*(.*)$/,x=["model","collection","el","id","attributes","className","tagName","events"];n.extend(E.prototype,f,{tagName:"div",$:function(e){return this.$el.find(e)},initialize:function(){},render:function(){return this},remove:function(){return this.$el.remove(),this.stopListening(),this},setElement:function(e,n){return this.$el&&this.undelegateEvents(),this.$el=e instanceof t.$?e:t.$(e),this.el=this.$el[0],n!==!1&&this.delegateEvents(),this},delegateEvents:function(e){if(!e&&!(e=n.result(this,"events")))return this;this.undelegateEvents();for(var t in e){var r=e[t];n.isFunction(r)||(r=this[e[t]]);if(!r)continue;var i=t.match(S),s=i[1],o=i[2];r=n.bind(r,this),s+=".delegateEvents"+this.cid,o===""?this.$el.on(s,r):this.$el.on(s,o,r)}return this},undelegateEvents:function(){return this.$el.off(".delegateEvents"+this.cid),this},_ensureElement:function(){if(!this.el){var e=n.extend({},n.result(this,"attributes"));this.id&&(e.id=n.result(this,"id")),this.className&&(e["class"]=n.result(this,"className"));var r=t.$("<"+n.result(this,"tagName")+">").attr(e);this.setElement(r,!1)}else this.setElement(n.result(this,"el"),!1)}}),t.sync=function(e,r,i){var s=N[e];n.defaults(i||(i={}),{emulateHTTP:t.emulateHTTP,emulateJSON:t.emulateJSON});var o={type:s,dataType:"json"};i.url||(o.url=n.result(r,"url")||F()),i.data==null&&r&&(e==="create"||e==="update"||e==="patch")&&(o.contentType="application/json",o.data=JSON.stringify(i.attrs||r.toJSON(i))),i.emulateJSON&&(o.contentType="application/x-www-form-urlencoded",o.data=o.data?{model:o.data}:{});if(i.emulateHTTP&&(s==="PUT"||s==="DELETE"||s==="PATCH")){o.type="POST",i.emulateJSON&&(o.data._method=s);var u=i.beforeSend;i.beforeSend=function(e){e.setRequestHeader("X-HTTP-Method-Override",s);if(u)return u.apply(this,arguments)}}o.type!=="GET"&&!i.emulateJSON&&(o.processData=!1),o.type==="PATCH"&&T&&(o.xhr=function(){return new ActiveXObject("Microsoft.XMLHTTP")});var a=i.xhr=t.ajax(n.extend(o,i));return r.trigger("request",r,a,i),a};var T=typeof window!="undefined"&&!!window.ActiveXObject&&(!window.XMLHttpRequest||!(new XMLHttpRequest).dispatchEvent),N={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};t.ajax=function(){return t.$.ajax.apply(t.$,arguments)};var C=t.Router=function(e){e||(e={}),e.routes&&(this.routes=e.routes),this._bindRoutes(),this.initialize.apply(this,arguments)},k=/\((.*?)\)/g,L=/(\(\?)?:\w+/g,A=/\*\w+/g,O=/[\-{}\[\]+?.,\\\^$|#\s]/g;n.extend(C.prototype,f,{initialize:function(){},route:function(e,r,i){n.isRegExp(e)||(e=this._routeToRegExp(e)),n.isFunction(r)&&(i=r,r=""),i||(i=this[r]);var s=this;return t.history.route(e,function(n){var o=s._extractParameters(e,n);s.execute(i,o),s.trigger.apply(s,["route:"+r].concat(o)),s.trigger("route",r,o),t.history.trigger("route",s,r,o)}),this},execute:function(e,t){e&&e.apply(this,t)},navigate:function(e,n){return t.history.navigate(e,n),this},_bindRoutes:function(){if(!this.routes)return;this.routes=n.result(this,"routes");var e,t=n.keys(this.routes);while((e=t.pop())!=null)this.route(e,this.routes[e])},_routeToRegExp:function(e){return e=e.replace(O,"\\$&").replace(k,"(?:$1)?").replace(L,function(e,t){return t?e:"([^/?]+)"}).replace(A,"([^?]*?)"),new RegExp("^"+e+"(?:\\?([\\s\\S]*))?$")},_extractParameters:function(e,t){var r=e.exec(t).slice(1);return n.map(r,function(e,t){return t===r.length-1?e||null:e?decodeURIComponent(e):null})}});var M=t.History=function(){this.handlers=[],n.bindAll(this,"checkUrl"),typeof window!="undefined"&&(this.location=window.location,this.history=window.history)},_=/^[#\/]|\s+$/g,D=/^\/+|\/+$/g,P=/msie [\w.]+/,H=/\/$/,B=/#.*$/;M.started=!1,n.extend(M.prototype,f,{interval:50,atRoot:function(){return this.location.pathname.replace(/[^\/]$/,"$&/")===this.root},getHash:function(e){var t=(e||this).location.href.match(/#(.*)$/);return t?t[1]:""},getFragment:function(e,t){if(e==null)if(this._hasPushState||!this._wantsHashChange||t){e=decodeURI(this.location.pathname+this.location.search);var n=this.root.replace(H,"");e.indexOf(n)||(e=e.slice(n.length))}else e=this.getHash();return e.replace(_,"")},start:function(e){if(M.started)throw new Error("Backbone.history has already been started");M.started=!0,this.options=n.extend({root:"/"},this.options,e),this.root=this.options.root,this._wantsHashChange=this.options.hashChange!==!1,this._wantsPushState=!!this.options.pushState,this._hasPushState=!!(this.options.pushState&&this.history&&this.history.pushState);var r=this.getFragment(),i=document.documentMode,s=P.exec(navigator.userAgent.toLowerCase())&&(!i||i<=7);this.root=("/"+this.root+"/").replace(D,"/");if(s&&this._wantsHashChange){var o=t.$('<iframe src="javascript:0" tabindex="-1">');this.iframe=o.hide().appendTo("body")[0].contentWindow,this.navigate(r)}this._hasPushState?t.$(window).on("popstate",this.checkUrl):this._wantsHashChange&&"onhashchange"in window&&!s?t.$(window).on("hashchange",this.checkUrl):this._wantsHashChange&&(this._checkUrlInterval=setInterval(this.checkUrl,this.interval)),this.fragment=r;var u=this.location;if(this._wantsHashChange&&this._wantsPushState){if(!this._hasPushState&&!this.atRoot())return this.fragment=this.getFragment(null,!0),this.location.replace(this.root+"#"+this.fragment),!0;this._hasPushState&&this.atRoot()&&u.hash&&(this.fragment=this.getHash().replace(_,""),this.history.replaceState({},document.title,this.root+this.fragment))}if(!this.options.silent)return this.loadUrl()},stop:function(){t.$(window).off("popstate",this.checkUrl).off("hashchange",this.checkUrl),this._checkUrlInterval&&clearInterval(this._checkUrlInterval),M.started=!1},route:function(e,t){this.handlers.unshift({route:e,callback:t})},checkUrl:function(e){var t=this.getFragment();t===this.fragment&&this.iframe&&(t=this.getFragment(this.getHash(this.iframe)));if(t===this.fragment)return!1;this.iframe&&this.navigate(t),this.loadUrl()},loadUrl:function(e){return e=this.fragment=this.getFragment(e),n.any(this.handlers,function(t){if(t.route.test(e))return t.callback(e),!0})},navigate:function(e,t){if(!M.started)return!1;if(!t||t===!0)t={trigger:!!t};var n=this.root+(e=this.getFragment(e||""));e=e.replace(B,"");if(this.fragment===e)return;this.fragment=e,e===""&&n!=="/"&&(n=n.slice(0,-1));if(this._hasPushState)this.history[t.replace?"replaceState":"pushState"]({},document.title,n);else{if(!this._wantsHashChange)return this.location.assign(n);this._updateHash(this.location,e,t.replace),this.iframe&&e!==this.getFragment(this.getHash(this.iframe))&&(t.replace||this.iframe.document.open().close(),this._updateHash(this.iframe.location,e,t.replace))}if(t.trigger)return this.loadUrl(e)},_updateHash:function(e,t,n){if(n){var r=e.href.replace(/(javascript:|#).*$/,"");e.replace(r+"#"+t)}else e.hash="#"+t}}),t.history=new M;var j=function(e,t){var r=this,i;e&&n.has(e,"constructor")?i=e.constructor:i=function(){return r.apply(this,arguments)},n.extend(i,r,t);var s=function(){this.constructor=i};return s.prototype=r.prototype,i.prototype=new s,e&&n.extend(i.prototype,e),i.__super__=r.prototype,i};d.extend=m.extend=C.extend=E.extend=M.extend=j;var F=function(){throw new Error('A "url" property or function must be specified')},I=function(e,t){var n=t.error;t.error=function(r){n&&n(e,r,t),e.trigger("error",e,r,t)}};return t}),function(e,t){typeof exports=="object"&&typeof require=="function"?module.exports=t(require("backbone"),require("underscore")):typeof define=="function"&&define.amd?define("backbone.browserStorage",["backbone","underscore"],function(n,r){return t(n||e.Backbone,r||e._)}):t(Backbone,_)}(this,function(e,t){function n(){return((1+Math.random())*65536|0).toString(16).substring(1)}function r(){return n()+n()+"-"+n()+"-"+n()+"-"+n()+"-"+n()+n()+n()}function i(e,t){var n=e.length;while(n--)if(e[n]===t)return!0;return!1}function s(e,t){for(var n in t)e[n]=t[n];return e}function o(e,n,r){var i;if(r==="local"&&!window.localStorage)throw"Backbone.browserStorage: Environment does not support localStorage.";if(r==="session"&&!window.sessionStorage)throw"Backbone.browserStorage: Environment does not support sessionStorage.";this.name=e,this.serializer=n||{serialize:function(e){return t.isObject(e)?JSON.stringify(e):e},deserialize:function(e){return e&&JSON.parse(e)}};if(r==="session")this.store=window.sessionStorage;else{if(r!=="local")throw"Backbone.browserStorage: No storage type was specified";this.store=window.localStorage}i=this.store.getItem(this.name),this.records=i&&i.split(",")||[]}e.BrowserStorage={local:function(e,t){return o.bind(this,e,t,"local")()},session:function(e,t){return o.bind(this,e,t,"session")()}};var u={save:function(){this.store.setItem(this.name,this.records.join(","))},create:function(e){return e.id||(e.id=r(),e.set(e.idAttribute,e.id)),this.store.setItem(this._itemName(e.id),this.serializer.serialize(e)),this.records.push(e.id.toString()),this.save(),this.find(e)!==!1},update:function(e){this.store.setItem(this._itemName(e.id),this.serializer.serialize(e));var t=e.id.toString();return i(this.records,t)||(this.records.push(t),this.save()),this.find(e)!==!1},find:function(e){return this.serializer.deserialize(this.store.getItem(this._itemName(e.id)))},findAll:function(){var e=[];for(var t=0,n,r;t<this.records.length;t++)n=this.records[t],r=this.serializer.deserialize(this.store.getItem(this._itemName(n))),r!==null&&e.push(r);return e},destroy:function(e){this.store.removeItem(this._itemName(e.id));var t=e.id.toString();for(var n=0,r;n<this.records.length;n++)this.records[n]===t&&this.records.splice(n,1);return this.save(),e},browserStorage:function(){return{session:sessionStorage,local:localStorage}},_clear:function(){var e=this.store,t=new RegExp("^"+this.name+"-");e.removeItem(this.name);for(var n in e)t.test(n)&&e.removeItem(n);this.records.length=0},_storageSize:function(){return this.store.length},_itemName:function(e){return this.name+"-"+e}};return s(e.BrowserStorage.session.prototype,u),s(e.BrowserStorage.local.prototype,u),e.BrowserStorage.sync=e.localSync=function(t,n,r){var i=n.browserStorage||n.collection.browserStorage,s,o,u=e.$?e.$.Deferred&&e.$.Deferred():e.Deferred&&e.Deferred();try{switch(t){case"read":s=n.id!==undefined?i.find(n):i.findAll();break;case"create":s=i.create(n);break;case"update":s=i.update(n);break;case"delete":s=i.destroy(n)}}catch(a){a.code===22&&i._storageSize()===0?o="Private browsing is unsupported":o=a.message}return s?(r&&r.success&&(e.VERSION==="0.9.10"?r.success(n,s,r):r.success(s)),u&&u.resolve(s)):(o=o?o:"Record Not Found",r&&r.error&&(e.VERSION==="0.9.10"?r.error(n,o,r):r.error(o)),u&&u.reject(o)),r&&r.complete&&r.complete(s),u&&u.promise()},e.ajaxSync=e.sync,e.getSyncMethod=function(t){return t.browserStorage||t.collection&&t.collection.browserStorage?e.localSync:e.ajaxSync},e.sync=function(t,n,r){return e.getSyncMethod(n).apply(this,[t,n,r])},e.BrowserStorage}),function(e,t){typeof define=="function"&&define.amd?define("backbone.overview",["underscore","backbone"],t):t(_||e._,Backbone||e.Backbone)}(this,function(e,t){"use strict";var n=t.Overview=function(n){this.views={},this.keys=e.partial(e.keys,this.views),this.getAll=e.partial(e.identity,this.views),this.get=function(e){return this.views[e]}.bind(this),this.add=function(e,t){return this.views[e]=t,t}.bind(this),this.remove=function(e){typeof e=="undefined"&&(new t.View).remove.apply(this);var n=this.views[e];if(n)return delete this.views[e],n.remove(),n}.bind(this),this.removeAll=function(){e.each(e.keys(this.views),this.remove)}.bind(this),t.View.apply(this,Array.prototype.slice.apply(arguments))},r=["forEach","each","map","collect","reduce","foldl","inject","reduceRight","foldr","find","detect","filter","select","reject","every","all","some","any","include","contains","invoke","max","min","toArray","size","first","head","take","initial","rest","tail","drop","last","without","difference","indexOf","shuffle","lastIndexOf","isEmpty","chain","sample"];return e.each(r,function(t){n.prototype[t]=function(){var n=Array.prototype.slice.call(arguments);return n.unshift(this.views),e[t].apply(e,n)}}),e.extend(n.prototype,t.View.prototype),n.extend=t.View.extend,t.Overview}),function(e,t){typeof define=="function"&&define.amd?define("typeahead",["jquery"],function(n){t(n,e)}):t(jQuery,e)}(this,function(e,t){var n=function(){"use strict";return{isMsie:function(){return/(msie|trident)/i.test(navigator.userAgent)?navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2]:!1},isBlankString:function(e){return!e||/^\s*$/.test(e)},escapeRegExChars:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isString:function(e){return typeof e=="string"},isNumber:function(e){return typeof e=="number"},isArray:e.isArray,isFunction:e.isFunction,isObject:e.isPlainObject,isUndefined:function(e){return typeof e=="undefined"},toStr:function(t){return n.isUndefined(t)||t===null?"":t+""},bind:e.proxy,each:function(t,n){function r(e,t){return n(t,e)}e.each(t,r)},map:e.map,filter:e.grep,every:function(t,n){var r=!0;return t?(e.each(t,function(e,i){if(!(r=n.call(null,i,e,t)))return!1}),!!r):r},some:function(t,n){var r=!1;return t?(e.each(t,function(e,i){if(r=n.call(null,i,e,t))return!1}),!!r):r},mixin:e.extend,getUniqueId:function(){var e=0;return function(){return e++}}(),templatify:function(n){function r(){return String(n)}return e.isFunction(n)?n:r},defer:function(e){setTimeout(e,0)},debounce:function(e,t,n){var r,i;return function(){var s=this,o=arguments,u,a;return u=function(){r=null,n||(i=e.apply(s,o))},a=n&&!r,clearTimeout(r),r=setTimeout(u,t),a&&(i=e.apply(s,o)),i}},throttle:function(e,t){var n,r,i,s,o,u;return o=0,u=function(){o=new Date,i=null,s=e.apply(n,r)},function(){var a=new Date,f=t-(a-o);return n=this,r=arguments,f<=0?(clearTimeout(i),i=null,o=a,s=e.apply(n,r)):i||(i=setTimeout(u,f)),s}},noop:function(){}}}(),r=function(){return{wrapper:'<span class="twitter-typeahead"></span>',dropdown:'<span class="tt-dropdown-menu"></span>',dataset:'<div class="tt-dataset-%CLASS%"></div>',suggestions:'<span class="tt-suggestions"></span>',suggestion:'<div class="tt-suggestion"></div>'}}(),i=function(){"use strict";var e={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none",opacity:"1"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},dropdown:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"},suggestions:{display:"block"},suggestion:{whiteSpace:"nowrap",cursor:"pointer"},suggestionChild:{whiteSpace:"normal"},ltr:{left:"0",right:"auto"},rtl:{left:"auto",right:" 0"}};return n.isMsie()&&n.mixin(e.input,{backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"}),n.isMsie()&&n.isMsie()<=7&&n.mixin(e.input,{marginTop:"-1px"}),e}(),s=function(){"use strict";function r(t){(!t||!t.el)&&e.error("EventBus initialized without el"),this.$el=e(t.el)}var t="typeahead:";return n.mixin(r.prototype,{trigger:function(e){var n=[].slice.call(arguments,1);this.$el.trigger(t+e,n)}}),r}(),o=function(){"use strict";function r(t,n,r,i){var s;if(!r)return this;n=n.split(e),r=i?l(r,i):r,this._callbacks=this._callbacks||{};while(s=n.shift())this._callbacks[s]=this._callbacks[s]||{sync:[],async:[]},this._callbacks[s][t].push(r);return this}function i(e,t,n){return r.call(this,"async",e,t,n)}function s(e,t,n){return r.call(this,"sync",e,t,n)}function o(t){var n;if(!this._callbacks)return this;t=t.split(e);while(n=t.shift())delete this._callbacks[n];return this}function u(t){var r,i,s,o,u;if(!this._callbacks)return this;t=t.split(e),s=[].slice.call(arguments,1);while((r=t.shift())&&(i=this._callbacks[r]))o=a(i.sync,this,[r].concat(s)),u=a(i.async,this,[r].concat(s)),o()&&n(u);return this}function a(e,t,n){function r(){var r;for(var i=0,s=e.length;!r&&i<s;i+=1)r=e[i].apply(t,n)===!1;return!r}return r}function f(){var e;return t.setImmediate?e=function(t){setImmediate(function(){t()})}:e=function(t){setTimeout(function(){t()},0)},e}function l(e,t){return e.bind?e.bind(t):function(){e.apply(t,[].slice.call(arguments,0))}}var e=/\s+/,n=f();return{onSync:s,onAsync:i,off:o,trigger:u}}(),u=function(e){"use strict";function r(e,t,r){var i=[],s;for(var o=0,u=e.length;o<u;o++)i.push(n.escapeRegExChars(e[o]));return s=r?"\\b("+i.join("|")+")\\b":"("+i.join("|")+")",t?new RegExp(s):new RegExp(s,"i")}var t={node:null,pattern:null,tagName:"strong",className:null,wordsOnly:!1,caseSensitive:!1};return function(s){function u(t){var n,r,i;if(n=o.exec(t.data))i=e.createElement(s.tagName),s.className&&(i.className=s.className),r=t.splitText(n.index),r.splitText(n[0].length),i.appendChild(r.cloneNode(!0)),t.parentNode.replaceChild(i,r);return!!n}function a(e,t){var n,r=3;for(var i=0;i<e.childNodes.length;i++)n=e.childNodes[i],n.nodeType===r?i+=t(n)?1:0:a(n,t)}var o;s=n.mixin({},t,s);if(!s.node||!s.pattern)return;s.pattern=n.isArray(s.pattern)?s.pattern:[s.pattern],o=r(s.pattern,s.caseSensitive,s.wordsOnly),a(s.node,u)}}(t.document),a=function(){"use strict";function r(r){var s=this,o,u,a,f;r=r||{},r.input||e.error("input is missing"),o=n.bind(this._onBlur,this),u=n.bind(this._onFocus,this),a=n.bind(this._onKeydown,this),f=n.bind(this._onInput,this),this.$hint=e(r.hint),this.$input=e(r.input).on("blur.tt",o).on("focus.tt",u).on("keydown.tt",a),this.$hint.length===0&&(this.setHint=this.getHint=this.clearHint=this.clearHintIfInvalid=n.noop),n.isMsie()?this.$input.on("keydown.tt keypress.tt cut.tt paste.tt",function(e){if(t[e.which||e.keyCode])return;n.defer(n.bind(s._onInput,s,e))}):this.$input.on("input.tt",f),this.query=this.$input.val(),this.$overflowHelper=i(this.$input)}function i(t){return e('<pre aria-hidden="true"></pre>').css({position:"absolute",visibility:"hidden",whiteSpace:"pre",fontFamily:t.css("font-family"),fontSize:t.css("font-size"),fontStyle:t.css("font-style"),fontVariant:t.css("font-variant"),fontWeight:t.css("font-weight"),wordSpacing:t.css("word-spacing"),letterSpacing:t.css("letter-spacing"),textIndent:t.css("text-indent"),textRendering:t.css("text-rendering"),textTransform:t.css("text-transform")}).insertAfter(t)}function s(e,t){return r.normalizeQuery(e)===r.normalizeQuery(t)}function u(e){return e.altKey||e.ctrlKey||e.metaKey||e.shiftKey}var t;return t={9:"tab",27:"esc",37:"left",39:"right",13:"enter",38:"up",40:"down"},r.normalizeQuery=function(e){return(e||"").replace(/^\s*/g,"").replace(/\s{2,}/g," ")},n.mixin(r.prototype,o,{_onBlur:function(){this.resetInputValue(),this.trigger("blurred")},_onFocus:function(){this.trigger("focused")},_onKeydown:function(n){var r=t[n.which||n.keyCode];this._managePreventDefault(r,n),r&&this._shouldTrigger(r,n)&&this.trigger(r+"Keyed",n)},_onInput:function(){this._checkInputValue()},_managePreventDefault:function(t,n){var r,i,s;switch(t){case"tab":i=this.getHint(),s=this.getInputValue(),r=i&&i!==s&&!u(n);break;case"up":case"down":r=!u(n);break;default:r=!1}r&&n.preventDefault()},_shouldTrigger:function(t,n){var r;switch(t){case"tab":r=!u(n);break;default:r=!0}return r},_checkInputValue:function(){var t,n,r;t=this.getInputValue(),n=s(t,this.query),r=n?this.query.length!==t.length:!1,this.query=t,n?r&&this.trigger("whitespaceChanged",this.query):this.trigger("queryChanged",this.query)},focus:function(){this.$input.focus()},blur:function(){this.$input.blur()},getQuery:function(){return this.query},setQuery:function(t){this.query=t},getInputValue:function(){return this.$input.val()},setInputValue:function(t,n){this.$input.val(t),n?this.clearHint():this._checkInputValue()},resetInputValue:function(){this.setInputValue(this.query,!0)},getHint:function(){return this.$hint.val()},setHint:function(t){this.$hint.val(t)},clearHint:function(){this.setHint("")},clearHintIfInvalid:function(){var t,n,r,i;t=this.getInputValue(),n=this.getHint(),r=t!==n&&n.indexOf(t)===0,i=t!==""&&r&&!this.hasOverflow(),!i&&this.clearHint()},getLanguageDirection:function(){return(this.$input.css("direction")||"ltr").toLowerCase()},hasOverflow:function(){var t=this.$input.width()-2;return this.$overflowHelper.text(this.getInputValue()),this.$overflowHelper.width()>=t},isCursorAtEnd:function(){var e,t,r;return e=this.$input.val().length,t=this.$input[0].selectionStart,n.isNumber(t)?t===e:document.selection?(r=document.selection.createRange(),r.moveStart("character",-e),e===r.text.length):!0},destroy:function(){this.$hint.off(".tt"),this.$input.off(".tt"),this.$hint=this.$input=this.$overflowHelper=null}}),r}(),f=function(){"use strict";function f(t){t=t||{},t.templates=t.templates||{},t.source||e.error("missing source"),t.name&&!h(t.name)&&e.error("invalid dataset name: "+t.name),this.query=null,this.highlight=!!t.highlight,this.name=t.name||n.getUniqueId(),this.source=t.source,this.displayFn=l(t.display||t.displayKey),this.templates=c(t.templates,this.displayFn),this.$el=e(r.dataset.replace("%CLASS%",this.name))}function l(e){function t(t){return t[e]}return e=e||"value",n.isFunction(e)?e:t}function c(e,t){function r(e){return"<p>"+t(e)+"</p>"}return{empty:e.empty&&n.templatify(e.empty),header:e.header&&n.templatify(e.header),footer:e.footer&&n.templatify(e.footer),suggestion:e.suggestion||r}}function h(e){return/^[_a-zA-Z0-9-]+$/.test(e)}var t="ttDataset",s="ttValue",a="ttDatum";return f.extractDatasetName=function(r){return e(r).data(t)},f.extractValue=function(n){return e(n).data(s)},f.extractDatum=function(n){return e(n).data(a)},n.mixin(f.prototype,o,{_render:function(f,l){function p(){return c.templates.empty({query:f,isEmpty:!0})}function d(){function p(n){var o;return o=e(r.suggestion).append(c.templates.suggestion(n)).data(t,c.name).data(s,c.displayFn(n)).data(a,n),o.children().each(function(){e(this).css(i.suggestionChild)}),o}var o,h;return o=e(r.suggestions).css(i.suggestions),h=n.map(l,p),o.append.apply(o,h),c.highlight&&u({className:"tt-highlight",node:o[0],pattern:f}),o}function v(){return c.templates.header({query:f,isEmpty:!h})}function m(){return c.templates.footer({query:f,isEmpty:!h})}if(!this.$el)return;var c=this,h;this.$el.empty(),h=l&&l.length,!h&&this.templates.empty?this.$el.html(p()).prepend(c.templates.header?v():null).append(c.templates.footer?m():null):h&&this.$el.html(d()).prepend(c.templates.header?v():null).append(c.templates.footer?m():null),this.trigger("rendered")},getRoot:function(){return this.$el},update:function(t){function r(e){!n.canceled&&t===n.query&&n._render(t,e)}var n=this;this.query=t,this.canceled=!1,this.source(t,r)},cancel:function(){this.canceled=!0},clear:function(){this.cancel(),this.$el.empty(),this.trigger("rendered")},isEmpty:function(){return this.$el.is(":empty")},destroy:function(){this.$el=null}}),f}(),l=function(){"use strict";function t(t){var i=this,s,o,u;t=t||{},t.menu||e.error("menu is required"),this.isOpen=!1,this.isEmpty=!0,this.datasets=n.map(t.datasets,r),s=n.bind(this._onSuggestionClick,this),o=n.bind(this._onSuggestionMouseEnter,this),u=n.bind(this._onSuggestionMouseLeave,this),this.$menu=e(t.menu).on("click.tt",".tt-suggestion",s).on("mouseenter.tt",".tt-suggestion",o).on("mouseleave.tt",".tt-suggestion",u),n.each(this.datasets,function(e){i.$menu.append(e.getRoot()),e.onSync("rendered",i._onRendered,i)})}function r(e){return new f(e)}return n.mixin(t.prototype,o,{_onSuggestionClick:function(n){this.trigger("suggestionClicked",e(n.currentTarget))},_onSuggestionMouseEnter:function(n){this._removeCursor(),this._setCursor(e(n.currentTarget),!0)},_onSuggestionMouseLeave:function(){this._removeCursor()},_onRendered:function(){function t(e){return e.isEmpty()}this.isEmpty=n.every(this.datasets,t),this.isEmpty?this._hide():this.isOpen&&this._show(),this.trigger("datasetRendered")},_hide:function(){this.$menu.hide()},_show:function(){this.$menu.css("display","block")},_getSuggestions:function(){return this.$menu.find(".tt-suggestion")},_getCursor:function(){return this.$menu.find(".tt-cursor").first()},_setCursor:function(t,n){t.first().addClass("tt-cursor"),!n&&this.trigger("cursorMoved")},_removeCursor:function(){this._getCursor().removeClass("tt-cursor")},_moveCursor:function(t){var n,r,i,s;if(!this.isOpen)return;r=this._getCursor(),n=this._getSuggestions(),this._removeCursor(),i=n.index(r)+t,i=(i+1)%(n.length+1)-1;if(i===-1){this.trigger("cursorRemoved");return}i<-1&&(i=n.length-1),this._setCursor(s=n.eq(i)),this._ensureVisible(s)},_ensureVisible:function(t){var n,r,i,s;n=t.position().top,r=n+t.outerHeight(!0),i=this.$menu.scrollTop(),s=this.$menu.height()+parseInt(this.$menu.css("paddingTop"),10)+parseInt(this.$menu.css("paddingBottom"),10),n<0?this.$menu.scrollTop(i+n):s<r&&this.$menu.scrollTop(i+(r-s))},close:function(){this.isOpen&&(this.isOpen=!1,this._removeCursor(),this._hide(),this.trigger("closed"))},open:function(){this.isOpen||(this.isOpen=!0,!this.isEmpty&&this._show(),this.trigger("opened"))},setLanguageDirection:function(t){this.$menu.css(t==="ltr"?i.ltr:i.rtl)},moveCursorUp:function(){this._moveCursor(-1)},moveCursorDown:function(){this._moveCursor(1)},getDatumForSuggestion:function(t){var n=null;return t.length&&(n={raw:f.extractDatum(t),value:f.extractValue(t),datasetName:f.extractDatasetName(t)}),n},getDatumForCursor:function(){return this.getDatumForSuggestion(this._getCursor().first())},getDatumForTopSuggestion:function(){return this.getDatumForSuggestion(this._getSuggestions().first())},update:function(t){function r(e){e.update(t)}n.each(this.datasets,r)},empty:function(){function t(e){e.clear()}n.each(this.datasets,t),this.isEmpty=!0},isVisible:function(){return this.isOpen&&!this.isEmpty},destroy:function(){function t(e){e.destroy()}this.$menu.off(".tt"),this.$menu=null,n.each(this.datasets,t)}}),t}(),c=function(){"use strict";function o(t){var r,i,o;t=t||{},t.input||e.error("missing input"),this.isActivated=!1,this.autoselect=!!t.autoselect,this.minLength=n.isNumber(t.minLength)?t.minLength:1,this.$node=u(t.input,t.withHint),r=this.$node.find(".tt-dropdown-menu"),i=this.$node.find(".tt-input"),o=this.$node.find(".tt-hint"),i.on("blur.tt",function(e){var t,s,o;t=document.activeElement,s=r.is(t),o=r.has(t).length>0,n.isMsie()&&(s||o)&&(e.preventDefault(),e.stopImmediatePropagation(),n.defer(function(){i.focus()}))}),r.on("mousedown.tt",function(e){e.preventDefault()}),this.eventBus=t.eventBus||new s({el:i}),this.dropdown=(new l({menu:r,datasets:t.datasets})).onSync("suggestionClicked",this._onSuggestionClicked,this).onSync("cursorMoved",this._onCursorMoved,this).onSync("cursorRemoved",this._onCursorRemoved,this).onSync("opened",this._onOpened,this).onSync("closed",this._onClosed,this).onAsync("datasetRendered",this._onDatasetRendered,this),this.input=(new a({input:i,hint:o})).onSync("focused",this._onFocused,this).onSync("blurred",this._onBlurred,this).onSync("enterKeyed",this._onEnterKeyed,this).onSync("tabKeyed",this._onTabKeyed,this).onSync("escKeyed",this._onEscKeyed,this).onSync("upKeyed",this._onUpKeyed,this).onSync("downKeyed",this._onDownKeyed,this).onSync("leftKeyed",this._onLeftKeyed,this).onSync("rightKeyed",this._onRightKeyed,this).onSync("queryChanged",this._onQueryChanged,this).onSync("whitespaceChanged",this._onWhitespaceChanged,this),this._setLanguageDirection()}function u(n,s){var o,u,a,l;o=e(n),u=e(r.wrapper).css(i.wrapper),a=e(r.dropdown).css(i.dropdown),l=o.clone().css(i.hint).css(f(o)),l.val("").removeData().addClass("tt-hint").removeAttr("id name placeholder required").prop("readonly",!0).attr({autocomplete:"off",spellcheck:"false",tabindex:-1}),o.data(t,{dir:o.attr("dir"),autocomplete:o.attr("autocomplete"),spellcheck:o.attr("spellcheck"),style:o.attr("style")}),o.addClass("tt-input").attr({autocomplete:"off",spellcheck:!1}).css(s?i.input:i.inputWithNoHint);try{!o.attr("dir")&&o.attr("dir","auto")}catch(c){}return o.wrap(u).parent().prepend(s?l:null).append(a)}function f(e){return{backgroundAttachment:e.css("background-attachment"),backgroundClip:e.css("background-clip"),backgroundColor:e.css("background-color"),backgroundImage:e.css("background-image"),backgroundOrigin:e.css("background-origin"),backgroundPosition:e.css("background-position"),backgroundRepeat:e.css("background-repeat"),backgroundSize:e.css("background-size")}}function c(e){var r=e.find(".tt-input");n.each(r.data(t),function(e,t){n.isUndefined(e)?r.removeAttr(t):r.attr(t,e)}),r.detach().removeData(t).removeClass("tt-input").insertAfter(e),e.remove()}var t="ttAttrs";return n.mixin(o.prototype,{_onSuggestionClicked:function(t,n){var r;(r=this.dropdown.getDatumForSuggestion(n))&&this._select(r)},_onCursorMoved:function(){var t=this.dropdown.getDatumForCursor();this.input.setInputValue(t.value,!0),this.eventBus.trigger("cursorchanged",t.raw,t.datasetName)},_onCursorRemoved:function(){this.input.resetInputValue(),this._updateHint()},_onDatasetRendered:function(){this._updateHint()},_onOpened:function(){this._updateHint(),this.eventBus.trigger("opened")},_onClosed:function(){this.input.clearHint(),this.eventBus.trigger("closed")},_onFocused:function(){this.isActivated=!0,this.dropdown.open()},_onBlurred:function(){this.isActivated=!1,this.dropdown.empty(),this.dropdown.close()},_onEnterKeyed:function(t,n){var r,i;r=this.dropdown.getDatumForCursor(),i=this.dropdown.getDatumForTopSuggestion(),r?(this._select(r),n.preventDefault()):this.autoselect&&i&&(this._select(i),n.preventDefault())},_onTabKeyed:function(t,n){var r;(r=this.dropdown.getDatumForCursor())?(this._select(r),n.preventDefault()):this._autocomplete(!0)},_onEscKeyed:function(){this.dropdown.close(),this.input.resetInputValue()},_onUpKeyed:function(){var t=this.input.getQuery();this.dropdown.isEmpty&&t.length>=this.minLength?this.dropdown.update(t):this.dropdown.moveCursorUp(),this.dropdown.open()},_onDownKeyed:function(){var t=this.input.getQuery();this.dropdown.isEmpty&&t.length>=this.minLength?this.dropdown.update(t):this.dropdown.moveCursorDown(),this.dropdown.open()},_onLeftKeyed:function(){this.dir==="rtl"&&this._autocomplete()},_onRightKeyed:function(){this.dir==="ltr"&&this._autocomplete()},_onQueryChanged:function(t,n){this.input.clearHintIfInvalid(),n.length>=this.minLength?this.dropdown.update(n):this.dropdown.empty(),this.dropdown.open(),this._setLanguageDirection()},_onWhitespaceChanged:function(){this._updateHint(),this.dropdown.open()},_setLanguageDirection:function(){var t;this.dir!==(t=this.input.getLanguageDirection())&&(this.dir=t,this.$node.css("direction",t),this.dropdown.setLanguageDirection(t))},_updateHint:function(){var t,r,i,s,o,u;t=this.dropdown.getDatumForTopSuggestion(),t&&this.dropdown.isVisible()&&!this.input.hasOverflow()?(r=this.input.getInputValue(),i=a.normalizeQuery(r),s=n.escapeRegExChars(i),o=new RegExp("^(?:"+s+")(.+$)","i"),u=o.exec(t.value),u?this.input.setHint(r+u[1]):this.input.clearHint()):this.input.clearHint()},_autocomplete:function(t){var n,r,i,s;n=this.input.getHint(),r=this.input.getQuery(),i=t||this.input.isCursorAtEnd(),n&&r!==n&&i&&(s=this.dropdown.getDatumForTopSuggestion(),s&&this.input.setInputValue(s.value),this.eventBus.trigger("autocompleted",s.raw,s.datasetName))},_select:function(t){this.input.setQuery(t.value),this.input.setInputValue(t.value,!0),this._setLanguageDirection(),this.eventBus.trigger("selected",t.raw,t.datasetName),this.dropdown.close(),n.defer(n.bind(this.dropdown.empty,this.dropdown))},open:function(){this.dropdown.open()},close:function(){this.dropdown.close()},setVal:function(t){t=n.toStr(t),this.isActivated?this.input.setInputValue(t):(this.input.setQuery(t),this.input.setInputValue(t,!0)),this._setLanguageDirection()},getVal:function(){return this.input.getQuery()},destroy:function(){this.input.destroy(),this.dropdown.destroy(),c(this.$node),this.$node=null}}),o}();return function(){"use strict";var t,r,i;t=e.fn.typeahead,r="ttTypeahead",i={initialize:function(i,o){function u(){var t=e(this),u,a;n.each(o,function(e){e.highlight=!!i.highlight}),a=new c({input:t,eventBus:u=new s({el:t}),withHint:n.isUndefined(i.hint)?!0:!!i.hint,minLength:i.minLength,autoselect:i.autoselect,datasets:o}),t.data(r,a)}return o=n.isArray(o)?o:[].slice.call(arguments,1),i=i||{},this.each(u)},open:function(){function n(){var t=e(this),n;(n=t.data(r))&&n.open()}return this.each(n)},close:function(){function n(){var t=e(this),n;(n=t.data(r))&&n.close()}return this.each(n)},val:function(n){function i(){var t=e(this),i;(i=t.data(r))&&i.setVal(n)}function s(e){var t,n;if(t=e.data(r))n=t.getVal();return n}return arguments.length?this.each(i):s(this.first())},destroy:function(){function n(){var t=e(this),n;if(n=t.data(r))n.destroy(),t.removeData(r)}return this.each(n)}},e.fn.typeahead=function(t){var n;return i[t]&&t!=="initialize"?(n=this.filter(function(){return!!e(this).data(r)}),i[t].apply(n,[].slice.call(arguments,1))):i.initialize.apply(this,arguments)},e.fn.typeahead.noConflict=function(){return e.fn.typeahead=t,this}}(),{}}),define("converse-dependencies",["jquery","underscore","polyfill","utils","otr","moment_with_locales","strophe","strophe.disco","strophe.ping","strophe.rsm","strophe.vcard","backbone.browserStorage","backbone.overview","jquery.browser","typeahead"],function(e,t,n,r,i,s,o){return t.extend({underscore:t,jQuery:e,otr:i,moment:s,utils:r},o)}),function(e,t){typeof define=="function"&&define.amd?define("converse",["converse-dependencies","converse-templates"],function(e,n){return t(n,e.jQuery,e.$iq,e.$msg,e.$pres,e.$build,e.otr?e.otr.DSA:undefined,e.otr?e.otr.OTR:undefined,e.Strophe,e.underscore,e.moment,e.utils,e.SHA1.b64_sha1)}):e.converse=t(templates,jQuery,$iq,$msg,$pres,$build,DSA,OTR,Strophe,_,moment,utils,b64_sha1)}(this,function(e,t,n,r,i,s,o,u,a,f,l,c,h){f.templateSettings={evaluate:/\{\[([\s\S]+?)\]\}/g,interpolate:/\{\{([\s\S]+?)\}\}/g};var p=function(e,t){return function(n){if(typeof e=="object"){var r=!1;return f.each(e,function(e){r=r||n.get(e).toLowerCase().indexOf(t.toLowerCase())!==-1}),r}if(typeof e=="string")return n.get(e).toLowerCase().indexOf(t.toLowerCase())!==-1;throw new TypeError("contains: wrong attribute type. Must be string or array.")}};p.not=function(e,t){return function(n){return!p(e,t)(n)}};var d={plugins:{},templates:e,emit:function(e,n){t(this).trigger(e,n)},once:function(e,n){t(this).one(e,n)},on:function(e,n){t(this).bind(e,n)},off:function(e,n){t(this).unbind(e,n)},refreshWebkit:function(){if(t.browser.webkit){var e=document.getElementById("conversejs");e.style.display="none",e.offsetHeight=e.offsetHeight,e.style.display="block"}}},v=["max","first","last","after","before","index","count"],m=["with","start","end"],g={offline:6,unavailable:5,xa:4,away:3,dnd:2,chat:1,online:1};d.initialize=function(d,v){"use strict";var m=this,y;"onpagehide"in window?y="pagehide":"onbeforeunload"in window?y="beforeunload":"onunload"in window&&(y="unload"),a.log=function(e,t){m.log(e+" "+t,e)},a.error=function(e){m.log(e,"error")},a.addNamespace("CARBONS","urn:xmpp:carbons:2"),a.addNamespace("CHATSTATES","http://jabber.org/protocol/chatstates"),a.addNamespace("CSI","urn:xmpp:csi:0"),a.addNamespace("MAM","urn:xmpp:mam:0"),a.addNamespace("MUC_ADMIN",a.NS.MUC+"#admin"),a.addNamespace("MUC_OWNER",a.NS.MUC+"#owner"),a.addNamespace("MUC_REGISTER","jabber:iq:register"),a.addNamespace("MUC_ROOMCONF",a.NS.MUC+"#roomconfig"),a.addNamespace("MUC_USER",a.NS.MUC+"#user"),a.addNamespace("REGISTER","jabber:iq:register"),a.addNamespace("ROSTERX","http://jabber.org/protocol/rosterx"),a.addNamespace("RSM","http://jabber.org/protocol/rsm"),a.addNamespace("XFORM","jabber:x:data");var w=0;Object.keys(a.Status).forEach(function(e){w=Math.max(w,a.Status[e])}),a.Status.REGIFAIL=w+1,a.Status.REGISTERED=w+2,a.Status.CONFLICT=w+3,a.Status.NOTACCEPTABLE=w+5;var E="login",S="anonymous",x="prebind",T=0,N=1,C=2,k=3,L={ENTER:13,FORWARD_SLASH:47},A={0:"ERROR",1:"CONNECTING",2:"CONNFAIL",3:"AUTHENTICATING",4:"AUTHFAIL",5:"CONNECTED",6:"DISCONNECTED",7:"DISCONNECTING",8:"ATTACHED",9:"REDIRECT"},O="inactive",M="active",D="composing",P="paused",H="gone";this.TIMEOUTS={PAUSED:2e4,INACTIVE:9e4};var B=typeof crypto!="undefined"&&(typeof crypto.randomBytes=="function"||typeof crypto.getRandomValues=="function"),j=B&&typeof CryptoJS!="undefined"&&typeof u!="undefined"&&typeof o!="undefined",F="opened",I="closed";this.isConverseLocale=function(e){return typeof locales[e]!="undefined"},this.isMomentLocale=function(e){return l.locale()!==l.locale(e)},this.isLocaleAvailable=function(e,t){if(t(e))return e;var n=e.split("-")[0];if(n!==e&&t(n))return n},this.detectLocale=function(e){var t,n;window.navigator.userLanguage&&(t=this.isLocaleAvailable(window.navigator.userLanguage,e));if(window.navigator.languages&&!t)for(n=0;n<window.navigator.languages.length&&!t;n++)t=this.isLocaleAvailable(window.navigator.languages[n],e);return window.navigator.browserLanguage&&!t&&(t=this.isLocaleAvailable(window.navigator.browserLanguage,e)),window.navigator.language&&!t&&(t=this.isLocaleAvailable(window.navigator.language,e)),window.navigator.systemLanguage&&!t&&(t=this.isLocaleAvailable(window.navigator.systemLanguage,e)),t||"en"},l.locale||(l.locale=l.lang),l.locale(this.detectLocale(this.isMomentLocale)),this.i18n=d.i18n?d.i18n:locales[this.detectLocale(this.isConverseLocale)];var q=c.__.bind(this),R=c.___;this.default_settings={allow_chat_pending_contacts:!1,allow_contact_removal:!0,allow_contact_requests:!0,allow_dragresize:!0,allow_logout:!0,allow_muc:!0,allow_otr:!0,archived_messages_page_size:"20",auto_away:0,auto_xa:0,allow_registration:!0,animate:!0,auto_list_rooms:!1,auto_login:!1,auto_reconnect:!1,auto_subscribe:!1,bosh_service_url:undefined,cache_otr_key:!1,csi_waiting_time:0,debug:!1,domain_placeholder:q(" e.g. conversejs.org"),expose_rid_and_sid:!1,forward_messages:!1,hide_muc_server:!1,hide_offline_users:!1,jid:undefined,keepalive:!1,message_archiving:"never",message_carbons:!1,muc_history_max_stanzas:undefined,no_trimming:!1,ping_interval:180,play_sounds:!1,sounds_path:"/sounds/",password:undefined,authentication:"login",prebind:!1,prebind_url:null,providers_link:"https://xmpp.net/directory.php",rid:undefined,roster_groups:!1,show_controlbox_by_default:!1,show_only_online_users:!1,show_toolbar:!0,sid:undefined,storage:"session",use_otr_by_default:!1,use_vcards:!0,visible_toolbar_buttons:{emoticons:!0,call:!1,clear:!0,toggle_occupants:!0},websocket_url:undefined,xhr_custom_status:!1,xhr_custom_status_url:"",xhr_user_search:!1,xhr_user_search_url:""},f.extend(this,this.default_settings),f.extend(this,f.pick(d,Object.keys(this.default_settings))),this.prebind===!0&&(this.authentication=x);if(this.authentication===S&&!this.jid)throw"Config Error: you need to provide the server's domain via the 'jid' option when using anonymous authentication.";d.visible_toolbar_buttons&&f.extend(this.visible_toolbar_buttons,f.pick(d.visible_toolbar_buttons,["emoticons","call","clear","toggle_occupants"])),t.fx.off=!this.animate,this.allow_otr=this.allow_otr&&j,this.use_otr_by_default=this.use_otr_by_default&&this.allow_otr;var U={};U[T]="unencrypted",U[N]="unverified",U[C]="verified",U[k]="finished";var z={};z[T]=q("unencrypted"),z[N]=q("unverified"),z[C]=q("verified"),z[k]=q("finished");var W={dnd:q("This contact is busy"),online:q("This contact is online"),offline:q("This contact is offline"),unavailable:q("This contact is unavailable"),xa:q("This contact is away for an extended period"),away:q("This contact is away")},X=q("Click to hide these contacts"),V=q("My contacts"),J=q("Pending contacts"),K=q("Contact requests"),Q=q("Ungrouped"),G=q("Contacts"),Y=q("Groups"),Z={};Z[V]=0,Z[Q]=1,Z[K]=2,Z[J]=3,this.callback=v||function(){},this.initial_presence_sent=0,this.msg_counter=0,this.sendCSI=function(e){if(m.features[a.NS.CSI]||!0)m.connection.send(s(e,{xmlns:a.NS.CSI})),this.inactive=e===O?!0:!1},this.onUserActivity=function(){this.idle_seconds>0&&(this.idle_seconds=0);if(!m.connection.authenticated)return;this.inactive&&this.sendCSI(M),this.auto_changed_status===!0&&(this.auto_changed_status=!1,this.xmppstatus.setStatus("online"))},this.onEverySecond=function(){if(!m.connection.authenticated)return;var e=this.xmppstatus.getStatus();this.idle_seconds++,this.csi_waiting_time>0&&this.idle_seconds>this.csi_waiting_time&&!this.inactive&&this.sendCSI(O),this.auto_away>0&&this.idle_seconds>this.auto_away&&e!=="away"&&e!=="xa"?(this.auto_changed_status=!0,this.xmppstatus.setStatus("away")):this.auto_xa>0&&this.idle_seconds>this.auto_xa&&e!=="xa"&&(this.auto_changed_status=!0,this.xmppstatus.setStatus("xa"))},this.registerIntervalHandler=function(){if(this.auto_away<1&&this.auto_xa<1&&this.csi_waiting_time<1)return;this.idle_seconds=0,this.auto_changed_status=!1,t(window).on("click mousemove keypress focus"+y,this.onUserActivity.bind(this)),window.setInterval(this.onEverySecond.bind(this),1e3)},this.playNotification=function(){var e;m.play_sounds&&typeof Audio!="undefined"&&(e=new Audio(m.sounds_path+"msg_received.ogg"),e.canPlayType("/audio/ogg")?e.play():(e=new Audio(m.sounds_path+"msg_received.mp3"),e.play()))},this.giveFeedback=function(e,n){t(".conn-feedback").each(function(r,i){var s=t(i);s.addClass("conn-feedback").text(e),n?s.addClass(n):s.removeClass("error")})},this.log=function(e,t){var n;typeof console=="undefined"||typeof console.log=="undefined"?n={log:function(){},error:function(){}}:n=console,this.debug&&(t==="error"?n.log("ERROR: "+e):n.log(e))},this.rejectPresenceSubscription=function(e,t){var n=i({to:e,type:"unsubscribed"});t&&t!==""&&n.c("status").t(t),m.connection.send(n)},this.getVCard=function(e,n,r){if(!this.use_vcards){n&&n(e,e);return}m.connection.vcard.get(function(r){var i=t(r).find("vCard"),s=i.find("FN").text(),o=i.find("BINVAL").text(),u=i.find("TYPE").text(),a=i.find("URL").text();if(e){var c=m.roster.get(e);c&&(s=f.isEmpty(s)?c.get("fullname")||e:s,c.save({fullname:s,image_type:u,image:o,url:a,vcard_updated:l().format()}))}n&&n(r,e,s,o,u,a)}.bind(this),e,function(t){var n=m.roster.get(e);n&&n.save({vcard_updated:l().format()}),r&&r(t,e)})},this.reconnect=function(e){m.log("Attempting to reconnect in 5 seconds"),m.giveFeedback(q("Attempting to reconnect in 5 seconds"),"error"),setTimeout(function(){m.authentication!=="prebind"?this.connection.connect(this.connection.jid,this.connection.pass,function(e,t){this.onConnectStatusChanged(e,t,!0)}.bind(this),this.connection.wait,this.connection.hold,this.connection.route):m.prebind_url&&(this.clearSession(),this._tearDown(),this.startNewBOSHSession())}.bind(this),5e3)},this.renderLoginPanel=function(){m._tearDown();var e=m.chatboxviews.get("controlbox");e.model.set({connected:!1}),e.renderLoginPanel()},this.onConnectStatusChanged=function(e,t,n){m.log("Status changed to: "+A[e]),e===a.Status.CONNECTED||e===a.Status.ATTACHED?(delete m.disconnection_cause,typeof n!="undefined"&&n?(m.log(e===a.Status.CONNECTED?"Reconnected":"Reattached"),m.onReconnected()):(m.log(e===a.Status.CONNECTED?"Connected":"Attached"),m.onConnected())):e===a.Status.DISCONNECTED?m.disconnection_cause===a.Status.CONNFAIL&&m.auto_reconnect?m.reconnect(t):m.renderLoginPanel():e===a.Status.ERROR?m.giveFeedback(q("Error"),"error"):e===a.Status.CONNECTING?m.giveFeedback(q("Connecting")):e===a.Status.AUTHENTICATING?m.giveFeedback(q("Authenticating")):e===a.Status.AUTHFAIL?(m.giveFeedback(q("Authentication Failed"),"error"),m.connection.disconnect(q("Authentication Failed")),m.disconnection_cause=a.Status.AUTHFAIL):e===a.Status.CONNFAIL?m.disconnection_cause=a.Status.CONNFAIL:e===a.Status.DISCONNECTING&&(m.connection.connected||m.renderLoginPanel(),t&&m.giveFeedback(t,"error"))},this.applyDragResistance=function(e,t){if(typeof e=="undefined")return undefined;if(typeof t=="undefined")return e;var n=10;return e!==t&&Math.abs(e-t)<n?t:e},this.updateMsgCounter=function(){this.msg_counter>0?(document.title.search(/^Messages \(\d+\) /)===-1?document.title="Messages ("+this.msg_counter+") "+document.title:document.title=document.title.replace(/^Messages \(\d+\) /,"Messages ("+this.msg_counter+") "),window.blur(),window.focus()):document.title.search(/^Messages \(\d+\) /)!==-1&&(document.title=document.title.replace(/^Messages \(\d+\) /,""))},this.incrementMsgCounter=function(){this.msg_counter+=1,this.updateMsgCounter()},this.clearMsgCounter=function(){this.msg_counter=0,this.updateMsgCounter()},this.initStatus=function(e){this.xmppstatus=new this.XMPPStatus;var t=h("converse.xmppstatus-"+m.bare_jid);this.xmppstatus.id=t,this.xmppstatus.browserStorage=new Backbone.BrowserStorage[m.storage](t),this.xmppstatus.fetch({success:e,error:e})},this.initSession=function(){this.session=new this.Session;var e=h("converse.bosh-session");this.session.id=e,this.session.browserStorage=new Backbone.BrowserStorage[m.storage](e),this.session.fetch()},this.clearSession=function(){this.roster&&this.roster.browserStorage._clear(),this.session.browserStorage._clear(),m.connection.connected&&m.chatboxes.get("controlbox").save({connected:!1})},this.logOut=function(){m.chatboxviews.closeAllChatBoxes(!1),m.clearSession(),m.connection.disconnect()},this.registerGlobalEventHandlers=function(){t(document).click(function(){t(".toggle-otr ul").is(":visible")&&t(".toggle-otr ul",this).slideUp(),t(".toggle-smiley ul").is(":visible")&&t(".toggle-smiley ul",this).slideUp()}),t(document).on("mousemove",function(e){if(!this.resizing||!this.allow_dragresize)return!0;e.preventDefault(),this.resizing.chatbox.resizeChatBox(e)}.bind(this)),t(document).on("mouseup",function(e){if(!this.resizing||!this.allow_dragresize)return!0;e.preventDefault();var t=this.applyDragResistance(this.resizing.chatbox.height,this.resizing.chatbox.model.get("default_height")),n=this.applyDragResistance(this.resizing.chatbox.width,this.resizing.chatbox.model.get("default_width"));this.connection.connected?(this.resizing.chatbox.model.save({height:t}),this.resizing.chatbox.model.save({width:n})):(this.resizing.chatbox.model.set({height:t}),this.resizing.chatbox.model.set({width:n})),this.resizing=null}.bind(this)),t(window).on("blur focus",function(e){this.windowState!==e.type&&e.type==="focus"&&m.clearMsgCounter(),this.windowState=e.type}.bind(this)),t(window).on("resize",f.debounce(function(e){this.chatboxviews.trimChats()}.bind(this),200))},this.ping=function(e,t,n,r){m.lastStanzaDate=new Date;if(typeof e=="undefined"||e===null)e=a.getDomainFromJid(m.bare_jid);return typeof r=="undefined"&&(r=null),typeof t=="undefined"&&(t=null),typeof n=="undefined"&&(n=null),m.connection?(m.connection.ping.ping(e,t,n,r),!0):!1},this.pong=function(e){return m.lastStanzaDate=new Date,m.connection.ping.pong(e),!0},this.registerPongHandler=function(){m.connection.disco.addFeature(a.NS.PING),m.connection.ping.addPingHandler(this.pong)},this.registerPingHandler=function(){this.registerPongHandler(),this.ping_interval>0&&(this.connection.addHandler(function(){return this.lastStanzaDate=new Date,!0}.bind(m)),this.connection.addTimedHandler(1e3,function(){var e=new Date;return this.lastStanzaDate||(this.lastStanzaDate=e),(e-this.lastStanzaDate)/1e3>this.ping_interval?this.ping():!0}.bind(m)))},this.onReconnected=function(){this.initStatus(function(){this.registerPingHandler(),this.rosterview.registerRosterXHandler(),this.rosterview.registerPresenceHandler(),this.chatboxes.registerMessageHandler(),this.xmppstatus.sendPresence(),this.giveFeedback(q("Contacts"))}.bind(this))},this.enableCarbons=function(){if(!this.message_carbons||this.session.get("carbons_enabled"))return;var e=(new a.Builder("iq",{from:this.connection.jid,id:"enablecarbons",type:"set"})).c("enable",{xmlns:a.NS.CARBONS});this.connection.addHandler(function(e){t(e).find("error").length>0?m.log("ERROR: An error occured while trying to enable message carbons."):(this.session.save({carbons_enabled:!0}),m.log("Message carbons have been enabled."))}.bind(this),null,"iq",null,"enablecarbons"),this.connection.send(e)},this.onConnected=function(){this.chatboxviews.closeAllChatBoxes(),this.jid=this.connection.jid,this.bare_jid=a.getBareJidFromJid(this.connection.jid),this.resource=a.getResourceFromJid(this.connection.jid),this.domain=a.getDomainFromJid(this.connection.jid),this.minimized_chats=new m.MinimizedChats({model:this.chatboxes}),this.features=new this.Features,this.enableCarbons(),this.initStatus(function(){this.registerPingHandler(),this.registerIntervalHandler(),this.chatboxes.onConnected(),this.giveFeedback(q("Contacts")),this.callback&&(this.connection.service==="jasmine tests"?this.callback(this):this.callback())}.bind(this)),m.emit("ready")},this.OTR=Backbone.Model.extend({getSessionPassphrase:function(){if(m.authentication==="prebind"){var e=h(m.connection.jid),t=window.sessionStorage[e];return typeof t=="undefined"&&(t=Math.floor(Math.random()*4294967295).toString(),window.sessionStorage[e]=t),t}return m.connection.pass},generatePrivateKey:function(e){var t=new o,n=m.connection.jid;if(m.cache_otr_key){var r=CryptoJS.lib.PasswordBasedCipher,i=this.getSessionPassphrase();typeof i!="undefined"&&(window.sessionStorage[h(n+"priv_key")]=r.encrypt(CryptoJS.algo.AES,t.packPrivate(),i).toString(),window.sessionStorage[h(n+"instance_tag")]=e,window.sessionStorage[h(n+"pass_check")]=r.encrypt(CryptoJS.algo.AES,"match",i).toString())}return t}}),this.Message=Backbone.Model.extend({idAttribute:"msgid",defaults:function(){return{msgid:m.connection.getUniqueId()}}}),this.Messages=Backbone.Collection.extend({model:m.Message,comparator:"time"}),this.ChatBox=Backbone.Model.extend({initialize:function(){var e=this.get("height"),t=this.get("width"),n={height:m.applyDragResistance(e,this.get("default_height")),width:m.applyDragResistance(t,this.get("default_width")),num_unread:this.get("num_unread")||0};this.get("box_id")!=="controlbox"?(this.messages=new m.Messages,this.messages.browserStorage=new Backbone.BrowserStorage[m.storage](h("converse.messages"+this.get("jid")+m.bare_jid)),this.save(f.extend(n,{chat_state:undefined,box_id:h(this.get("jid")),minimized:this.get("minimized")||!1,otr_status:this.get("otr_status")||T,time_minimized:this.get("time_minimized")||l(),time_opened:this.get("time_opened")||l().valueOf(),url:"",user_id:a.getNodeFromJid(this.get("jid"))}))):this.set(f.extend(n,{time_opened:l(0).valueOf()}))},maximize:function(){this.save({minimized:!1,time_opened:l().valueOf()})},minimize:function(){this.save({minimized:!0,time_minimized:l().format()})},getSession:function(e){var t=CryptoJS.lib.PasswordBasedCipher,n,r,i,s;if(m.cache_otr_key){n=m.otr.getSessionPassphrase();if(typeof n!="undefined"){r=window.sessionStorage[h(this.id+"instance_tag")],i=window.sessionStorage[h(this.id+"priv_key")],s=window.sessionStorage[h(this.connection.jid+"pass_check")];if(i&&r&&typeof s!="undefined"){var a=t.decrypt(CryptoJS.algo.AES,i,n),f=o.parsePrivate(a.toString(CryptoJS.enc.Latin1));if(t.decrypt(CryptoJS.algo.AES,s,n).toString(CryptoJS.enc.Latin1)==="match"){this.trigger("showHelpMessages",[q("Re-establishing encrypted session")]),e({key:f,instance_tag:r});return}}}}this.trigger("showHelpMessages",[q("Generating private key."),q("Your browser might become unresponsive.")],null,!0),setTimeout(function(){var t=u.makeInstanceTag();e({key:m.otr.generatePrivateKey.call(this,t),instance_tag:t})},500)},updateOTRStatus:function(e){switch(e){case u.CONST.STATUS_AKE_SUCCESS:this.otr.msgstate===u.CONST.MSGSTATE_ENCRYPTED&&this.save({otr_status:N});break;case u.CONST.STATUS_END_OTR:this.otr.msgstate===u.CONST.MSGSTATE_FINISHED?this.save({otr_status:k}):this.otr.msgstate===u.CONST.MSGSTATE_PLAINTEXT&&this.save({otr_status:T})}},onSMP:function(e,t){switch(e){case"question":this.otr.smpSecret(prompt(q("Authentication request from %1$s\n\nYour chat contact is attempting to verify your identity, by asking you the question below.\n\n%2$s",[this.get("fullname"),t])));break;case"trust":t===!0?this.save({otr_status:C}):(this.trigger("showHelpMessages",[q("Could not verify this user's identify.")],"error"),this.save({otr_status:N}));break;default:throw new TypeError("ChatBox.onSMP: Unknown type for SMP")}},initiateOTR:function(e){this.save({otr_status:T}),this.getSession(function(t){this.otr=new u({fragment_size:140,send_interval:200,priv:t.key,instance_tag:t.instance_tag,debug:this.debug}),this.otr.on("status",this.updateOTRStatus.bind(this)),this.otr.on("smp",this.onSMP.bind(this)),this.otr.on("ui",function(e){this.trigger("showReceivedOTRMessage",e)}.bind(this)),this.otr.on("io",function(e){this.trigger("sendMessage",new m.Message({message:e}))}.bind(this)),this.otr.on("error",function(e){this.trigger("showOTRError",e)}.bind(this)),this.trigger("showHelpMessages",[q("Exchanging private key with contact.")]),e?this.otr.receiveMsg(e):this.otr.sendQueryMsg()}.bind(this))},endOTR:function(){this.otr&&this.otr.endOtr(),this.save({otr_status:T})},createMessage:function(e,t,n){t=t||e.find("delay");var r=e.children("body").text(),i=t.length>0,s=this.get("fullname"),o=e.attr("type")==="groupchat",u=e.attr("id"),c=e.find(D).length&&D||e.find(P).length&&P||e.find(O).length&&O||e.find(M).length&&M||e.find(H).length&&H,h,p,d,v;o?v=a.unescapeNode(a.getResourceFromJid(e.attr("from"))):v=a.getBareJidFromJid(e.attr("from")),s=(f.isEmpty(s)?v:s).split(" ")[0],i?(h=t.attr("stamp"),p=h):p=l().format(),o&&v===this.get("nick")||!o&&v===m.bare_jid?d="me":d="them",this.messages.create({chat_state:c,delayed:i,fullname:s,message:r||undefined,msgid:u,sender:d,time:p,archive_id:n})},receiveMessage:function(e,t,n){var r=e.children("body"),i=r.length>0?r.text():undefined;if(!i||!m.allow_otr)return this.createMessage(e,t,n);i.match(/^\?OTRv23?/)?this.initiateOTR(i):f.contains([N,C],this.get("otr_status"))?this.otr.receiveMsg(i):i.match(/^\?OTR/)?this.otr?this.otr.receiveMsg(i):this.initiateOTR(i):this.createMessage(e,t,n)}}),this.ChatBoxView=Backbone.View.extend({length:200,tagName:"div",className:"chatbox",is_chatroom:!1,events:{"click .close-chatbox-button":"close","click .toggle-chatbox-button":"minimize","keypress textarea.chat-textarea":"keyPressed","click .toggle-smiley":"toggleEmoticonMenu","click .toggle-smiley ul li":"insertEmoticon","click .toggle-clear":"clearMessages","click .toggle-otr":"toggleOTRMenu","click .start-otr":"startOTRFromToolbar","click .end-otr":"endOTR","click .auth-otr":"authOTR","click .toggle-call":"toggleCall","mousedown .dragresize-top":"onStartVerticalResize","mousedown .dragresize-left":"onStartHorizontalResize","mousedown .dragresize-topleft":"onStartDiagonalResize"},initialize:function(){t(window).on("resize",f.debounce(this.setDimensions.bind(this),100)),this.model.messages.on("add",this.onMessageAdded,this),this.model.on("show",this.show,this),this.model.on("destroy",this.hide,this),this.model.on("change:chat_state",this.sendChatState,this),this.model.on("change:chat_status",this.onChatStatusChanged,this),this.model.on("change:image",this.renderAvatar,this),this.model.on("change:otr_status",this.onOTRStatusChanged,this),this.model.on("change:minimized",this.onMinimizedChanged,this),this.model.on("change:status",this.onStatusChanged,this),this.model.on("showOTRError",this.showOTRError,this),this.model.on("showHelpMessages",this.showHelpMessages,this),this.model.on("sendMessage",this.sendMessage,this),this.model.on("showSentOTRMessage",function(e){this.showMessage({message:e,sender:"me"})},this),this.model.on("showReceivedOTRMessage",function(e){this.showMessage({message:e,sender:"them"})},this),this.updateVCard().render().fetchMessages().insertIntoPage().hide(),(f.contains([N,C],this.model.get("otr_status"))||m.use_otr_by_default)&&this.model.initiateOTR()},render:function(){return this.$el.attr("id",this.model.get("box_id")).html(m.templates.chatbox(f.extend(this.model.toJSON(),{show_toolbar:m.show_toolbar,info_close:q("Close this chat box"),info_minimize:q("Minimize this chat box"),info_view:q("View more information on this person"),label_personal_message:q("Personal message")}))),this.setWidth(),this.$content=this.$el.find(".chat-content"),this.renderToolbar().renderAvatar(),this.$content.on("scroll",f.debounce(this.onScroll.bind(this),100)),m.emit("chatBoxOpened",this),setTimeout(m.refreshWebkit,50),this.showStatusMessage()},setWidth:function(){this.model.get("width")&&this.$el.css("width",this.model.get("width"))},onScroll:function(e){t(e.target).scrollTop()===0&&this.model.messages.length&&this.fetchArchivedMessages({before:this.model.messages.at(0).get("archive_id"),"with":this.model.get("jid"),max:m.archived_messages_page_size})},fetchMessages:function(){return this.model.messages.fetch({add:!0,success:function(){if(!m.features.findWhere({"var":a.NS.MAM}))return;this.model.messages.length<m.archived_messages_page_size&&this.fetchArchivedMessages({before:"","with":this.model.get("jid"),max:m.archived_messages_page_size})}.bind(this)}),this},fetchArchivedMessages:function(e){if(!m.features.findWhere({"var":a.NS.MAM})){m.log("Attempted to fetch archived messages but this user's server doesn't support XEP-0313");return}this.addSpinner(),b.archive.query(f.extend(e,{groupchat:this.is_chatroom}),function(e){this.clearSpinner(),e.length&&(this.is_chatroom?f.map(e,this.onChatRoomMessage.bind(this)):f.map(e,m.chatboxes.onMessage.bind(m.chatboxes)))}.bind(this),function(){this.clearSpinner(),m.log("Error while trying to fetch archived messages","error")}.bind(this))},insertIntoPage:function(){return this.$el.insertAfter(m.chatboxviews.get("controlbox").$el),this},adjustToViewport:function(){var e=Math.max(document.documentElement.clientWidth,window.innerWidth||0),t=Math.max(document.documentElement.clientHeight,window.innerHeight||0);e<=480?(this.model.set("height",undefined),this.model.set("width",undefined)):e<=this.model.get("width")?this.model.set("width",undefined):t<=this.model.get("height")&&this.model.set("height",undefined)},initDragResize:function(){var e=this.$el.find(".box-flyout");if(typeof this.model.get("height")=="undefined"){var t=e.height(),n=e.width();this.model.set("height",t),this.model.set("default_height",t),this.model.set("width",n),this.model.set("default_width",n)}var r=e.css("min-width"),i=e.css("min-height");return this.model.set("min_width",r.endsWith("px")?Number(r.replace(/px$/,"")):0),this.model.set("min_height",i.endsWith("px")?Number(i.replace(/px$/,"")):0),this.prev_pageY=0,this.prev_pageX=0,m.connection.connected&&(this.height=this.model.get("height"),this.width=this.model.get("width")),this},setDimensions:function(){this.adjustToViewport(),this.setChatBoxHeight(this.model.get("height")),this.setChatBoxWidth(this.model.get("width"))},clearStatusNotification:function(){this.$content.find("div.chat-event").remove()},showStatusNotification:function(e,n){n||this.clearStatusNotification(),this.$content.append(t('<div class="chat-info chat-event"></div>').text(e)),this.scrollDown()},clearChatRoomMessages:function(e){typeof e!="undefined"&&e.stopPropagation();var t=confirm(q("Are you sure you want to clear the messages from this room?"));return t===!0&&this.$content.empty(),this},addSpinner:function(){this.$content.first().hasClass("spinner")||this.$content.prepend('<span class="spinner"/>')},clearSpinner:function(){this.$content.children(":first").is("span.spinner")&&this.$content.children(":first").remove()},prependDayIndicator:function(e){var t=l(e).startOf("day");this.$content.prepend(m.templates.new_day({isodate:t.format(),datestring:t.format("dddd MMM Do YYYY")}))},appendMessage:function(e){f.compose(f.debounce(this.scrollDown.bind(this),50),this.$content.append.bind(this.$content))(this.renderMessage(e))},showMessage:function(e){var n=this.$content.children(".chat-message:first"),r=n.data("isodate"),i,s,o,u,a,c;if(!r){this.appendMessage(e);return}s=l(e.time)||l,i=this.$content.children(".chat-message:last").data("isodate");if(typeof i!="undefined"&&(s.isAfter(i)||s.isSame(i))){s.isAfter(i,"day")&&(o=l(s).startOf("day"),this.$content.append(m.templates.new_day({isodate:s.format(),datestring:s.format("dddd MMM Do YYYY")}))),this.appendMessage(e);return}typeof r!="undefined"&&(s.isBefore(r)||s.isSame(r)&&!s.isSame(i))?(n.prev().length===0&&this.prependDayIndicator(r),s.isBefore(r,"day")?(f.compose(this.scrollDownMessageHeight.bind(this),function(e){return this.$content.prepend(e),e}.bind(this))(this.renderMessage(e)),this.prependDayIndicator(s)):f.compose(this.scrollDownMessageHeight.bind(this),function(e){return e.insertBefore(n),e})(this.renderMessage(e))):(s=s.format(),u=this.$content.children(".chat-message"),a=f.map(u,function(e){return t(e).data("isodate")}),a.push(s),a.sort(),c=a.indexOf(s)-1,f.compose(this.scrollDownMessageHeight.bind(this),function(e){return e.insertAfter(this.$content.find('.chat-message[data-isodate="'+a[c]+'"]')),e}.bind(this))(this.renderMessage(e)))},renderMessage:function(e){var n=l(e.time)||l,r=e.message,i=r.match(/^\/(.*?)(?: (.*))?$/),s=this.model.get("fullname")||e.fullname,o=e.delayed&&"delayed"||"",u,a;return i&&i[1]==="me"?(r=r.replace(/^\/me/,""),u=m.templates.action,a=s):(u=m.templates.message,a=e.sender==="me"&&q("me")||s),this.$content.find("div.chat-event").remove(),this.is_chatroom&&e.sender==="them"&&(new RegExp("\\b"+this.model.get("nick")+"\\b")).test(r)&&(o+=" mentioned"),t(u({msgid:e.msgid,sender:e.sender,time:n.format("hh:mm"),isodate:n.format(),username:a,message:"",extra_classes:o})).children(".chat-msg-content").first().text(r).addHyperlinks().addEmoticons(m.visible_toolbar_buttons.emoticons).parent()},showHelpMessages:function(e,n,r){var i,s=e.length;for(i=0;i<s;i++)this.$content.append(t('<div class="chat-'+(n||"info")+'">'+e[i]+"</div>"));return r===!0?this.$content.append('<span class="spinner"/>'):r===!1&&this.$content.find("span.spinner").remove(),this.scrollDown()},onMessageAdded:function(e){typeof this.clear_status_timeout!="undefined"&&(clearTimeout(this.clear_status_timeout),delete this.clear_status_timeout);if(!e.get("message")){if(e.get("chat_state")===D){this.showStatusNotification(e.get("fullname")+" "+q("is typing")),this.clear_status_timeout=setTimeout(this.clearStatusNotification.bind(this),1e4);return}if(e.get("chat_state")===P){this.showStatusNotification(e.get("fullname")+" "+q("has stopped typing"));return}if(f.contains([O,M],e.get("chat_state"))){this.$content.find("div.chat-event").remove();return}if(e.get("chat_state")===H){this.showStatusNotification(e.get("fullname")+" "+q("has gone away"));return}}else this.showMessage(f.clone(e.attributes));e.get("sender")!=="me"&&m.windowState==="blur"&&m.incrementMsgCounter(),!this.model.get("minimized")&&!this.$el.is(":visible")&&f.debounce(this.show.bind(this),100)()},sendMessage:function(e){var t=this.model.get("jid"),n=r({from:m.connection.jid,to:t,type:"chat",id:e.get("msgid")}).c("body").t(e.get("message")).up().c(M,{xmlns:a.NS.CHATSTATES}).up();this.model.get("otr_status")!==T&&n.c("private",{xmlns:a.NS.CARBONS}),m.connection.send(n),m.forward_messages&&m.connection.send(r({to:m.bare_jid,type:"chat",id:e.get("msgid")}).c("forwarded",{xmlns:"urn:xmpp:forward:0"}).c("delay",{xmns:"urn:xmpp:delay",stamp:(new Date).getTime()}).up().cnode(n.tree()))},onMessageSubmitted:function(e){if(!m.connection.authenticated)return this.showHelpMessages(["Sorry, the connection has been lost, and your message could not be sent"],"error");var t=e.replace(/^\s*/,"").match(/^\/(.*)\s*$/),n;if(t){if(t[1]==="clear")return this.clearMessages();if(t[1]==="help"){n=["<strong>/help</strong>:"+q("Show this menu")+"","<strong>/me</strong>:"+q("Write in the third person")+"","<strong>/clear</strong>:"+q("Remove messages")+""],this.showHelpMessages(n);return}if(m.allow_otr&&t[1]==="endotr")return this.endOTR();if(m.allow_otr&&t[1]==="otr")return this.model.initiateOTR()}if(f.contains([N,C],this.model.get("otr_status")))this.model.otr.sendMsg(e),this.model.trigger("showSentOTRMessage",e);else{var r=m.xmppstatus.get("fullname");r=f.isEmpty(r)?m.bare_jid:r;var i=this.model.messages.create({fullname:r,sender:"me",time:l().format(),message:e});this.sendMessage(i)}},sendChatState:function(){m.connection.send(r({to:this.model.get("jid"),type:"chat"}).c(this.model.get("chat_state"),{xmlns:a.NS.CHATSTATES}))},setChatState:function(e,t){return typeof this.chat_state_timeout!="undefined"&&(clearTimeout(this.chat_state_timeout),delete this.chat_state_timeout),e===D?this.chat_state_timeout=setTimeout(this.setChatState.bind(this),m.TIMEOUTS.PAUSED,P):e===P&&(this.chat_state_timeout=setTimeout(this.setChatState.bind(this),m.TIMEOUTS.INACTIVE,O)),!t&&this.model.get("chat_state")!==e&&this.model.set("chat_state",e),this},keyPressed:function(e){var n=t(e.target),r;e.keyCode===L.ENTER?(e.preventDefault(),r=n.val(),n.val("").focus(),r!==""&&(this.model.get("chatroom")?this.onChatRoomMessageSubmitted(r):this.onMessageSubmitted(r),m.emit("messageSend",r)),this.setChatState(M)):this.model.get("chatroom")||this.setChatState(D,e.keyCode===L.FORWARD_SLASH)},onStartVerticalResize:function(e){if(!m.allow_dragresize)return!0;this.height=this.$el.children(".box-flyout").height(),m.resizing={chatbox:this,direction:"top"},this.prev_pageY=e.pageY},onStartHorizontalResize:function(e){if(!m.allow_dragresize)return!0;this.width=this.$el.children(".box-flyout").width(),m.resizing={chatbox:this,direction:"left"},this.prev_pageX=e.pageX},onStartDiagonalResize:function(e){this.onStartHorizontalResize(e),this.onStartVerticalResize(e),m.resizing.direction="topleft"},setChatBoxHeight:function(e){this.model.get("minimized")||(e?e=m.applyDragResistance(e,this.model.get("default_height"))+"px":e="",this.$el.children(".box-flyout")[0].style.height=e)},setChatBoxWidth:function(e){this.model.get("minimized")||(e?e=m.applyDragResistance(e,this.model.get("default_width"))+"px":e="",this.$el[0].style.width=e,this.$el.children(".box-flyout")[0].style.width=e)},resizeChatBox:function(e){var t;m.resizing.direction.indexOf("top")===0&&(t=e.pageY-this.prev_pageY,t&&(this.height=this.height-t>(this.model.get("min_height")||0)?this.height-t:this.model.get("min_height"),this.prev_pageY=e.pageY,this.setChatBoxHeight(this.height))),m.resizing.direction.indexOf("left")!==-1&&(t=this.prev_pageX-e.pageX,t&&(this.width=this.width+t>(this.model.get("min_width")||0)?this.width+t:this.model.get("min_width"),this.prev_pageX=e.pageX,this.setChatBoxWidth(this.width)))},clearMessages:function(e){e&&e.preventDefault&&e.preventDefault();var t=confirm(q("Are you sure you want to clear the messages from this chat box?"));return t===!0&&(this.$content.empty(),this.model.messages.reset(),this.model.messages.browserStorage._clear()),this},insertEmoticon:function(e){e.stopPropagation(),this.$el.find(".toggle-smiley ul").slideToggle(200);var n=this.$el.find("textarea.chat-textarea"),r=n.val(),i=t(e.target);i=i.is("a")?i:i.children("a"),r&&r[r.length-1]!==" "&&(r+=" "),n.focus().val(r+i.data("emoticon")+" ")},toggleEmoticonMenu:function(e){e.stopPropagation(),this.$el.find(".toggle-smiley ul").slideToggle(200)},toggleOTRMenu:function(e){e.stopPropagation(),this.$el.find(".toggle-otr ul").slideToggle(200)},showOTRError:function(e){e==="Message cannot be sent at this time."?this.showHelpMessages([q("Your message could not be sent")],"error"):e==="Received an unencrypted message."?this.showHelpMessages([q("We received an unencrypted message")],"error"):e==="Received an unreadable encrypted message."?this.showHelpMessages([q("We received an unreadable encrypted message")],"error"):this.showHelpMessages(["Encryption error occured: "+e],"error"),m.log("OTR ERROR:"+e)},startOTRFromToolbar:function(e){t(e.target).parent().parent().slideUp(),e.stopPropagation(),this.model.initiateOTR()},endOTR:function(e){typeof e!="undefined"&&(e.preventDefault(),e.stopPropagation()),this.model.endOTR()},authOTR:function(e){var n=t(e.target).data().scheme,r,i,s;n==="fingerprint"?(r=confirm(q("Here are the fingerprints, please confirm them with %1$s, outside of this chat.\n\nFingerprint for you, %2$s: %3$s\n\nFingerprint for %1$s: %4$s\n\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.",[this.model.get("fullname"),m.xmppstatus.get("fullname")||m.bare_jid,this.model.otr.priv.fingerprint(),this.model.otr.their_priv_pk.fingerprint()])),r===!0?this.model.save({otr_status:C}):this.model.save({otr_status:N})):n==="smp"?(alert(q("You will be prompted to provide a security question and then an answer to that question.\n\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.")),i=prompt(q("What is your security question?")),i&&(s=prompt(q("What is the answer to the security question?")),this.model.otr.smpSecret(s,i))):this.showHelpMessages([q("Invalid authentication scheme provided")],"error")},toggleCall:function(e){e.stopPropagation(),m.emit("callButtonClicked",{connection:m.connection,model:this.model})},onChatStatusChanged:function(e){var t=e.get("chat_status"),n=e.get("fullname");n=f.isEmpty(n)?e.get("jid"):n,this.$el.is(":visible")&&(t==="offline"?this.showStatusNotification(n+" "+q("has gone offline")):t==="away"?this.showStatusNotification(n+" "+q("has gone away")):t==="dnd"?this.showStatusNotification(n+" "+q("is busy")):t==="online"&&this.$el.find("div.chat-event").remove()),m.emit("contactStatusChanged",e.attributes,e.get("chat_status"))},onStatusChanged:function(e){this.showStatusMessage(),m.emit("contactStatusMessageChanged",e.attributes,e.get("status"))},onOTRStatusChanged:function(){this.renderToolbar().informOTRChange()},onMinimizedChanged:function(e){e.get("minimized")?this.hide():this.maximize()},showStatusMessage:function(e){return e=e||this.model.get("status"),typeof e=="string"&&this.$el.find("p.user-custom-message").text(e).attr("title",e),this},close:function(e){return e&&e.preventDefault&&e.preventDefault(),m.connection.connected?(this.model.destroy(),this.setChatState(O)):this.hide(),m.emit("chatBoxClosed",this),this},maximize:function(){var e=m.chatboxviews;this.$el.insertAfter(e.get("controlbox").$el).show("fast",function(){e.trimChats(this),m.refreshWebkit(),this.setChatState(M).focus(),m.emit("chatBoxMaximized",this)}.bind(this))},minimize:function(e){e&&e.preventDefault&&e.preventDefault(),this.setChatState(O).model.minimize(),this.$el.hide("fast",m.refreshwebkit),m.emit("chatBoxMinimized",this)},updateVCard:function(){if(!this.use_vcards)return this;var e=this.model.get("jid"),t=m.roster.get(e);return t&&!t.get("vcard_updated")&&m.getVCard(e,function(e,t,n,r,i,s){this.model.save({fullname:n||t,url:s,image_type:i,image:r})}.bind(this),function(){m.log("ChatBoxView.initialize: An error occured while fetching vcard")}),this},informOTRChange:function(){var e=this.model.toJSON(),t=[];return e.otr_status===T?t.push(q("Your messages are not encrypted anymore")):e.otr_status===N?t.push(q("Your messages are now encrypted but your contact's identity has not been verified.")):e.otr_status===C?t.push(q("Your contact's identify has been verified.")):e.otr_status===k&&t.push(q("Your contact has ended encryption on their end, you should do the same.")),this.showHelpMessages(t,"info",!1)},renderToolbar:function(){if(m.show_toolbar){var e=this.model.toJSON();e.otr_status===T?e.otr_tooltip=q("Your messages are not encrypted. Click here to enable OTR encryption."):e.otr_status===N?e.otr_tooltip=q("Your messages are encrypted, but your contact has not been verified."):e.otr_status===C?e.otr_tooltip=q("Your messages are encrypted and your contact verified."):e.otr_status===k&&(e.otr_tooltip=q("Your contact has closed their end of the private session, you should do the same")),this.$el.find(".chat-toolbar").html(m.templates.toolbar(f.extend(e,{FINISHED:k,UNENCRYPTED:T,UNVERIFIED:N,VERIFIED:C,allow_otr:m.allow_otr&&!this.is_chatroom,label_clear:q("Clear all messages"),label_end_encrypted_conversation:q("End encrypted conversation"),label_insert_smiley:q("Insert a smiley"),label_hide_occupants:q("Hide the list of occupants"),label_refresh_encrypted_conversation:q("Refresh encrypted conversation"),label_start_call:q("Start a call"),label_start_encrypted_conversation:q("Start encrypted conversation"),label_verify_with_fingerprints:q("Verify with fingerprints"),label_verify_with_smp:q("Verify with SMP"),label_whats_this:q("What's this?"),otr_status_class:U[e.otr_status],otr_translated_status:z[e.otr_status],show_call_button:m.visible_toolbar_buttons.call,show_clear_button:m.visible_toolbar_buttons.clear,show_emoticons:m.visible_toolbar_buttons.emoticons,show_occupants_toggle:this.is_chatroom&&m.visible_toolbar_buttons.toggle_occupants})))}return this},renderAvatar:function(){if(!this.model.get("image"))return;var e="data:"+this.model.get("image_type")+";base64,"+this.model.get("image"),n=t('<canvas height="32px" width="32px" class="avatar"></canvas>').get(0);if(!n.getContext||!n.getContext("2d"))return this;var r=n.getContext("2d"),i=new Image;return i.onload=function(){var e=i.width/i.height;e<1?r.drawImage(i,0,0,32,32*(1/e)):r.drawImage(i,0,0,32,32*e)},i.src=e,this.$el.find(".chat-title").before(n),this},focus:function(){return this.$el.find(".chat-textarea").focus(),m.emit("chatBoxFocused",this),this},hide:function(){return this.$el.is(":visible")&&this.$el.css("opacity")==="1"&&(this.$el.hide(),m.refreshWebkit()),this},show:function(e){return this.$el.is(":visible")&&this.$el.css("opacity")==="1"?this.focus():(this.initDragResize().setDimensions(),this.$el.fadeIn(function(){typeof e=="function"&&e.apply(this,arguments),m.connection.connected&&this.model.save(),this.setChatState(M),this.scrollDown().focus()}.bind(this)),this)},scrollDownMessageHeight:function(e){return this.$content.is(":visible")&&this.$content.scrollTop(this.$content.scrollTop()+e[0].scrollHeight),this},scrollDown:function(){return this.$content.is(":visible")&&this.$content.scrollTop(this.$content[0].scrollHeight),this}}),this.ContactsPanel=Backbone.View.extend({tagName:"div",className:"controlbox-pane",id:"users",events:{"click a.toggle-xmpp-contact-form":"toggleContactForm","submit form.add-xmpp-contact":"addContactFromForm","submit form.search-xmpp-contact":"searchContacts","click a.subscribe-to-user":"addContactFromList"},initialize:function(e){e.$parent.append(this.$el),this.$tabs=e.$parent.parent().find("#controlbox-tabs")},render:function(){var e,t=m.templates.contacts_panel({label_online:q("Online"),label_busy:q("Busy"),label_away:q("Away"),label_offline:q("Offline"),label_logout:q("Log out"),allow_logout:m.allow_logout});return this.$tabs.append(m.templates.contacts_tab({label_contacts:G})),m.xhr_user_search?e=m.templates.search_contact({label_contact_name:q("Contact name"),label_search:q("Search")}):e=m.templates.add_contact_form({label_contact_username:q("e.g. user@example.com"),label_add:q("Add")}),m.allow_contact_requests&&(t+=m.templates.add_contact_dropdown({label_click_to_chat:q("Click to add new chat contacts"),label_add_contact:q("Add a contact")})),this.$el.html(t),this.$el.find(".search-xmpp ul").append(e),this},toggleContactForm:function(e){e.preventDefault(),this.$el.find(".search-xmpp").toggle("fast",function(){t(this).is(":visible")&&t(this).find("input.username").focus()})},searchContacts:function(e){e.preventDefault(),t.getJSON(m.xhr_user_search_url+"?q="+t(e.target).find("input.username").val(),function(e){var n=t(".search-xmpp ul");n.find("li.found-user").remove(),n.find("li.chat-info").remove(),e.length||n.append('<li class="chat-info">'+q("No users found")+"</li>"),t(e).each(function(e,r){n.append(t('<li class="found-user"></li>').append(t('<a class="subscribe-to-user" href="#" title="'+q("Click to add as a chat contact")+'"></a>').attr("data-recipient",a.getNodeFromJid(r.id)+"@"+a.getDomainFromJid(r.id)).text(r.fullname)))})})},addContactFromForm:function(e){e.preventDefault();var n=t(e.target).find("input"),r=n.val();if(!r){n.addClass("error");return}m.roster.addAndSubscribe(r),t(".search-xmpp").hide()},addContactFromList:function(e){e.preventDefault();var n=t(e.target),r=n.attr("data-recipient"),i=n.text();m.roster.addAndSubscribe(r,i),n.parent().remove(),t(".search-xmpp").hide()}}),this.RoomsPanel=Backbone.View.extend({tagName:"div",className:"controlbox-pane",id:"chatrooms",events:{"submit form.add-chatroom":"createChatRoom","click input#show-rooms":"showRooms","click a.open-room":"createChatRoom","click a.room-info":"showRoomInfo","change input[name=server]":"setDomain","change input[name=nick]":"setNick"},initialize:function(e){this.$parent=e.$parent,this.model.on("change:muc_domain",this.onDomainChange,this),this.model.on("change:nick",this.onNickChange,this)},render:function(){return this.$parent.append(this.$el.html(m.templates.room_panel({server_input_type:m.hide_muc_server&&"hidden"||"text",server_label_global_attr:m.hide_muc_server&&" hidden"||"",label_room_name:q("Room name"),label_nickname:q("Nickname"),label_server:q("Server"),label_join:q("Join Room"),label_show_rooms:q("Show rooms")})).hide()),this.$tabs=this.$parent.parent().find("#controlbox-tabs"),this.$tabs.append(m.templates.chatrooms_tab({label_rooms:q("Rooms")})),this},onDomainChange:function(e){var t=this.$el.find("input.new-chatroom-server");t.val(e.get("muc_domain")),m.auto_list_rooms&&this.updateRoomsList()},onNickChange:function(e){var t=this.$el.find("input.new-chatroom-nick");t.val(e.get("nick"))},informNoRoomsFound:function(){var e=this.$el.find("#available-chatrooms");e.html("<dt>"+q("No rooms on %1$s",this.model.get("muc_domain"))+"</dt>"),t("input#show-rooms").show().siblings("span.spinner").remove()},onRoomsFound:function(e){var n,r,i,s,o=this.$el.find("#available-chatrooms");this.rooms=t(e).find("query").find("item");if(this.rooms.length){o.html("<dt>"+q("Rooms on %1$s",this.model.get("muc_domain"))+"</dt>"),s=document.createDocumentFragment();for(i=0;i<this.rooms.length;i++)n=a.unescapeNode(t(this.rooms[i]).attr("name")||t(this.rooms[i]).attr("jid")),r=t(this.rooms[i]).attr("jid"),s.appendChild(t(m.templates.room_item({name:n,jid:r,open_title:q("Click to open this room"),info_title:q("Show more information on this room")}))[0]);o.append(s),t("input#show-rooms").show().siblings("span.spinner").remove()}else this.informNoRoomsFound();return!0},updateRoomsList:function(){m.connection.sendIQ(n({to:this.model.get("muc_domain"),from:m.connection.jid,type:"get"}).c("query",{xmlns:a.NS.DISCO_ITEMS}),this.onRoomsFound.bind(this),this.informNoRoomsFound.bind(this))},showRooms:function(){var e=this.$el.find("#available-chatrooms"),n=this.$el.find("input.new-chatroom-server"),r=n.val();if(!r){n.addClass("error");return}this.$el.find("input.new-chatroom-name").removeClass("error"),n.removeClass("error"),e.empty(),t("input#show-rooms").hide().after('<span class="spinner"/>'),this.model.save({muc_domain:r}),this.updateRoomsList()},showRoomInfo:function(e){var n=e.target,r=t(n).parent("dd"),i=r.find("div.room-info");i.length?i.remove():(r.find("span.spinner").remove(),r.append('<span class="spinner hor_centered"/>'),m.connection.disco.info(t(n).attr("data-room-jid"),null,function(e){var n=t(e);r.find("span.spinner").replaceWith(m.templates.room_description({desc:n.find('field[var="muc#roominfo_description"] value').text(),occ:n.find('field[var="muc#roominfo_occupants"] value').text(),hidden:n.find('feature[var="muc_hidden"]').length,membersonly:n.find('feature[var="muc_membersonly"]').length,moderated:n.find('feature[var="muc_moderated"]').length,nonanonymous:n.find('feature[var="muc_nonanonymous"]').length,open:n.find('feature[var="muc_open"]').length,passwordprotected:n.find('feature[var="muc_passwordprotected"]').length,persistent:n.find('feature[var="muc_persistent"]').length,publicroom:n.find('feature[var="muc_public"]').length,semianonymous:n.find('feature[var="muc_semianonymous"]').length,temporary:n.find('feature[var="muc_temporary"]').length,unmoderated:n.find('feature[var="muc_unmoderated"]').length,label_desc:q("Description:"),label_occ:q("Occupants:"),label_features:q("Features:"),label_requires_auth:q("Requires authentication"),label_hidden:q("Hidden"),label_requires_invite:q("Requires an invitation"),label_moderated:q("Moderated"),label_non_anon:q("Non-anonymous"),label_open_room:q("Open room"),label_permanent_room:q("Permanent room"),label_public:q("Public"),label_semi_anon:q("Semi-anonymous"),label_temp_room:q("Temporary room"),label_unmoderated:q("Unmoderated")}))}.bind(this)))},createChatRoom:function(e){e.preventDefault();var n,r,i,s,o,u=this.$el.find("input.new-chatroom-nick"),f=u.val(),l;f?u.removeClass("error"):u.addClass("error");if(e.type==="click")n=t(e.target).text(),o=t(e.target).attr("data-room-jid");else{r=this.$el.find("input.new-chatroom-name"),s=this.$el.find("input.new-chatroom-server"),i=s.val(),n=r.val().trim(),r.val("");if(!n||!i){n||r.addClass("error"),i||s.addClass("error");return}o=a.escapeNode(n.toLowerCase())+"@"+i,r.removeClass("error"),s.removeClass("error"),this.model.save({muc_domain:i})}if(!f)return;l=m.chatboxviews.showChat({id:o,jid:o,name:n||a.unescapeNode(a.getNodeFromJid(o)),nick:f,chatroom:!0,box_id:h(o)})},setDomain:function(e){this.model.save({muc_domain:e.target.value})},setNick:function(e){this.model.save({nick:e.target.value})}}),this.ControlBoxView=m.ChatBoxView.extend({tagName:"div",className:"chatbox",id:"controlbox",events:{"click a.close-chatbox-button":"close","click ul#controlbox-tabs li a":"switchTab","mousedown .dragresize-top":"onStartVerticalResize","mousedown .dragresize-left":"onStartHorizontalResize","mousedown .dragresize-topleft":"onStartDiagonalResize"},initialize:function(){this.$el.insertAfter(m.controlboxtoggle.$el),t(window).on("resize",f.debounce(this.setDimensions.bind(this),100)),this.model.on("change:connected",this.onConnected,this),this.model.on("destroy",this.hide,this),this.model.on("hide",this.hide,this),this.model.on("show",this.show,this),this.model.on("change:closed",this.ensureClosedState,this),this.render(),this.model.get("connected")&&this.initRoster(),this.model.get("closed")?this.hide():this.show()},render:function(){return!m.connection.connected||!m.connection.authenticated||m.connection.disconnecting?this.renderLoginPanel():(!this.contactspanel||!this.contactspanel.$el.is(":visible"))&&this.renderContactsPanel(),this},giveFeedback:function(e,t){var n=this.$(".conn-feedback");n.addClass("conn-feedback").text(e),t&&n.addClass(t)},onConnected:function(){if(this.model.get("connected")){this.render().initRoster(),m.features.off("add",this.featureAdded,this),m.features.on("add",this.featureAdded,this);var e=m.features.findWhere({"var":a.NS.MUC});e&&this.featureAdded(e)}},initRoster:function(){m.roster=new m.RosterContacts,m.roster.browserStorage=new Backbone.BrowserStorage[m.storage](h("converse.contacts-"+m.bare_jid));var e=new m.RosterGroups;return e.browserStorage=new Backbone.BrowserStorage[m.storage](h("converse.roster.groups"+m.bare_jid)),m.rosterview=new m.RosterView({model:e}),this.contactspanel.$el.append(m.rosterview.$el),m.rosterview.render().fetch().update(),this},renderLoginPanel:function(){var e=this.$(".conn-feedback");this.$el.html(m.templates.controlbox(this.model.toJSON()));var t={$parent:this.$el.find(".controlbox-panes"),model:this};return this.loginpanel?(this.loginpanel.delegateEvents().initialize(t),m.allow_registration&&this.registerpanel.delegateEvents().initialize(t)):(this.loginpanel=new m.LoginPanel(t),m.allow_registration&&(this.registerpanel=new m.RegisterPanel(t))),this.loginpanel.render(),m.allow_registration&&this.registerpanel.render().$el.hide(),this.initDragResize().setDimensions(),e.length&&e.text()!==q("Connecting")&&this.$(".conn-feedback").replaceWith(e),this},renderContactsPanel:function(){this.$el.html(m.templates.controlbox(this.model.toJSON())),this.contactspanel=new m.ContactsPanel({$parent:this.$el.find(".controlbox-panes")}),this.contactspanel.render(),m.xmppstatusview=new m.XMPPStatusView({model:m.xmppstatus}),m.xmppstatusview.render(),m.allow_muc&&(this.roomspanel=new m.RoomsPanel({$parent:this.$el.find(".controlbox-panes"),model:new(Backbone.Model.extend({id:h("converse.roomspanel"+m.bare_jid),browserStorage:new Backbone.BrowserStorage[m.storage](h("converse.roomspanel"+m.bare_jid))}))}),this.roomspanel.render().model.fetch(),this.roomspanel.model.get("nick")||this.roomspanel.model.save({nick:a.getNodeFromJid(m.bare_jid)})),this.initDragResize().setDimensions()},close:function(e){return e&&e.preventDefault&&e.preventDefault(),m.connection.connected?this.model.save({closed:!0}):this.model.trigger("hide"),m.emit("controlBoxClosed",this),this},ensureClosedState:function(){this.model.get("closed")?this.hide():this.show()},hide:function(e){return this.$el.hide("fast",function(){m.refreshWebkit(),m.emit("chatBoxClosed",this),m.controlboxtoggle.show(function(){typeof e=="function"&&e()})}),this},show:function(){return m.controlboxtoggle.hide(function(){this.$el.show("fast",function(){m.rosterview&&m.rosterview.update(),m.refreshWebkit()}.bind(this)),m.emit("controlBoxOpened",this)}.bind(this)),this},featureAdded:function(e){if(e.get("var")===a.NS.MUC&&m.allow_muc){this.roomspanel.model.save({muc_domain:e.get("from")});var t=this.$el.find("input.new-chatroom-server");t.is(":focus")||t.val(this.roomspanel.model.get("muc_domain"))}},switchTab:function(e){e&&e.preventDefault&&e.preventDefault();var n=t(e.target),r=n.parent().siblings("li").children("a"),i=t(n.attr("href"));return t(r.attr("href")).hide(),r.removeClass("current"),n.addClass("current"),i.show(),this},showHelpMessages:function(e){return}}),this.ChatRoomOccupant=Backbone.Model,this.ChatRoomOccupantView=Backbone.View.extend({tagName:"li",initialize:function(){this.model.on("add",this.render,this),this.model.on("change",this.render,this),this.model.on("destroy",this.destroy,this)},render:function(){var e=m.templates.occupant(f.extend(this.model.toJSON(),{desc_moderator:q("This user is a moderator"),desc_occupant:q("This user can send messages in this room"),desc_visitor:q("This user can NOT send messages in this room")}));return this.$el.replaceWith(e),this.setElement(e,!0),this},destroy:function(){this.$el.remove()}}),this.ChatRoomOccupants=Backbone.Collection.extend({model:m.ChatRoomOccupant}),this.ChatRoomOccupantsView=Backbone.Overview.extend({tagName:"div",className:"occupants",initialize:function(){this.model.on("add",this.onOccupantAdded,this)},render:function(){return this.$el.html(m.templates.chatroom_sidebar({label_invitation:q("Invite..."),label_occupants:q("Occupants")})),this.initInviteWidget()},onOccupantAdded:function(e){var t=this.get(e.get("id"));t?(delete t.model,t.model=e,t.initialize()):t=this.add(e.get("id"),new m.ChatRoomOccupantView({model:e})),this.$(".occupant-list").append(t.render().$el)},parsePresence:function(e){var t=a.getResourceFromJid(e.getAttribute("from")),n={id:t,nick:t,type:e.getAttribute("type"),states:[]};return f.each(e.childNodes,function(e){switch(e.nodeName){case"status":n.status=e.textContent||null;break;case"show":n.show=e.textContent||null;break;case"x":e.getAttribute("xmlns")===a.NS.MUC_USER&&f.each(e.childNodes,function(e){switch(e.nodeName){case"item":n.affiliation=e.getAttribute("affiliation"),n.role=e.getAttribute("role"),n.jid=e.getAttribute("jid"),n.nick=e.getAttribute("nick")||n.nick;break;case"status":e.getAttribute("code")&&n.states.push(e.getAttribute("code"))}})}}),n},updateOccupantsOnPresence:function(e){var t,n=this.parsePresence(e);switch(n.type){case"error":return!0;case"unavailable":t=this.model.get(n.id),t&&t.destroy();break;default:t=this.model.get(n.id),t?t.save(n):this.model.create(n)}},initInviteWidget:function(){var e=this.$("input.invited-contact");return e.typeahead({minLength:1,highlight:!0},{name:"contacts-dataset",source:function(e,t){var n=[];f.each(m.roster.filter(p(["fullname","jid"],e)),function(e){n.push({value:e.get("fullname"),jid:e.get("jid")})}),t(n)},templates:{suggestion:f.template('<p data-jid="{{jid}}">{{value}}</p>')}}),e.on("typeahead:selected",function(e,n,r){var i=prompt(q(R('You are about to invite %1$s to the chat room "%2$s". '),n.value,this.model.get("id"))+q("You may optionally include a message, explaining the reason for the invitation."));i!==null&&this.chatroomview.directInvite(n.jid,i),t(e.target).typeahead("val","")}.bind(this)),this}}),this.ChatRoomView=m.ChatBoxView.extend({length:300,tagName:"div",className:"chatbox chatroom",events:{"click .close-chatbox-button":"close","click .toggle-chatbox-button":"minimize","click .configure-chatroom-button":"configureChatRoom","click .toggle-smiley":"toggleEmoticonMenu","click .toggle-smiley ul li":"insertEmoticon","click .toggle-clear":"clearChatRoomMessages","click .toggle-call":"toggleCall","click .toggle-occupants a":"toggleOccupants","keypress textarea.chat-textarea":"keyPressed","mousedown .dragresize-top":"onStartVerticalResize","mousedown .dragresize-left":"onStartHorizontalResize","mousedown .dragresize-topleft":"onStartDiagonalResize"},is_chatroom:!0,initialize:function(){t(window).on("resize",f.debounce(this.setDimensions.bind(this),100)),this.model.messages.on("add",this.onMessageAdded,this),this.model.on("change:minimized",function(e){e.get("minimized")?this.hide():this.maximize()},this),this.model.on("destroy",function(){this.hide().leave()},this),this.occupantsview=new m.ChatRoomOccupantsView({model:new m.ChatRoomOccupants({nick:this.model.get("nick")})});var e=h("converse.occupants"+m.bare_jid+this.model.get("id")+this.model.get("nick"));this.occupantsview.model.browserStorage=new Backbone.BrowserStorage[m.storage](e),this.occupantsview.chatroomview=this,this.render().$el.hide(),this.occupantsview.model.fetch({add:!0}),this.join(null,{maxstanzas:m.muc_history_max_stanzas}),this.fetchMessages(),m.emit("chatRoomOpened",this),this.$el.insertAfter(m.chatboxviews.get("controlbox").$el),this.model.get("minimized")?this.hide():this.show()},render:function(){return this.$el.attr("id",this.model.get("box_id")).html(m.templates.chatroom(this.model.toJSON())),this.renderChatArea(),this.$content.on("scroll",f.debounce(this.onScroll.bind(this),100)),this.setWidth(),setTimeout(m.refreshWebkit,50),this},renderChatArea:function(){return this.$(".chat-area").length||(this.$(".chatroom-body").empty().append(m.templates.chatarea({show_toolbar:m.show_toolbar,label_message:q("Message")})).append(this.occupantsview.render().$el),this.renderToolbar(),this.$content=this.$el.find(".chat-content")),this.toggleOccupants(null,!0),this},toggleOccupants:function(e,t){e&&(e.preventDefault(),e.stopPropagation()),t&&this.model.set({hidden_occupants:!this.model.get("hidden_occupants")});var n=this.$(".icon-hide-users");this.model.get("hidden_occupants")?(this.model.save({hidden_occupants:!1}),n.removeClass("icon-show-users").addClass("icon-hide-users"),this.$(".chat-area").removeClass("full"),this.$("div.occupants").removeClass("hidden"),this.scrollDown()):(this.model.save({hidden_occupants:!0}),n.removeClass("icon-hide-users").addClass("icon-show-users"),this.$(".occupants").addClass("hidden"),this.$(".chat-area").addClass("full"),this.scrollDown())},directInvite:function(e,t){var n={xmlns:"jabber:x:conference",jid:this.model.get("jid")};t!==null&&(n.reason=t),this.model.get("password")&&(n.password=this.model.get("password"));var i=r({from:m.connection.jid,to:e,id:m.connection.getUniqueId()}).c("x",n);m.connection.send(i),m.emit("roomInviteSent",this,e,t)},onCommandError:function(e){this.showStatusNotification(q("Error: could not execute the command"),!0)},sendChatRoomMessage:function(e){var t=m.connection.getUniqueId(),n=r({to:this.model.get("jid"),from:m.connection.jid,type:"groupchat",id:t}).c("body").t(e).up().c("x",{xmlns:"jabber:x:event"}).c("composing");m.connection.send(n);var i=m.xmppstatus.get("fullname");this.model.messages.create({fullname:f.isEmpty(i)?m.bare_jid:i,sender:"me",time:l().format(),message:e,msgid:t})},setAffiliation:function(e,t,r,i,o,u){var f=s("item",{jid:t,affiliation:r}),l=n({to:e,type:"set"}).c("query",{xmlns:a.NS.MUC_ADMIN}).cnode(f.node);return i!==null&&l.c("reason",i),m.connection.sendIQ(l.tree(),o,u)},modifyRole:function(e,t,r,i,o,u){var f=s("item",{nick:t,role:r}),l=n({to:e,type:"set"}).c("query",{xmlns:a.NS.MUC_ADMIN}).cnode(f.node);return i!==null&&l.c("reason",i),m.connection.sendIQ(l.tree(),o,u)},member:function(e,t,n,r,i){return this.setAffiliation(e,t,"member",n,r,i)},revoke:function(e,t,n,r,i){return this.setAffiliation(e,t,"none",n,r,i)},owner:function(e,t,n,r,i){return this.setAffiliation(e,t,"owner",n,r,i)},admin:function(e,t,n,r,i){return this.setAffiliation(e,t,"admin",n,r,i)},validateRoleChangeCommand:function(e,t){return t.length<1||t.length>2?(this.showStatusNotification(q('Error: the "'+e+"\" command takes two arguments, the user's nickname and optionally a reason."),!0),!1):!0},onChatRoomMessageSubmitted:function(e){var t=e.replace(/^\s*/,"").match(/^\/(.*?)(?: (.*))?$/)||[!1,"",""],n=t[2]&&t[2].splitOnce(" ")||[];switch(t[1]){case"admin":if(!this.validateRoleChangeCommand(t[1],n))break;this.setAffiliation(this.model.get("jid"),n[0],"admin",n[1],undefined,this.onCommandError.bind(this));break;case"ban":if(!this.validateRoleChangeCommand(t[1],n))break;this.setAffiliation(this.model.get("jid"),n[0],"outcast",n[1],undefined,this.onCommandError.bind(this));break;case"clear":this.clearChatRoomMessages();break;case"deop":if(!this.validateRoleChangeCommand(t[1],n))break;this.modifyRole(this.model.get("jid"),n[0],"occupant",n[1],undefined,this.onCommandError.bind(this));break;case"help":this.showHelpMessages(["<strong>/admin</strong>: "+q("Change user's affiliation to admin"),"<strong>/ban</strong>: "+q("Ban user from room"),"<strong>/clear</strong>: "+q("Remove messages"),"<strong>/deop</strong>: "+q("Change user role to occupant"),"<strong>/help</strong>: "+q("Show this menu"),"<strong>/kick</strong>: "+q("Kick user from room"),"<strong>/me</strong>: "+q("Write in 3rd person"),"<strong>/member</strong>: "+q("Grant membership to a user"),"<strong>/mute</strong>: "+q("Remove user's ability to post messages"),"<strong>/nick</strong>: "+q("Change your nickname"),"<strong>/op</strong>: "+q("Grant moderator role to user"),"<strong>/owner</strong>: "+q("Grant ownership of this room"),"<strong>/revoke</strong>: "+q("Revoke user's membership"),"<strong>/topic</strong>: "+q("Set room topic"),"<strong>/voice</strong>: "+q("Allow muted user to post messages")]);break;case"kick":if(!this.validateRoleChangeCommand(t[1],n))break;this.modifyRole(this.model.get("jid"),n[0],"none",n[1],undefined,this.onCommandError.bind(this));break;case"mute":if(!this.validateRoleChangeCommand(t[1],n))break;this.modifyRole(this.model.get("jid"),n[0],"visitor",n[1],undefined,this.onCommandError.bind(this));break;case"member":if(!this.validateRoleChangeCommand(t[1],n))break;this.setAffiliation(this.model.get("jid"),n[0],"member",n[1],undefined,this.onCommandError.bind(this));break;case"nick":m.connection.send(i({from:m.connection.jid,to:this.getRoomJIDAndNick(t[2]),id:m.connection.getUniqueId()}).tree());break;case"owner":if(!this.validateRoleChangeCommand(t[1],n))break;this.setAffiliation(this.model.get("jid"),n[0],"owner",n[1],undefined,this.onCommandError.bind(this));break;case"op":if(!this.validateRoleChangeCommand(t[1],n))break;this.modifyRole(this.model.get("jid"),n[0],"moderator",n[1],undefined,this.onCommandError.bind(this));break;case"revoke":if(!this.validateRoleChangeCommand(t[1],n))break;this.setAffiliation(this.model.get("jid"),n[0],"none",n[1],undefined,this.onCommandError.bind(this));break;case"topic":m.connection.send(r({to:this.model.get("jid"),from:m.connection.jid,type:"groupchat"}).c("subject",{xmlns:"jabber:client"}).t(t[2]).tree());break;case"voice":if(!this.validateRoleChangeCommand(t[1],n))break;this.modifyRole(this.model.get("jid"),n[0],"occupant",n[1],undefined,this.onCommandError.bind(this));break;default:this.sendChatRoomMessage(e)}},handleMUCStanza:function(e){var n,r,i,s=e.getAttribute("from"),o=t(e).find('[xmlns="'+a.NS.MAM+'"]').length>0;if(!s||this.model.get("id")!==s.split("/")[0]||o)return!0;if(e.nodeName==="message")f.compose(this.onChatRoomMessage.bind(this),this.showStatusMessages.bind(this))(e);else if(e.nodeName==="presence"){r=e.getElementsByTagName("x");if(r.length>0)for(i=0;i<r.length;i++){n=r[i].getAttribute("xmlns");if(n&&n.match(a.NS.MUC)){this.onChatRoomPresence(e);break}}}return!0},getRoomJIDAndNick:function(e){e=e||this.model.get("nick");var t=this.model.get("jid"),n=a.getNodeFromJid(t),r=a.getDomainFromJid(t);return n+"@"+r+(e!==null?"/"+e:"")},join:function(e,t,n){var r=i({from:m.connection.jid,to:this.getRoomJIDAndNick()}).c("x",{xmlns:a.NS.MUC});return typeof t=="object"&&Object.keys(t).length&&(r=r.c("history",t).up()),e&&r.cnode(a.xmlElement("password",[],e)),typeof n!="undefined"&&n!==null&&r.up.cnode(n),this.handler||(this.handler=m.connection.addHandler(this.handleMUCStanza.bind(this))),this.model.set("connection_status",a.Status.CONNECTING),m.connection.send(r)},leave:function(e){var t=m.connection.getUniqueId(),n=i({type:"unavailable",id:t,from:m.connection.jid,to:this.getRoomJIDAndNick()});e!==null&&n.c("status",e),m.connection.addHandler(function(){this.model.set("connection_status",a.Status.DISCONNECTED)}.bind(this),null,"presence",null,t),m.connection.send(n)},renderConfigurationForm:function(e){var n=this.$el.find("form.chatroom-form"),r=n.children("fieldset:first"),i=t(e),s=i.find("field"),o=i.find("title").text(),u=i.find("instructions").text();r.find("span.spinner").remove(),r.append(t("<legend>").text(o)),u&&u!==o&&r.append(t('<p class="instructions">').text(u)),f.each(s,function(e){r.append(c.xForm2webForm(t(e),i))}),n.append("<fieldset></fieldset>"),r=n.children("fieldset:last"),r.append('<input type="submit" class="pure-button button-primary" value="'+q("Save")+'"/>'),r.append('<input type="button" class="pure-button button-cancel" value="'+q("Cancel")+'"/>'),r.find("input[type=button]").on("click",this.cancelConfiguration.bind(this)),n.on("submit",this.saveConfiguration.bind(this))},sendConfiguration:function(e,t,r){var i=n({to:this.model.get("jid"),type:"set"}).c("query",{xmlns:a.NS.MUC_OWNER}).c("x",{xmlns:a.NS.XFORM,type:"submit"});return f.each(e,function(e){i.cnode(e).up()}),m.connection.sendIQ(i.tree(),t,r)},saveConfiguration:function(e){e.preventDefault();var n=this,r=t(e.target).find(":input:not([type=button]):not([type=submit])"),i=r.length,s=[];r.each(function(){s.push(c.webForm2xForm(this)),--i||n.sendConfiguration(s,n.onConfigSaved.bind(n),n.onErrorConfigSaved.bind(n))}),this.$el.find("div.chatroom-form-container").hide(function(){t(this).remove(),n.$el.find(".chat-area").removeClass("hidden"),n.$el.find(".occupants").removeClass("hidden")})},onConfigSaved:function(e){},onErrorConfigSaved:function(e){this.showStatusNotification(q("An error occurred while trying to save the form."))},cancelConfiguration:function(e){e.preventDefault();var n=this;this.$el.find("div.chatroom-form-container").hide(function(){t(this).remove(),n.$el.find(".chat-area").removeClass("hidden"),n.$el.find(".occupants").removeClass("hidden")})},configureChatRoom:function(e){e.preventDefault();if(this.$el.find("div.chatroom-form-container").length)return;this.$(".chatroom-body").children().addClass("hidden"),this.$(".chatroom-body").append(m.templates.chatroom_form()),m.connection.sendIQ(n({to:this.model.get("jid"),type:"get"}).c("query",{xmlns:a.NS.MUC_OWNER}).tree(),this.renderConfigurationForm.bind(this))},submitPassword:function(e){e.preventDefault();var t=this.$el.find(".chatroom-form").find("input[type=password]").val();this.$el.find(".chatroom-form-container").replaceWith('<span class="spinner centered"/>'),this.join(t)},renderPasswordForm:function(){this.$(".chatroom-body").children().hide(),this.$("span.centered.spinner").remove(),this.$(".chatroom-body").append(m.templates.chatroom_password_form({heading:q("This chatroom requires a password"),label_password:q("Password: "),label_submit:q("Submit")})),this.$(".chatroom-form").on("submit",this.submitPassword.bind(this))},showDisconnectMessage:function(e){this.$(".chat-area").hide(),this.$(".occupants").hide(),this.$("span.centered.spinner").remove(),this.$(".chatroom-body").append(t("<p>"+e+"</p>"))},infoMessages:{100:q("This room is not anonymous"),102:q("This room now shows unavailable members"),103:q("This room does not show unavailable members"),104:q("Non-privacy-related room configuration has changed"),170:q("Room logging is now enabled"),171:q("Room logging is now disabled"),172:q("This room is now non-anonymous"),173:q("This room is now semi-anonymous"),174:q("This room is now fully-anonymous"),201:q("A new room has been created")},disconnectMessages:{301:q("You have been banned from this room"),307:q("You have been kicked from this room"),321:q("You have been removed from this room because of an affiliation change"),322:q("You have been removed from this room because the room has changed to members-only and you're not a member"),332:q("You have been removed from this room because the MUC (Multi-user chat) service is being shut down.")},actionInfoMessages:{301:R("<strong>%1$s</strong> has been banned"),303:R("<strong>%1$s</strong>'s nickname has changed"),307:R("<strong>%1$s</strong> has been kicked out"),321:R("<strong>%1$s</strong> has been removed because of an affiliation change"),322:R("<strong>%1$s</strong> has been removed for not being a member")},newNicknameMessages:{210:R("Your nickname has been automatically changed to: <strong>%1$s</strong>"),303:R("Your nickname has been changed to: <strong>%1$s</strong>")},showStatusMessages:function(e,n){var r=t(e),i=[],s=[],o=[];r.find('x[xmlns="'+a.NS.MUC_USER+'"]').each(function(e,u){var l=t(u).find("item");a.getBareJidFromJid(l.attr("jid"))===m.bare_jid&&l.attr("affiliation")==="owner"&&this.$el.find("a.configure-chatroom-button").show(),t(u).find("item reason").each(function(e,n){t(n).text()&&o.push(t(n).text())}),t(u).find("status").each(function(e,o){var u=o.getAttribute("code"),c=a.unescapeNode(a.getResourceFromJid(r.attr("from")));n&&u==="210"?s.push(q(this.newNicknameMessages[u],c)):n&&u==="303"?s.push(q(this.newNicknameMessages[u],l.attr("nick"))):n&&f.contains(f.keys(this.disconnectMessages),u)?i.push(this.disconnectMessages[u]):!n&&f.contains(f.keys(this.actionInfoMessages),u)?s.push(q(this.actionInfoMessages[u],c)):f.contains(f.keys(this.infoMessages),u)?s.push(this.infoMessages[u]):u!=="110"&&t(o).text()&&s.push(t(o).text())}.bind(this))}.bind(this));if(i.length>0){for(w=0;w<i.length;w++)this.showDisconnectMessage(i[w]);for(w=0;w<o.length;w++)this.showDisconnectMessage(q('The reason given is: "'+o[w]+'"'),!0);this.model.set("connection_status",a.Status.DISCONNECTED);return}for(w=0;w<s.length;w++)this.$content.append(m.templates.info({message:s[w]}));for(w=0;w<o.length;w++)this.showStatusNotification(q('The reason given is: "'+o[w]+'"'),!0);return this.scrollDown(),e},showErrorMessage:function(e){e.attr("type")==="auth"?e.find("not-authorized").length?this.renderPasswordForm():e.find("registration-required").length?this.showDisconnectMessage(q("You are not on the member list of this room")):e.find("forbidden").length&&this.showDisconnectMessage(q("You have been banned from this room")):e.attr("type")==="modify"?e.find("jid-malformed").length&&this.showDisconnectMessage(q("No nickname was specified")):e.attr("type")==="cancel"&&(e.find("not-allowed").length?this.showDisconnectMessage(q("You are not allowed to create new rooms")):e.find("not-acceptable").length?this.showDisconnectMessage(q("Your nickname doesn't conform to this room's policies")):e.find("conflict").length?this.showDisconnectMessage(q("Your nickname is already taken")):e.find("item-not-found").length?this.showDisconnectMessage(q("This room does not (yet) exist")):e.find("service-unavailable").length&&this.showDisconnectMessage(q("This room has reached it's maximum number of occupants")))},onChatRoomPresence:function(e){var n=t(e),r,i=this.model.get("nick");n.attr("type")==="error"?(this.model.set("connection_status",a.Status.DISCONNECTED),this.showErrorMessage(n.find("error"))):(r=n.find("status[code='110']").length||n.attr("from")===this.model.get("id")+"/"+a.escapeNode(i),this.model.get("connection_status")!==a.Status.CONNECTED&&this.model.set("connection_status",a.Status.CONNECTED),this.showStatusMessages(e,r)),this.occupantsview.updateOccupantsOnPresence(e)},onChatRoomMessage:function(e){var n=t(e),r=n.find('result[xmlns="'+a.NS.MAM+'"]').attr("id"),i=n.find("delay").length>0,s=n.find("forwarded"),o;s.length&&(n=s.children("message"),o=s.children("delay"),i=o.length>0);var u=n.children("body").text(),f=n.attr("from"),l=n.attr("id"),c=a.getResourceFromJid(f),h=c&&a.unescapeNode(c)||"",p=n.children("subject").text();return l&&this.model.messages.findWhere({msgid:l})?!0:(p&&(this.$el.find(".chatroom-topic").text(p).attr("title",p),this.$content.append(m.templates.info({message:q("Topic set by %1$s to: %2$s",h,p)}))),h===""?!0:(this.model.createMessage(n,o,r),!i&&h!==this.model.get("nick")&&(new RegExp("\\b"+this.model.get("nick")+"\\b")).test(u)&&m.playNotification(),h!==this.model.get("nick")&&m.emit("message",e),!0))}}),this.ChatBoxes=Backbone.Collection.extend({model:m.ChatBox,comparator:"time_opened",registerMessageHandler:function(){m.connection.addHandler(function(e){return this.onMessage(e),!0}.bind(this),null,"message","chat"),m.connection.addHandler(function(e){return this.onInvite(e),!0}.bind(this),"jabber:x:conference","message")},onConnected:function(){this.browserStorage=new Backbone.BrowserStorage[m.storage](h("converse.chatboxes-"+m.bare_jid)),this.registerMessageHandler(),this.fetch({add:!0,success:function(e,t){e.each(function(e){e.get("id")!=="controlbox"&&!e.get("minimized")&&e.trigger("show")}),f.include(f.pluck(t,"id"),"controlbox")||this.add({id:"controlbox",box_id:"controlbox"}),this.get("controlbox").save({connected:!0})}.bind(this)})},isOnlyChatStateNotification:function(e){return e.find("body").length===0&&(e.find(M).length!==0||e.find(D).length!==0||e.find(O).length!==0||e.find(P).length!==0||e.find(H).length!==0)},onInvite:function(e){var n=t(e),r=n.children('x[xmlns="jabber:x:conference"]'),i=a.getBareJidFromJid(n.attr("from")),s=r.attr("jid"),o=r.attr("reason"),u=m.roster.get(i),l;o?l=confirm(q(R('%1$s has invited you to join a chat room: %2$s, and left the following reason: "%3$s"'),u.get("fullname"),s,o)):l=confirm(q(R("%1$s has invited you to join a chat room: %2$s"),u.get("fullname"),s));if(l===!0){var c=m.chatboxviews.showChat({id:s,jid:s,name:a.unescapeNode(a.getNodeFromJid(s)),nick:a.unescapeNode(a.getNodeFromJid(m.connection.jid)),chatroom:!0,box_id:h(s),password:r.attr("password")});f.contains([a.Status.CONNECTING,a.Status.CONNECTED],c.get("connection_status"))||m.chatboxviews.get(s).join(null)}},onMessage:function(e){var n=t(e),r,i,s,o,u,f,l,c,h,p=n.attr("from"),d=n.attr("to"),v=a.getResourceFromJid(d),g=n.find('result[xmlns="'+a.NS.MAM+'"]').attr("id");return v&&v!==m.resource?(m.log("Ignore incoming message intended for a different resource: "+d,"info"),!0):p===m.connection.jid?(m.log("Ignore incoming message sent from this client's JID: "+p,"info"),!0):(i=n.find("forwarded"),i.length&&(n=i.children("message"),s=i.children("delay"),p=n.attr("from"),d=n.attr("to")),o=a.getBareJidFromJid(p),u=a.getResourceFromJid(p),f=o===m.bare_jid,l=n.attr("id"),f?(r=a.getBareJidFromJid(d),h=a.getResourceFromJid(d)):(r=o,h=u),c=this.getChatBox(r,n.find("body").length>0),c?l&&c.messages.findWhere({msgid:l})?!0:(!this.isOnlyChatStateNotification(n)&&!f&&!i.length&&m.playNotification(),c.receiveMessage(n,s,g),m.roster.addResource(r,h),m.emit("message",e),!0):!0)},getChatBox:function(e,t){var n=a.getBareJidFromJid(e),r=this.get(n);if(!r&&t){var i=m.roster.get(n);if(i===undefined){m.log("Could not get roster item for JID "+n,"error");return}r=this.create({id:n,jid:n,fullname:f.isEmpty(i.get("fullname"))?e:i.get("fullname"),image_type:i.get("image_type"),image:i.get("image"),url:i.get("url")})}return r}}),this.ChatBoxViews=Backbone.Overview.extend({initialize:function(){this.model.on("add",this.onChatBoxAdded,this),this.model.on("change:minimized",function(e){e.get("minimized")===!0?this.trimChats():this.trimChats(this.get(e.get("id")))},this)},_ensureElement:function(){if(!this.el){var e=t("#conversejs");e.length||(e=t('<div id="conversejs">'),t("body").append(e)),e.html(m.templates.chats_panel()),this.setElement(e,!1)}else this.setElement(f.result(this,"el"),!1)},onChatBoxAdded:function(e){var t=this.get(e.get("id"));t?(delete t.model,t.model=e,t.initialize()):(e.get("chatroom")?t=new m.ChatRoomView({model:e}):e.get("box_id")==="controlbox"?t=new m.ControlBoxView({model:e}):t=new m.ChatBoxView({model:e}),this.add(e.get("id"),t)),this.trimChats(t)},trimChats:function(e){if(m.no_trimming||this.model.length<=1)return;var n,r=0,i=m.minimized_chats.$el,s=f.contains(this.model.pluck("minimized"),!0)?i.outerWidth(!0):0,o=e?e.$el.outerWidth(!0):0,u=e?e.model.get("id"):null,a=this.get("controlbox");!a||!a.$el.is(":visible")?r=m.controlboxtoggle.$el.outerWidth(!0):r=a.$el.outerWidth(!0),f.each(this.getAll(),function(e){var t=e.model.get("id");t!=="controlbox"&&t!==u&&!e.model.get("minimized")&&e.$el.is(":visible")&&(o+=e.$el.outerWidth(!0))}),s+o+r>t("body").outerWidth(!0)&&(n=this.getOldestMaximizedChat(),n&&n.get("id")!==u&&n.minimize())},getOldestMaximizedChat:function(){var e=0,t=this.model.sort().at(e);while(t.get("id")==="controlbox"||t.get("minimized")===!0){e++,t=this.model.at(e);if(!t)return null}return t},closeAllChatBoxes:function(e){var t=[];return this.model.each(function(n){var r=n.get("id");(e||r!=="controlbox")&&t.push(r)}),t.forEach(function(e){var t=this.get(e);t&&t.close()},this),this},showChat:function(e){var t=this.model.get(e.jid);return t||(t=this.model.create(e,{error:function(e,t){m.log(t.responseText)}})),t.get("minimized")?t.maximize():t.trigger("show"),t}}),this.MinimizedChatBoxView=Backbone.View.extend({tagName:"div",className:"chat-head",events:{"click .close-chatbox-button":"close","click .restore-chat":"restore"},initialize:function(){this.model.messages.on("add",function(e){e.get("message")&&this.updateUnreadMessagesCounter()},this),this.model.on("change:minimized",this.clearUnreadMessagesCounter,this),this.model.on("showReceivedOTRMessage",this.updateUnreadMessagesCounter,this),this.model.on("showSentOTRMessage",this.updateUnreadMessagesCounter,this)},render:function(){var e=f.extend(this.model.toJSON(),{tooltip:q("Click to restore this chat")});return this.model.get("chatroom")?(e.title=this.model.get("name"),this.$el.addClass("chat-head-chatroom")):(e.title=this.model.get("fullname"),this.$el.addClass("chat-head-chatbox")),this.$el.html(m.templates.trimmed_chat(e))},clearUnreadMessagesCounter:function(){this.model.set({num_unread:0}),this.render()},updateUnreadMessagesCounter:function(){this.model.set({num_unread:this.model.get("num_unread")+1}),this.render()},close:function(e){return e&&e.preventDefault&&e.preventDefault(),this.remove(),this.model.destroy(),m.emit("chatBoxClosed",this),this},restore:f.debounce(function(e){e&&e.preventDefault&&e.preventDefault(),this.model.messages.off("add",null,this),this.remove(),this.model.maximize()},200,!0)}),this.MinimizedChats=Backbone.Overview.extend({el:"#minimized-chats",events:{"click #toggle-minimized-chats":"toggle"},initialize:function(){this.initToggle(),this.model.on("add",this.onChanged,this),this.model.on("destroy",this.removeChat,this),this.model.on("change:minimized",this.onChanged,this),this.model.on("change:num_unread",this.updateUnreadMessagesCounter,this)},tearDown:function(){return this.model.off("add",this.onChanged),this.model.off("destroy",this.removeChat),this.model.off("change:minimized",this.onChanged),this.model.off("change:num_unread",this.updateUnreadMessagesCounter),this},initToggle:function(){this.toggleview=new m.MinimizedChatsToggleView({model:new m.MinimizedChatsToggle});var e=h("converse.minchatstoggle"+m.bare_jid);this.toggleview.model.id=e,this.toggleview.model.browserStorage=new Backbone.BrowserStorage[m.storage](e),this.toggleview.model.fetch()},render:function(){return this.keys().length===0?this.$el.hide("fast"):this.keys().length===1&&this.$el.show("fast"),this.$el},toggle:function(e){e&&e.preventDefault&&e.preventDefault(),this.toggleview.model.save({collapsed:!this.toggleview.model.get("collapsed")}),this.$(".minimized-chats-flyout").toggle()},onChanged:function(e){e.get("id")!=="controlbox"&&e.get("minimized")?this.addChat(e):this.get(e.get("id"))&&this.removeChat(e)},addChat:function(e){var t=this.get(e.get("id"));if(t&&t.$el.parent().length!==0)return;var n=new m.MinimizedChatBoxView({model:e});this.$(".minimized-chats-flyout").append(n.render()),this.add(e.get("id"),n),this.toggleview.model.set({num_minimized:this.keys().length}),this.render()},removeChat:function(e){this.remove(e.get("id")),this.toggleview.model.set({num_minimized:this.keys().length}),this.render()},updateUnreadMessagesCounter:function(){var e=this.model.pluck("num_unread"),t=0,n;for(n=0;n<e.length;n++)t+=e[n];this.toggleview.model.set({num_unread:t}),this.render()}}),this.MinimizedChatsToggle=Backbone.Model.extend({initialize:function(){this.set({collapsed:this.get("collapsed")||!1,num_minimized:this.get("num_minimized")||0,num_unread:this.get("num_unread")||0})}}),this.MinimizedChatsToggleView=Backbone.View.extend({el:"#toggle-minimized-chats",initialize:function(){this.model.on("change:num_minimized",this.render,this),this.model.on("change:num_unread",this.render,this),this.$flyout=this.$el.siblings(".minimized-chats-flyout")},render:function(){return this.$el.html(m.templates.toggle_chats(f.extend(this.model.toJSON(),{Minimized:q("Minimized")}))),this.model.get("collapsed")?this.$flyout.hide():this.$flyout.show(),this.$el}}),this.RosterContact=Backbone.Model.extend({initialize:function(e,t){var n=e.jid,r=a.getBareJidFromJid(n),i=a.getResourceFromJid(n);e.jid=r,this.set(f.extend({id:r,jid:r,fullname:r,chat_status:"offline",user_id:a.getNodeFromJid(n),resources:i?[i]:[],groups:[],image_type:"image/png",image:"iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAIAAABt+uBvAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gwHCy455JBsggAABkJJREFUeNrtnM1PE1sUwHvvTD8otWLHST/Gimi1CEgr6M6FEWuIBo2pujDVsNDEP8GN/4MbN7oxrlipG2OCgZgYlxAbkRYw1KqkIDRCSkM7nXvvW8x7vjyNeQ9m7p1p3z1LQk/v/Dhz7vkEXL161cHl9wI5Ag6IA+KAOCAOiAPigDggLhwQB2S+iNZ+PcYY/SWEEP2HAAAIoSAIoihCCP+ngDDGtVotGAz29/cfOXJEUZSOjg6n06lp2sbGRqlUWlhYyGazS0tLbrdbEASrzgksyeYJId3d3el0uqenRxRFAAAA4KdfIIRgjD9+/Pj8+fOpqSndslofEIQwHA6Pjo4mEon//qmFhYXHjx8vLi4ihBgDEnp7e9l8E0Jo165dQ0NDd+/eDYVC2/qsJElDQ0OEkKWlpa2tLZamxAhQo9EIBoOjo6MXL17csZLe3l5FUT59+lQul5l5JRaAVFWNRqN37tw5ceKEQVWRSOTw4cOFQuHbt2+iKLYCIISQLMu3b99OJpOmKAwEAgcPHszn8+vr6wzsiG6UQQhxuVyXLl0aGBgwUW0sFstkMl6v90fo1KyAMMYDAwPnzp0zXfPg4GAqlWo0Gk0MiBAiy/L58+edTqf5Aa4onj59OhaLYYybFRCEMBaL0fNxBw4cSCQStN0QRUBut3t4eJjq6U+dOiVJElVPRBFQIBDo6+ujCqirqyscDlONGykC2lYyYSR6pBoQQapHZwAoHo/TuARYAOrs7GQASFEUqn6aIiBJkhgA6ujooFpUo6iaTa7koFwnaoWadLNe81tbWwzoaJrWrICWl5cZAFpbW6OabVAEtLi4yABQsVjUNK0pAWWzWQaAcrlcswKanZ1VVZUqHYRQEwOq1Wpv3ryhCmh6erpcLjdrNl+v1ycnJ+l5UELI27dvv3//3qxxEADgy5cvExMT9Mznw4cPtFtAdAPFarU6Pj5eKpVM17yxsfHy5cvV1VXazXu62gVBKBQKT58+rdVqJqrFGL948eLdu3dU8/g/H4FBUaJYLAqC0NPTY9brMD4+PjY25mDSracOCABACJmZmXE6nUePHjWu8NWrV48ePSKEsGlAs7Agfd5nenq6Wq0mk0kjDzY2NvbkyRMIIbP2PLvhBUEQ8vl8NpuNx+M+n29bzhVjvLKycv/+/YmJCcazQuwA6YzW1tYmJyf1SY+2trZ/rRk1Go1SqfT69esHDx4UCgVmNaa/zZ/9ABUhRFXVYDB48uTJeDweiUQkSfL7/T9MA2NcqVTK5fLy8vL8/PzU1FSxWHS5XJaM4wGr9sUwxqqqer3eUCgkSZJuUBBCfTRvc3OzXC6vrKxUKhWn02nhCJ5lM4oQQo/HgxD6+vXr58+fHf8sDOp+HQDg8XgclorFU676dKLlo6yWRdItIBwQB8QBcUCtfosRQjRNQwhhjPUC4w46WXryBSHU1zgEQWBz99EFhDGu1+t+v//48ePxeFxRlD179ng8nh0Efgiher2+vr6ur3HMzMysrq7uTJVdACGEurq6Ll++nEgkPB7Pj9jPoDHqOxyqqubz+WfPnuVyuV9XPeyeagAAAoHArVu3BgcHab8CuVzu4cOHpVKJUnfA5GweY+xyuc6cOXPv3r1IJMLAR8iyPDw8XK/Xi8Wiqqqmm5KZgBBC7e3tN27cuHbtGuPVpf7+/lAoNDs7W61WzfVKpgHSSzw3b95MpVKW3MfRaDQSiczNzVUqFRMZmQOIEOL1eq9fv3727FlL1t50URRFluX5+flqtWpWEGAOIFEUU6nUlStXLKSjy759+xwOx9zcnKZpphzGHMzhcDiTydgk9r1w4YIp7RPTAAmCkMlk2FeLf/tIEKbTab/fbwtAhJBoNGrutpNx6e7uPnTokC1eMU3T0um0DZPMkZER6wERQnw+n/FFSxpy7Nix3bt3WwwIIcRgIWnHkkwmjecfRgGx7DtuV/r6+iwGhDHev3+/bQF1dnYaH6E2CkiWZdsC2rt3r8WAHA5HW1ubbQGZcjajgOwTH/4qNko1Wlg4IA6IA+KAOKBWBUQIsfNojyliKIoRRfH9+/dut9umf3wzpoUNNQ4BAJubmwz+ic+OxefzWWlBhJD29nbug7iT5sIBcUAcEAfEAXFAHBAHxOVn+QMrmWpuPZx12gAAAABJRU5ErkJggg==",status:""},e)),this.on("destroy",function(){this.removeFromRoster()}.bind(this))},subscribe:function(e){this.save("ask","subscribe");var t=i({to:this.get("jid"),type:"subscribe"});e&&e!==""&&t.c("status").t(e).up();var n=m.xmppstatus.get("fullname");return n&&n!==""&&t.c("nick",{xmlns:a.NS.NICK}).t(n).up(),m.connection.send(t),this},ackSubscribe:function(){m.connection.send(i({type:"subscribe",to:this.get("jid")}))},ackUnsubscribe:function(e){m.connection.send(i({type:"unsubscribe",to:this.get("jid")})),this.destroy()},unauthorize:function(e){return m.rejectPresenceSubscription(this.get("jid"),e),this},authorize:function(e){var t=i({to:this.get("jid"),type:"subscribed"});return e&&e!==""&&t.c("status").t(e),m.connection.send(t),this},removeResource:function(e){var t=this.get("resources"),n;return e&&(n=f.indexOf(t,e),n!==-1&&(t.splice(n,1),this.save({resources:t}))),t.length},removeFromRoster:function(e){var t=n({type:"set"}).c("query",{xmlns:a.NS.ROSTER}).c("item",{jid:this.get("jid"),subscription:"remove"});return m.connection.sendIQ(t,e,e),this},showInRoster:function(){var e=this.get("chat_status");return m.show_only_online_users&&e!=="online"||m.hide_offline_users&&e==="offline"?this.get("ask")==="subscribe"||this.get("subscription")==="from"||this.get("requesting")===!0?!0:!1:!0}}),this.RosterContactView=Backbone.View.extend({tagName:"dd",events:{"click .accept-xmpp-request":"acceptRequest","click .decline-xmpp-request":"declineRequest","click .open-chat":"openChat","click .remove-xmpp-contact":"removeContact"},initialize:function(){this.model.on("change",this.render,this),this.model.on("remove",this.remove,this),this.model.on("destroy",this.remove,this),this.model.on("open",this.openChat,this)},render:function(){if(!this.model.showInRoster())return this.$el.hide(),this;this.$el[0].style.display==="none"&&this.$el.show();var e=this.model,t=e.get("ask"),n=e.get("chat_status"),r=e.get("requesting"),i=e.get("subscription"),s=["current-xmpp-contact","pending-xmpp-contact","requesting-xmpp-contact"].concat(f.keys(W));f.each(s,function(e){this.el.className.indexOf(e)!==-1&&this.$el.removeClass(e)},this),this.$el.addClass(n).data("status",n);if(t==="subscribe"||i==="from")this.$el.addClass("pending-xmpp-contact"),this.$el.html(m.templates.pending_contact(f.extend(e.toJSON(),{desc_remove:q("Click to remove this contact"),allow_chat_pending_contacts:m.allow_chat_pending_contacts})));else if(r===!0)this.$el.addClass("requesting-xmpp-contact"),this.$el.html(m.templates.requesting_contact(f.extend(e.toJSON(),{desc_accept:q("Click to accept this contact request"),desc_decline:q("Click to decline this contact request"),allow_chat_pending_contacts:m.allow_chat_pending_contacts}))),m.controlboxtoggle.showControlBox();else if(i==="both"||i==="to")this.$el.addClass("current-xmpp-contact"),this.$el.removeClass(f.without(["both","to"],i)[0]).addClass(i),this.$el.html(m.templates.roster_item(f.extend(e.toJSON(),{desc_status:W[n||"offline"],desc_chat:q("Click to chat with this contact"),desc_remove:q("Click to remove this contact"),title_fullname:q("Name"),allow_contact_removal:m.allow_contact_removal})));return this},openChat:function(e){return e&&e.preventDefault&&e.preventDefault(),m.chatboxviews.showChat(this.model.attributes)},removeContact:function(e){e&&e.preventDefault&&e.preventDefault();if(!m.allow_contact_removal)return;var t=confirm(q("Are you sure you want to remove this contact?"));if(t===!0){var r=n({type:"set"}).c("query",{xmlns:a.NS.ROSTER}).c("item",{jid:this.model.get("jid"),subscription:"remove"});m.connection.sendIQ(r,function(e){this.model.destroy(),this.remove()}.bind(this),function(e){alert(q("Sorry, there was an error while trying to remove "+name+" as a contact.")),m.log(e)})}},acceptRequest:function(e){e&&e.preventDefault&&e.preventDefault(),m.roster.sendContactAddIQ(this.model.get("jid"),this.model.get("fullname"),[],function(){this.model.authorize().subscribe()}.bind(this))},declineRequest:function(e){e&&e.preventDefault&&e.preventDefault();var t=confirm(q("Are you sure you want to decline this contact request?"));return t===!0&&this.model.unauthorize().destroy(),this}}),this.RosterContacts=Backbone.Collection.extend({model:m.RosterContact,comparator:function(e,t){var n,r,i=e.get("chat_status")||"offline",s=t.get("chat_status")||"offline";return g[i]===g[s]?(n=e.get("fullname").toLowerCase(),r=t.get("fullname").toLowerCase(),n<r?-1:n>r?1:0):g[i]<g[s]?-1:1},subscribeToSuggestedItems:function(e){return t(e).find("item").each(function(e,t){this.getAttribute("action")==="add"&&m.roster.addAndSubscribe(this.getAttribute("jid"),null,m.xmppstatus.get("fullname"))}),!0},isSelf:function(e){return a.getBareJidFromJid(e)===a.getBareJidFromJid(m.connection.jid)},addAndSubscribe:function(e,t,n,r,i){this.addContact(e,t,n,i).done(function(e){e instanceof m.RosterContact&&e.subscribe(r)})},sendContactAddIQ:function(e,t,r,i,s){t=f.isEmpty(t)?e:t;var o=n({type:"set"}).c("query",{xmlns:a.NS.ROSTER}).c("item",{jid:e,name:t});f.map(r,function(e){o.c("group").t(e).up()}),m.connection.sendIQ(o,i,s)},addContact:function(e,n,r,i){var s=new t.Deferred;return r=r||[],n=f.isEmpty(n)?e:n,this.sendContactAddIQ(e,n,r,function(t){var o=this.create(f.extend({ask:undefined,fullname:n,groups:r,jid:e,requesting:!1,subscription:"none"},i),{sort:!1});s.resolve(o)}.bind(this),function(e){alert(q("Sorry, there was an error while trying to add "+n+" as a contact.")),m.log(e),s.resolve(e)}),s.promise()},addResource:function(e,t){var n=this.get(e),r;n&&(r=n.get("resources"),r?f.indexOf(r,t)===-1&&(r.push(t),n.set({resources:r})):n.set({resources:[t]}))},subscribeBack:function(e){var t=this.get(e);t instanceof m.RosterContact?t.authorize().subscribe():this.addContact(e,"",[],{subscription:"from"}).done(function(e){e instanceof m.RosterContact&&e.authorize().subscribe()})},getNumOnlineContacts:function(){var e=0,t=["offline","unavailable"],n=this.models,r=n.length,i;m.show_only_online_users&&(t=f.union(t,["dnd","xa","away"]));for(i=0;i<r;i++)f.indexOf(t,n[i].get("chat_status"))===-1&&e++;return e},onRosterPush:function(e){var r=e.getAttribute("id"),i=e.getAttribute("from");return i&&i!==""&&a.getBareJidFromJid(i)!==m.bare_jid?(m.connection.send(n({type:"error",id:r,from:m.connection.jid}).c("error",{type:"cancel"}).c("service-unavailable",{xmlns:a.NS.ROSTER})),!0):(m.connection.send(n({type:"result",id:r,from:m.connection.jid})),t(e).children("query").find("item").each(function(e,t){this.updateContact(t)}.bind(this)),m.emit("rosterPush",e),!0)},fetchFromServer:function(e,t){var r=n({type:"get",id:m.connection.getUniqueId("roster")}).c("query",{xmlns:a.NS.ROSTER});return m.connection.sendIQ(r,this.onReceivedFromServer.bind(this))},onReceivedFromServer:function(e){m.emit("roster",e),t(e).children("query").find("item").each(function(e,t){this.updateContact(t)}.bind(this)),m.initial_presence_sent||(m.initial_presence_sent=1,m.xmppstatus.sendPresence())},updateContact:function(e){var n=e.getAttribute("jid");if(this.isSelf(n))return;var r=[],i=this.get(n),s=e.getAttribute("ask"),o=e.getAttribute("subscription");t.map(e.getElementsByTagName("group"),function(e){r.push(a.getText(e))});if(!i){if(o==="none"&&s===null||o==="remove")return;this.create({ask:s,fullname:e.getAttribute("name")||n,groups:r,jid:n,subscription:o},{sort:!1})}else{if(o==="remove")return i.destroy();i.save({subscription:o,ask:s,requesting:null,groups:r})}},createContactFromVCard:function(e,t,n,r,i,s){var o=a.getBareJidFromJid(t);this.create({jid:o,subscription:"none",ask:null,requesting:!0,fullname:n||o,image:r,image_type:i,url:s,vcard_updated:l().format()})},handleIncomingSubscription:function(e){var t=a.getBareJidFromJid(e),n=this.get(t);m.allow_contact_requests||m.rejectPresenceSubscription(e,q("This client does not allow presence subscriptions")),m.auto_subscribe?!n||n.get("subscription")!=="to"?this.subscribeBack(t):n.authorize():n?n.get("subscription")!=="none"?n.authorize():n.get("ask")==="subscribe"&&n.authorize():n||m.getVCard(t,this.createContactFromVCard.bind(this),function(e,t){m.log("Error while retrieving vcard for "+t),this.createContactFromVCard.call(this,e,t)}.bind(this))},presenceHandler:function(e){var n=t(e),r=e.getAttribute("type");if(r==="error")return!0;var i=e.getAttribute("from"),s=a.getBareJidFromJid(i),o=a.getResourceFromJid(i),u=n.find("show").text()||"online",f=n.find("status"),l=this.get(s);if(this.isSelf(s)){m.connection.jid!==i&&r!=="unavailable"&&(m.xmppstatus.save({status:u}),f.length&&m.xmppstatus.save({status_message:f.text()}));return}if((n.find("x").attr("xmlns")||"").indexOf(a.NS.MUC)===0)return;l&&f.text()!==l.get("status")&&l.save({status:f.text()});if(r==="subscribed"&&l)l.ackSubscribe();else if(r==="unsubscribed"&&l)l.ackUnsubscribe();else{if(r==="unsubscribe")return;r==="subscribe"?this.handleIncomingSubscription(i):r==="unavailable"&&l?l.removeResource(o)===0&&l.save({chat_status:"offline"}):l&&(this.addResource(s,o),l.save({chat_status:u}))}}}),this.RosterGroup=Backbone.Model.extend({initialize:function(e,t){this.set(f.extend({description:X,state:F},e)),this.contacts=new m.RosterContacts}}),this.RosterGroupView=Backbone.Overview.extend({tagName:"dt",className:"roster-group",events:{"click a.group-toggle":"toggle"},initialize:function(){this.model.contacts.on("add",this.addContact,this),this.model.contacts.on("change:subscription",this.onContactSubscriptionChange,this),this.model.contacts.on("change:requesting",this.onContactRequestChange,this),this.model.contacts.on("change:chat_status",function(e){this.model.contacts.sort(),this.positionContact(e).render()},this),this.model.contacts.on("destroy",this.onRemove,this),this.model.contacts.on("remove",this.onRemove,this),m.roster.on("change:groups",this.onContactGroupChange,this)},render:function(){return this.$el.attr("data-group",this.model.get("name")),this.$el.html(t(m.templates.group_header({label_group:this.model.get("name"),desc_group_toggle:this.model.get("description"),toggle_state:this.model.get("state")}))),this},addContact:function(e){var t=new m.RosterContactView({model:e});this.add(e.get("id"),t),t=this.positionContact(e).render(),e.showInRoster()&&(this.model.get("state")===I?(t.$el[0].style.display!=="none"&&t.$el.hide(),this.$el.is(":visible")||this.$el.show()):this.$el[0].style.display!=="block"&&this.show())},positionContact:function(e){var t=this.get(e.get("id")),n=this.model.contacts.indexOf(e);return t.$el.detach(),n===0?this.$el.after(t.$el):n===this.model.contacts.length-1?this.$el.nextUntil("dt").last().after(t.$el):this.$el.nextUntil("dt").eq(n).before(t.$el),t},show:function(){this.$el.show(),f.each(this.getAll(),function(e){e.model.showInRoster()&&e.$el.show()})},hide:function(){this.$el.nextUntil("dt").addBack().hide()},filter:function(e){var t;e.length===0?(this.model.get("state")===F&&this.model.contacts.each(function(e){e.showInRoster()&&this.get(e.get("id")).$el.show()}.bind(this)),this.showIfNecessary()):(e=e.toLowerCase(),t=this.model.contacts.filter(p.not("fullname",e)),t.length===this.model.contacts.length?this.hide():(f.each(t,function(e){this.get(e.get("id")).$el.hide()}.bind(this)),f.each(this.model.contacts.reject(p.not("fullname",e)),function(e){this.get(e.get("id")).$el.show()}.bind(this)),this.showIfNecessary()))},showIfNecessary:function(){!this.$el.is(":visible")&&this.model.contacts.length>0&&this.$el.show()},toggle:function(e){e&&e.preventDefault&&e.preventDefault();var n=t(e.target);n.hasClass("icon-opened")?(this.$el.nextUntil("dt").slideUp(),this.model.save({state:I}),n.removeClass("icon-opened").addClass("icon-closed")):(n.removeClass("icon-closed").addClass("icon-opened"),this.model.save({state:F}),this.filter(m.rosterview.$(".roster-filter").val(),m.rosterview.$(".filter-type").val()))},onContactGroupChange:function(e){var t=f.contains(e.get("groups"),this.model.get("name")),n=e.get("id"),r=!this.get(n);t&&!r?this.model.contacts.remove(n):!t&&r&&this.addContact(e)},onContactSubscriptionChange:function(e){this.model.get("name")===J&&e.get("subscription")!=="from"&&this.model.contacts.remove(e.get("id"))},onContactRequestChange:function(e){this.model.get("name")===K&&!e.get("requesting")&&this.model.contacts.remove(e.get("id"))},onRemove:function(e){this.remove(e.get("id")),this.model.contacts.length===0&&this.$el.hide()}}),this.RosterGroups=Backbone.Collection.extend({model:m.RosterGroup,comparator:function(e,t){e=e.get("name"),t=t.get("name");var n=f.keys(Z),r=f.contains(n,e),i=f.contains(n,t);if(!r&&!i)return e.toLowerCase()<t.toLowerCase()?-1:e.toLowerCase()>t.toLowerCase()?1:0;if(r&&i)return Z[e]<Z[t]?-1:Z[e]>Z[t]?1:0;if(!r&&i)return t===V?1:-1;if(r&&!i)return e===V?-1:1}}),this.RosterView=Backbone.Overview.extend({tagName:"div",id:"converse-roster",events:{"keydown .roster-filter":"liveFilter","click .onX":"clearFilter","mousemove .x":"togglePointer","change .filter-type":"changeFilterType"},initialize:function(){this.roster_handler_ref=this.registerRosterHandler(),this.rosterx_handler_ref=this.registerRosterXHandler(),this.presence_ref=this.registerPresenceHandler(),m.roster.on("add",this.onContactAdd,this),m.roster.on("change",this.onContactChange,this),m.roster.on("destroy",this.update,this),m.roster.on("remove",this.update,this),this.model.on("add",this.onGroupAdd,this),this.model.on("reset",this.reset,this),this.$roster=t('<dl class="roster-contacts" style="display: none;"></dl>')},unregisterHandlers:function(){m.connection.deleteHandler(this.roster_handler_ref),delete this.roster_handler_ref,m.connection.deleteHandler(this.rosterx_handler_ref),delete this.rosterx_handler_ref,m.connection.deleteHandler(this.presence_ref),delete this.presence_ref},update:f.debounce(function(){var e=t("#online-count");return e.text("("+m.roster.getNumOnlineContacts()+")"),e.is(":visible")||e.show(),this.$roster.parent().length===0&&this.$el.append(this.$roster.show()),this.showHideFilter()},m.animate?100:0),render:function(){return this.$el.html(m.templates.roster({placeholder:q("Type to filter"),label_contacts:G,label_groups:Y})),m.allow_contact_requests||this.$el.addClass("no-contact-requests"),this},fetch:function(){return this.model.fetch({silent:!0,success:function(e,t,n){e.length!==0&&this.positionFetchedGroups(e,t,n),m.roster.fetch({add:!0,success:function(e){e.length>0?m.initial_presence_sent=1:m.roster.fetchFromServer()}})}.bind(this)}),this},changeFilterType:function(e){e&&e.preventDefault&&e.preventDefault(),this.clearFilter(),this.filter(this.$(".roster-filter").val(),e.target.value)},tog:function(e){return e?"addClass":"removeClass"},togglePointer:function(e){e&&e.preventDefault&&e.preventDefault();var n=e.target;t(n)[this.tog(n.offsetWidth-18<e.clientX-n.getBoundingClientRect().left)]("onX")},filter:function(e,t){e=e.toLowerCase(),t==="groups"?f.each(this.getAll(),function(t,n){t.model.get("name").toLowerCase().indexOf(e.toLowerCase())===-1?t.hide():t.model.contacts.length>0&&t.show()}):f.each(this.getAll(),function(n){n.filter(e,t)})},liveFilter:f.debounce(function(e){e&&e.preventDefault&&e.preventDefault();var t=this.$(".roster-filter"),n=t.val(),r=this.$(".filter-type").val();t[this.tog(n)]("x"),this.filter(n,r)},300),clearFilter:function(e){e&&e.preventDefault&&(e.preventDefault(),t(e.target).removeClass("x onX").val("")),this.filter("")},showHideFilter:function(){if(!this.$el.is(":visible"))return;var e=this.$(".roster-filter"),t=this.$(".filter-type"),n=e.is(":visible");if(n&&e.val().length>0)return;return this.$roster.hasScrollBar()?n||(e.show(),t.show()):(e.hide(),t.hide()),this},reset:function(){return m.roster.reset(),this.removeAll(),this.$roster=t('<dl class="roster-contacts" style="display: none;"></dl>'),this.render().update(),this},registerRosterHandler:function(){m.connection.addHandler(m.roster.onRosterPush.bind(m.roster),a.NS.ROSTER,"iq","set")},registerRosterXHandler:function(){var e=0;m.connection.addHandler(function(n){return window.setTimeout(function(){m.connection.flush(),m.roster.subscribeToSuggestedItems.bind(m.roster)(n)},e),e+=t(n).find("item").length*250,!0},a.NS.ROSTERX,"message",null)},registerPresenceHandler:function(){m.connection.addHandler(function(e){return m.roster.presenceHandler(e),!0}.bind(this),null,"presence",null)},onGroupAdd:function(e){var t=new m.RosterGroupView({model:e});this.add(e.get("name"),t.render()),this.positionGroup(t)},onContactAdd:function(e){this.addRosterContact(e).update(),e.get("vcard_updated")||m.getVCard(e.get("jid"))},onContactChange:function(e){this.updateChatBox(e).update(),f.has(e.changed,"subscription")&&(e.changed.subscription==="from"?this.addContactToGroup(e,J):f.contains(["both","to"],e.get("subscription"))&&this.addExistingContact(e)),f.has(e.changed,"ask")&&e.changed.ask==="subscribe"&&this.addContactToGroup(e,J),f.has(e.changed,"subscription")&&e.changed.requesting==="true"&&this.addContactToGroup(e,K),this.liveFilter()},updateChatBox:function(e){var t=m.chatboxes.get(e.get("jid")),n={};return t?(f.has(e.changed,"chat_status")&&(n.chat_status=e.get("chat_status")),f.has(e.changed,"status")&&(n.status=e.get("status")),t.save(n),this):this},positionFetchedGroups:function(e,t,n){e.sort(),e.each(function(e,t){var n=this.get(e.get("name"));n||(n=new m.RosterGroupView({model:e}),this.add(e.get("name"),n.render())),t===0?this.$roster.append(n.$el):this.appendGroup(n)}.bind(this))},positionGroup:function(e){var n=this.$roster.find(".roster-group"),r=n.length?this.model.indexOf(e.model):0;return r===0?this.$roster.prepend(e.$el):r===this.model.length-1?this.appendGroup(e):t(n.eq(r)).before(e.$el),this},appendGroup:function(e){var t=this.$roster.find(".roster-group").last(),n=t.siblings("dd");return n.length>0?n.last().after(e.$el):t.after(e.$el),this},getGroup:function(e){var t=this.get(e);return t?t.model:this.model.create({name:e,id:h(e)})},addContactToGroup:function(e,t){this.getGroup(t).contacts.add(e)},addExistingContact:function(e){var t;m.roster_groups?(t=e.get("groups"),t.length===0&&(t=[Q])):t=[V],f.each(t,f.bind(this.addContactToGroup,this,e))},addRosterContact:function(e){return e.get("subscription")==="both"||e.get("subscription")==="to"?this.addExistingContact(e):e.get("ask")==="subscribe"||e.get("subscription")==="from"?this.addContactToGroup(e,J):e.get("requesting")===!0&&this.addContactToGroup(e,K),this}}),this.XMPPStatus=Backbone.Model.extend({initialize:function(){this.set({status:this.getStatus()}),this.on("change",function(e){this.get("fullname")===undefined&&m.getVCard(null,function(e,t,n,r,i,s){this.save({fullname:n})}.bind(this)),f.has(e.changed,"status")&&m.emit("statusChanged",this.get("status")),f.has(e.changed,"status_message")&&m.emit("statusMessageChanged",this.get("status_message"))}.bind(this))},constructPresence:function(e,t){typeof e=="undefined"&&(e=this.get("status")||"online"),typeof t=="undefined"&&(t=this.get("status_message"));var n;return e==="unavailable"||e==="probe"||e==="error"||e==="unsubscribe"||e==="unsubscribed"||e==="subscribe"||e==="subscribed"?n=i({type:e}):e==="offline"?(n=i({type:"unavailable"}),t&&n.c("show").t(e)):(e==="online"?n=i():n=i().c("show").t(e).up(),t&&n.c("status").t(t)),n},sendPresence:function(e,t){m.connection.send(this.constructPresence(e,t))},setStatus:function(e){this.sendPresence(e),this.save({status:e})},getStatus:function(){return this.get("status")||"online"},setStatusMessage:function(e){this.sendPresence(this.getStatus(),e);var n=this.get("status_message");this.save({status_message:e}),this.xhr_custom_status&&t.ajax({url:this.xhr_custom_status_url,type:"POST",data:{msg:e}}),n===e&&this.trigger("update-status-ui",this)}}),this.XMPPStatusView=Backbone.View.extend({el:"span#xmpp-status-holder",events:{"click a.choose-xmpp-status":"toggleOptions","click #fancy-xmpp-status-select a.change-xmpp-status-message":"renderStatusChangeForm","submit #set-custom-xmpp-status":"setStatusMessage","click .dropdown dd ul li a":"setStatus"},initialize:function(){this.model.on("change:status",this.updateStatusUI,this),this.model.on("change:status_message",this.updateStatusUI,this),this.model.on("update-status-ui",this.updateStatusUI,this)},render:function(){var e=this.$el.find("select#select-xmpp-status"),n=this.model.get("status")||"offline",r=t("option",e),i,s=[];return this.$el.html(m.templates.choose_status()),this.$el.find("#fancy-xmpp-status-select").html(m.templates.chat_status({status_message:this.model.get("status_message")||q("I am %1$s",this.getPrettyStatus(n)),chat_status:n,desc_custom_status:q("Click here to write a custom status message"),desc_change_status:q("Click to change your chat status")})),r.each(function(){s.push(m.templates.status_option({value:t(this).val(),text:this.text}))}),i=this.$el.find("#target dd ul").hide(),i.append(s.join("")),e.remove(),this},toggleOptions:function(e){e.preventDefault(),t(e.target).parent().parent().siblings("dd").find("ul").toggle("fast")},renderStatusChangeForm:function(e){e.preventDefault();var t=this.model.get("status")||"offline",n=m.templates.change_status_message({status_message:t,label_custom_status:q("Custom status"),label_save:q("Save")}),r=this.$el.find(".xmpp-status");r.parent().addClass("no-border"),r.replaceWith(n),this.$el.find(".custom-xmpp-status").focus().focus()},setStatusMessage:function(e){e.preventDefault(),this.model.setStatusMessage(t(e.target).find("input").val())},setStatus:function(e){e.preventDefault();var n=t(e.target),r=n.attr("data-value");r==="logout"?(this.$el.find(".dropdown dd ul").hide(),m.logOut()):(this.model.setStatus(r),this.$el.find(".dropdown dd ul").hide())},getPrettyStatus:function(e){return e==="chat"?q("online"):e==="dnd"?q("busy"):e==="xa"?q("away for long"):e==="away"?q("away"):e==="offline"?q("offline"):q(e)||q("online")},updateStatusUI:function(e){var t=e.get("status"),n=e.get("status_message")||q("I am %1$s",this.getPrettyStatus(t));this.$el.find("#fancy-xmpp-status-select").removeClass("no-border").html(m.templates.chat_status({chat_status:t,status_message:n,desc_custom_status:q("Click here to write a custom status message"),desc_change_status:q("Click to change your chat status")}))}}),this.Session=Backbone.Model,this.Feature=Backbone.Model,this.Features=Backbone.Collection.extend({model:m.Feature,initialize:function(){this.addClientIdentities().addClientFeatures(),this.browserStorage=new Backbone.BrowserStorage[m.storage](h("converse.features"+m.bare_jid)),this.on("add",this.onFeatureAdded,this),this.browserStorage.records.length===0?(m.connection.disco.info(m.domain,null,this.onInfo.bind(this)),m.connection.disco.items(m.domain,null,this.onItems.bind(this))):this.fetch({add:!0})},onFeatureAdded:function(e){var t=e.get("preferences")||{};m.emit("serviceDiscovered",e),e.get("var")===a.NS.MAM&&t["default"]!==m.message_archiving&&m.connection.sendIQ(n({type:"get"}).c("prefs",{xmlns:a.NS.MAM}),f.bind(this.onMAMPreferences,this,e),f.bind(this.onMAMError,this,e))},onMAMPreferences:function(e,r){var i=t(r).find('prefs[xmlns="'+a.NS.MAM+'"]'),s=i.attr("default"),o;s!==m.message_archiving?(o=n({type:"set"}).c("prefs",{xmlns:a.NS.MAM,"default":m.message_archiving}),i.children().each(function(e,t){o.cnode(t).up()}),m.connection.sendIQ(o,f.bind(function(e,t){e.save({preferences:{"default":m.message_archiving}})},this,e),f.bind(this.onMAMError,this,e))):e.save({preferences:{"default":m.message_archiving}})},onMAMError:function(e){t(e).find("feature-not-implemented").length?m.log("Message Archive Management (XEP-0313) not supported by this browser"):(m.log("An error occured while trying to set archiving preferences."),m.log(e))},addClientIdentities:function(){return m.connection.disco.addIdentity("client","web","Converse.js"),this},addClientFeatures:function(){return m.connection.disco.addFeature("jabber:x:conference"),m.connection.disco.addFeature(a.NS.BOSH),m.connection.disco.addFeature(a.NS.CHATSTATES),m.connection.disco.addFeature(a.NS.DISCO_INFO),m.connection.disco.addFeature(a.NS.MAM),m.connection.disco.addFeature(a.NS.ROSTERX),m.use_vcards&&m.connection.disco.addFeature(a.NS.VCARD),m.allow_muc&&m.connection.disco.addFeature(a.NS.MUC),m.message_carbons&&m.connection.disco.addFeature(a.NS.CARBONS),this},onItems:function(e){t(e).find("query item").each(function(e,n){m.connection.disco.info(t(n).attr("jid"),null,this.onInfo.bind(this))}.bind(this))},onInfo:function(e){var n=t(e);if(n.find("identity[category=server][type=im]").length===0&&n.find("identity[category=conference][type=text]").length===0)return;n.find("feature").each(function(e,r){var i=t(r).attr("var");this[i]=!0,this.create({"var":i,from:n.attr("from")})}.bind(this))}}),this.RegisterPanel=Backbone.View.extend({tagName:"div",id:"register",className:"controlbox-pane",events:{"submit form#converse-register":"onProviderChosen"},initialize:function(e){this.reset(),this.$parent=e.$parent,this.$tabs=e.$parent.parent().find("#controlbox-tabs"),this.registerHooks()},render:function(){return this.$parent.append(this.$el.html(m.templates.register_panel({label_domain:q("Your XMPP provider's domain name:"),label_register:q("Fetch registration form"),help_providers:q("Tip: A list of public XMPP providers is available"),help_providers_link:q("here"),href_providers:m.providers_link,domain_placeholder:m.domain_placeholder}))),this.$tabs.append(m.templates.register_tab({label_register:q("Register")})),this},registerHooks:function(){var e=m.connection,t=e._connect_cb.bind(e);e._connect_cb=function(e,n,r){this._registering?this.getRegistrationFields(e,n,r)&&(this._registering=!1):t(e,n,r)}.bind(this)},getRegistrationFields:function(e,t,r){m.log("sendQueryStanza was called");var i=m.connection;i.connected=!0;var s=i._proto._reqToData(e);if(!s)return;if(i._proto._connect_cb(s)===a.Status.CONNFAIL)return!1;var o=s.getElementsByTagName("register"),u=s.getElementsByTagName("mechanism");return o.length===0&&u.length===0?(i._proto._no_auth_received(t),!1):o.length===0?(i._changeConnectStatus(a.Status.REGIFAIL,q("Sorry, the given provider does not support in band account registration. Please try with a different provider.")),!0):(i._addSysHandler(this.onRegistrationFields.bind(this),null,"iq",null,null),i.send(n({type:"get"}).c("query",{xmlns:a.NS.REGISTER}).tree()),!0)},onRegistrationFields:function(e){return e.getElementsByTagName("query").length!==1?(m.connection._changeConnectStatus(a.Status.REGIFAIL,"unknown"),!1):(this.setFields(e),this.renderRegistrationForm(e),!1)},reset:function(e){var t={fields:{},urls:[],title:"",instructions:"",registered:!1,_registering:!1,domain:null,form_type:null};f.extend(this,t),e&&f.extend(this,f.pick(e,Object.keys(t)))},onProviderChosen:function(e){e&&e.preventDefault&&e.preventDefault();var n=t(e.target),r=n.find("input[name=domain]"),i=r.val();if(!i){r.addClass("error");return}return n.find("input[type=submit]").hide().after(m.templates.registration_request({cancel:q("Cancel"),info_message:q("Requesting a registration form from the XMPP server")})),n.find("button.cancel").on("click",this.cancelRegistration.bind(this)),this.reset({domain:a.getDomainFromJid(i),_registering:!0}),m.connection.connect(this.domain,"",this.onRegistering.bind(this)),!1},giveFeedback:function(e,n){this.$(".reg-feedback").attr("class","reg-feedback").text(e),n&&t(".reg-feedback").addClass(n)},onRegistering:function(e,n){var r;m.log("onRegistering"),f.contains([a.Status.DISCONNECTED,a.Status.CONNFAIL,a.Status.REGIFAIL,a.Status.NOTACCEPTABLE,a.Status.CONFLICT],e)?(m.log("Problem during registration: Strophe.Status is: "+e),this.cancelRegistration(),n?this.giveFeedback(n,"error"):this.giveFeedback(q('Something went wrong while establishing a connection with "%1$s". Are you sure it exists?',this.domain),"error")):e===a.Status.REGISTERED&&(m.log("Registered successfully."),m.connection.reset(),r=this,this.$("form").hide(function(){t(this).replaceWith('<span class="spinner centered"/>'),r.fields.password&&r.fields.username?(m.connection.connect(r.fields.username.toLowerCase()+"@"+r.domain.toLowerCase(),r.fields.password,m.onConnectStatusChanged),m.chatboxviews.get("controlbox").switchTab({target:r.$tabs.find(".current")}).giveFeedback(q("Now logging you in"))):m.chatboxviews.get("controlbox").renderLoginPanel().giveFeedback(q("Registered successfully")),r.reset()}))},renderRegistrationForm:function(n){var r=this.$("form"),i=t(n),s,o;r.empty().append(m.templates.registration_form({domain:this.domain,title:this.title,instructions:this.instructions})),this.form_type==="xform"?(s=i.find("field"),f.each(s,function(e){r.append(c.xForm2webForm.bind(this,t(e),i))}.bind(this))):(f.each(Object.keys(this.fields),function(n){n==="username"?o=e.form_username({domain:" @"+this.domain,name:n,type:"text",label:n,value:"",required:1}):(r.append("<label>"+n+"</label>"),o=t('<input placeholder="'+n+'" name="'+n+'"></input>'),(n==="password"||n==="email")&&o.attr("type",n)),r.append(o)}.bind(this)),f.each(this.urls,function(e){r.append(t('<a target="blank"></a>').attr("href",e).text(e))}.bind(this))),this.fields?(r.append('<input type="submit" class="pure-button button-primary" value="'+q("Register")+'"/>'),r.on("submit",this.submitRegistrationForm.bind(this)),r.append('<input type="button" class="pure-button button-cancel" value="'+q("Cancel")+'"/>'),r.find("input[type=button]").on("click",this.cancelRegistration.bind(this))):(r.append('<input type="button" class="submit" value="'+q("Return")+'"/>'),r.find("input[type=button]").on("click",this.cancelRegistration.bind(this)))},reportErrors:function(e){var n=this.$("form"),r,i=t(e).find("error text"),s=n.find(".form-errors");s.length?s.empty():(r='<legend class="form-errors"></legend>',n.find("p.instructions").length?n.find("p.instructions").append(r):n.prepend(r),s=n.find(".form-errors")),i.each(function(e,n){s.append(t("<p>").text(t(n).text()))}),i.length||s.append(t("<p>").text(q("The provider rejected your registration attempt. Please check the values you entered for correctness."))),s.show()},cancelRegistration:function(e){e&&e.preventDefault&&e.preventDefault(),m.connection.reset(),this.render()},submitRegistrationForm:function(e){e&&e.preventDefault&&e.preventDefault();var r=this.$("input.required:emptyVal");if(r.length){r.addClass("error");return}var i=t(e.target).find(":input:not([type=button]):not([type=submit])"),s=n({type:"set"}).c("query",{xmlns:a.NS.REGISTER});this.form_type==="xform"?(s.c("x",{xmlns:a.NS.XFORM,type:"submit"}),i.each(function(){s.cnode(c.webForm2xForm(this)).up()})):i.each(function(){var e=t(this);s.c(e.attr("name"),{},e.val())}),m.connection._addSysHandler(this._onRegisterIQ.bind(this),null,"iq",null,null),m.connection.send(s),this.setFields(s.tree())},setFields:function(e){var n=t(e).find("query"),r;n.length>0&&(r=n.find('x[xmlns="'+a.NS.XFORM+'"]'),r.length>0?this._setFieldsFromXForm(r):this._setFieldsFromLegacy(n))},_setFieldsFromLegacy:function(e){e.children().each(function(e,n){var r=t(n);if(n.tagName.toLowerCase()==="instructions"){this.instructions=a.getText(n);return}if(n.tagName.toLowerCase()==="x"){r.attr("xmlns")==="jabber:x:oob"&&r.find("url").each(function(e,n){this.urls.push(t(n).text())}.bind(this));return}this.fields[n.tagName.toLowerCase()]=a.getText(n)}.bind(this)),this.form_type="legacy"},_setFieldsFromXForm:function(e){this.title=e.find("title").text(),this.instructions=e.find("instructions").text(),e.find("field").each(function(e,n){var r=n.getAttribute("var");r?this.fields[r.toLowerCase()]=t(n).children("value").text():m.log("WARNING: Found field we couldn't parse")}.bind(this)),this.form_type="xform"},_onRegisterIQ:function(e){var t=null,n=e.getElementsByTagName("query");n.length>0&&(n=n[0]);if(e.getAttribute("type")==="error"){m.log("Registration failed."),t=e.getElementsByTagName("error");if(t.length!==1)return m.connection._changeConnectStatus(a.Status.REGIFAIL,"unknown"),!1;t=t[0].firstChild.tagName.toLowerCase(),t==="conflict"?m.connection._changeConnectStatus(a.Status.CONFLICT,t):t==="not-acceptable"?m.connection._changeConnectStatus(a.Status.NOTACCEPTABLE,t):m.connection._changeConnectStatus(a.Status.REGIFAIL,t),this.reportErrors(e)}else m.connection._changeConnectStatus(a.Status.REGISTERED,null);return!1},remove:function(){this.$tabs.empty(),this.$el.parent().empty()}}),this.LoginPanel=Backbone.View.extend({tagName:"div",id:"login-dialog",className:"controlbox-pane",events:{"submit form#converse-login":"authenticate"},initialize:function(e){e.$parent.html(this.$el.html(m.templates.login_panel({LOGIN:E,ANONYMOUS:S,PREBIND:x,auto_login:m.auto_login,authentication:m.authentication,label_username:q("XMPP Username:"),label_password:q("Password:"),label_anon_login:q("Click here to log in anonymously"),label_login:q("Log In"),placeholder_username:q("user@server"),placeholder_password:q("password")}))),this.$tabs=e.$parent.parent().find("#controlbox-tabs")},render:function(){return this.$tabs.append(m.templates.login_tab({label_sign_in:q("Sign in")})),this.$el.find("input#jid").focus(),this.$el.is(":visible")||this.$el.show(),this},authenticate:function(e){e&&e.preventDefault&&e.preventDefault();var n=t(e.target);if(m.authentication===S){this.connect(n,m.jid,null);return}var r=n.find("input[name=jid]"),i=r.val(),s=n.find("input[name=password]"),o=s.val(),u=!1;i||(u=!0,r.addClass("error")),o||(u=!0,s.addClass("error"));if(u)return;return this.connect(n,i,o),!1},connect:function(e,t,n){var r;e&&e.find("input[type=submit]").hide().after('<span class="spinner login-submit"/>'),t&&(r=a.getResourceFromJid(t),r?t=a.getBareJidFromJid(t).toLowerCase()+"/"+a.getResourceFromJid(t):t=t.toLowerCase()+"/converse.js-"+Math.floor(Math.random()*139749825).toString()),m.connection.connect(t,n,m.onConnectStatusChanged)},remove:function(){this.$tabs.empty(),this.$el.parent().empty()}}),this.ControlBoxToggle=Backbone.View.extend({tagName:"a",className:"toggle-controlbox",id:"toggle-controlbox",events:{click:"onClick"},attributes:{href:"#"},initialize:function(){this.render()},render:function(){return t("#conversejs").prepend(this.$el.html(m.templates.controlbox_toggle({label_toggle:q("Toggle chat")}))),this.$el.hide(),this},hide:function(e){this.$el.fadeOut("fast",e)},show:function(e){this.$el.show("fast",e)},showControlBox:function(){var e=m.chatboxes.get("controlbox");e||(e=m.addControlBox()),m.connection.connected?e.save({closed:!1}):e.trigger("show")},onClick:function(e){e.preventDefault();if(t("div#controlbox").is(":visible")){var n=m.chatboxes.get("controlbox");m.connection.connected?n.save({closed:!0}):n.trigger("hide")}else this.showControlBox()}}),this.addControlBox=function(){return this.chatboxes.add({id:"controlbox",box_id:"controlbox",closed:!this.show_controlbox_by_default})},this.setUpXMLLogging=function(){this.debug&&(this.connection.xmlInput=function(e){m.log(e)},this.connection.xmlOutput=function(e){m.log(e)})},this.startNewBOSHSession=function(){t.ajax({url:this.prebind_url,type:"GET",success:function(e){this.connection.attach(e.jid,e.sid,e.rid,this.onConnectStatusChanged)}.bind(this),error:function(e){delete this.connection,this.emit("noResumeableSession")}.bind(this)})},this.attemptPreboundSession=function(e){if(!this.keepalive){if(this.jid&&this.sid&&this.rid)return this.connection.attach(this.jid,this.sid,this.rid,this.onConnectStatusChanged);throw new Error("initConnection: If you use prebind and not keepalive, then you MUST supply JID, RID and SID values")}if(!this.jid)throw new Error("initConnection: when using 'keepalive' with 'prebind, you must supply the JID of the current user.");try{return this.connection.restore(this.jid,this.onConnectStatusChanged)}catch(t){m.log("Could not restore session for jid: "+this.jid+" Error message: "+t.message)}this.prebind_url?this.startNewBOSHSession():(delete this.connection,this.emit("noResumeableSession"))},this.attemptNonPreboundSession=function(){if(this.keepalive)try{return this.connection.restore(undefined,this.onConnectStatusChanged)}catch(e){m.log("Could not restore sessions. Error message: "+e.message)}if(this.auto_login){if(!this.jid)throw new Error("initConnection: If you use auto_login, you also need to provide a jid value");if(this.authentication===S)this.connection.connect(this.jid.toLowerCase(),null,this.onConnectStatusChanged);else if(this.authentication===E){if(!this.password)throw new Error("initConnection: If you use auto_login and authentication='login' then you also need to provide a password.");this.jid=a.getBareJidFromJid(this.jid).toLowerCase()+"/"+a.getResourceFromJid(this.jid),this.connection.connect(this.jid,this.password,this.onConnectStatusChanged)}}},this.initConnection=function(){if(this.connection&&this.connection.connected)this.setUpXMLLogging(),this.onConnected();else{if(!this.bosh_service_url&&!this.websocket_url)throw new Error("initConnection: you must supply a value for either the bosh_service_url or websocket_url or both.");if(("WebSocket"in window||"MozWebSocket"in window)&&this.websocket_url)this.connection=new a.Connection(this.websocket_url);else{if(!this.bosh_service_url)throw new Error("initConnection: this browser does not support websockets and bosh_service_url wasn't specified.");this.connection=new a.Connection(this.bosh_service_url,{keepalive:this.keepalive})}this.setUpXMLLogging(),this.authentication===x?this.attemptPreboundSession():this.attemptNonPreboundSession()}},this._tearDown=function(){return this.initial_presence_sent=!1,this.roster&&this.roster.off().reset(),this.rosterview&&(this.rosterview.unregisterHandlers(),this.rosterview.model.off().reset(),this.rosterview.undelegateEvents().remove()),this.chatboxes.remove(),this.features&&this.features.reset(),this.minimized_chats&&(this.minimized_chats.undelegateEvents().model.reset(),this.minimized_chats.removeAll(),this.minimized_chats.tearDown().remove(),delete this.minimized_chats),this},this._initialize=function(){return this.chatboxes=new this.ChatBoxes,this.chatboxviews=new this.ChatBoxViews({model:this.chatboxes}),this.controlboxtoggle=new this.ControlBoxToggle,this.otr=new this.OTR,this.initSession(),this.initConnection(),this.connection&&this.addControlBox(),this},this._overrideAttribute=function(e,t){var n=t.overrides[e];typeof n=="function"?(typeof t._super=="undefined"&&(t._super={converse:m}),t._super[e]=m[e].bind(m),m[e]=n.bind(t)):m[e]=n},this._extendObject=function(e,t){e.prototype._super||(e.prototype._super={converse:m}),f.each(t,function(t,n){n==="events"?e.prototype[n]=f.extend(t,e.prototype[n]):(typeof t=="function"&&(e.prototype._super[n]=e.prototype[n]),e.prototype[n]=t)})},this._initializePlugins=function(){f.each(this.plugins,function(e){e.converse=m,f.each(Object.keys(e.overrides),function(t){var n=e.overrides[t];typeof n=="object"?this._extendObject(m[t],n):this._overrideAttribute(t,e)}.bind(this)),typeof e.initialize=="function"?e.initialize.bind(e)(this):e.bind(this)(this)}.bind(this))},d.connection&&(this.connection=d.connection),this._initializePlugins(),this._initialize(),this.registerGlobalEventHandlers(),m.emit("initialized")};var y=function(e){if(!e)return;var t=d.chatboxviews.get(e.get("jid"));return{close:t.close.bind(t),endOTR:e.endOTR.bind(e),focus:t.focus.bind(t),get:e.get.bind(e),initiateOTR:e.initiateOTR.bind(e),is_chatroom:e.is_chatroom,maximize:e.maximize.bind(e),minimize:e.minimize.bind(e),open:t.show.bind(t),set:e.set.bind(e)}},b={initialize:function(e,t){d.initialize(e,t)},disconnect:function(){d.connection.disconnect()},account:{logout:function(){d.logOut()}},user:{logout:function(){d.logOut()},status:{get:function(){return d.xmppstatus.get("status")},set:function(e,t){var n={status:e};if(!f.contains(f.keys(g),e))throw new Error("Invalid availability value. See https://xmpp.org/rfcs/rfc3921.html#rfc.section.2.2.2.1");typeof t=="string"&&(n.status_message=t),d.xmppstatus.save(n)},message:{get:function(){return d.xmppstatus.get("status_message")},set:function(e){d.xmppstatus.save({status_message:e})}}}},settings:{get:function(e){if(f.contains(Object.keys(d.default_settings),e))return d[e]},set:function(e,t){var n={};typeof e=="object"?f.extend(d,f.pick(e,Object.keys(d.default_settings))):typeof e=="string"&&(n[e]=t,f.extend(d,f.pick(n,Object.keys(d.default_settings))))}},contacts:{get:function(e){var t=function(e){var t=d.roster.get(a.getBareJidFromJid(e));return t?t.attributes:null};if(typeof e=="undefined")e=d.roster.pluck("jid");else if(typeof e=="string")return t(e);return f.map(e,t)},add:function(e,t){if(typeof e!="string"||e.indexOf("@")<0)throw new TypeError("contacts.add: invalid jid");d.roster.addAndSubscribe(e,f.isEmpty(t)?e:t)}},chats:{open:function(e){var t;return typeof e=="undefined"?(d.log("chats.open: You need to provide at least one JID","error"),null):typeof e=="string"?(t=y(d.chatboxes.getChatBox(e,!0)),t.open(),t):f.map(e,function(e){return t=y(d.chatboxes.getChatBox(e,!0)),t.open(),t})},get:function(e){return typeof e=="undefined"?(d.log("chats.get: You need to provide at least one JID","error"),null):typeof e=="string"?y(d.chatboxes.getChatBox(e,!0)):f.map(e,f.partial(f.compose(y,d.chatboxes.getChatBox.bind(d.chatboxes)),f,!0))}},archive:{query:function(e,r,i){var s,o=[];typeof e=="function"&&(r=e,i=r);if(!d.features.findWhere({"var":a.NS.MAM}))throw new Error("This server does not support XEP-0313, Message Archive Management");var u=d.connection.getUniqueId(),c={type:"set"};if(typeof e!="undefined"&&e.groupchat){if(!e["with"])throw new Error('You need to specify a "with" value containing the chat room JID, when querying groupchat messages.');c.to=e["with"]}var h=n(c).c("query",{xmlns:a.NS.MAM,queryid:u});typeof e!="undefined"&&(h.c("x",{xmlns:a.NS.XFORM,type:"submit"}).c("field",{"var":"FORM_TYPE",type:"hidden"}).c("value").t(a.NS.MAM).up().up(),e["with"]&&!e.groupchat&&h.c("field",{"var":"with"}).c("value").t(e["with"]).up().up(),f.each(["start","end"],function(t){if(e[t]){s=l(e[t]);if(!s.isValid())throw new TypeError("archive.query: invalid date provided for: "+t);h.c("field",{"var":t}).c("value").t(s.format()).up().up()}}),h.up(),e instanceof a.RSM?h.cnode(e.toXML()):f.intersection(v,f.keys(e)).length&&h.cnode((new a.RSM(e)).toXML())),d.connection.addHandler(function(n){var i=t(n),s,l;if(typeof r=="function")return s=i.find('fin[xmlns="'+a.NS.MAM+'"]'),s.length?(l=new a.RSM({xml:s.find("set")[0]}),f.extend(l,f.pick(e,["max"])),f.extend(l,f.pick(e,m)),r(o,l),!1):(u===i.find("result").attr("queryid")&&o.push(n),!0);return!1},a.NS.MAM),d.connection.sendIQ(h,null,i)}},rooms:{open:function(e,t){t||(t=a.getNodeFromJid(d.bare_jid));if(typeof t!="string")throw new TypeError("rooms.open: invalid nick, must be string");var n=function(e){var n=d.chatboxes.get(e);return d.log("jid"),n||(n=d.chatboxviews.showChat({id:e,jid:e,name:a.unescapeNode(a.getNodeFromJid(e)),nick:t,chatroom:!0,box_id:h(e)})),y(d.chatboxes.getChatBox(e,!0))};if(typeof e=="undefined")throw new TypeError("rooms.open: You need to provide at least one JID");return typeof e=="string"?n(e):f.map(e,n)},get:function(e){if(typeof e=="undefined")throw new TypeError("rooms.get: You need to provide at least one JID");return typeof e=="string"?y(d.chatboxes.getChatBox(e,!0)):f.map(e,f.partial(y,f.bind(d.chatboxes.getChatBox,d.chatboxes,f,!0)))}},tokens:{get:function(e){if(!d.expose_rid_and_sid||typeof d.connection=="undefined")return null;if(e.toLowerCase()==="rid")return d.connection.rid||d.connection._proto.rid;if(e.toLowerCase()==="sid")return d.connection.sid||d.connection._proto.sid}},listen:{once:function(e,t){d.once(e,t)},on:function(e,t){d.on(e,t)},not:function(e,t){d.off(e,t)}},send:function(e){d.connection.send(e)},ping:function(e){d.ping(e)},plugins:{add:function(e,t){d.plugins[e]=t},remove:function(e){delete d.plugins[e]},override:function(e,t){d._overrideAttribute(e,t)},extend:function(e,t){d._extendObject(e,t)}},env:{$build:s,$iq:n,$msg:r,$pres:i,Strophe:a,_:f,b64_sha1:h,jQuery:t,moment:l}};return b});var config;typeof require=="undefined"&&(require={config:function(e){config=e}}),require.config({baseUrl:".",paths:{backbone:"components/backbone/backbone","backbone.browserStorage":"components/backbone.browserStorage/backbone.browserStorage","backbone.overview":"components/backbone.overview/backbone.overview","converse-dependencies":"src/deps-full","converse-templates":"src/templates",eventemitter:"components/otr/build/dep/eventemitter",jquery:"components/jquery/dist/jquery","jquery-private":"src/jquery-private","jquery.browser":"components/jquery.browser/dist/jquery.browser","jquery.easing":"components/jquery-easing-original/index",moment:"components/momentjs/moment",strophe:"components/strophejs/src/wrapper","strophe-base64":"components/strophejs/src/base64","strophe-bosh":"components/strophejs/src/bosh","strophe-core":"components/strophejs/src/core","strophe-md5":"components/strophejs/src/md5","strophe-polyfill":"components/strophejs/src/polyfills","strophe-sha1":"components/strophejs/src/sha1","strophe-websocket":"components/strophejs/src/websocket","strophe.disco":"components/strophejs-plugins/disco/strophe.disco","strophe.ping":"src/strophe.ping","strophe.rsm":"components/strophejs-plugins/rsm/strophe.rsm","strophe.vcard":"src/strophe.vcard",text:"components/requirejs-text/text",tpl:"components/requirejs-tpl-jcbrand/tpl",typeahead:"components/typeahead.js/index",underscore:"components/underscore/underscore",utils:"src/utils",polyfill:"src/polyfill",bigint:"src/bigint",crypto:"src/crypto","crypto.aes":"components/otr/vendor/cryptojs/aes","crypto.cipher-core":"components/otr/vendor/cryptojs/cipher-core","crypto.core":"components/otr/vendor/cryptojs/core","crypto.enc-base64":"components/otr/vendor/cryptojs/enc-base64","crypto.evpkdf":"components/crypto-js-evanvosberg/src/evpkdf","crypto.hmac":"components/otr/vendor/cryptojs/hmac","crypto.md5":"components/crypto-js-evanvosberg/src/md5","crypto.mode-ctr":"components/otr/vendor/cryptojs/mode-ctr","crypto.pad-nopadding":"components/otr/vendor/cryptojs/pad-nopadding","crypto.sha1":"components/otr/vendor/cryptojs/sha1","crypto.sha256":"components/otr/vendor/cryptojs/sha256",salsa20:"components/otr/build/dep/salsa20",otr:"src/otr",locales:"src/locales",jed:"components/jed/jed",af:"locale/af/LC_MESSAGES/converse.json",de:"locale/de/LC_MESSAGES/converse.json",en:"locale/en/LC_MESSAGES/converse.json",es:"locale/es/LC_MESSAGES/converse.json",fr:"locale/fr/LC_MESSAGES/converse.json",he:"locale/he/LC_MESSAGES/converse.json",hu:"locale/hu/LC_MESSAGES/converse.json",id:"locale/id/LC_MESSAGES/converse.json",it:"locale/it/LC_MESSAGES/converse.json",ja:"locale/ja/LC_MESSAGES/converse.json",nb:"locale/nb/LC_MESSAGES/converse.json",nl:"locale/nl/LC_MESSAGES/converse.json",pl:"locale/pl/LC_MESSAGES/converse.json",pt_BR:"locale/pt_BR/LC_MESSAGES/converse.json",ru:"locale/ru/LC_MESSAGES/converse.json",uk:"locale/uk/LC_MESSAGES/converse.json",zh:"locale/zh/LC_MESSAGES/converse.json",moment_with_locales:"src/moment_locales",moment_af:"components/momentjs/locale/af",moment_de:"components/momentjs/locale/de",moment_es:"components/momentjs/locale/es",moment_fr:"components/momentjs/locale/fr",moment_he:"components/momentjs/locale/he",moment_hu:"components/momentjs/locale/hu",moment_id:"components/momentjs/locale/id",moment_it:"components/momentjs/locale/it",moment_ja:"components/momentjs/locale/ja",moment_nb:"components/momentjs/locale/nb",moment_nl:"components/momentjs/locale/nl",moment_pl:"components/momentjs/locale/pl","moment_pt-br":"components/momentjs/locale/pt-br",moment_ru:"components/momentjs/locale/ru",moment_uk:"components/momentjs/locale/uk",moment_zh:"components/momentjs/locale/zh-cn",action:"src/templates/action",add_contact_dropdown:"src/templates/add_contact_dropdown",add_contact_form:"src/templates/add_contact_form",change_status_message:"src/templates/change_status_message",chat_status:"src/templates/chat_status",chatarea:"src/templates/chatarea",chatbox:"src/templates/chatbox",chatroom:"src/templates/chatroom",chatroom_form:"src/templates/chatroom_form",chatroom_password_form:"src/templates/chatroom_password_form",chatroom_sidebar:"src/templates/chatroom_sidebar",chatrooms_tab:"src/templates/chatrooms_tab",chats_panel:"src/templates/chats_panel",choose_status:"src/templates/choose_status",contacts_panel:"src/templates/contacts_panel",contacts_tab:"src/templates/contacts_tab",controlbox:"src/templates/controlbox",controlbox_toggle:"src/templates/controlbox_toggle",field:"src/templates/field",form_captcha:"src/templates/form_captcha",form_checkbox:"src/templates/form_checkbox",form_input:"src/templates/form_input",form_select:"src/templates/form_select",form_textarea:"src/templates/form_textarea",form_username:"src/templates/form_username",group_header:"src/templates/group_header",info:"src/templates/info",login_panel:"src/templates/login_panel",login_tab:"src/templates/login_tab",message:"src/templates/message",new_day:"src/templates/new_day",occupant:"src/templates/occupant",pending_contact:"src/templates/pending_contact",pending_contacts:"src/templates/pending_contacts",register_panel:"src/templates/register_panel",register_tab:"src/templates/register_tab",registration_form:"src/templates/registration_form",registration_request:"src/templates/registration_request",requesting_contact:"src/templates/requesting_contact",requesting_contacts:"src/templates/requesting_contacts",room_description:"src/templates/room_description",room_item:"src/templates/room_item",room_panel:"src/templates/room_panel",roster:"src/templates/roster",roster_item:"src/templates/roster_item",search_contact:"src/templates/search_contact",select_option:"src/templates/select_option",status_option:"src/templates/status_option",toggle_chats:"src/templates/toggle_chats",toolbar:"src/templates/toolbar",trimmed_chat:"src/templates/trimmed_chat",vcard:"src/templates/vcard"},map:{"*":{jquery:"jquery-private"},"jquery-private":{jquery:"jquery"}},tpl:{templateSettings:{evaluate:/\{\[([\s\S]+?)\]\}/g,interpolate:/\{\{([\s\S]+?)\}\}/g}},shim:{"crypto.aes":{deps:["crypto.cipher-core"]},"crypto.cipher-core":{deps:["crypto.enc-base64","crypto.evpkdf"]},"crypto.enc-base64":{deps:["crypto.core"]},"crypto.evpkdf":{deps:["crypto.md5"]},"crypto.hmac":{deps:["crypto.core"]},"crypto.md5":{deps:["crypto.core"]},"crypto.mode-ctr":{deps:["crypto.cipher-core"]},"crypto.pad-nopadding":{deps:["crypto.cipher-core"]},"crypto.sha1":{deps:["crypto.core"]},"crypto.sha256":{deps:["crypto.core"]},bigint:{deps:["crypto"]},"strophe.ping":{deps:["strophe"]},"strophe.register":{deps:["strophe"]},"strophe.vcard":{deps:["strophe"]}}}),typeof require=="function"&&require(["converse"],function(e){window.converse=e}),define("main",function(){});
\ No newline at end of file
--- /dev/null
+# ADDON xmpp
+# Copyright (C)
+# This file is distributed under the same license as the Friendica xmpp addon package.
+#
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-27 09:30+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: fabrixxm <fabrix.xm@gmail.com>, 2018\n"
+"Language-Team: Italian (https://www.transifex.com/Friendica/teams/12172/it/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: it\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: xmpp.php:38
+msgid "XMPP settings updated."
+msgstr "Impostazioni XMPP aggiornate."
+
+#: xmpp.php:63 xmpp.php:67
+msgid "XMPP-Chat (Jabber)"
+msgstr "XMPP-Chat (Jabber)"
+
+#: xmpp.php:71
+msgid "Enable Webchat"
+msgstr "Abilita chat web"
+
+#: xmpp.php:76
+msgid "Individual Credentials"
+msgstr "Credenziali Individuali"
+
+#: xmpp.php:82 xmpp.php:108
+msgid "Jabber BOSH host"
+msgstr "Server Jabber BOSH"
+
+#: xmpp.php:91 xmpp.php:107
+msgid "Save Settings"
+msgstr "Salva Impostazioni"
+
+#: xmpp.php:109
+msgid "Use central userbase"
+msgstr "Usa base utenti centrale"
+
+#: xmpp.php:109
+msgid ""
+"If enabled, users will automatically login to an ejabberd server that has to"
+" be installed on this machine with synchronized credentials via the "
+"\"auth_ejabberd.php\" script."
+msgstr ""
+"Se abilitato, gli utenti verranno automaticamente autenticati con un server "
+"ejabber che deve essere installato su questa macchina, con le credenziali "
+"sincronizzate attraverso lo script \"auth_ejabberd.php\""
+
+#: xmpp.php:119
+msgid "Settings updated."
+msgstr "Impostazioni aggiornate."
--- /dev/null
+<?php
+
+if(! function_exists("string_plural_select_it")) {
+function string_plural_select_it($n){
+ return ($n != 1);;
+}}
+;
+$a->strings["XMPP settings updated."] = "Impostazioni XMPP aggiornate.";
+$a->strings["XMPP-Chat (Jabber)"] = "XMPP-Chat (Jabber)";
+$a->strings["Enable Webchat"] = "Abilita chat web";
+$a->strings["Individual Credentials"] = "Credenziali Individuali";
+$a->strings["Jabber BOSH host"] = "Server Jabber BOSH";
+$a->strings["Save Settings"] = "Salva Impostazioni";
+$a->strings["Use central userbase"] = "Usa base utenti centrale";
+$a->strings["If enabled, users will automatically login to an ejabberd server that has to be installed on this machine with synchronized credentials via the \"auth_ejabberd.php\" script."] = "Se abilitato, gli utenti verranno automaticamente autenticati con un server ejabber che deve essere installato su questa macchina, con le credenziali sincronizzate attraverso lo script \"auth_ejabberd.php\"";
+$a->strings["Settings updated."] = "Impostazioni aggiornate.";
--- /dev/null
+# ADDON xmpp
+# Copyright (C)
+# This file is distributed under the same license as the Friendica xmpp addon package.
+#
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-27 09:30+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Karel Vandecandelaere <karel@dasrakel.eu>, 2018\n"
+"Language-Team: Dutch (https://www.transifex.com/Friendica/teams/12172/nl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: xmpp.php:38
+msgid "XMPP settings updated."
+msgstr "XMPP-instellingen bijgewerkt."
+
+#: xmpp.php:63 xmpp.php:67
+msgid "XMPP-Chat (Jabber)"
+msgstr "XMPP-chat (Jabber)"
+
+#: xmpp.php:71
+msgid "Enable Webchat"
+msgstr "Webchat inschakelen"
+
+#: xmpp.php:76
+msgid "Individual Credentials"
+msgstr ""
+
+#: xmpp.php:82 xmpp.php:108
+msgid "Jabber BOSH host"
+msgstr "Jabber BOSH Server"
+
+#: xmpp.php:91 xmpp.php:107
+msgid "Save Settings"
+msgstr "Instellingen opslaan"
+
+#: xmpp.php:109
+msgid "Use central userbase"
+msgstr ""
+
+#: xmpp.php:109
+msgid ""
+"If enabled, users will automatically login to an ejabberd server that has to"
+" be installed on this machine with synchronized credentials via the "
+"\"auth_ejabberd.php\" script."
+msgstr ""
+"Wanneer ingeschakeld zullen gebruikers automatisch inloggen op een ejabberd-"
+"server die op deze server moet geïnstalleerd staan, met dezelfde "
+"gebruikersnaam en wachtwoord, via het \"auth_ejabberd.php\" script."
+
+#: xmpp.php:119
+msgid "Settings updated."
+msgstr "Instellingen bijgewerkt."
--- /dev/null
+<?php
+
+if(! function_exists("string_plural_select_nl")) {
+function string_plural_select_nl($n){
+ return ($n != 1);;
+}}
+;
+$a->strings["XMPP settings updated."] = "XMPP-instellingen bijgewerkt.";
+$a->strings["XMPP-Chat (Jabber)"] = "XMPP-chat (Jabber)";
+$a->strings["Enable Webchat"] = "Webchat inschakelen";
+$a->strings["Individual Credentials"] = "";
+$a->strings["Jabber BOSH host"] = "Jabber BOSH Server";
+$a->strings["Save Settings"] = "Instellingen opslaan";
+$a->strings["Use central userbase"] = "";
+$a->strings["If enabled, users will automatically login to an ejabberd server that has to be installed on this machine with synchronized credentials via the \"auth_ejabberd.php\" script."] = "Wanneer ingeschakeld zullen gebruikers automatisch inloggen op een ejabberd-server die op deze server moet geïnstalleerd staan, met dezelfde gebruikersnaam en wachtwoord, via het \"auth_ejabberd.php\" script.";
+$a->strings["Settings updated."] = "Instellingen bijgewerkt.";
* Version: 0.1
* Author: Michael Vogel <https://pirati.ca/profile/heluecht>
*/
-
-function xmpp_install() {
- register_hook('plugin_settings', 'addon/xmpp/xmpp.php', 'xmpp_plugin_settings');
- register_hook('plugin_settings_post', 'addon/xmpp/xmpp.php', 'xmpp_plugin_settings_post');
- register_hook('page_end', 'addon/xmpp/xmpp.php', 'xmpp_script');
- register_hook('logged_in', 'addon/xmpp/xmpp.php', 'xmpp_login');
+use Friendica\App;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+
+function xmpp_install()
+{
+ Addon::registerHook('addon_settings', 'addon/xmpp/xmpp.php', 'xmpp_addon_settings');
+ Addon::registerHook('addon_settings_post', 'addon/xmpp/xmpp.php', 'xmpp_addon_settings_post');
+ Addon::registerHook('page_end', 'addon/xmpp/xmpp.php', 'xmpp_script');
+ Addon::registerHook('logged_in', 'addon/xmpp/xmpp.php', 'xmpp_login');
}
-function xmpp_uninstall() {
- unregister_hook('plugin_settings', 'addon/xmpp/xmpp.php', 'xmpp_plugin_settings');
- unregister_hook('plugin_settings_post', 'addon/xmpp/xmpp.php', 'xmpp_plugin_settings_post');
- unregister_hook('page_end', 'addon/xmpp/xmpp.php', 'xmpp_script');
- unregister_hook('logged_in', 'addon/xmpp/xmpp.php', 'xmpp_login');
+function xmpp_uninstall()
+{
+ Addon::unregisterHook('addon_settings', 'addon/xmpp/xmpp.php', 'xmpp_addon_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/xmpp/xmpp.php', 'xmpp_addon_settings_post');
+ Addon::unregisterHook('page_end', 'addon/xmpp/xmpp.php', 'xmpp_script');
+ Addon::unregisterHook('logged_in', 'addon/xmpp/xmpp.php', 'xmpp_login');
}
-function xmpp_plugin_settings_post($a,$post) {
- if(! local_user() || (! x($_POST,'xmpp-settings-submit')))
+function xmpp_addon_settings_post()
+{
+ if (!local_user() || (!x($_POST, 'xmpp-settings-submit'))) {
return;
set_pconfig(local_user(),'xmpp','enabled',intval($_POST['xmpp_enabled']));
set_pconfig(local_user(),'xmpp','individual',intval($_POST['xmpp_individual']));
set_pconfig(local_user(),'xmpp','bosh_proxy',$_POST['xmpp_bosh_proxy']);
- info( t('XMPP settings updated.') . EOL);
+ info(L10n::t('XMPP settings updated.') . EOL);
}
-function xmpp_plugin_settings(&$a,&$s) {
-
- if(! local_user())
+function xmpp_addon_settings(App $a, &$s)
+{
+ if (!local_user()) {
return;
/* Add our stylesheet to the xmpp so we can make our settings look nice */
/* Add some HTML to the existing form */
$s .= '<span id="settings_xmpp_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_xmpp_expanded\'); openClose(\'settings_xmpp_inflated\');">';
- $s .= '<h3>' . t('XMPP-Chat (Jabber)') . '</h3>';
+ $s .= '<h3>' . L10n::t('XMPP-Chat (Jabber)') . '</h3>';
$s .= '</span>';
$s .= '<div id="settings_xmpp_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_xmpp_expanded\'); openClose(\'settings_xmpp_inflated\');">';
- $s .= '<h3>' . t('XMPP-Chat (Jabber)') . '</h3>';
+ $s .= '<h3>' . L10n::t('XMPP-Chat (Jabber)') . '</h3>';
$s .= '</span>';
$s .= '<div id="xmpp-settings-wrapper">';
- $s .= '<label id="xmpp-enabled-label" for="xmpp-enabled">' . t('Enable Webchat') . '</label>';
+ $s .= '<label id="xmpp-enabled-label" for="xmpp-enabled">' . L10n::t('Enable Webchat') . '</label>';
$s .= '<input id="xmpp-enabled" type="checkbox" name="xmpp_enabled" value="1" ' . $enabled_checked . '/>';
$s .= '<div class="clear"></div>';
- if (get_config("xmpp", "central_userbase")) {
- $s .= '<label id="xmpp-individual-label" for="xmpp-individual">' . t('Individual Credentials') . '</label>';
+ if (Config::get("xmpp", "central_userbase")) {
+ $s .= '<label id="xmpp-individual-label" for="xmpp-individual">' . L10n::t('Individual Credentials') . '</label>';
$s .= '<input id="xmpp-individual" type="checkbox" name="xmpp_individual" value="1" ' . $individual_checked . '/>';
$s .= '<div class="clear"></div>';
}
- if (!get_config("xmpp", "central_userbase") || get_pconfig(local_user(),"xmpp","individual")) {
- $s .= '<label id="xmpp-bosh-proxy-label" for="xmpp-bosh-proxy">'.t('Jabber BOSH host').'</label>';
- $s .= ' <input id="xmpp-bosh-proxy" type="text" name="xmpp_bosh_proxy" value="'.$bosh_proxy.'" />';
+ if (!Config::get("xmpp", "central_userbase") || PConfig::get(local_user(), "xmpp", "individual")) {
+ $s .= '<label id="xmpp-bosh-proxy-label" for="xmpp-bosh-proxy">' . L10n::t('Jabber BOSH host') . '</label>';
+ $s .= ' <input id="xmpp-bosh-proxy" type="text" name="xmpp_bosh_proxy" value="' . $bosh_proxy . '" />';
$s .= '<div class="clear"></div>';
}
/* provide a submit button */
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="xmpp-settings-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
-
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="xmpp-settings-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
}
function xmpp_login($a,$b) {
}
}
-function xmpp_plugin_admin(&$a, &$o){
+function xmpp_addon_admin(App $a, &$o)
+{
$t = get_markup_template("admin.tpl", "addon/xmpp/");
- $o = replace_macros($t, array(
- '$submit' => t('Save Settings'),
- '$bosh_proxy' => array('bosh_proxy', t('Jabber BOSH host'), get_config('xmpp', 'bosh_proxy'), ''),
- '$central_userbase' => array('central_userbase', t('Use central userbase'), get_config('xmpp', 'central_userbase'), t('If enabled, users will automatically login to an ejabberd server that has to be installed on this machine with synchronized credentials via the "auth_ejabberd.php" script.')),
- ));
+ $o = replace_macros($t, [
+ '$submit' => L10n::t('Save Settings'),
+ '$bosh_proxy' => ['bosh_proxy', L10n::t('Jabber BOSH host'), Config::get('xmpp', 'bosh_proxy'), ''],
+ '$central_userbase' => ['central_userbase', L10n::t('Use central userbase'), Config::get('xmpp', 'central_userbase'), L10n::t('If enabled, users will automatically login to an ejabberd server that has to be installed on this machine with synchronized credentials via the "auth_ejabberd.php" script.')],
+ ]);
}
-function xmpp_plugin_admin_post(&$a){
- $bosh_proxy = ((x($_POST,'bosh_proxy')) ? trim($_POST['bosh_proxy']) : '');
- $central_userbase = ((x($_POST,'central_userbase')) ? intval($_POST['central_userbase']) : false);
- set_config('xmpp','bosh_proxy',$bosh_proxy);
- set_config('xmpp','central_userbase',$central_userbase);
- info( t('Settings updated.'). EOL );
+function xmpp_addon_admin_post()
+{
+ $bosh_proxy = ((x($_POST, 'bosh_proxy')) ? trim($_POST['bosh_proxy']) : '');
+ $central_userbase = ((x($_POST, 'central_userbase')) ? intval($_POST['central_userbase']) : false);
+ Config::set('xmpp', 'bosh_proxy', $bosh_proxy);
+ Config::set('xmpp', 'central_userbase', $central_userbase);
+ info(L10n::t('Settings updated.') . EOL);
}
function xmpp_script(&$a,&$s) {
YourLS
For server admins only.
-Defines a YourLS url shortener for the Statusnet & Twitter plugins.
+Defines a YourLS url shortener for the Statusnet & Twitter addons.
-This plugin will not do anything else unless the Statusnet and/or Twitter plugins are installed.
+This addon will not do anything else unless the Statusnet and/or Twitter addons are installed.
-The message is entered in the admin account at Settings -> Plugin settings.
+The message is entered in the admin account at Settings -> Addon settings.
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:30+0000\n"
+"PO-Revision-Date: 2017-09-20 06:09+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
"MIME-Version: 1.0\n"
--- /dev/null
+# ADDON yourls
+# Copyright (C)
+# This file is distributed under the same license as the Friendica yourls addon package.
+#
+#
+# Translators:
+# Karel Vandecandelaere <karel@dasrakel.eu>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: friendica\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-02-27 05:01-0500\n"
+"PO-Revision-Date: 2018-03-20 13:29+0000\n"
+"Last-Translator: Karel Vandecandelaere <karel@dasrakel.eu>\n"
+"Language-Team: Dutch (http://www.transifex.com/Friendica/friendica/language/nl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: yourls.php:55
+msgid "YourLS Settings"
+msgstr "YourLS-instellingen"
+
+#: yourls.php:57
+msgid "URL: http://"
+msgstr "URL: http://"
+
+#: yourls.php:62
+msgid "Username:"
+msgstr "Gebruikersnaam:"
+
+#: yourls.php:67
+msgid "Password:"
+msgstr "Wachtwoord:"
+
+#: yourls.php:72
+msgid "Use SSL "
+msgstr "Gebruik SSL"
+
+#: yourls.php:76
+msgid "Submit"
+msgstr "Toepassen"
+
+#: yourls.php:92
+msgid "yourls Settings saved."
+msgstr "YourLS-instellingen bijgewerkt."
--- /dev/null
+<?php
+
+if(! function_exists("string_plural_select_nl")) {
+function string_plural_select_nl($n){
+ return ($n != 1);;
+}}
+;
+$a->strings["YourLS Settings"] = "YourLS-instellingen";
+$a->strings["URL: http://"] = "URL: http://";
+$a->strings["Username:"] = "Gebruikersnaam:";
+$a->strings["Password:"] = "Wachtwoord:";
+$a->strings["Use SSL "] = "Gebruik SSL";
+$a->strings["Submit"] = "Toepassen";
+$a->strings["yourls Settings saved."] = "YourLS-instellingen bijgewerkt.";
<?php
-
-
/**
* Name: Yourls
- * Description: Defines a YourLS url shortener for the Statusnet & Twitter plugins
+ * Description: Defines a YourLS url shortener for the Statusnet & Twitter addons
* Version: 1.0
* Author: Keith Fernie <http://friendika.me4.it/profile/keith>
- *
+ * Status: Unsupported
*/
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
function yourls_install() {
- register_hook('plugin_settings', 'addon/yourls/yourls.php', 'yourls_addon_settings');
- register_hook('plugin_settings_post', 'addon/yourls/yourls.php', 'yourls_addon_settings_post');
+ Addon::registerHook('addon_settings', 'addon/yourls/yourls.php', 'yourls_addon_settings');
+ Addon::registerHook('addon_settings_post', 'addon/yourls/yourls.php', 'yourls_addon_settings_post');
}
function yourls_uninstall() {
- unregister_hook('plugin_settings', 'addon/yourls/yourls.php', 'yourls_addon_settings');
- unregister_hook('plugin_settings_post', 'addon/yourls/yourls.php', 'yourls_addon_settings_post');
- set_config('yourls','url1',trim($_POST['']));
- set_config('yourls','username1',trim($_POST['']));
- set_config('yourls','password1',trim($_POST['']));
- set_config('yourls','ssl1',trim($_POST['']));
+ Addon::unregisterHook('addon_settings', 'addon/yourls/yourls.php', 'yourls_addon_settings');
+ Addon::unregisterHook('addon_settings_post', 'addon/yourls/yourls.php', 'yourls_addon_settings_post');
+ Config::set('yourls','url1',trim($_POST['']));
+ Config::set('yourls','username1',trim($_POST['']));
+ Config::set('yourls','password1',trim($_POST['']));
+ Config::set('yourls','ssl1',trim($_POST['']));
}
$yourls_ssl = get_config('yourls', 'ssl1');
$s .= '<span id="settings_yourls_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_yourls_expanded\'); openClose(\'settings_yourls_inflated\');">';
- $s .= '<h3>' . t('YourLS') . '</h3>';
+ $s .= '<h3>' . L10n::t('YourLS') . '</h3>';
$s .= '</span>';
$s .= '<div id="settings_yourls_expanded" class="settings-block" style="display: none;">';
$s .= '<span class="fakelink" onclick="openClose(\'settings_yourls_expanded\'); openClose(\'settings_yourls_inflated\');">';
- $s .= '<h3>' . t('YourLS') . '</h3>';
+ $s .= '<h3>' . L10n::t('YourLS') . '</h3>';
$s .= '</span>';
$s .= '<div id="yourls-url-wrapper">';
- $s .= '<label id="yourls-url-label" for="yourls-url">' . t('URL: http://') . '</label>';
+ $s .= '<label id="yourls-url-label" for="yourls-url">' . L10n::t('URL: http://') . '</label>';
$s .= '<input id="yourls-url" type="text" name="yourls_url" value="' . $yourls_url .'" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="yourls-username-wrapper">';
- $s .= '<label id="yourls-username-label" for="yourls-username">' . t('Username:') . '</label>';
+ $s .= '<label id="yourls-username-label" for="yourls-username">' . L10n::t('Username:') . '</label>';
$s .= '<input id="yourls-username" type="text" name="yourls_username" value="' . $yourls_username .'" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="yourls-password-wrapper">';
- $s .= '<label id="yourls-password-label" for="yourls-password">' . t('Password:') . '</label>';
+ $s .= '<label id="yourls-password-label" for="yourls-password">' . L10n::t('Password:') . '</label>';
$s .= '<input id="yourls-password" type="password" name="yourls_password" value="' . $yourls_password .'" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="yourls-ssl-wrapper">';
- $s .= '<label id="yourls-ssl-label" for="yourls-ssl">' . t('Use SSL ') . '</label>';
+ $s .= '<label id="yourls-ssl-label" for="yourls-ssl">' . L10n::t('Use SSL ') . '</label>';
$s .= '<input id="yourls-ssl" type="checkbox" name="yourls_ssl" value="1" ' . $ssl_checked . ' />';
$s .= '</div><div class="clear"></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="yourls-submit" name="yourls-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="yourls-submit" name="yourls-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
return;
return;
if($_POST['yourls-submit']) {
- set_config('yourls','url1',trim($_POST['yourls_url']));
- set_config('yourls','username1',trim($_POST['yourls_username']));
- set_config('yourls','password1',trim($_POST['yourls_password']));
- set_config('yourls','ssl1',intval($_POST['yourls_ssl']));
- info( t('yourls Settings saved.') . EOL);
+ Config::set('yourls','url1',trim($_POST['yourls_url']));
+ Config::set('yourls','username1',trim($_POST['yourls_username']));
+ Config::set('yourls','password1',trim($_POST['yourls_password']));
+ Config::set('yourls','ssl1',intval($_POST['yourls_ssl']));
+ info(L10n::t('yourls Settings saved.') . EOL);
}
}