From a00464cd984ee824a7a4d5a95ece66841d6dfb7d Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sun, 14 Jul 2013 14:58:12 +0200 Subject: [PATCH 01/13] twitter and statusnet: Now Newlines are transmitted. wppost: The title is now shortened with a "..." --- statusnet/statusnet.php | 2 +- twitter/twitter.php | 2 +- wppost/wppost.php | 11 +++++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/statusnet/statusnet.php b/statusnet/statusnet.php index b3450d95..2171acf4 100755 --- a/statusnet/statusnet.php +++ b/statusnet/statusnet.php @@ -563,7 +563,7 @@ function statusnet_shortenmsg($b, $max_char) { else if ($lastchar != "\n") $msg = substr($msg, 0, -3)."..."; } - $msg = str_replace("\n", " ", $msg); + //$msg = str_replace("\n", " ", $msg); // Removing multiple spaces - again while (strpos($msg, " ") !== false) diff --git a/twitter/twitter.php b/twitter/twitter.php index 1b9f2c1b..29f3795b 100755 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -445,7 +445,7 @@ function twitter_shortenmsg($b) { else if ($lastchar != "\n") $msg = substr($msg, 0, -3)."..."; } - $msg = str_replace("\n", " ", $msg); + //$msg = str_replace("\n", " ", $msg); // Removing multiple spaces - again while (strpos($msg, " ") !== false) diff --git a/wppost/wppost.php b/wppost/wppost.php index e8b6fc6d..b0c3dd91 100755 --- a/wppost/wppost.php +++ b/wppost/wppost.php @@ -189,12 +189,15 @@ function wppost_send(&$a,&$b) { // If no bookmark is found then take the first line if ($wptitle == '') { - $title = html2plain(bbcode($b['body']), 0, true); + $title = html2plain(bbcode($b['body']), 0, true)."\n"; $pos = strpos($title, "\n"); - if (($pos == 0) or ($pos > 60)) - $pos = 60; + $trailer = ""; + if (($pos == 0) or ($pos > 100)) { + $pos = 100; + $trailer = "..."; + } - $wptitle = substr($title, 0, $pos); + $wptitle = substr($title, 0, $pos).$trailer; } } From 37940d007028a0233f13da9c65eddccdc8575e3e Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sun, 14 Jul 2013 16:26:18 +0200 Subject: [PATCH 02/13] Twitter+Statusnet: Between message and link there is now a linefeed. --- statusnet/statusnet.php | 2 +- twitter/twitter.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/statusnet/statusnet.php b/statusnet/statusnet.php index 2171acf4..6b4c8010 100755 --- a/statusnet/statusnet.php +++ b/statusnet/statusnet.php @@ -569,7 +569,7 @@ function statusnet_shortenmsg($b, $max_char) { while (strpos($msg, " ") !== false) $msg = str_replace(" ", " ", $msg); - return(array("msg"=>trim($msg." ".$msglink), "image"=>$image)); + return(array("msg"=>trim($msg."\n".$msglink), "image"=>$image)); } function statusnet_post_hook(&$a,&$b) { diff --git a/twitter/twitter.php b/twitter/twitter.php index 29f3795b..775072e0 100755 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -452,7 +452,7 @@ function twitter_shortenmsg($b) { $msg = str_replace(" ", " ", $msg); //return(trim($msg." ".$msglink)); - return(trim($msg." ".$orig_link)); + return(trim($msg."\n".$orig_link)); } function twitter_post_hook(&$a,&$b) { From e7f5f0cf200407bac24af30e818f2d11378b8e30 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Mon, 15 Jul 2013 06:56:23 +0200 Subject: [PATCH 03/13] pumpio: Changed nonce for oAuth from md5 to sha1 - hopefully now more posts come through --- pumpio/oauth/oauth_client.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pumpio/oauth/oauth_client.php b/pumpio/oauth/oauth_client.php index 5047e0e9..2a709aab 100644 --- a/pumpio/oauth/oauth_client.php +++ b/pumpio/oauth/oauth_client.php @@ -1013,7 +1013,8 @@ class oauth_client_class { $values = array( 'oauth_consumer_key'=>$this->client_id, - 'oauth_nonce'=>md5(uniqid(rand(), true)), + //'oauth_nonce'=>md5(uniqid(rand(), true)), + 'oauth_nonce'=>sha1(uniqid(mt_rand(), true).uniqid(mt_rand(), true)), 'oauth_signature_method'=>$this->signature_method, 'oauth_timestamp'=>time(), 'oauth_version'=>'1.0', @@ -2173,4 +2174,4 @@ class oauth_client_class */ -?> \ No newline at end of file +?> From 804bc7a0673cab728195aa538fdd924dff2f0a6c Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Fri, 19 Jul 2013 23:34:54 +0200 Subject: [PATCH 04/13] Mirroring: There was a problem that the title variable wasn't cleared so it could be fetched from a previous post. Statusnet: The activity messages are now suppressed --- fbpost/fbpost.php | 3 +++ fromgplus/fromgplus.php | 1 + public_server/public_server.php | 5 ++++- pumpio/pumpio.php | 13 ++++++++++--- statusnet/statusnet.php | 6 ++++++ twitter/twitter.php | 3 +++ 6 files changed, 27 insertions(+), 4 deletions(-) diff --git a/fbpost/fbpost.php b/fbpost/fbpost.php index ba60f4e6..1167376a 100644 --- a/fbpost/fbpost.php +++ b/fbpost/fbpost.php @@ -1052,11 +1052,14 @@ function fbpost_fetchwall($a, $uid) { $_SESSION["authenticated"] = true; $_SESSION["uid"] = $uid; + unset($_REQUEST); $_REQUEST["type"] = "wall"; $_REQUEST["api_source"] = true; $_REQUEST["profile_uid"] = $uid; $_REQUEST["source"] = "Facebook"; + $_REQUEST["title"] = ""; + $_REQUEST["body"] = (isset($item->message) ? escape_tags($item->message) : ''); if(isset($item->name) and isset($item->link)) diff --git a/fromgplus/fromgplus.php b/fromgplus/fromgplus.php index 5d0e86c3..fdd0b579 100644 --- a/fromgplus/fromgplus.php +++ b/fromgplus/fromgplus.php @@ -109,6 +109,7 @@ function fromgplus_post($a, $uid, $source, $body, $location) { $_SESSION['authenticated'] = true; $_SESSION['uid'] = $uid; + unset($_REQUEST); $_REQUEST['type'] = 'wall'; $_REQUEST['api_source'] = true; diff --git a/public_server/public_server.php b/public_server/public_server.php index 3711854f..becf96c3 100644 --- a/public_server/public_server.php +++ b/public_server/public_server.php @@ -43,9 +43,11 @@ function public_server_register_account($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' "); @@ -116,6 +118,7 @@ function public_server_cron($a,$b) { } } + logger("public_server: cron end"); } diff --git a/pumpio/pumpio.php b/pumpio/pumpio.php index da723eca..f85e8bd9 100755 --- a/pumpio/pumpio.php +++ b/pumpio/pumpio.php @@ -385,14 +385,16 @@ function pumpio_send(&$a,&$b) { $client->client_id = $consumer_key; $client->client_secret = $consumer_secret; + $username = $user.'@'.$host; + $success = $client->CallAPI( 'https://'.$host.'/api/user/'.$user.'/feed', 'POST', $params, array('FailOnAccessError'=>true, 'RequestContentType'=>'application/json'), $user); if($success) - logger('pumpio_send: success'); + logger('pumpio_send '.$username.': success'); else - logger('pumpio_send: general error: ' . print_r($user,true)); + logger('pumpio_send '.$username.': general error: ' . print_r($user,true)); } } @@ -456,10 +458,12 @@ function pumpio_fetchtimeline($a, $uid) { logger('pumpio: fetching for user '.$uid.' '.$url.' C:'.$client->client_id.' CS:'.$client->client_secret.' T:'.$client->access_token.' TS:'.$client->access_token_secret); + $username = $user.'@'.$host; + $success = $client->CallAPI($url, 'GET', array(), array('FailOnAccessError'=>true), $user); if (!$success) { - logger('pumpio: error fetching posts for user '.$uid." ".print_r($user, true)); + logger('pumpio: error fetching posts for user '.$uid." ".$username." ".print_r($user, true)); return; } @@ -498,6 +502,7 @@ function pumpio_fetchtimeline($a, $uid) { $_SESSION["authenticated"] = true; $_SESSION["uid"] = $uid; + unset($_REQUEST); $_REQUEST["type"] = "wall"; $_REQUEST["api_source"] = true; $_REQUEST["profile_uid"] = $uid; @@ -505,6 +510,8 @@ function pumpio_fetchtimeline($a, $uid) { if ($post->object->displayName != "") $_REQUEST["title"] = html2bbcode($post->object->displayName); + else + $_REQUEST["title"] = ""; $_REQUEST["body"] = html2bbcode($post->object->content); diff --git a/statusnet/statusnet.php b/statusnet/statusnet.php index 6b4c8010..bd2312f7 100755 --- a/statusnet/statusnet.php +++ b/statusnet/statusnet.php @@ -855,6 +855,9 @@ function statusnet_fetchtimeline($a, $uid) { if ($first_time) continue; + if ($post->source == "activity") + continue; + if (is_object($post->retweeted_status)) continue; @@ -865,6 +868,7 @@ function statusnet_fetchtimeline($a, $uid) { $_SESSION["authenticated"] = true; $_SESSION["uid"] = $uid; + unset($_REQUEST); $_REQUEST["type"] = "wall"; $_REQUEST["api_source"] = true; $_REQUEST["profile_uid"] = $uid; @@ -872,6 +876,8 @@ function statusnet_fetchtimeline($a, $uid) { //$_REQUEST["date"] = $post->created_at; + $_REQUEST["title"] = ""; + $_REQUEST["body"] = $post->text; if (is_string($post->place->name)) $_REQUEST["location"] = $post->place->name; diff --git a/twitter/twitter.php b/twitter/twitter.php index 775072e0..5e01db95 100755 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -678,6 +678,7 @@ function twitter_fetchtimeline($a, $uid) { $_SESSION["authenticated"] = true; $_SESSION["uid"] = $uid; + unset($_REQUEST); $_REQUEST["type"] = "wall"; $_REQUEST["api_source"] = true; $_REQUEST["profile_uid"] = $uid; @@ -685,6 +686,8 @@ function twitter_fetchtimeline($a, $uid) { //$_REQUEST["date"] = $post->created_at; + $_REQUEST["title"] = ""; + $_REQUEST["body"] = $post->text; if (is_string($post->place->name)) $_REQUEST["location"] = $post->place->name; From aaee2a92604f299f2291f57ee8e177399d72978a Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sat, 20 Jul 2013 14:28:17 +0200 Subject: [PATCH 05/13] wppost: Posting a youtube video now embeds it. --- fbpost/fbpost.php | 34 ---------------------------------- wppost/wppost.php | 12 +++++++++--- 2 files changed, 9 insertions(+), 37 deletions(-) diff --git a/fbpost/fbpost.php b/fbpost/fbpost.php index 1167376a..be9fc290 100644 --- a/fbpost/fbpost.php +++ b/fbpost/fbpost.php @@ -529,40 +529,6 @@ function fbpost_post_hook(&$a,&$b) { // if($b['verb'] == ACTIVITY_DISLIKE) // $msg = trim(strip_tags(bbcode($msg))); - // Old code - /*$search_str = $a->get_baseurl() . '/search'; - - if(preg_match("/\[url=(.*?)\](.*?)\[\/url\]/is",$msg,$matches)) { - - // don't use hashtags for message link - - if(strpos($matches[2],$search_str) === false) { - $link = $matches[1]; - if(substr($matches[2],0,5) != '[img]') - $linkname = $matches[2]; - } - } - - // strip tag links to avoid link clutter, this really should be - // configurable because we're losing information - - $msg = preg_replace("/\#\[url=(.*?)\](.*?)\[\/url\]/is",'#$2',$msg); - - // provide the link separately for normal links - $msg = preg_replace("/\[url=(.*?)\](.*?)\[\/url\]/is",'$2 $1',$msg); - - if(preg_match("/\[img\](.*?)\[\/img\]/is",$msg,$matches)) - $image = $matches[1]; - - $msg = preg_replace("/\[img\](.*?)\[\/img\]/is", t('Image: ') . '$1', $msg); - - if((strpos($link,z_root()) !== false) && (! $image)) - $image = $a->get_baseurl() . '/images/friendica-64.jpg'; - - $msg = trim(strip_tags(bbcode($msg)));*/ - - // New code - // Looking for the first image $image = ''; if(preg_match("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/is",$b['body'],$matches)) diff --git a/wppost/wppost.php b/wppost/wppost.php index b0c3dd91..a6574cc2 100755 --- a/wppost/wppost.php +++ b/wppost/wppost.php @@ -189,7 +189,7 @@ function wppost_send(&$a,&$b) { // If no bookmark is found then take the first line if ($wptitle == '') { - $title = html2plain(bbcode($b['body']), 0, true)."\n"; + $title = html2plain(bbcode($b['body'], false, false), 0, true)."\n"; $pos = strpos($title, "\n"); $trailer = ""; if (($pos == 0) or ($pos > 100)) { @@ -202,11 +202,17 @@ function wppost_send(&$a,&$b) { } $title = '' . (($wptitle) ? $wptitle : t('Post from Friendica')) . ''; - $post = $title . bbcode($b['body']); + $post = bbcode($b['body'], false, false); + + // If a link goes to youtube then remove the stuff around it. Wordpress detects youtube links and embeds it + $post = preg_replace('/(.*?)<\/a>/ism',"\n$1\n",$post); + $post = preg_replace('/(.*?)<\/a>/ism',"\n$1\n",$post); + + $post = $title.$post; $wp_backlink = intval(get_pconfig($b['uid'],'wppost','backlink')); if($wp_backlink && $b['plink']) - $post .= EOL . EOL . '' + $post .= EOL . EOL . '' . t('Read the original post and comment stream on Friendica') . '' . EOL . EOL; $post = xmlify($post); From 3d83a2415c96417b8be8ce1772de674f896bfce3 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sat, 20 Jul 2013 14:58:42 +0200 Subject: [PATCH 06/13] pumpio: Youtube- and vimeo videos have now a preview image. --- pumpio/pumpio.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/pumpio/pumpio.php b/pumpio/pumpio.php index f85e8bd9..60d8e82f 100755 --- a/pumpio/pumpio.php +++ b/pumpio/pumpio.php @@ -363,13 +363,24 @@ function pumpio_send(&$a,&$b) { if ($title != '') $title = "

