aboutsummaryrefslogtreecommitdiffstats
path: root/mod
diff options
context:
space:
mode:
authorfabrixxm <fabrix.xm@gmail.com>2011-08-22 13:56:08 +0200
committerfabrixxm <fabrix.xm@gmail.com>2011-08-22 13:56:08 +0200
commitd8bd4fbb3e38bf0ff9c7b61dba58e20c0d097d75 (patch)
treedbdc1dbffe5c56dcff18669e957f679b5ae37bb3 /mod
parentafdc639f17f0f5e12f291b512ccc12b3df6b2acf (diff)
parent564ade0685470158ac487d9a9f18a21079c729bb (diff)
downloadvolse-hubzilla-d8bd4fbb3e38bf0ff9c7b61dba58e20c0d097d75.tar.gz
volse-hubzilla-d8bd4fbb3e38bf0ff9c7b61dba58e20c0d097d75.tar.bz2
volse-hubzilla-d8bd4fbb3e38bf0ff9c7b61dba58e20c0d097d75.zip
Merge branch 'master' into newui
Diffstat (limited to 'mod')
-rw-r--r--mod/contacts.php4
-rw-r--r--mod/dfrn_confirm.php15
-rw-r--r--mod/dfrn_notify.php34
-rw-r--r--mod/dfrn_request.php30
-rw-r--r--mod/follow.php10
-rw-r--r--mod/hcard.php13
-rw-r--r--mod/like.php6
-rw-r--r--mod/message.php104
-rw-r--r--mod/profile.php13
-rw-r--r--mod/receive.php2
-rw-r--r--mod/wall_upload.php2
11 files changed, 88 insertions, 145 deletions
diff --git a/mod/contacts.php b/mod/contacts.php
index eb1de25ad..e4be93cd5 100644
--- a/mod/contacts.php
+++ b/mod/contacts.php
@@ -141,7 +141,7 @@ function contacts_content(&$a) {
$cmd = $a->argv[2];
- $orig_record = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ $orig_record = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d AND `self` = 0 LIMIT 1",
intval($contact_id),
intval(local_user())
);
@@ -222,7 +222,7 @@ function contacts_content(&$a) {
}
- contact_remove($contact_id);
+ contact_remove($orig_record[0]['id']);
info( t('Contact has been removed.') . EOL );
goaway($a->get_baseurl() . '/contacts');
return; // NOTREACHED
diff --git a/mod/dfrn_confirm.php b/mod/dfrn_confirm.php
index 4088178c0..4dacb5d81 100644
--- a/mod/dfrn_confirm.php
+++ b/mod/dfrn_confirm.php
@@ -360,8 +360,14 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
}
$new_relation = $contact['rel'];
- if($network === NETWORK_DIASPORA && $duplex)
- $new_relation = CONTACT_IS_FRIEND;
+ $writable = $contact['writable'];
+
+ if($network === NETWORK_DIASPORA) {
+ if($duplex)
+ $new_relation = CONTACT_IS_FRIEND;
+ if($new_relation != CONTACT_IS_FOLLOWER)
+ $writable = 1;
+ }
$r = q("DELETE FROM `intro` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($intro_id),
@@ -380,6 +386,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
`blocked` = 0,
`pending` = 0,
`network` = '%s',
+ `writable` = %d,
`rel` = %d
WHERE `id` = %d LIMIT 1
",
@@ -392,6 +399,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
dbesc($notify),
dbesc($poll),
dbesc($network),
+ intval($writable),
intval($new_relation),
intval($contact_id)
);
@@ -640,7 +648,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
`blocked` = 0,
`pending` = 0,
`duplex` = %d,
- `network` = 'dfrn' WHERE `id` = %d LIMIT 1
+ `network` = '%s' WHERE `id` = %d LIMIT 1
",
dbesc($photos[0]),
dbesc($photos[1]),
@@ -650,6 +658,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
dbesc(datetime_convert()),
dbesc(datetime_convert()),
intval($duplex),
+ dbesc(NETWORK_DFRN),
intval($dfrn_record)
);
if($r === false) { // indicates schema is messed up or total db failure
diff --git a/mod/dfrn_notify.php b/mod/dfrn_notify.php
index f284b8b38..84cb2fc16 100644
--- a/mod/dfrn_notify.php
+++ b/mod/dfrn_notify.php
@@ -58,6 +58,9 @@ function dfrn_notify_post(&$a) {
break; // NOTREACHED
}
+ // be careful - $importer will contain both the contact information for the contact
+ // sending us the post, and also the user information for the person receiving it.
+ // since they are mixed together, it is easy to get them confused.
$r = q("SELECT `contact`.*, `contact`.`uid` AS `importer_uid`,
`contact`.`pubkey` AS `cpubkey`,
@@ -512,17 +515,19 @@ function dfrn_notify_post(&$a) {
$msg['htmlversion']
= html_entity_decode(bbcode(stripslashes(str_replace(array("\\r\\n", "\\r","\\n\\n" ,"\\n"), "<br />\n",$datarray['body']))));
+ $imgtouse = ((link_compare($datarray['author-link'],$importer['url'])) ? $importer['thumb'] : $datarray['author-avatar']);
+
// load the template for private message notifications
$tpl = get_intltext_template('cmnt_received_html_body_eml.tpl');
$email_html_body_tpl = replace_macros($tpl,array(
'$username' => $importer['username'],
'$sitename' => $a->config['sitename'], // name of this site
'$siteurl' => $a->get_baseurl(), // descriptive url of this site
- '$thumb' => $datarray['author-avatar'], // thumbnail url for sender icon
+ '$thumb' => $imgtouse, // thumbnail url for sender icon
'$email' => $importer['email'], // email address to send to
- '$url' => $datarray['author-link'], // full url for the site
- '$from' => $from, // name of the person sending the message
- '$body' => $msg['htmlversion'], // html version of the message
+ '$url' => $datarray['author-link'], // full url for the site
+ '$from' => $from, // name of the person sending the message
+ '$body' => $msg['htmlversion'], // html version of the message
'$display' => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $posted_id,
));
@@ -532,10 +537,10 @@ function dfrn_notify_post(&$a) {
'$username' => $importer['username'],
'$sitename' => $a->config['sitename'], // name of this site
'$siteurl' => $a->get_baseurl(), // descriptive url of this site
- '$thumb' => $datarray['author-avatar'], // thumbnail url for sender icon
+ '$thumb' => $imgtouse, // thumbnail url for sender icon
'$email' => $importer['email'], // email address to send to
- '$url' => $datarray['author-link'], // full url for the site
- '$from' => $from, // name of the person sending the message
+ '$url' => $datarray['author-link'], // full url for the site
+ '$from' => $from, // name of the person sending the message
'$body' => $msg['textversion'], // text version of the message
'$display' => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $posted_id,
));
@@ -643,15 +648,18 @@ function dfrn_notify_post(&$a) {
$msg['htmlversion']
= html_entity_decode(bbcode(stripslashes(str_replace(array("\\r\\n", "\\r","\\n\\n" ,"\\n"), "<br />\n",$datarray['body']))));
+ $imgtouse = ((link_compare($datarray['author-link'],$importer['url'])) ? $importer['thumb'] : $datarray['author-avatar']);
+
+
// load the template for private message notifications
$tpl = get_intltext_template('cmnt_received_html_body_eml.tpl');
$email_html_body_tpl = replace_macros($tpl,array(
'$username' => $importer['username'],
'$sitename' => $a->config['sitename'], // name of this site
'$siteurl' => $a->get_baseurl(), // descriptive url of this site
- '$thumb' => $datarray['author-avatar'], // thumbnail url for sender icon
- '$url' => $datarray['author-link'], // full url for the site
- '$from' => $from, // name of the person sending the message
+ '$thumb' => $imgtouse, // thumbnail url for sender icon
+ '$url' => $datarray['author-link'], // full url for the site
+ '$from' => $from, // name of the person sending the message
'$body' => $msg['htmlversion'], // html version of the message
'$display' => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $posted_id,
));
@@ -662,9 +670,9 @@ function dfrn_notify_post(&$a) {
'$username' => $importer['username'],
'$sitename' => $a->config['sitename'], // name of this site
'$siteurl' => $a->get_baseurl(), // descriptive url of this site
- '$thumb' => $datarray['author-avatar'], // thumbnail url for sender icon
- '$url' => $datarray['author-link'], // full url for the site
- '$from' => $from, // name of the person sending the message
+ '$thumb' => $imgtouse, // thumbnail url for sender icon
+ '$url' => $datarray['author-link'], // full url for the site
+ '$from' => $from, // name of the person sending the message
'$body' => $msg['textversion'], // text version of the message
'$display' => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $posted_id,
));
diff --git a/mod/dfrn_request.php b/mod/dfrn_request.php
index 79070604b..98901e9f5 100644
--- a/mod/dfrn_request.php
+++ b/mod/dfrn_request.php
@@ -12,10 +12,6 @@
if(! function_exists('dfrn_request_init')) {
function dfrn_request_init(&$a) {
- if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
- return;
- }
-
if($a->argc > 1)
$which = $a->argv[1];
@@ -147,8 +143,8 @@ function dfrn_request_post(&$a) {
*/
$r = q("INSERT INTO `contact` ( `uid`, `created`,`url`, `name`, `nick`, `photo`, `site-pubkey`,
- `request`, `confirm`, `notify`, `poll`, `aes_allow`)
- VALUES ( %d, '%s', '%s', '%s' , '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d)",
+ `request`, `confirm`, `notify`, `poll`, `network`, `aes_allow`)
+ VALUES ( %d, '%s', '%s', '%s' , '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d)",
intval(local_user()),
datetime_convert(),
dbesc($dfrn_url),
@@ -160,6 +156,7 @@ function dfrn_request_post(&$a) {
$parms['dfrn-confirm'],
$parms['dfrn-notify'],
$parms['dfrn-poll'],
+ dbesc(NETWORK_DFRN),
intval($aes_allow)
);
}
@@ -298,7 +295,7 @@ function dfrn_request_post(&$a) {
}
- if($network === 'dfrn') {
+ if($network === NETWORK_DFRN) {
$ret = q("SELECT * FROM `contact` WHERE `uid` = %d AND `url` = '%s' AND `self` = 0 LIMIT 1",
intval($uid),
dbesc($url)
@@ -373,8 +370,8 @@ function dfrn_request_post(&$a) {
dbesc_array($parms);
$r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `name`, `nick`, `issued-id`, `photo`, `site-pubkey`,
- `request`, `confirm`, `notify`, `poll` )
- VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )",
+ `request`, `confirm`, `notify`, `poll`, `network` )
+ VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )",
intval($uid),
datetime_convert(),
$parms['url'],
@@ -386,7 +383,8 @@ function dfrn_request_post(&$a) {
$parms['dfrn-request'],
$parms['dfrn-confirm'],
$parms['dfrn-notify'],
- $parms['dfrn-poll']
+ $parms['dfrn-poll'],
+ dbesc(NETWORK_DFRN)
);
// find the contact record we just created
@@ -437,15 +435,16 @@ function dfrn_request_post(&$a) {
. (($aes_allow) ? "&aes_allow=1" : "")
);
// NOTREACHED
- // END $network === 'dfrn'
+ // END $network === NETWORK_DFRN
}
- elseif($network === 'stat') {
+ elseif($network === NETWORK_OSTATUS) {
/**
*
* OStatus network
* Check contact existence
- * Try and scrape together enough information to create a contact record, with us as CONTACT_IS_FOLLOWER
+ * Try and scrape together enough information to create a contact record,
+ * with us as CONTACT_IS_FOLLOWER
* Substitute our user's feed URL into $url template
* Send the subscriber home to subscribe
*
@@ -454,7 +453,7 @@ function dfrn_request_post(&$a) {
$url = str_replace('{uri}', $a->get_baseurl() . '/dfrn_poll/' . $nickname, $url);
goaway($url);
// NOTREACHED
- // END $network === 'stat'
+ // END $network === NETWORK_OSTATUS
}
} return;
@@ -466,8 +465,6 @@ function dfrn_request_post(&$a) {
if(! function_exists('dfrn_request_content')) {
function dfrn_request_content(&$a) {
-
-
if(($a->argc != 2) || (! count($a->profile)))
return "";
@@ -578,6 +575,7 @@ function dfrn_request_content(&$a) {
);
}
}
+
killme();
return; // NOTREACHED
}
diff --git a/mod/follow.php b/mod/follow.php
index 14b2ea46c..df4d2e630 100644
--- a/mod/follow.php
+++ b/mod/follow.php
@@ -100,9 +100,9 @@ function follow_post(&$a) {
$new_relation = CONTACT_IS_FOLLOWER;
// create contact record
- $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `addr`, `alias`, `notify`, `poll`, `name`, `nick`, `photo`, `network`, `rel`, `priority`,
+ $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `addr`, `alias`, `notify`, `poll`, `name`, `nick`, `photo`, `network`, `pubkey`, `rel`, `priority`,
`writable`, `blocked`, `readonly`, `pending` )
- VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ",
+ VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ",
intval(local_user()),
dbesc(datetime_convert()),
dbesc($ret['url']),
@@ -114,6 +114,7 @@ function follow_post(&$a) {
dbesc($ret['nick']),
dbesc($ret['photo']),
dbesc($ret['network']),
+ dbesc($ret['pubkey']),
intval($new_relation),
intval($ret['priority']),
intval($writeable)
@@ -190,11 +191,12 @@ function follow_post(&$a) {
}
if($contact['network'] == NETWORK_DIASPORA) {
require_once('include/diaspora.php');
- $ret = diaspora_share($a->user,$r[0]);
+ $ret = diaspora_share($a->user,$contact);
logger('mod_follow: diaspora_share returns: ' . $ret);
}
}
- goaway($_SESSION['return_url']);
+ goaway($a->get_baseurl() . '/contacts/' . $contact_id);
+// goaway($_SESSION['return_url']);
// NOTREACHED
}
diff --git a/mod/hcard.php b/mod/hcard.php
index 5505ca08e..19e649dcb 100644
--- a/mod/hcard.php
+++ b/mod/hcard.php
@@ -2,8 +2,7 @@
function hcard_init(&$a) {
- if((get_config('system','block_public')) && (! local_user()) && (! remote_user()))
- return;
+ $blocked = (((get_config('system','block_public')) && (! local_user()) && (! remote_user())) ? true : false);
if($a->argc > 1)
$which = $a->argv[1];
@@ -31,10 +30,12 @@ function hcard_init(&$a) {
$a->page['htmlhead'] .= '<link rel="openid.delegate" href="' . $delegate . '" />' . "\r\n";
}
- $keywords = ((x($a->profile,'pub_keywords')) ? $a->profile['pub_keywords'] : '');
- $keywords = str_replace(array(',',' ',',,'),array(' ',',',','),$keywords);
- if(strlen($keywords))
- $a->page['htmlhead'] .= '<meta name="keywords" content="' . $keywords . '" />' . "\r\n" ;
+ if(! $blocked) {
+ $keywords = ((x($a->profile,'pub_keywords')) ? $a->profile['pub_keywords'] : '');
+ $keywords = str_replace(array(',',' ',',,'),array(' ',',',','),$keywords);
+ if(strlen($keywords))
+ $a->page['htmlhead'] .= '<meta name="keywords" content="' . $keywords . '" />' . "\r\n" ;
+ }
$a->page['htmlhead'] .= '<meta name="dfrn-global-visibility" content="' . (($a->profile['net-publish']) ? 'true' : 'false') . '" />' . "\r\n" ;
$a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . $a->get_baseurl() . '/dfrn_poll/' . $which .'" />' . "\r\n" ;
diff --git a/mod/like.php b/mod/like.php
index 966fe500b..287630212 100644
--- a/mod/like.php
+++ b/mod/like.php
@@ -19,14 +19,10 @@ function like_content(&$a) {
switch($verb) {
case 'like':
- $activity = ACTIVITY_LIKE;
- break;
- case 'dislike':
- $activity = ACTIVITY_DISLIKE;
- break;
case 'unlike':
$activity = ACTIVITY_LIKE;
break;
+ case 'dislike':
case 'undislike':
$activity = ACTIVITY_DISLIKE;
break;
diff --git a/mod/message.php b/mod/message.php
index 9e8999592..cc94730bc 100644
--- a/mod/message.php
+++ b/mod/message.php
@@ -1,6 +1,7 @@
<?php
require_once('include/acl_selectors.php');
+require_once('include/message.php');
function message_post(&$a) {
@@ -14,97 +15,22 @@ function message_post(&$a) {
$body = ((x($_POST,'body')) ? escape_tags(trim($_POST['body'])) : '');
$recipient = ((x($_POST,'messageto')) ? intval($_POST['messageto']) : 0 );
- if(! $recipient) {
- notice( t('No recipient selected.') . EOL );
- return;
- }
-
- if(! strlen($subject))
- $subject = t('[no subject]');
-
- $me = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1",
- intval(local_user())
- );
- $contact = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($recipient),
- intval(local_user())
- );
-
- if(! (count($me) && (count($contact)))) {
- notice( t('Unable to locate contact information.') . EOL );
- return;
- }
-
- $hash = random_string();
- $uri = 'urn:X-dfrn:' . $a->get_baseurl() . ':' . local_user() . ':' . $hash ;
-
- if(! strlen($replyto))
- $replyto = $uri;
-
- $r = q("INSERT INTO `mail` ( `uid`, `from-name`, `from-photo`, `from-url`,
- `contact-id`, `title`, `body`, `seen`, `replied`, `uri`, `parent-uri`, `created`)
- VALUES ( %d, '%s', '%s', '%s', %d, '%s', '%s', %d, %d, '%s', '%s', '%s' )",
- intval(local_user()),
- dbesc($me[0]['name']),
- dbesc($me[0]['thumb']),
- dbesc($me[0]['url']),
- intval($recipient),
- dbesc($subject),
- dbesc($body),
- 1,
- 0,
- dbesc($uri),
- dbesc($replyto),
- datetime_convert()
- );
- $r = q("SELECT * FROM `mail` WHERE `uri` = '%s' and `uid` = %d LIMIT 1",
- dbesc($uri),
- intval(local_user())
- );
- if(count($r))
- $post_id = $r[0]['id'];
-
- /**
- *
- * When a photo was uploaded into the message using the (profile wall) ajax
- * uploader, The permissions are initially set to disallow anybody but the
- * owner from seeing it. This is because the permissions may not yet have been
- * set for the post. If it's private, the photo permissions should be set
- * appropriately. But we didn't know the final permissions on the post until
- * now. So now we'll look for links of uploaded messages that are in the
- * post and set them to the same permissions as the post itself.
- *
- */
-
- $match = null;
-
- if(preg_match_all("/\[img\](.*?)\[\/img\]/",$body,$match)) {
- $images = $match[1];
- if(count($images)) {
- foreach($images as $image) {
- if(! stristr($image,$a->get_baseurl() . '/photo/'))
- continue;
- $image_uri = substr($image,strrpos($image,'/') + 1);
- $image_uri = substr($image_uri,0, strpos($image_uri,'-'));
- $r = q("UPDATE `photo` SET `allow_cid` = '%s'
- WHERE `resource-id` = '%s' AND `album` = '%s' AND `uid` = %d ",
- dbesc('<' . $recipient . '>'),
- dbesc($image_uri),
- dbesc( t('Wall Photos')),
- intval(local_user())
- );
- }
- }
- }
- if($post_id) {
- proc_run('php',"include/notifier.php","mail","$post_id");
- info( t('Message sent.') . EOL );
- }
- else {
- notice( t('Message could not be sent.') . EOL );
+ $ret = send_message($recipient, $body, $subject, $replyto);
+
+ switch($ret){
+ case -1:
+ notice( t('No recipient selected.') . EOL );
+ break;
+ case -2:
+ notice( t('Unable to locate contact information.') . EOL );
+ break;
+ case -3:
+ notice( t('Message could not be sent.') . EOL );
+ default:
+ info( t('Message sent.') . EOL );
}
- return;
+
}
function message_content(&$a) {
diff --git a/mod/profile.php b/mod/profile.php
index 5a66892da..66fa17554 100644
--- a/mod/profile.php
+++ b/mod/profile.php
@@ -2,8 +2,7 @@
function profile_init(&$a) {
- if((get_config('system','block_public')) && (! local_user()) && (! remote_user()))
- return;
+ $blocked = (((get_config('system','block_public')) && (! local_user()) && (! remote_user())) ? true : false);
if($a->argc > 1)
$which = $a->argv[1];
@@ -31,10 +30,12 @@ function profile_init(&$a) {
$a->page['htmlhead'] .= '<link rel="openid.delegate" href="' . $delegate . '" />' . "\r\n";
}
- $keywords = ((x($a->profile,'pub_keywords')) ? $a->profile['pub_keywords'] : '');
- $keywords = str_replace(array(',',' ',',,'),array(' ',',',','),$keywords);
- if(strlen($keywords))
- $a->page['htmlhead'] .= '<meta name="keywords" content="' . $keywords . '" />' . "\r\n" ;
+ if(! $blocked) {
+ $keywords = ((x($a->profile,'pub_keywords')) ? $a->profile['pub_keywords'] : '');
+ $keywords = str_replace(array(',',' ',',,'),array(' ',',',','),$keywords);
+ if(strlen($keywords))
+ $a->page['htmlhead'] .= '<meta name="keywords" content="' . $keywords . '" />' . "\r\n" ;
+ }
$a->page['htmlhead'] .= '<meta name="dfrn-global-visibility" content="' . (($a->profile['net-publish']) ? 'true' : 'false') . '" />' . "\r\n" ;
$a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . $a->get_baseurl() . '/dfrn_poll/' . $which .'" />' . "\r\n" ;
diff --git a/mod/receive.php b/mod/receive.php
index 19c163967..c3738c143 100644
--- a/mod/receive.php
+++ b/mod/receive.php
@@ -15,6 +15,8 @@ function receive_post(&$a) {
if($a->argc != 3 || $a->argv[1] !== 'users')
http_status_exit(500);
+ logger('receive: raw input: ' . file_get_contents('php://input'), LOGGER_DATA);
+
$guid = $a->argv[2];
$r = q("SELECT * FROM `user` WHERE `guid` = '%s' LIMIT 1",
diff --git a/mod/wall_upload.php b/mod/wall_upload.php
index dd2197d7c..b34f2cf6b 100644
--- a/mod/wall_upload.php
+++ b/mod/wall_upload.php
@@ -55,7 +55,7 @@ function wall_upload_post(&$a) {
if(($maximagesize) && ($filesize > $maximagesize)) {
echo sprintf( t('Image exceeds size limit of %d'), $maximagesize) . EOL;
@unlink($src);
- return;
+ killme();
}
$imagedata = @file_get_contents($src);