/php/getff.php

https://gitlab.com/AaronDeb/cloudbox · PHP · 518 lines · 424 code · 54 blank · 40 comment · 116 complexity · 76106501774fed47322e1c147fd7f821 MD5 · raw file

  1. <?PHP
  2. include 'init.php';
  3. session_start();
  4. $mode = $_GET['mode'];
  5. echo "<flrequest>";
  6. switch($mode){
  7. case "file" :
  8. $action = $_GET['action'];
  9. switch ($action) {
  10. case "fOpen" :
  11. $fileName = $_GET['filename'];
  12. $type = $_GET['type'];
  13. $folder = $_GET['folder'];
  14. if($folder == "") {
  15. $fTypeResult = dbUtil::SELECT("SELECT clmnFileType FROM tblFiles WHERE clmnUNFile=:uname AND clmnFileName=:fname AND clmnFoldIn='root'", array(':uname' => $_SESSION['un'], ':fname' => $fileName));
  16. if(count($fTypeResult) != 0) {
  17. $fType = $fTypeResult[0]['clmnFileType'];
  18. }
  19. } else {
  20. $fTypeResult = dbUtil::SELECT("SELECT clmnFileType FROM tblFiles WHERE clmnUNFile=:uname AND clmnFileName=:fname AND clmnFoldIn=:foldName", array(':uname' => $_SESSION['un'], ':fname' => $fileName,':foldName' => $folder) );
  21. if(count($fTypeResult) != 0) {
  22. $fType = $fTypeResult[0]['clmnFileType'];
  23. }
  24. }
  25. /*
  26. filename actual if type == actType
  27. */
  28. $fileType = explode("/", $fType);
  29. if($type == $fileType[0])
  30. {
  31. switch($type) {
  32. case "image" :
  33. echo "<filecontents>";
  34. $fActNameResult = dbUtil::SELECT("SELECT clmnActFN FROM tblFiles WHERE clmnUNFile=:uname AND clmnFileName=:fname", array(':uname' => $_SESSION['un'], ':fname' => $fileName));
  35. if(count($fActNameResult) != 0) {
  36. $actFN = $fActNameResult[0]['clmnActFN'];
  37. }
  38. $data = file_get_contents("../files/" . $actFN);
  39. echo base64_encode($data);
  40. echo "</filecontents>";
  41. break;
  42. case "video" :
  43. echo "<videofname>";
  44. $fActNameResult = dbUtil::SELECT("SELECT clmnActFN FROM tblFiles WHERE clmnUNFile=:uname AND clmnFileName=:fname", array(':uname' => $_SESSION['un'], ':fname' => $fileName));
  45. if(count($fActNameResult) != 0) {
  46. $actFN = $fActNameResult[0]['clmnActFN'];
  47. }
  48. $data = copy("../files/" . $actFN, "../temp/" . $fileName);
  49. echo "/temp/" . $fileName;
  50. echo "</videofname>";
  51. break;
  52. default :
  53. break;
  54. }
  55. }
  56. break;
  57. case 'fNew' :
  58. $name = $_GET['name'];
  59. $type = $_GET['type'];
  60. $where = $_GET['where'];
  61. if($type == 'Folder') {
  62. //check if there is a folder named the same
  63. $fCheckResult = dbUtil::SELECT("SELECT clmnFoldID FROM tblFolders WHERE clmnUNFolder=:uname AND clmnFoldIn=:foldin AND clmnFoldName=:fname", array(':uname' => $_SESSION['un'], ':fname' => $name, ':foldin' => $where));
  64. if(count($fCheckResult) == 0) {
  65. //if not add folder
  66. $exc = dbUtil::INSERT("INSERT INTO tblFolders VALUES('', :foldName, :foldIn, :UNfold)", array(':foldName' => $name, ':foldIn' => $where, ':UNfold' => $_SESSION['un']));
  67. if($exc == true)
  68. {
  69. //sucess
  70. }
  71. } else {
  72. //Throw error
  73. xml_encode("error", "Folder already exists!");
  74. }
  75. }
  76. break;
  77. case 'fRename' :
  78. $fName = $_GET['name'];
  79. $newName = $_GET['newname'];
  80. $type = $_GET['type'];
  81. $where = $_GET['where'];
  82. if($type == 'Folder') {
  83. //check if there is a folder named the same
  84. $fCheckResult = dbUtil::SELECT("SELECT clmnFoldID FROM tblFolders WHERE clmnUNFolder=:uname AND clmnFoldIn=:foldin AND clmnFoldName=:fname", array(':uname' => $_SESSION['un'], ':fname' => $newName, ':foldin' => $where));
  85. if(count($fCheckResult) == 0) {
  86. //if not update folder name
  87. $exc = dbUtil::UPDATE("UPDATE tblFolders SET clmnFoldName=:newFoldName WHERE clmnUNFolder=:uname AND clmnFoldIn=:foldin AND clmnFoldName=:fname", array(':newFoldName' => $newName, ':uname' => $_SESSION['un'], ':fname' => $fName, ':foldin' => $where));
  88. if($exc == true)
  89. {
  90. //sucess
  91. }
  92. } else {
  93. //Throw error
  94. xml_encode("error", "Folder already exists!");
  95. }
  96. } else {
  97. //check if there is a file named the same
  98. $fCheckResult = dbUtil::SELECT("SELECT clmnFileID FROM tblFiles WHERE clmnFileName=:fileName AND clmnFoldIn=:foldin AND clmnUNFile=:uname", array(':fileName' => $newName, ':uname' => $_SESSION['un'], ':foldin' => $where));
  99. if(count($fCheckResult) == 0) {
  100. //if not update file name
  101. $exc = dbUtil::UPDATE("UPDATE tblFiles SET clmnFileName=:newFileName WHERE clmnFileName=:fileName AND clmnFoldIn=:foldin AND clmnUNFile=:uname", array(':newFileName' => $newName, ':uname' => $_SESSION['un'], ':fileName' => $fName, ':foldin' => $where));
  102. if($exc == true)
  103. {
  104. //sucess
  105. }
  106. } else {
  107. //Throw error
  108. xml_encode("error", "File already exists!");
  109. }
  110. }
  111. break;
  112. case 'fRemove' :
  113. $fName = $_GET['name'];
  114. $type = $_GET['type'];
  115. $where = $_GET['where'];
  116. if($type == 'Folder') {
  117. $fCheckResult = dbUtil::SELECT("SELECT clmnFoldID FROM tblFolders WHERE clmnUNFolder=:uname AND clmnFoldIn=:foldin AND clmnFoldName=:fname", array(':uname' => $_SESSION['un'], ':fname' => $fName, ':foldin' => $where));
  118. if(count($fCheckResult) != 0) {
  119. echo $fCheckResult[0]['clmnFoldID'];
  120. dbUtil::DELETE("DELETE FROM tblFolders WHERE clmnFoldID=:foldId", array(':foldId' => $fCheckResult[0]['clmnFoldID']));
  121. }
  122. } else {
  123. //Get fileid from selection of columns
  124. //DELETE row with that fileid
  125. //DELETE shared row with that fileid
  126. $fCheckResult = dbUtil::SELECT("SELECT clmnFileID FROM tblFiles WHERE clmnFileName=:fileName AND clmnFoldIn=:foldin AND clmnUNFile=:uname", array(':fileName' => $fName, ':uname' => $_SESSION['un'], ':foldin' => $where));
  127. if(count($fCheckResult) != 0) {
  128. dbUtil::DELETE("DELETE FROM tblFiles WHERE clmnFileID=:fileId", array(':fileId' => $fCheckResult[0]['clmnFileID']));
  129. dbUtil::DELETE("DELETE FROM tblSharedFiles WHERE clmnFileID=:fileId", array(':fileId' => $fCheckResult[0]['clmnFileID']));
  130. }
  131. }
  132. break;
  133. case 'fEncrypt' :
  134. $fName = $_GET['name'];
  135. $type = $_GET['type'];
  136. $where = $_GET['where'];
  137. //Set file as Encrypted
  138. $exc = dbUtil::UPDATE("UPDATE tblFiles SET clmnEncrypted='1' WHERE clmnFileName=:fileName AND clmnFoldIn=:foldin AND clmnUNFile=:uname", array(':uname' => $_SESSION['un'], ':fileName' => $fName, ':foldin' => $where));
  139. if($exc == true)
  140. {
  141. //sucess
  142. }
  143. //Encrypt File
  144. $kCheckResult = dbUtil::SELECT("SELECT clmnKey FROM tblUsers WHERE clmnUserName=:uname", array(':uname' => $_SESSION['un']));
  145. if(count($kCheckResult) != 0) {
  146. $fActNameResult = dbUtil::SELECT("SELECT clmnActFN FROM tblFiles WHERE clmnUNFile=:uname AND clmnFileName=:fname", array(':uname' => $_SESSION['un'], ':fname' => $fName));
  147. if(count($fActNameResult) != 0) {
  148. $actFN = $fActNameResult[0]['clmnActFN'];
  149. }
  150. $key = $kCheckResult[0]['clmnKey'];
  151. $f = fopen("../files/" . $actFN, "r+");
  152. $len = filesize("../files/" . $actFN);
  153. $input = fread($f, $len);
  154. $data = base64_encode($input);
  155. fwrite($f, $data);
  156. fclose($fw);
  157. }
  158. break;
  159. case 'fDecrypt' :
  160. $fName = $_GET['name'];
  161. $type = $_GET['type'];
  162. $where = $_GET['where'];
  163. //Set file as Encrypted
  164. $exc = dbUtil::UPDATE("UPDATE tblFiles SET clmnEncrypted='0' WHERE clmnFileName=:fileName AND clmnFoldIn=:foldin AND clmnUNFile=:uname", array(':uname' => $_SESSION['un'], ':fileName' => $fName, ':foldin' => $where));
  165. if($exc == true)
  166. {
  167. //sucess
  168. }
  169. //Encrypt File
  170. $kCheckResult = dbUtil::SELECT("SELECT clmnKey FROM tblUsers WHERE clmnUserName=:uname", array(':uname' => $_SESSION['un']));
  171. if(count($kCheckResult) != 0) {
  172. $fActNameResult = dbUtil::SELECT("SELECT clmnActFN FROM tblFiles WHERE clmnUNFile=:uname AND clmnFileName=:fname", array(':uname' => $_SESSION['un'], ':fname' => $fName));
  173. if(count($fActNameResult) != 0) {
  174. $actFN = $fActNameResult[0]['clmnActFN'];
  175. }
  176. $key = $kCheckResult[0]['clmnKey'];
  177. $f = fopen("../files/" . $actFN, "r+");
  178. $len = filesize("../files/" . $actFN);
  179. $input = fread($f, $len);
  180. $data = base64_decode($input);
  181. fwrite($f, $data);
  182. fclose($fw);
  183. }
  184. break;
  185. case 'fShare' :
  186. $fName = $_GET['name'];
  187. $toShare = $_GET['sharer'];
  188. $type = $_GET['type'];
  189. $where = $_GET['where'];
  190. $shareCheckResult = dbUtil::SELECT("SELECT clmnID FROM tblUsers WHERE clmnUserName=:usrname", array(':usrname' => $toShare));
  191. if(count($shareCheckResult) == 0) {
  192. xml_encode("error", "Sharer Not Found!");
  193. die();
  194. }
  195. $userIdResult = dbUtil::SELECT("SELECT clmnId FROM tblUsers WHERE clmnUserName=:uname", array(':uname' => $_SESSION['un']));
  196. if(count($userIdResult) != 0) {
  197. $userId = $userIdResult[0]['clmnId'];
  198. }
  199. $fCheckResult = dbUtil::SELECT("SELECT clmnFileID FROM tblFiles WHERE clmnFileName=:fileName AND clmnFoldIn=:foldin AND clmnUNFile=:uname", array(':fileName' => $fName, ':uname' => $_SESSION['un'], ':foldin' => $where));
  200. if(count($fCheckResult) != 0) {
  201. $sCheckResult = dbUtil::SELECT("SELECT clmnShrId FROM tblSharedFiles WHERE clmnFileID=:fileId", array(':fileId' => $fCheckResult[0]['clmnFileID']));
  202. if(count($sCheckResult) == 0) {
  203. $exc = dbUtil::INSERT("INSERT INTO tblSharedFiles VALUES('', :fileid, :fileown, :unfold)", array(':fileid' => $fCheckResult[0]['clmnFileID'], ':unfold' => $shareCheckResult[0]['clmnID'], ':fileown' => $userId));
  204. if($exc == true)
  205. {
  206. //sucess
  207. }
  208. }
  209. }
  210. break;
  211. case 'fUnShare' :
  212. $fName = $_GET['name'];
  213. $type = $_GET['type'];
  214. $where = $_GET['where'];
  215. $fCheckResult = dbUtil::SELECT("SELECT clmnFileID FROM tblFiles WHERE clmnFileName=:fileName AND clmnFoldIn=:foldin AND clmnUNFile=:uname", array(':fileName' => $fName, ':uname' => $_SESSION['un'], ':foldin' => $where));
  216. if(count($fCheckResult) != 0) {
  217. dbUtil::DELETE("DELETE FROM tblSharedFiles WHERE clmnFileID=:fileId", array(':fileId' => $fCheckResult[0]['clmnFileID']));
  218. }
  219. break;
  220. case 'fDownload' :
  221. $dmode = $_GET['dmode'];
  222. switch ($dmode) {
  223. case 'single':
  224. $fName = $_GET['name'];
  225. $type = $_GET['type'];
  226. $where = $_GET['where'];
  227. if($type == 'Folder') {
  228. //recursive
  229. if(!(is_dir("../temp/" . $fName)))
  230. {
  231. mkdir("../temp/" . $fName);
  232. }
  233. $fFolderFilesResult = dbUtil::SELECT("SELECT clmnFileID FROM tblFiles WHERE clmnUNFile=:uname AND clmnFoldIn=:foldin", array(':uname' => $_SESSION['un'], ':foldin' => $fName));
  234. if(count($fFolderFilesResult) != 0) {
  235. foreach($fFolderFilesResult as $row) {
  236. $fActNameResult = dbUtil::SELECT("SELECT clmnActFN FROM tblFiles WHERE clmnFileID=:fileid", array(':fileid' => $row['clmnFileID']));
  237. if(count($fActNameResult) != 0) {
  238. $actFN = $fActNameResult[0]['clmnActFN'];
  239. copy("../files/" . $actFN, "../temp/" . $fName);
  240. }
  241. }
  242. }
  243. //Zip Folder
  244. Zip("../temp/" . $fName, "../temp/" . $fName, $fName);
  245. //Remove Directory
  246. } else {
  247. $fActNameResult = dbUtil::SELECT("SELECT clmnActFN FROM tblFiles WHERE clmnUNFile=:uname AND clmnFileName=:fname", array(':uname' => $_SESSION['un'], ':fname' => $fName));
  248. if(count($fActNameResult) != 0) {
  249. $actFN = $fActNameResult[0]['clmnActFN'];
  250. }
  251. copy("../files/" . $actFN, "../temp/" . $fName);
  252. }
  253. break;
  254. case 'getkey':
  255. echo "<key>" . md5(generateRandomString()) . "</key>";
  256. break;
  257. case 'package':
  258. //move files or folders to respective <key> directory
  259. $fName = $_GET['name'];
  260. $type = $_GET['type'];
  261. $where = $_GET['where'];
  262. $key = $_GET['key'];
  263. if(!(is_dir("../temp/" . $key . "/")))
  264. {
  265. mkdir("../temp/" . $key . "/");
  266. }
  267. if($type == 'Folder') {
  268. //recursive .
  269. if(!(is_dir("../temp/" . $key . "/" . $fName)))
  270. {
  271. mkdir("../temp/" . $key . "/" . $fName);
  272. }
  273. $fFolderFilesResult = dbUtil::SELECT("SELECT clmnFileID, clmnFileName FROM tblFiles WHERE clmnUNFile=:uname AND clmnFoldIn=:foldin", array(':uname' => $_SESSION['un'], ':foldin' => $fName));
  274. if(count($fFolderFilesResult) != 0) {
  275. foreach($fFolderFilesResult as $row) {
  276. $fActNameResult = dbUtil::SELECT("SELECT clmnActFN FROM tblFiles WHERE clmnFileID=:fileid", array(':fileid' => $row['clmnFileID']));
  277. if(count($fActNameResult) != 0) {
  278. $actFN = $fActNameResult[0]['clmnActFN'];
  279. }
  280. copy("../files/" . $actFN, "../temp/" . $key . "/" . $fName . "/". $row['clmnFileName']);
  281. }
  282. }
  283. } else {
  284. $fActNameResult = dbUtil::SELECT("SELECT clmnActFN FROM tblFiles WHERE clmnUNFile=:uname AND clmnFileName=:fname AND clmnFoldIn=:foldin", array(':uname' => $_SESSION['un'], ':fname' => $fName, ':foldin' => $where));
  285. if(count($fActNameResult) != 0) {
  286. $actFN = $fActNameResult[0]['clmnActFN'];
  287. }
  288. copy("../files/" . $actFN, "../temp/" . $key . "/" . $fName);
  289. }
  290. break;
  291. case 'compress':
  292. $key = $_GET['key'];
  293. //Zip Folder
  294. Zip("../temp/" . $key, "../temp/" . $key . "/", $key);
  295. $filename = $key . ".zip";
  296. $filepath = "temp/";
  297. //Remove file
  298. //unlink("../temp/" . $key . ".zip");
  299. //Remove Directory
  300. removeDir("../temp/" . $key . "/");
  301. break;
  302. default:
  303. // not supported
  304. break;
  305. }
  306. break;
  307. default:
  308. // not supported
  309. break;
  310. }
  311. break;
  312. case "folder" :
  313. echo "<files>";
  314. $foldName = $_GET['fn'];
  315. $result = dbUtil::SELECT("SELECT clmnFileName, clmnFileSize, clmnFileModified, clmnFileType FROM tblfiles WHERE clmnUNFile=:un AND clmnFoldIn=:fn AND clmnEncrypted='0' ", array(':fn' => $foldName ,':un' => $_SESSION['un']));
  316. if ( count($result) ) {
  317. foreach($result as $row) {
  318. echo "<file>";
  319. echo "<filename>" . $row['clmnFileName'] . "</filename>";
  320. echo "<filesize>" . FileSizeConvert($row['clmnFileSize']) . "</filesize>";
  321. echo "<filemod>" . date("d/m/Y", $row['clmnFileModified']) . "</filemod>";
  322. $type = explode("/", $row['clmnFileType']);
  323. echo "<filetype>" . $type[0] . "</filetype>";
  324. echo "</file>";
  325. }
  326. } else {
  327. xml_encode("error", "No files were found!");
  328. }
  329. echo "</files>";
  330. echo "<folders>";
  331. $result = dbUtil::SELECT("SELECT clmnFoldName FROM tblfolders WHERE clmnUNFolder=:un AND clmnFoldIn=:fn ", array(':fn' => $foldName ,':un' => $_SESSION['un']));
  332. if ( count($result) ) {
  333. foreach($result as $row) {
  334. echo "<folder>";
  335. echo "<foldername>" . $row['clmnFoldName'] . "</foldername>";
  336. echo "</folder>";
  337. }
  338. } else {
  339. xml_encode("error", "No folders were found!");
  340. }
  341. echo "</folders>";
  342. break;
  343. case "shared" :
  344. echo "<files>";
  345. $userIdResult = dbUtil::SELECT("SELECT clmnId FROM tblUsers WHERE clmnUserName=:uname", array(':uname' => $_SESSION['un']));
  346. if(count($userIdResult) != 0) {
  347. $userId = $userIdResult[0]['clmnId'];
  348. }
  349. //Select Shared files with the user
  350. $fileIdResult = dbUtil::SELECT("SELECT clmnFileID FROM tblSharedFiles WHERE clmnUsrID=:usrid", array(':usrid' => $userId));
  351. if(count($fileIdResult) != 0) {
  352. foreach($fileIdResult as $row) {
  353. $fileId = $row['clmnFileID'];
  354. echo $fileId;
  355. $fileResult = dbUtil::SELECT("SELECT clmnFileName, clmnFileSize, clmnFileModified, clmnFileType FROM tblFiles WHERE clmnFileID=:fileid", array(':fileid' => $fileId));
  356. if ( count($fileResult) ) {
  357. foreach($fileResult as $trow) {
  358. echo "<file>";
  359. echo "<filename>" . $trow['clmnFileName'] . "</filename>";
  360. echo "<filesize>" . FileSizeConvert($trow['clmnFileSize']) . "</filesize>";
  361. echo "<filemod>" . date("d/m/Y", $trow['clmnFileModified']) . "</filemod>";
  362. $type = explode("/", $trow['clmnFileType']);
  363. echo "<filetype>" . $type[0] . "</filetype>";
  364. echo "</file>";
  365. }
  366. } else {
  367. xml_encode("error", "No files were found!");
  368. }
  369. }
  370. }
  371. //Select files shared BY the user
  372. $fileIdResult = dbUtil::SELECT("SELECT clmnFileID FROM tblSharedFiles WHERE clmnFileOwner=:usrid", array(':usrid' => $userId));
  373. if(count($fileIdResult) != 0) {
  374. foreach($fileIdResult as $row) {
  375. $fileId = $row['clmnFileID'];
  376. echo $fileId;
  377. $fileResult = dbUtil::SELECT("SELECT clmnFileName, clmnFileSize, clmnFileModified, clmnFileType FROM tblFiles WHERE clmnFileID=:fileid", array(':fileid' => $fileId));
  378. if ( count($fileResult) ) {
  379. foreach($fileResult as $trow) {
  380. echo "<file>";
  381. echo "<filename>" . $trow['clmnFileName'] . "</filename>";
  382. echo "<filesize>" . FileSizeConvert($trow['clmnFileSize']) . "</filesize>";
  383. echo "<filemod>" . date("d/m/Y", $trow['clmnFileModified']) . "</filemod>";
  384. $type = explode("/", $trow['clmnFileType']);
  385. echo "<filetype>" . $type[0] . "</filetype>";
  386. echo "</file>";
  387. }
  388. } else {
  389. xml_encode("error", "No files were found!");
  390. }
  391. }
  392. }
  393. echo "</files>";
  394. break;
  395. case "encrypted" :
  396. $userIdResult = dbUtil::SELECT("SELECT clmnId FROM tblUsers WHERE clmnUserName=:uname", array(':uname' => $_SESSION['un']));
  397. if(count($userIdResult) != 0) {
  398. $userId = $userIdResult[0]['clmnId'];
  399. }
  400. $fileResult = dbUtil::SELECT("SELECT clmnFileName, clmnFileSize, clmnFileModified, clmnFileType FROM tblFiles WHERE clmnUNFile=:uname AND clmnEncrypted='1'", array(':uname' => $_SESSION['un']));
  401. if ( count($fileResult) ) {
  402. foreach($fileResult as $trow) {
  403. echo "<file>";
  404. echo "<filename>" . $trow['clmnFileName'] . "</filename>";
  405. echo "<filesize>" . FileSizeConvert($trow['clmnFileSize']) . "</filesize>";
  406. echo "<filemod>" . date("d/m/Y", $trow['clmnFileModified']) . "</filemod>";
  407. $type = explode("/", $trow['clmnFileType']);
  408. echo "<filetype>" . $type[0] . "</filetype>";
  409. echo "</file>";
  410. }
  411. } else {
  412. xml_encode("error", "No files were found!");
  413. }
  414. break;
  415. default :
  416. //not supported
  417. break;
  418. }
  419. echo "</flrequest>";
  420. header('Content-Type: application/xml; charset=utf-8');
  421. function Zip($dir, $source, $name)
  422. {
  423. $zip = new ZipIt();
  424. $res = $zip->open($dir . '.zip', ZipArchive::CREATE);
  425. if ($res === TRUE) {
  426. $zip->addDir($source, basename($source));
  427. $zip->close();
  428. }
  429. }
  430. class ZipIt extends ZipArchive
  431. {
  432. public function addDir($location, $name)
  433. {
  434. $this->addEmptyDir($name);
  435. $this->addDirDo($location, $name);
  436. }
  437. private function addDirDo($location, $name)
  438. {
  439. $name .= '/';
  440. $location .= '/';
  441. // Read all Files in Dir
  442. $dir = opendir($location);
  443. while ($file = readdir($dir)) {
  444. if ($file == '.' || $file == '..')
  445. continue;
  446. $do = (filetype($location . $file) == 'dir') ? 'addDir' : 'addFile';
  447. echo $name . $file;
  448. echo $location . $file;
  449. $this->$do($location . $file, $name . $file);
  450. }
  451. }
  452. }
  453. function removeDir($path) {
  454. $i = new DirectoryIterator($path);
  455. foreach($i as $f) {
  456. if($f->isFile()) {
  457. unlink($f->getRealPath());
  458. } else if(!$f->isDot() && $f->isDir()) {
  459. rrmdir($f->getRealPath());
  460. }
  461. }
  462. rmdir($path);
  463. }
  464. ?>