".$title."

"; + $content = bbcode($b['body'], false, false); + + // Enhance the way, videos are displayed + $content = preg_replace('/(.*?)<\/a>/ism',"\n[url]$1[/url]\n",$content); + $content = preg_replace('/(.*?)<\/a>/ism',"\n$1\n",$content); + $content = preg_replace('/(.*?)<\/a>/ism',"\n$1\n",$content); + $content = preg_replace('/(.*?)<\/a>/ism',"\n$1\n",$content); + + $URLSearchString = "^\[\]"; + $content = preg_replace_callback("/\[url\]([$URLSearchString]*)\[\/url\]/ism",'tryoembed',$content); + $params = array(); $params["verb"] = "post"; $params["object"] = array( 'objectType' => "note", - 'content' => $title.bbcode($b['body'], false, false)); + 'content' => $title.$content); if ($public) $params["to"] = array(Array( From d04fd5fb6f02e18791e2ebd40e06567da16aa5d5 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Mon, 22 Jul 2013 23:25:23 +0200 Subject: [PATCH 07/13] twitter: Now pictures are posted to twitpic so that they are embedded in the standard twitter clients --- twitter/twitter.php | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/twitter/twitter.php b/twitter/twitter.php index 5e01db95..e4fbaa6a 100755 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -414,12 +414,12 @@ function twitter_shortenmsg($b) { // If the message is short enough then don't modify it. if ((strlen(trim($origmsg)) <= $max_char) AND ($msglink == "")) - return(trim($origmsg)); + return(array("msg"=>trim($origmsg), "image"=>"")); // If the message is short enough and the link exists in the original message don't modify it as well // -3 because of the bad shortener of twitter if ((strlen(trim($origmsg)) <= ($max_char - 3)) AND strpos($origmsg, $msglink)) - return(trim($origmsg)); + return(array("msg"=>trim($origmsg), "image"=>"")); // Preserve the unshortened link $orig_link = $msglink; @@ -451,8 +451,10 @@ function twitter_shortenmsg($b) { while (strpos($msg, " ") !== false) $msg = str_replace(" ", " ", $msg); - //return(trim($msg." ".$msglink)); - return(trim($msg."\n".$orig_link)); + if ($image == $orig_link) + return(array("msg"=>trim($msg), "image"=>$image)); + else + return(array("msg"=>trim($msg."\n".$orig_link), "image"=>"")); } function twitter_post_hook(&$a,&$b) { @@ -574,15 +576,33 @@ function twitter_post_hook(&$a,&$b) { $msg = trim($msg); } else - $msg = twitter_shortenmsg($b); + $msgarr = twitter_shortenmsg($b); + $msg = $msgarr["msg"]; + $image = $msgarr["image"]; // and now tweet it :-) - if(strlen($msg)) { + if(strlen($msg) and ($image == "")) { $result = $tweet->post('statuses/update', array('status' => $msg)); logger('twitter_post send, result: ' . print_r($result, true), LOGGER_DEBUG); if ($result->error) { logger('Send to Twitter failed: "' . $result->error . '"'); } + } else if(strlen($msg) and ($image != "")) { + $img_str = fetch_url($image); + + $tempfile = tempnam(get_config("system","temppath"), "cache"); + file_put_contents($tempfile, $img_str); + $mime = image_type_to_mime_type(exif_imagetype($tempfile)); + unlink($tempfile); + + $filename = "upload"; + + $result = $tweet->post('statuses/update_with_media', array('media[]' => "{$img_str};type=".$mime.";filename={$filename}" , 'status' => $msg)); + + logger('twitter_post_with_media send, result: ' . print_r($result, true), LOGGER_DEBUG); + if ($result->error) { + logger('Send to Twitter failed: "' . $result->error . '"'); + } } } } From adb0219e1077e7d632ec133c62c0936e7ec4fe33 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Tue, 23 Jul 2013 01:09:19 +0200 Subject: [PATCH 08/13] twitter: Better detection if a picture is posted. --- twitter/twitter.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/twitter/twitter.php b/twitter/twitter.php index e4fbaa6a..997f30a9 100755 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -451,8 +451,16 @@ function twitter_shortenmsg($b) { while (strpos($msg, " ") !== false) $msg = str_replace(" ", " ", $msg); - if ($image == $orig_link) - return(array("msg"=>trim($msg), "image"=>$image)); + // Looking if the link points to an image + $img_str = fetch_url($orig_link); + + $tempfile = tempnam(get_config("system","temppath"), "cache"); + file_put_contents($tempfile, $img_str); + $mime = image_type_to_mime_type(exif_imagetype($tempfile)); + unlink($tempfile); + + if (($image == $orig_link) OR (substr($mime, 0, 6) == "image/")) + return(array("msg"=>trim($msg), "image"=>$orig_link)); else return(array("msg"=>trim($msg."\n".$orig_link), "image"=>"")); } From 6790681b1ba0a2a61ec5e1da923604685fa05c61 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Wed, 24 Jul 2013 08:10:20 +0200 Subject: [PATCH 09/13] twitter: If a post contains an image and a link then both will be posted. --- twitter/twitter.php | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/twitter/twitter.php b/twitter/twitter.php index 997f30a9..f84ab96d 100755 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -392,6 +392,21 @@ function twitter_shortenmsg($b) { // If there is no bookmark element then take the first link if ($link == '') { $links = collecturls($html); + + foreach($links AS $singlelink) { + $img_str = fetch_url($singlelink); + + $tempfile = tempnam(get_config("system","temppath"), "cache"); + file_put_contents($tempfile, $img_str); + $mime = image_type_to_mime_type(exif_imagetype($tempfile)); + unlink($tempfile); + + if (substr($mime, 0, 6) == "image/") { + $image = $singlelink; + unset($links[$singlelink]); + } + } + if (sizeof($links) > 0) { reset($links); $link = current($links); @@ -416,6 +431,10 @@ function twitter_shortenmsg($b) { if ((strlen(trim($origmsg)) <= $max_char) AND ($msglink == "")) return(array("msg"=>trim($origmsg), "image"=>"")); + // If the message is short enough and contains a picture then post the picture as well + if ((strlen(trim($origmsg)) <= ($max_char - 40)) AND strpos($origmsg, $msglink)) + return(array("msg"=>trim($origmsg), "image"=>$image)); + // If the message is short enough and the link exists in the original message don't modify it as well // -3 because of the bad shortener of twitter if ((strlen(trim($origmsg)) <= ($max_char - 3)) AND strpos($origmsg, $msglink)) @@ -444,6 +463,20 @@ function twitter_shortenmsg($b) { $msg = substr($msg, 0, $pos); else if ($lastchar != "\n") $msg = substr($msg, 0, -3)."..."; + + // if the post contains a picture and a link then the system tries to cut the post earlier. + // So the link and the picture can be posted. + if (($image != "") AND ($orig_link != $image)) { + $msg2 = substr($msg, 0, ($max_char - 40) - (strlen($msglink))); + $lastchar = substr($msg2, -1); + $msg2 = substr($msg2, 0, -1); + $pos = strrpos($msg2, "\n"); + if ($pos > 0) + $msg = substr($msg2, 0, $pos); + else if ($lastchar == "\n") + $msg = trim($msg2); + } + } //$msg = str_replace("\n", " ", $msg); @@ -451,6 +484,10 @@ function twitter_shortenmsg($b) { while (strpos($msg, " ") !== false) $msg = str_replace(" ", " ", $msg); + // Removing multiple newlines + //while (strpos($msg, "\n\n") !== false) + // $msg = str_replace("\n\n", "\n", $msg); + // Looking if the link points to an image $img_str = fetch_url($orig_link); @@ -461,6 +498,8 @@ function twitter_shortenmsg($b) { if (($image == $orig_link) OR (substr($mime, 0, 6) == "image/")) return(array("msg"=>trim($msg), "image"=>$orig_link)); + else if (($image != $orig_link) AND ($image != "") AND (strlen($msg."\n".$orig_link) <= 100)) + return(array("msg"=>trim($msg."\n".$orig_link), "image"=>$image)); else return(array("msg"=>trim($msg."\n".$orig_link), "image"=>"")); } From f424a9e974d61e5bffd4a1e442cf7cbebea1b69d Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Wed, 24 Jul 2013 14:48:24 +0200 Subject: [PATCH 10/13] twitter: Improvements for tweets with pictures and links. --- twitter/twitter.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/twitter/twitter.php b/twitter/twitter.php index f84ab96d..3de55353 100755 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -432,7 +432,7 @@ function twitter_shortenmsg($b) { return(array("msg"=>trim($origmsg), "image"=>"")); // If the message is short enough and contains a picture then post the picture as well - if ((strlen(trim($origmsg)) <= ($max_char - 40)) AND strpos($origmsg, $msglink)) + if ((strlen(trim($origmsg)) <= ($max_char - 20)) AND strpos($origmsg, $msglink)) return(array("msg"=>trim($origmsg), "image"=>$image)); // If the message is short enough and the link exists in the original message don't modify it as well @@ -467,7 +467,7 @@ function twitter_shortenmsg($b) { // if the post contains a picture and a link then the system tries to cut the post earlier. // So the link and the picture can be posted. if (($image != "") AND ($orig_link != $image)) { - $msg2 = substr($msg, 0, ($max_char - 40) - (strlen($msglink))); + $msg2 = substr($msg, 0, ($max_char - 20) - (strlen($msglink))); $lastchar = substr($msg2, -1); $msg2 = substr($msg2, 0, -1); $pos = strrpos($msg2, "\n"); @@ -498,7 +498,7 @@ function twitter_shortenmsg($b) { if (($image == $orig_link) OR (substr($mime, 0, 6) == "image/")) return(array("msg"=>trim($msg), "image"=>$orig_link)); - else if (($image != $orig_link) AND ($image != "") AND (strlen($msg."\n".$orig_link) <= 100)) + else if (($image != $orig_link) AND ($image != "") AND (strlen($msg."\n".$msglink) <= ($max_char - 20))) return(array("msg"=>trim($msg."\n".$orig_link), "image"=>$image)); else return(array("msg"=>trim($msg."\n".$orig_link), "image"=>"")); From 83f95acbbfef35855a7ea1580c335df41a49c633 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sun, 28 Jul 2013 20:40:37 +0200 Subject: [PATCH 11/13] facebook, statusnet and twitter: Now shared messages are clearly marked with the name of the original poster twitter: When a post with a picture failes than the post is repeated without a picture fromgplus: Under certain circumenstances "fromgplus" generates an empty post that is blocking the cron hook - so now messages are mirrored anymore. --- fbpost/fbpost.php | 26 +++++++++++++------------- fromgplus/fromgplus.php | 7 ++++++- statusnet/statusnet.php | 4 ++-- twitter/twitter.php | 21 ++++++++++++--------- 4 files changed, 33 insertions(+), 25 deletions(-) diff --git a/fbpost/fbpost.php b/fbpost/fbpost.php index be9fc290..0fc6dd65 100644 --- a/fbpost/fbpost.php +++ b/fbpost/fbpost.php @@ -570,25 +570,25 @@ function fbpost_post_hook(&$a,&$b) { $body = preg_replace( '/'.$recycle.'\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', "\n\t$2:\t", $body); // share element - $body = preg_replace_callback("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]/ism","fbpost_ShareAttributes", $body); + //$body = preg_replace_callback("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]/ism","fbpost_ShareAttributes", $body); - $bodyparts = explode("\t", $body); + //$bodyparts = explode("\t", $body); // Doesn't help with multiple repeats - the problem has to be solved later - if (sizeof($bodyparts) == 3) { - $html = bbcode($bodyparts[2], false, false); - $test = trim(html2plain($html, 0, true)); + //if (sizeof($bodyparts) == 3) { + // $html = bbcode($bodyparts[2], false, false); + // $test = trim(html2plain($html, 0, true)); - if (trim($bodyparts[0]) == "") - $body = trim($bodyparts[2]); - else if (trim($test) == "") - $body = trim($bodyparts[0]); - else - $body = trim($bodyparts[0])."\n\n".trim($bodyparts[1])."[quote]".trim($bodyparts[2])."[/quote]"; - } else + // if (trim($bodyparts[0]) == "") + // $body = trim($bodyparts[2]); + // else if (trim($test) == "") + // $body = trim($bodyparts[0]); + // else + // $body = trim($bodyparts[0])."\n\n".trim($bodyparts[1])."[quote]".trim($bodyparts[2])."[/quote]"; + //} else $body = str_replace("\t", "", $body); // At first convert the text to html - $html = bbcode($body, false, false); + $html = bbcode($body, false, false, 2); // Then convert it to plain text $msg = trim($b['title']." \n\n".html2plain($html, 0, true)); diff --git a/fromgplus/fromgplus.php b/fromgplus/fromgplus.php index fdd0b579..94b12af3 100644 --- a/fromgplus/fromgplus.php +++ b/fromgplus/fromgplus.php @@ -124,11 +124,16 @@ function fromgplus_post($a, $uid, $source, $body, $location) { $_REQUEST['body'] = $body; $_REQUEST['location'] = $location; - logger('fromgplus: posting for user '.$uid); + if (($_REQUEST['title'] == "") AND ($_REQUEST['body'] == "")) { + logger('fromgplus: empty post for user '.$uid." ".print_r($_REQUEST, true)); + return; + } require_once('mod/item.php'); //print_r($_REQUEST); + logger('fromgplus: posting for user '.$uid." ".print_r($_REQUEST, true)); item_post($a); + logger('fromgplus: done for user '.$uid); } function fromgplus_html2bbcode($html) { diff --git a/statusnet/statusnet.php b/statusnet/statusnet.php index bd2312f7..d168955c 100755 --- a/statusnet/statusnet.php +++ b/statusnet/statusnet.php @@ -491,10 +491,10 @@ function statusnet_shortenmsg($b, $max_char) { $body = preg_replace( '/'.$recycle.'\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', "\n", $body); // remove the share element - $body = preg_replace("/\[share(.*?)\](.*?)\[\/share\]/ism","\n\n$2\n\n",$body); + //$body = preg_replace("/\[share(.*?)\](.*?)\[\/share\]/ism","\n\n$2\n\n",$body); // At first convert the text to html - $html = bbcode($body, false, false); + $html = bbcode($body, false, false, 2); // Then convert it to plain text //$msg = trim($b['title']." \n\n".html2plain($html, 0, true)); diff --git a/twitter/twitter.php b/twitter/twitter.php index 3de55353..bd9eb18c 100755 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -357,10 +357,10 @@ function twitter_shortenmsg($b) { $body = preg_replace( '/'.$recycle.'\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', "\n", $body); // remove the share element - $body = preg_replace("/\[share(.*?)\](.*?)\[\/share\]/ism","\n\n$2\n\n",$body); + //$body = preg_replace("/\[share(.*?)\](.*?)\[\/share\]/ism","\n\n$2\n\n",$body); // At first convert the text to html - $html = bbcode($body, false, false); + $html = bbcode($body, false, false, 2); // Then convert it to plain text //$msg = trim($b['title']." \n\n".html2plain($html, 0, true)); @@ -628,13 +628,7 @@ function twitter_post_hook(&$a,&$b) { $image = $msgarr["image"]; // and now tweet it :-) - if(strlen($msg) and ($image == "")) { - $result = $tweet->post('statuses/update', array('status' => $msg)); - logger('twitter_post send, result: ' . print_r($result, true), LOGGER_DEBUG); - if ($result->error) { - logger('Send to Twitter failed: "' . $result->error . '"'); - } - } else if(strlen($msg) and ($image != "")) { + if(strlen($msg) and ($image != "")) { $img_str = fetch_url($image); $tempfile = tempnam(get_config("system","temppath"), "cache"); @@ -649,8 +643,17 @@ function twitter_post_hook(&$a,&$b) { logger('twitter_post_with_media send, result: ' . print_r($result, true), LOGGER_DEBUG); if ($result->error) { logger('Send to Twitter failed: "' . $result->error . '"'); + // Workaround: Remove the picture link so that the post can be reposted without it + $image = ""; } } + + if(strlen($msg) and ($image == "")) { + $result = $tweet->post('statuses/update', array('status' => $msg)); + logger('twitter_post send, result: ' . print_r($result, true), LOGGER_DEBUG); + if ($result->error) + logger('Send to Twitter failed: "' . $result->error . '"'); + } } } From 600b5ce7912bedca14dc1dae7c382e9fbd463f55 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sun, 4 Aug 2013 08:24:32 +0200 Subject: [PATCH 12/13] Twitter: fix problem sending tweets in normal mode --- twitter/twitter.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/twitter/twitter.php b/twitter/twitter.php index bd9eb18c..7dd083ea 100755 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -622,11 +622,12 @@ function twitter_post_hook(&$a,&$b) { } $msg = trim($msg); - } else + $image = ""; + } else { $msgarr = twitter_shortenmsg($b); $msg = $msgarr["msg"]; $image = $msgarr["image"]; - + } // and now tweet it :-) if(strlen($msg) and ($image != "")) { $img_str = fetch_url($image); From 5862b6273394b66b2c0151256a2b32599bcda098 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sun, 4 Aug 2013 08:27:49 +0200 Subject: [PATCH 13/13] Twitter: new tarball --- twitter.tgz | Bin 24089 -> 25348 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/twitter.tgz b/twitter.tgz index 9720e3299edee1ab3e701ec8eb3b2fac75d09774..945586cff68c62d4a27f8adc6911c8d06cea85df 100755 GIT binary patch literal 25348 zcmV(uKLp=xp6Mj!)YMAhi4nl!k$Do7nt zghv53!fPT)h*})eR3HgW?UV#~W5jp^{)r$&merJ`L`g(d1PLeUbW&V2hI0h25|VF} zPSg&|nusdENXP+LgTaH9D3TAWo%qP|jG`J+M6^+11V%_YkwG4c$u#TGPanrdsy_pvIUf8Rw5EXjU?luV(?bD91sZ=o@gY_129Ou ztY^JWLq(_MEW=t{vnbJd_*~)RBHD!SN2*$sSEQ*_#VD{nJA{Tpf(!!NnLJg~P3z)( znuJBn9$1S?L`8sSA|?u$6ITt9Fh9X;0qlhIBOUO7`9xPcj1**nDa%YPq9?=%<`ztq zFyl1LDuv~juG6(}p$1=&1pW1)Hg~{F;C)NLKh9U@ts}MLNvOd~JpPvP0pI9`5NYr? z)_DU#;%=^kyUn41ueLShha1K2Aj~Yr2b{ZkJn>%I67U9t#2+BOrj|w@2m|Q>cXP<+ z4cdsW+0)os=W8BqBOrh@`$MGB*W?Squ#n$Im73GI>@?!9Cr#dfrvW~?YkiHr(0FP{ zy)V>^y6Qoho3ywCA)lwU(H$Tyt$`MQ&`V%hT%9lIX>|LVymfZa4jPGfoVPhdf(`D* zMl!N+iK9rZ7ff>3HhP&{SW}%Z;Pr%ToUhq@hsyvzfi;ab5^V8$eE7zDsTWLl2gciQ z_28wTcWf&Rf`_Ee-Q*q(D;b=10Cy+{Kmvlt;0V&_4^rQ>2E8_}&K+`7#UKJ41CQZ-ZEMg+UF2&Hc>{sgmXOciJOq~722KDQ z-7vL|`qJM_mkI&!2gZX?4t+pfZ6j?BUbr7X_tDt9(FH-s0Z)kJ3}v&YN9Q$I>+^98*_ATqun4)8IxZEn!nN|%f&09LWLIr(X$aU;HZ&RsXohi03D zA<{vgnHAJ!o(9w1b}kqHt^ObIy6c*}_PB5addzqCe`xwuu7dtw;jAt{+W&uyE5zbY zTI6ID8beLq#c@s86Zs^dr=}l*6VOJJM+*Qz+gOtT6y^m1nhJn-hb94jLr*7ZHAy18 zLZSfJ_(4N}XAL2t0tAO8Su)Z%2R<4c+?O;`l1PSSDN+JGUDx?2v<-M}T5czyn3#Q# zl7N;#+kp1OClZt>paczU?mW*CX#4u?+f*cH(jLV4fiNl6otO6Xi^ z&IM{!N&#s`Bxst^EQs-t0br{pMuAK~4&b^H3E5J?M1_V34Yeer0kVo! zfzD@UYRoo_K^UhipbB`XnTioL?tmpQ{)KB)M4Aq!L=LP{lZrtl3o5!=SHXAg4pfKZ zEnl#_&2tAnj^Z*D;&($qB4yH($mgbrY2tt-Mu5U{30~3|IR?T8Io2UT0I3^6n2k!I zc}Xn;9dT+5$m)=yNwzvO+ax6-Cy^5&N8?%YCpDRlN8>U%i-n47k2v`N$WH5O!brUTc)HA_K z9u^~63TuEK6DPPPl5m>1;Zux{147EO#N*xvI1UVohzhb?i?vS(B7UT^v&-o0T9HqZ zMllS7fhPv*tcgQx98WwzXV4-V9^FXG45g?%im-Vhrm7$iQXInru4@lUQ3WGN%gJ0s zJ2)3CA5O61btrl8S}Yl6Y0j2nIZnkM!GWP{FpS0Q69p(s#B-ct=aUX#?32NG@`Oc?kN*W%vEfd^mUXc`m5EyO3z3`mYr zJ!4Tu432QipjQDAPy>0(2iSofot*$`MBpiG(OBsd&NM3lS;h)gVfBS2hT5_O01;JD zQ`rERjoS(V+*eHDyulR*Esdq4&_4>TR$|>PrpB^dF!#Zk=Eh9RAr;)ANCmj}a1l6U z0%ltspAAcf0ii?9La_pDZQAK@v$fOn0CWjwj~UDn_Czefa)_f_*@1lNDE4H+AUzFP z6(2Nl!XP?(&_q&0icK{(Vz=9i&DMfT*R%ZyEXYLoJ6Z{0twaS>2K3=ziUo4nQw1ZX zBG(c1p4OR$pm~;fkWP&pl%HHm(7RG5> zSg+C#AH+-?J5>pDNC1?_?xiN^VTH+!%$}#Sc7?}Hy2&7{gf+oj;TTN=zf3$QaaxiBO!0MEP3~6{#d}as;&)PoacW z35#NGceQ4^?Q1-_T24;f;z?y2i)MB?#Qrp!%B z4<@EWS+?cEEXaz)L@0W?%&^*Jr*;MrDSF^Yj=4zo1hIop%4oTiV>yhX2+VXr*bB8RW&#Ig2H6B#ZtAQibCWBxeTL4mitRlW3X&%ND!7vb zOu{o|WNZnM#>r~#B_(K6VG?9~Mx|!Fgu81zJ>WH~Bj;>FNoJOC0J&M&SNn$(qS@VN}F?{EU5yGh=9VqAXuANb~;15u}Q|Pt!y?5 zcC%ek6tK>$@}r$8MvAAoM?(b$(QScZx!c@-$x%>h#Nu|+9`e`useRbgsFy90Y=RL6 zNodbv2igxS98hZTW*S{w%Dzo00KFdho}B`sFD}K?8rnfkiKaVp*n zkD3@)&6q@zKnWD21X#Kk@<>I6TdIiyEKBSo%lNecJ{nNxXb}p&&_`Ou7 z+gc4?5M|LYcl??C7h(42?SKmRKdNT-a|XbwiN860AP-5@?BP>R?`>q~23&?^g(yeK zw4V$QYNs`69Zw_`!91y*P+l65dCcpaV~B|p$|u4~so9+Qa{_DoYwmjK9w&3Qf~O1R z*#iS4J?vXqyQ)PUrc~VlDoV>sJyajC`v0qg@_*6GI{3;QVe0x1uH$=t|KoDPGgq0j zx}vhItlU{qgj?!BM$Za zDE9vAT^alr;|UoUl70k!3HlHI{4ccMNq<*ZQ;g@D z?Yd-$#iWy$lW=F+w1I3$cXu&yj2h_xfusKITbfn>GV(Lv{|P1fgX{Pn{I7trNB-}0 zR#udiRX7pkid{GD~e@$i3tS~cLMmtN}&odDPL z6NEYNxp$&rJnRxrJO%%bdF!JY-@wh&4ezCfM-$okR!EAAMU@WMFo$!P_Q?j^Q})LJ zLGyRHMQ%Y2i=9i6>Zb{G%K02H~gr>fE8&%pJE)OWgYQ*)LtOX=C+yx7l30 zuXtgvTGBvbWRBan>i$;#_IJ4de(SBzhsJK^xS?fNJ@iod9q-?8+K5TJ0*{0)X}x%f zcV$!TzQsR3>8Zq+x&;?MdYfGJrvqOuZ~ykvQ#uzsbKI%@?&$7#L)bWMTldC6JBMvL zaEIR6R`lMav88=S_rGdRtNsA@!oKS#FInu2u9?-prgPpspWYPd+Wgs4eQ?qAXYX-b z);6HN|Ed$YBH!*l>AN57J7C_Quj$%yePqqY?Uw~UyYAgrgt_ldZdu!_Xs&Yd>-PPp zAIF_JV4mvu=Hb=OR&n~G-yeVN^G}?yX3W(G%5Qzo`^$5cbypsH%?*8DUVdiZ3m0B; zL1e;-E2I0CpHu(*r@fA|kNx7@Pj>sB>|Vb=xW1%q;p$nhPd>l0w9juYIqv!GPfrbe zHRQf?PI7(gS^De6U6CzU?09&@*%zI6?V@3;J*Ql8_te?k!ZX_bwtD^f$A94ChWQ4Z zGBrN-me}LNoYRWi9!t1J{^I0y2mdTJPwzZwS^ZTXY}tC}?zcZoL|lGlW9{}?ff-Xb z)jav)A4mNBq|?=bGsd1a|J5x;D<9ig`s|9XW5hjM!}E5X@!lg-`}}Oh0AbVS`qeMT2gwIqR%9XCEB2_m7>o^q;YyG@)PrAN%I5nYJ|HD%p78%1`c^{)%VIgI}+| z<%6NAgCl>ntlz@G+TgmHRbR{<`(CfJw>`A)w-qnVx@U8rm!I1{bD6NM`Qwe1Cx5(d z*45+ek*jOnE6S&Dd`Eu&`4{i2ldI0TsC~tq*X&WZMql0elV9IA=_b#TPZzEFdfDEu z-mM;bvt#_SsbfB0)Azg)kDc=PN@>;^ZL#R`UKcn%oPWWar)}*$W#=Qe44XRe4d+j1 z&fX9mn%>-N_LRWd*KTWkp!T}aOJ3M<>YrAA+4qfQzgzRltE&e2`gcVf>%RGN|2I>1 zjxdy@DX_j(z>B_w7&YUcchnuFF4YUwqN{SNE=d?B;8_`u(!~x%1{! zkK6S3X_L0Sy~A;NaQpP48P9BYect?zQyc14bnDjLFU?H-ZS_?r z|8@Jz->&}hubX$x`R&~L(4>=(e`t1aS@MgIp1JmS*K9~f-~HL68#Xx4zHx3~jc;s; z>+Bo*f4z9tthMP6pN^gPz~m{?gAX3N7H z;kc4bqptkPF$>l=ygmQk*Dk#C_3o4-8qfkSruRGSYtMXi@9LM9?$S1H>5L8k@UCOp z-~VFluowP^x@QfKqR5s7lucZ9SJY(}T$(0kX2N8Kgs=;F5F-%b8Ulty)JzyVGo572 zWM-V6Aq0&tcGt%$K34X_t1gHix`2Qexn9Hv+)q%sf{Ka=;`#tl@v$q5Ab7=F=Tud9 zbx%(+A#v}$`2jQCRi~;>ojR{N=gilmcILfR`sCfiy-yFm_|e~ey!gbJg@evK-g*9A zr}dBj=&JHHm4}Xfb7JW!>x2C_6a+5lzpU!_QopnA{nOql$NuY_s{BOTY*L;52wf|Us|81449y<7ss}8PM;apU3-p$WfbbdXxde_bZ?Re1xONVS;^M+%- zwB*v|Q>riC_t>(bIg9-9kw;%#GIquj1E)-xzv9KEGfv$-Xw;q3v1`|_dbjlZqt{C_ zSB%^B+NMt?-QhpFcl_R`|GRqaqx*LR?PnH?)_nMY}^}5gE7w`Pb*0;{D+<(j2`(A#bvZ}3e(&9VM zSaW8uKjBqVr@uDv*n;i9I&;&P&we}JclDzA(P!U%y2kV9bB>Oh8UCVa1HRh+%JyYP z-V9ac4qmq9iAAGBXAL@|bJOMrhQ08M${k-Oj_jM|JbO_|{)x#&o96B~G;YYe{$ETz zcC24w(e`^6F06U7YT&npjX{y2R3(b4x0zxEdYgta&3Jh))z%1b{yeZ73w4WDJ7=BmH!g}Yx}@I>>j z$RpFfc2qoc@8EAvJ?i*;?fJ)!zj(&5cXll}P~s{dzQ$Qo6ezx8;XSQd?)zWOyRYow zek!6#<53D|C)a6fp z9(i)(GXq*TEu88<{e#2V?~Gcp>@j!QLrZ3@bXE=D`sBH9zjb!}$IIruUHr4ZetWR- zr4x_jj+y+s@$1$lf1BHHUG<>sN6%YWIdS$YbN4RY9D3rEKfF9`>Yr{r?bjvE+Zrz0 z*3{H==a##cd^Fwr%;p8Vjy(R^?p0Hc*Y5fJl_meS{ED&1md~rcFMr*hUOe*e z4oH1?HBeygbWskq=sbM=D z%IVsOZ#Rz|dUsag!251kzUq!Gr~Ulzn>P$Pwr=N;!@<*M{bhgQ{+oVs^RA(tf3Lg1 zU)I@H(Qnm-H(qr3gIhnCx#)s*MfFRgpWMHpZT;lCx4MdNTf6YPT%DF|EYB1jkV)W9lr8F^*JX7 zy&u25e5z~DrJ%7*om@R>^@Ug7)HnK{)&C!BiS-R&;m@T16I+hs=ys{F6mB2n!xAWcni8AWw@I;iy~&DA zGnb6>V)ObuGd8cUb7S-RIy*M6PxE8*dYmCk3A?Y;WZ@X~X{Iaz*hk5-!2bF!UzR}Y zkGb?z(y*>~x)Kz^BL(BcvBW=lkHN=8J{43>mJ&P}BeikC;v zSb9mPpFzra@VzMVE@*C>3u$&bC>Fm{Y!`*2H!|fcaIP<<$;D%NYBa)XqL>YUNdQjx zl*{r0TpX63$_a@e2}=lNLQfj9CdcVBlnC2rsec&1RA~gnV+x-p$rHomQ9?E)!XclP zYapK{SDF<^7e7n)V_=QMK3tcqPfDZte6mN+d~wWCZIbTvWIGJxqd;wNgL$Mvu7sYk zC`{K2Yw-wcu7F$+K);S%9=_R3vz^S5_|dpss*(usq>?WDFgj1V$Oul_ybC`=feuZe zHN_@Ji3l_`+(ZK&6FlUw%e)p2kcH9laCN|<+mb?*E`5jx^zleM4ibshlug7Av7Q0o zG104$&294%n~5moJ>GYO;a*LQ=Zs<_%XaT9Co@OJcD!rQb!usqL6eEjkXeu z@JP$lj6ci`gfoVzJCH7%oyDo&551iZJs#dU~4dqLDr+l$VT{XfGN0q39+9$i1bUlp%UgJ1HRhhI&%K z_MU!H@q029gxn_@)(lnjf6Y8M6sVRpuR!}6)AmAau%??q&GNFDd&mri8D7x zap&eV;;9NXIY&qoNg&ajE?0IIIq->OJOU`sNwgzSB7%u>;*U`V?-V<@b-XN;n-eXlf)^8XPWYP2)s}Vw2TryOE~tmYifabLeur+fO(_v^oXLEMTgN zo-7b*GM&zjV#mriLr}Akphs!1DW74+7l2;R~xvuO9 z@v)8u7o`nvUS1ygPr@_{&?#(UY4wOwa4V<@q7h-XhLN;MR86m-CR2ENrg~~|0&L(V z{|42tJuONGF-j&y7YV3m-I!kMGGb`?UuJNy@WNUWCp~BgH6FYkjRfUh!r@ReQRDqah&Dp#l+-XWx31~xoWw#Ad~yQpuy)(Upje6sWDsx?M9Ua#j`o&Nfci!O z8IbBraIeNOK@$@lTSCDgwSC0oWCj*pz?jI)LF1=Fw{HE=ENP)cgph~N65nYm8uVjO zg(+eh)zwK=19VrQD}flVFqrPsCG$qq7(Kqn&GEpY^rPZr9dY@#8}i$X$G zxB+ybuxG-6`4h-)(8=N4oGCz%E+u_8qOESso@VK!My{f`LN{ip(Lz8B`vODGma?+6 z?iB(P6Ld=wT|hm3>Sv3_d1Vfa(U#i|n4kM1Y?xF=BQSlgpf~*u9%l~-wji#CqYCvZ zRbU~InPS?#8#o90sz3<{VxbMlpSv*GER8HGOo7-ORoayfC%8)BU^Xh6nv4^B%;WI# z6XVs5CC$RlIH!t4@eG2j=B$eCI}j65jp8BDnl!gT3y^*vXi*}~%t6Km7}7tN&}y^>KWuT@-pohLK|CbL28&26mHI=b(J?63xZJapz1w&dKJakm)3(~d8!AB`Yg$rqrNH#SAABe$~HB`ppGMSqh zkE%a{ockI3p-0WMt=0#5HJ^+G!U4_24t9D(e@CFSPgXLj!>S$z_O zrP(k)jlK+qv=~GwwJY%mD>x!)t)Uo%GH6iPgX_55+rXzBV>7Ofnt7^z#mAS@6ir5g z9%%+G--m@F1FX&ly}%R;5PH}`W7L%-=w)so98(Tweu8 zAZ3Fbg;6sK`JgbWNzDVdQU_suMidubJhIC(7?uexkB4=qC8!{KFbZa!Y_db+*_~C6;}Y+LTt6-up#}PGqWzhaL?IYYbl5+s$ z38h}eGCN?>p`h*&$KnF*SQk4kTbk0E1J=g)R0brPp397=AZSu|>zH;8g8?YY5Qb$m zx@nftWI?I6`10v%Z?{ko%^VJODp?`1ChQJ?>>ECSoyibs% zd>(iKAqre{u*(zln+dy4cJi4X3!MU_uJUKicL;JCSjI9XB#4>p#(~;2USo<`qR2C` zFi|~gN5xPH+ z31zn~jwy^F1lfi)8)4yeFb3+KqsBu`9e$zcBA-E;qYgGU?l9pk;&WQ$MW+0Q5GNa) zSikg+&5tFa{lsvkG+7!;0jukIln3ZlwgjaiO7ulM{hUAA1%rvBYh-0Att4vCB-1tq zu22kfC zTr{dtl10%dl-_d!|8z;TEI)InasQd7#uPBq!yVjn$KSAWn6&;nMDFr}y|kX9D8kZF zKd6u3z<{Gx?;spb1wWmmL3FR!{aG=|u~r>Ts5;JyrAbLv^Enm|%~1j!hUdo#yElc5 z$KNA0O8jh~a7jj5i4q)<=7iLCqQsZup1N2$KOwhDv_4>MX~q-ipWF(8uU9IF=kN`t_Y zz@S*%%7Q@p3h+nJXJ6fwM?Ivi?Mh=8LF?@mLfKTh!6$DepwnaZ`~2VtwN?_dAk}!y z5SvlSS43m4u_%n)4JO5wW^AT9sD5~irqpw@;#6qBvD$6*Rly+Z9a6=?yF;s~tr@W< zpQ#N_yR|L4l0ia=K2Z+!d@roE{;WJ#f2}K>=?cR30hcuf>yFV1Eya+s9%9&@!v7B# zZ4emO31M$mq;$U^4K!|lg7=su~1Bf<&E3uHD z=6gCCV17MZy6L(I;~H(yP#|z-yp**xG2hGT`z~}L3UgSEAc4TBM1J9|xY^}ldWj_J z7LLBnYrYg7)QRzv5~o~PEdCw)OyNd7C}0MTqSx>&6>{gtNDpXW#ilD#jm zhW~K@F>>77qw!!G0Fr|@NDD#J(k)1Gkay|&nNZ~?7IeI7rqjM@{saixlk~+v43TyH zUH9aR5PIqh@46>hfzS!o+I4&Ojr=3dGM?Iv5)5|p2NW%!1XU+djpGW?4ejR^F;rJm z5K!QLS$I|(54BkyP1P<6T3dx89pJJC9?51wB>;2ZiPQ3epDvM%;cx5Vq%e!z&^;j+ z9>M~wy%O;b!{sj&<>yhsnwqvN^LdcHfZ)D(fhVB23A|97n}~5wGhu{;-*pg#WRAce z7H^cT2{VA@0_}E6oh5bwO*bKzA|V1==|{wd9JzqgRjBq$t!pH>U~~l(BKVevK!cOV>H;|XmIBs098Zr zp%1~I){kl6H^TfKjPIh7%w_^T8O>(6f(D8lBGE#zu!`@2?|=*<^1~^Bl4KZAc1a`3 z;DMGIA;dHFz;i_-=;0czB_2&Sw@9#in2@i8F{B2e)q)|{ zrYaH590vq`L={UnfH{rR2gafayJv;xryUr6DRICWBvh(o_$W7&ust9T5}`y`l^bB$ zvW%N1v}P|ovM=I`$R2#fH&90*c?RfdB*fOH#9I-CWm1zuc#9rTtr1IK{}mz$f3Xz~ zeS1_Q`ddOPrmfho#^7&zuyjyW;&5SVWIzeGC(XzueEtQ{EZIm}@@At6GbX)^CWR?Y z*n2vc8c2P@AOnK=tCP_LAspLD0qcX`lEPvfL?;P%V3d@J2vR$G#AzVmgEvHhb52Mf z$Ai;1+t*+|bo31zgf`jjaJVT9^QzK-%Nz*qK46jVcp>UkNT`tMOz)@FcKnezaB}O; zQvT~GfoL)u1P6Kmu5nd*MZ+NzgzJ-|%vz=sludgHU%dQV1O1B48f2FnPCM)Cix|Dh z=QRBZ^$HNkH^S&~Li{`nzcCV510BTrk+e{=P+Ww%1GEskUB~@~7~d8(9D`rCGPpg1 zM}ZV%L;L{!Ob@Fc{Mm^Peop1wk#h@w{hPuPiOg_vb*=xBy6Lr07Q<0jTbVzO#%(dw znKqUf{&*3Iussf6Jz)%lWPI(TaGM+SPh`X471?eF;z%}@F3z-2a@ML^!j;j4$4;F1 zzcOL#UTH0G?9?#kZ^KL5k>LzrOD7wN4}%Z+K|m&#Q;4k2Z5ps5!9*uH&+sz`1`~td z3nC~YD~A8bxKx63j)F{3|F4k4s|De~VbO$nl;;Q&S3xud0t{3j6hg>{9fS`{lo1;$ zfD;Es_LhhzRWx43-Wj#D*=2a+7IxRz+-wtfU~xNiUP<`#gnsLjx!-mUE;VjrE=;@ zHI$#7m3_?HCLS0W%YRtZLpQE?ZrBXkF*J&cn35U-hX9Y8uc}2@}{z z^g=`xR1ESG@L&LRHI94sIKHGGJ^G7Akw*&9&kzpxhdu0D*m31G9|CEDLW@FJG{5X5 zA6^#$d#p>~L{ZNpL=b3zO=t25p~sc4{D2WUEJ^?1jTtk#T@;0T*grh+=AOu`=Q6{-&kpMciYCAH^ReL1;E0RZi}ihq-`O?Gy~ZIQ06R1oNh zipH&$HsNy|r#3*Jr1stueW9{E#!h(VaHfILhel&@*`1{ z^=_JOf#dxUZSpBj%(}h3?1?=}^OSxn+2hEqEY(Q(-nD0M98#ZPL-^2@oH82rS6qut zm&D^`h6c_8Iv)nVYZoIl#9MK%X3OF9L^gVk4Gr}2QOS8w6y555uoc4C^LH7Y!Mj$!!M>KTj#EME1K0tswnHVD#9JI81*x2Fl0BRjZ zeib&NSg(W@n06DT;eT~K4H57Qk$w@CmKdK<=fyGS!QtqNPP)evsX@mCQHhlYy*TdZ z3Qx_NKBZ0b?F!7*s9PnB2gkvNqvRNSVz2P~s59%}(Dog}J9qu~Cj<0Xm*Q$@8&TpA zcS{sCL=UbTn(GN?S`0vLkbh5yEx(3Nin#vES8ST3u>>w$d|6Hf7Wyibr9<`#XLp3x zqv^iP%nur#e@Y_XU{Y-od9K83D{w+O{f-D;$x3Bv=b8zDidDP zPV5T(14^sX>n&Jbgb^B+$I}^GiUT}FNe`Kj+ghvC(A(C}SEZe&>gKAL;f{JVFif%8 zQfY6#x+YbR2zalmjw)iVw$H`Aeg;q^7hTTE9G|K{wd|q*61AMFEm3z@1B&YvX^Diw zR9Ervh{wd?-$ZgEey%o*o)8xbcb{ax{&hV50bfv&yhAslcb_DIks%lOLfKD`#a=vu zLd1RE>K1ww3XsT8CHf+xEQpfun?f^U1^F5y))#b@#=`!%21$3HW6mQjUk*WQ)hcG7 z+!N;X?1}@HnNuVvYQnH;c3G#)GE_t>gb@y5=!kL^w-ESYViK86kED~+C-JiN+rr&4I7ufSS;6U)B+|p}ciWj}Fu{_>kJcg{`p0vENBc1t3FzFP zw{f6!Mv=Qr(tx3vfL4Kx2&98Nl!#_!y17^r53N&*068E#|knJ~4J7$9(R!t^Kb zbmwslSU7ncH?mGrOpN?c4@Pt{xmPCl$5yZR6rEDfEmYC{ghAt{NSC;%jxQ#SSC~9gekg|*xY2X z(ETsb0h8%Kx7-{7ApG{|EBL6gd24@hP{!7%+Ezc8)xW;WW5a)wrKx<97l^3SY_}6*V?uLGz#!$X$Zzg z?4jeiWKmRenT)zmtr4$<;nY;4X?ck+i7mf(@6bTY8u)CZh<0@Y$8R*0ST&)-DsD>X zV;_R!xM_$G`J@PMi%%)9(^XZ>9U8X?&@|F`h8J4-@UAEfr^2vSo@W%dd#dS1hDIAb z6fRc*0|!kNZl+Q)2*odLRB=6bdt_u3v4|QNCH?cfM#EwvY)LI!A4=H$#DudK)CitE zpu4w^+{3~<9IGh16?%?o9T0(@xa6a)$g|+{q!bk2PQH$ZTf|L8n*lwIx75i4p$cjk zCP8dhzlX?OfOK+2WQ3Kmr{o5Z`*$+kO|+%y`jm$WG#%U#ViEi<34`hs4KE61Rt!X= zVtDFKgk=s*I6ZayRdOgfIpVOH-rNo~V`Tke&^9r%7a`7jJ#t%W!fp$pnM1g z<5j!bvrTV0UXDGZqK;UX$_IYL(@{uxo-|)lMMTyp+^j~Kso^>l@Dj`Qf`y=eSSR&> zLz6R_QA`~GI8I*nlTC_85&fb9_qm^xF+4aC!OTTDk;x|pOuRcM&J)CB4~xb39Gb>z zMbY#B6k%H1@NaQUtjn*W!@Ns;0lOZL817-*tC-u1CRk6m>uDbP{T}1_TgTCBHclB$ zyZgi;n{N7f{A4%VvzK-KN{-{D$N4$dei}-D*W18ZpTw$<@qX_nwyrubbB)7v#9xY~qRtsBw`h5(++H2e`^$M(wmKGf=)vLxeJ<=~ zJP~ZHDxI$Fj^^TjgC#?AFooc5zW1recEV{+SL5aRZVBHXhpCTen>i(JZIrWaTnyD< zxW){=C&u9IQ8*%N3RxOZWvxlE284L2(WM^Z0vO8RNS(($x!zxGp@dIz+vnju5BKy$ zw{FBXgnA!-_@}5Dpw__WN|7Tub}btelh>YXi|-CKfGziLdRssb6QuVhvy3WN(+Lq* z+F{*^&-`R^T1&}-*c2a$o4Ws^j=N9AV(Th06?_6kjVmgB8|NoLlf%ZkVHWDK`s~w` ze45clZByQ$ty=czHk)`u?!=)9>4VA$(<=J?dsr70?)R!D1|h_={B<4}Plz$%`I_YD_X&Z&Vb59bySjJ@l zDkM5aDW2soN<|9ovGy`JqpuG-mt3X06I4uVIn4d9HZEDeb^Bo|=7wEJGOyBy|HEs()b;AyO#+cQH)YiTmJKA$mpI z?~S4f@S-ldjEEm0rGTM^o1^#aFU7bD7@S?rvM)3fjx4TeACV17jLQ!2oJWjhB%;9L(cyO(zCdgSU>w{MH}nXGS; zDMxMtUED(xUDm|cih2l$=W)D3-V?Y(-SFRgy2eKLk3M}Ay7aRnhYqk`3P1KQ@#fnj zqwJT!6Tf6iCIX6S`DK~j#d1ya4>kHQ*v$?dd1mwo-mrWG-uLvfE`e@JEe9*47-@L! zfG$1V<~WTIKw7Lk_Di{U(b?$8gc^hc$x>7n@rhAc$XhH?@+BVso{l5D^^Gu;K4(WP z*e7Y0&e$ovfF5ur-`t=L=*EiTHPY*;4f3mzS~nP7p#+tZb59er)K634$?G~Od&1)a z^`FAK4<>L93L)d@9m_R<_^nqmj`h-tk`f03di#zh*jE?Pt#Tpqhnt)a{i z>dSm|xlh1c?C15sxQI`I0z3r%ZS(N#@rP z_Ia3Yrwh$os?voCHM^3Zqij6MHp3z^L2JD2co_vm7$GP9l}a&Gb2$u-AQ2iku6e@F zSNbiE{BxT!@sTG8h~VIn)X-c5CgUdnBpFDz&F$rg=k{s@3Udu1T~u&Nh3EiTBd|pu zRDq6RhqYo22;tx*OS+ABQ`=6#umDSLJ$(A80#8;sK5&vBLul}sAAC%2UMbgUHyTxi z_SEh)EH-db@=j=|$N4)&pW;bFRc!)SXAUR64pi*IV>qQK>6Gy&H@CssPRZ)`(w6uy z)HvLBR>Zz=enF+;q3j8tFxk9jl^$ECHZY8A*YGg?JFsIg{x5$X8XOuN93I#{ylZ&Z zLj!}`hqv!~hz+k(e`1f1$~$8ZojP?Yhe=r)m236=f9MmVe?eat7U-P*I|hd``ftdS zq(5I0^-a@0BrjK_}F|F+R znrXO(?s)wTK_;(|ib2dlFFi*qxw;Cu4%Ql9?!>$B9JI-#!!kFPpEQFTuB)3>4LGbA z+=!r;^df-Qt$y|tzF?#>qu?6bOyeK_ex{34)V zclAny$lMslFhfUu2Z;lilRS2qBNN!ws3EWRF>L}5F5yr>a0CR;Ex#?l6nq@JB zO{lH`1w<2l1OPfmC7|Cp6cD@;bh@aU1r80X0*{tlAnG%^RfbZIX7v#>;_jMm<({+b zYLP*w3QlkXdT2eu4l0;eCxi(9B#*)87;U0E2yCL^G?F6oDVH5_f~in6s{+GFk@DvE z6A7WUs|F^7K^%qjh2oP2FIESXZ@loz95MCnHnFCA;{|pf1B1F;#Z{=@}5_nP6 zUC-2EWvXZS?CO-}SEq2kky!eF!QJx41Jqb?nbe%iwQ3sr0-Hoi?A2E|-(Obs%^j*w8`k*_h;S>twBXdtbAteT1laI#i zKR{9I_gnI*IXJN_Ed5JFu77a^pq3{;kU|E?Bv`)JXvBW!JCq+6(=ylirCn7`q#E~i zPf3}5`8?kQgou1~au=w^C*R{Xx>XNQ&w1K16P!eI# z^FVaGLh0=cx?oGY^SV5z*m)&C4~hZ`Iwt^X18r{r-lh=OlxPK!@Xz~k@rd$(SR{1$ zs1)4+A~F*^zG!iOXA&ERqoYY!kZYuBoKg0@naVYxJEyE=eH;Q=x*8S@O&3{OohwGR>0bfeE8>I?5}L_{|0Yl?*qF9=#&;L~8P zMYL`A4%6lUioX`hP(&q-Sqec=2hQ~J56i{x5;p)20(&9Rc1vV}dx<~p0jJItgEzOg zonmPC;h64!1dBgTY+%`88+fF5Sh`LY%&`^69cAq(34^0%vM09(PTES6EngJbnf}ej ztLx-+7O`Ok_<0z1CAhd6%a}4=SoO)e=fyv}wkN&YW0auq>qdw~`*x-)a2-#{IA;GdZN2J1qv;TsJ2OYuBz^L?{ZnQO$s*gBV8K2yRIgQM4>ERPHQ z{1BB0sdaB9O4WNL8nlO0*>@-(NJ5tx8eZ4U#rgYgV@pcl{2zd|3X{cm7Z#Wh1e8f{!$e)oNiG)zRQA^30ph zK{~MdpsIqhiS&~l#W!U>RzbwTH>FKX_fi`0Y8qSb9rKRmah9|VT65;M-LPfb7O;EA z#qn*1TNAdeYc#WvJ8CoQHEz4lEQB4-N->Q}XQ=e+q(1;l9e};(K0kTSmZ7^X9!gZN zsx@7=4kut0Hc}2>p{i37rZCR=U4k_>qya(JX6zZ@ctU>ZB}i2)kdDSiJwx7v>mPW9 z43mqUd-}9+R$qJnk&sMa!k-i4;!6cCDgHX1cf7|zKs*z;9V}v(uD)qV2)?E3u`N6K zJXpSYyew3uAfe|-MFIb{uJ=j|UsKqzE=urt+4~<&Jhy$o%pm4iuV>TH&NDsQ(xkE4 zPolMQgJG<>P{ZUxtZ)0=wq)Q%B@>8d!uM(Lyln&}-6p@;8RFM&pUCf{euSWo(1A3N z^Z+-wLb_;;o|5NTL@k=ynC8_Q`?4;3uDqA~G)4n@t#rS`Mzhc537-~&+#97l8XNIS zE|I$?$F5@ZcgFKSpvhMmu3=7ld*UZn-6*gYsy|-~rK8q{7`?}v=UOT!N}7Rq1s`Dj z%$7eXd&A!{g(X&14!$c(!~bLQYlcH4ZZ~h`bh2(W#JkaGO{cX#a>0uckb516d%9*u&n3+T^fVT-ut9xpW!t)2LzKi*(Fj@|&F z^#VJx3TPTHRB1FdySMg}fPQ_7Y&Ui-@A21;ugO>w8op`rk3nQlJo*xW%YUmFcwoDF zG+kQK1H7sfZ>i~N8!3^$TlwcwHu*o%F>TqnKJS#Q$=a zwI$&72v0{vE=-`$iC*O+ArpQ|HP@q#*9hgN53zw>UqHvh<~5OkQ2`f=W4xlz{N zhsY~|M&4*r5vy^HUe`mPa65-j<_;t7PGHi$cYjU4pgiX8{cUMNK}<-y?FhKh+%A+d zyF<_5P=^vy%kGNy{wZ}xs3g`DVYed; zild*QS?>~%;*g7iT)E=X+s`jz9ifpqkw!mkc+r&=+tcm>-Y?D$LSBUn#6`iHR^98G zW$7avb7iJAy}y;8tf#y)H#6f@_ABNN5J4G~;_x**kb(+67@ecVba$bq;0uc`<1!1efBh zrWj4=*BG9wBN|dsQI>^WrE-077f;LDbduHI+sGJm zzhd-UM+yJVBp(#aPMbUhz!$&P;-yB1!gpOZtblBwG8H(Ung7-M`~aL7S;algh-k}TdH2ntMYUeiI{%+q#DWoWy}Cb zK*8RzmTpuasJ^gGE>M<(~;pFhM29M0n^XFc zz?Wi7o--qgUm1Cj0wJO_iGLI)btt!H-*6Dt26Vn#%=GJ$k014^oFYH`w`^%5J|z3Q zR1rLHC3WJB;)F`PMg=aOnIGc2=l^3jW?m(sZM|CFgm$RO^M-ISqf$@R>?A8=l_O2p zk_HsFTKsLBcQyZ0UQ&CMidBoz{3T6HQ$xYKTfks@jq?l0&qF0D-h;(^`upiQoI0P-tX5lsBm})cU z0rU^gP((!UU1lI?=rBJlra2S&DEUc@1PNG|skP!bJM41-I4PqMVC($D zPy~w`yoF$(N*sgTj4QQ2Nm1fVK*Q(w--ooix5EpIZN%-4!%H~7(p?OM3sgsB>~PZr z;!$ew&J^=0(e6(S94loU5gyx&WA$1pcYI@>%XF0$u1slGG~*Lsf~P?h8TO__Ulp4; za~BNG@zwb`oI8t}^y754IANziPP@5uOb`)vYxv_s3W!O?X3jh&-*4wjWF z2J@Qufg}Up)k#Qx%5?3s_mncqNLOgX6<#eBa_cx|W+*0Up?e}#;#e*Xf!EShLL1jO zW09iqU)3}ysx&Y~*oZr^CXz(Rd!8IGsl5wM@$eeKn>qW_lH}=QyP^9QA0!3lhcKIo zpA$C;4{A7qk?LIQIh@Jp>&Azp-LJCh9Pz7uwqq!A#q8n#LCjhMWfyBLN1M` zGx>+iMT&2tPqXF32X4`jWgVPyjce|qWmi zkcaK=`-ijI87+(>0%AvQ5$z709iU$R`MmIOwnnkh*-l*Cw#5e6-Ja7jn12~c6jSk4J4@F}|U~I^v>!g48>K(R9 z3qje-Pgrd9DXglGrdOf{AFZaRkw0u8FLuQVv3&w5?3Z8~2f`&j8vM?w1d29ok^(%w z1bRokXQ4IOzB)?_BG}tB5mRTvX7c(nvKx|M+kyrTeC4gheDT1z%+gNIGE$v)mYo9_Z-r?Jo$+!s8>UE598Q<#{N-qVWJOA zCGUP%1KA!K%hj>%!@PK~wzu{^df~D;ST^Tju>9=j^XiHBafe>tByNAoWog*UM@{7J zo30%3R$uZs-)V&Osa5Z-*hFJ5%#kIRdC`)2KjxV>uYkGWLTUro)c&sOgF!L2SB3jaPWmIsQM*KBz z$IAE261i=P3RNw&qEp-R-PfxgEe3;qXhH_Kjb+~5qIhRakRKbv@v4@o^W5b6R)OTk z!G(IU*x;_}n*H&9>lZ-4_#(IIlhI63PR^!|r@Asy7TYsQZhv1Vp2RH)4BinOwa%~Q zXsNk6`OfHkC)VNzEw3No@9)A(b+^-MZfRO+Z=pM(O?$iwuj&4{<~&?TWEwTa819KR z%3v2d&PYr?wE|C#n3k5gB{E*Z%{fqJG z$i?^Nh0@dC%5~l5p*J3)PZyCpRyo|Je(I&gW$t(N=0q>5BgyiKA1fdwMWZH(1(K70 z@Xyp18?H8mYJ0s@h6HQp{>e=c%dzoQ+SbW(QrJ}>_3+d zaW^Tujyx%q!hU19-0QTHq0b-rZa+J~*qXNf*(%HfJ2R-u(0%pqT_O zPz_=tE&$jxc@W68Rv;buAyAJrZ?d`saO2i=0kk=BcCo7|*tt3Qh}O~775({>uv_l_RA21yPY5Cwsme0U6Zws!NGM!;Fs*B)4Uf%2^ZonT2l4VT^Sy;1Nl#& zq#rv*;0B0)K^z{UdZqg|M<#KLJl}EJ?_Vl=7)!`XdDWpE`Q!|Q6a@JWHTxObGh#=c(%86PC5iq_6 z)=s1Dczq;KU~vl_fJ7N!G6Fa`N6|}ioJ25M^yr|)sNhZS40_fyIZIZIo6wRx-tRQ+uA#G=Pq?}(~?`s?@ z8q*c>tk7`n~^^S!2TRgVI;- z^L2Wj&;_diKhPK|osR|)p2OU}tDF4#g}KKUu8%vr>aVVJP zJ(ye`1#4h}E(pk(5WW36I8uWqOqx)X>-dt3Xag*d%<9~fAG?$CX`sn5Ga+eCMGO9E zLIn~tr`Tm8H-%x6nC1}2S2k*I?p*7ITM?t;y^ZArDBgP}ZP_(xBtS>lc1eB}hY}?# zQwlf_$2G)L`>W+mb`;kl*xp-zOT)Lq=MMCjz)p;T2o}t z;Cbj6QInl#6hl(X`3uqL_4xp?63Z3^cRodS+DA~XYiA?8mgCdcm_{~aK&*H8I2;4j1>OM0mx?=dHG^|JCJFlIOvh+6k+>+y@GQm6!Kdut#B{Q& z&QJd*PyW@Vle3q$e$j|VLn~p z?K=i+bJ?HqzX3#9Un8s34O6%!F>NOUd4tYv&CM4BWcSlM6xeJE~pD?M! zvVKbBaD9G7$5`Z|4^IA6zp2r(=8LhwjOBvJ%8@hN#z+fcFejjUKt^2&(F&I9WMY6} z$QMG*AUZp!@WjoGIw-ZCc8}bUaW0e2PU9O^EGqGEEv!Zkaa$K+-M5!-3?4ai4pDf7 zwwgJqK2cYh;v21n@;xJS&Bi+_m~YI_oG37b6GaC}k5>T4!WyZC%LsIOM`oeg8NE6; zP2p!y;g2HXa!_`8L$%aBj6+o1W~gPcTZO0>ZQbpy_@F*-!)Il5ffYUk7I32KHR*b= z9u$k|0ahXzi$P>@pUm1}T_$EWWY>;>s9Wh2PD_>tR{}u!f+5o z(h^jaq&K7oGzllNnn`%$9>Lz$6f-+!(WnN*Q7GAE)w9&|Le5iCccczwxkXrVKqRn6 zA_Uw0!^%SQHLV)mZlQ9!;g(t7 z^!O~A9?K=e4HrSS&s389Par#i?6y;U#I%PmVmw-s{d&tEF%9)7K-k-7A#4;1@t$Sk z?GYYl*W>XGAIzR%jcb1x;QKSgJ-avfyQuy5ujyH^?p8l zY>T(=vk1Zef&v0$p2E+oD%6|R>3f>4yS6+_H+n9!E0+39gYLNR**mf`z_%?;KO_8`#V>LIj$cct&L_iYAO;ltBz;vAz|)+WgH z!M$kX@DjH_K+Z{eZY@aP5Dy{VfXcTfW zVf&hF&(o3tfTna-5MpyQd39HhI65^f;tla8bm+WZ@$0`tv|orlf|iP=1mif7luU43Yutho7+CyY8?VcLv%$+%@p@ z`X;IgX}wUjtN0&vZ3T}lOo`Ain$`Z*mbq>{#N3Iue7|cNyx%%t_M6};lK7wj$7bNoge{>PF zW7XIB1ZuweKz;eo#94_k<jgu?HC~{tOeYRU*0M%GQ`j+!`v)*bG+#Z zJ@8f06Uud>wxlFoqE}vlJDpoG1+7EUP(&Y74*A!NtOK)8>GRob`*bVEC*oV;(sh~p zD|+LRLf;}yyT3(~UzNi}G4|N6i1!m>5RnnvUn|At!%`S3*iLN58DDeTJeN|~B{+z{ zh!VUQB~Lh>Bjw3lHQUf0+D;B{&a+8R z>Znx+LmPZWD3FLH-1yx~7wX#Fm03UgRWP2@UcPgdZ?XL=C|Xyypffdzf^@5%vZ?lS z>ac_)kaSKqkNx|KYV~mkZ_)h&{T2KI@$sK}^dDA;pJgOk&uaSq_3VE`M@rS)6R3{# z31k5slf+t(t_b4^^Or%3SMh$ZA9({ROqR{Bp>p$hAj!iFb4|G$fvzM}`flB^N&q8!O$tbpxcXEE$!h*hn#3DUCQ;QqE-{ucBWMm?i za`rwO^{q+)b)x(7^v7Kmo_>EhLv-f6ELE?|e1#X4BMz29K6iaCTW`QC|M{Mlh@HU7 zChK$Z5#eC6iTZg08sh8}=hTuN!&(f{_UZ~3^;RDemg8({`7H`;j~25Lw6aurDmVa3ASKLqZ0X|K{a30rZp+U^C{Za$Kiz*r#_4hkH(k-FqJY$ zr!nW=f)U|2Mu+W&bP%Q>{O@QGmt^9Tv%Fu>D~kc_UZsm~FuSly!U-5)fp@zPDw?r~ zIS5fgktK?wjYtg0J?ui4LtWoS);qI@ut9`f2ruwgMdy*N2eDO99NLY?*1uXVa$Ul2 zG=PT%7QpVxF99}0tH^)(+HnLuJ&*{jjExBGCso0W6jKehBd?M5WNc?AT-JRWJ@5X` z4SS${Ban-?J11u`N#AeO{hNg?b(oZ9p}0usQWG_vKldGSBPaxw1&ym zd_#o z5mJ0+AjF7=9l~|AIqf+)aE}j4R!Kh{=6THW;4r}Jb`|2sUulI8)%!1j2VC(0x( zTMwSU6j#bL44zvUdI9n@cF1X`c^}5S`eeA{N*_4pN*|o@v$puXrLs7=_R%t$jC%^p zm9q?v=Shr6i6)Zf-04f>)5?_rm^5TAGwGM( z`+t^uV(E;Jm(mglmE6D+5tDnT{h1HROWV+5Q*P%u|Oxa^mD;MgSHSPxyN z#uNsQZX;n7SN95YyXAiHZq_4CBCu#;x0||x>i3Z>W#19XJQ`=f9Qwp?y9M}yB+($F zRD1IVq8mTv;FI{1ba4l_Br6nrfRQ#hzws{*17pM@25V3xLvT$K;iWYrT<6^qEGrR1 zWX#=v4)`oJ>AngEl>7Xl4~YBFm|C;qOJZKA4 literal 24089 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

lBriHS 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