2016-04-20 12:40:44 +00:00
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace manager\module;
|
|
|
|
|
use \manager\Database;
|
|
|
|
|
use \manager\ResourceDispatcher;
|
|
|
|
|
use \manager\sessionManager;
|
2016-05-03 09:47:05 +00:00
|
|
|
|
use \manager\ModuleRequest;
|
2016-04-20 12:40:44 +00:00
|
|
|
|
use \manager\ManagerError;
|
|
|
|
|
use \manager\Repo;
|
|
|
|
|
|
|
|
|
|
class upload{
|
|
|
|
|
|
2016-05-03 10:08:24 +00:00
|
|
|
|
|
|
|
|
|
/* RENVOIE LE CHEMIN D'UN fichier
|
|
|
|
|
*
|
2016-04-20 12:40:44 +00:00
|
|
|
|
* @prefix<String> Préfixe (dossier parent) du fichier
|
2016-04-20 13:21:01 +00:00
|
|
|
|
* @extension<String> Extension du fichier
|
2016-05-03 10:08:24 +00:00
|
|
|
|
*
|
|
|
|
|
* @return response<Array> Renvoie le chemin du fichier, ainsi qu'une erreur de 'ManagerError'
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
private static function getPath($prefix, $extension){
|
2016-04-21 09:34:45 +00:00
|
|
|
|
// Si on est pas connecté, on retourne une erreur -> impossible via token
|
2016-05-03 10:08:24 +00:00
|
|
|
|
if( !connected() ) return array( 'error' => ManagerError::PermissionError );
|
2016-04-20 12:40:44 +00:00
|
|
|
|
|
2016-05-03 10:08:24 +00:00
|
|
|
|
/* [1] Chargement du fichier de config
|
2016-04-20 12:40:44 +00:00
|
|
|
|
=========================================================*/
|
|
|
|
|
/* (1) On récupère le fichier */
|
2016-04-20 13:21:01 +00:00
|
|
|
|
$uploadAuth = ResourceDispatcher::getResource('f/json/upload-auth/conf');
|
2016-04-20 12:40:44 +00:00
|
|
|
|
|
|
|
|
|
/* (2) Si une erreur pour le fichier de conf */
|
2016-04-20 13:21:01 +00:00
|
|
|
|
if( $uploadAuth === false )
|
2016-05-03 10:08:24 +00:00
|
|
|
|
return array( 'error' => ManagerError::UnreachableResource );
|
2016-04-20 12:40:44 +00:00
|
|
|
|
|
|
|
|
|
/* (3) On récupère la config sous forme de tableau */
|
2016-04-20 13:21:01 +00:00
|
|
|
|
$uploadAuth = json_decode( $uploadAuth, true );
|
2016-04-20 12:40:44 +00:00
|
|
|
|
|
|
|
|
|
/* (4) Si erreur de PARSAGE */
|
2016-04-20 13:21:01 +00:00
|
|
|
|
if( !is_array($uploadAuth) )
|
2016-05-03 10:08:24 +00:00
|
|
|
|
return array( 'error' => ManagerError::ParsingFailed );
|
2016-04-20 12:40:44 +00:00
|
|
|
|
|
2016-05-03 08:23:48 +00:00
|
|
|
|
|
2016-04-20 12:40:44 +00:00
|
|
|
|
/* [2] Vérification du préfixe
|
|
|
|
|
=========================================================*/
|
|
|
|
|
// Si le préfixe n'est pas dans la config -> erreur
|
|
|
|
|
if( !in_array($prefix, $uploadAuth['directories']) )
|
2016-05-03 10:08:24 +00:00
|
|
|
|
return array( 'error' => ManagerError::UploadError );
|
2016-04-20 12:40:44 +00:00
|
|
|
|
|
2016-05-03 10:08:24 +00:00
|
|
|
|
/* [3] Construction du chemin
|
2016-04-20 12:40:44 +00:00
|
|
|
|
=========================================================*/
|
|
|
|
|
/* (1) On construit le chemin */
|
|
|
|
|
$path = __ROOT__.$uploadAuth['root'].'/'.$prefix.'/';
|
|
|
|
|
|
|
|
|
|
/* (2) On crée le dossier s'il n'existe pas */
|
|
|
|
|
if ( !file_exists($path) ) mkdir($path, 0775, true);
|
|
|
|
|
|
|
|
|
|
/* (3) On construit le nom du fichier */
|
2016-04-20 13:21:01 +00:00
|
|
|
|
$fileName = $_SESSION['username'].'.'.$extension;
|
2016-04-20 12:40:44 +00:00
|
|
|
|
|
|
|
|
|
/* (4) On se place dans le dossier */
|
|
|
|
|
chdir( $path );
|
|
|
|
|
|
2016-05-03 08:23:48 +00:00
|
|
|
|
|
2016-05-03 10:08:24 +00:00
|
|
|
|
/* [4] Gestion du retour
|
|
|
|
|
=========================================================*/
|
|
|
|
|
return array(
|
|
|
|
|
'error' => ManagerError::Success,
|
|
|
|
|
'path' => $path.$fileName
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* EFFECTUE UN UPLOAD D'UN fichier
|
|
|
|
|
*
|
|
|
|
|
* @prefix<String> Préfixe (dossier parent) du fichier
|
|
|
|
|
* @extension<String> Extension du fichier
|
|
|
|
|
* @file<FILE> Pointeur vers $_FILES['']
|
|
|
|
|
* @tester<Function> Fonction qui renvoie TRUE si le format est correct (en prenant le contenu du fichier en paramètre)
|
|
|
|
|
*
|
|
|
|
|
* @return error<ManagerError> Retourne l'erreur attestant de l'état de l'upload
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
private static function simpleFile($prefix, $extension, $file, $tester){
|
|
|
|
|
/* [1] On récupère le chemin du fichier à créer et vérifie le dossier
|
|
|
|
|
=========================================================*/
|
|
|
|
|
$pathResponse = self::getPath($prefix, $extension);
|
|
|
|
|
|
|
|
|
|
// Si une erreur est intervenue, on la retourne
|
|
|
|
|
if( $pathResponse['error'] != ManagerError::Success )
|
|
|
|
|
return $pathResponse['error'];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* [2] Vérification du format (via la fonction $tester)
|
|
|
|
|
=========================================================*/
|
|
|
|
|
/* (1) Si $tester est une fonction, on effectue le test */
|
|
|
|
|
if( is_callable($tester) ){
|
|
|
|
|
|
|
|
|
|
/* (2) Sinon, on vérifie le format */
|
|
|
|
|
$file_content = file_get_contents($file['tmp_name']);
|
|
|
|
|
|
|
|
|
|
/* (3) On retourne 'FormatError' si erreur de format */
|
|
|
|
|
if( !$tester($file_content) ) return ManagerError::FormatError;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* [3] Création du fichier (temporaire->permanent)
|
2016-04-20 12:40:44 +00:00
|
|
|
|
=========================================================*/
|
2016-05-03 08:23:48 +00:00
|
|
|
|
/* (1) On déplace le fichier avec le nom formel */
|
2016-05-03 10:08:24 +00:00
|
|
|
|
if( move_uploaded_file($file['tmp_name'], $pathResponse['path']) ){
|
2016-04-20 12:40:44 +00:00
|
|
|
|
// on modifie les droits du fichier
|
2016-05-03 10:08:24 +00:00
|
|
|
|
chmod($pathResponse['path'], 0774);
|
2016-05-03 08:23:48 +00:00
|
|
|
|
return ManagerError::Success;
|
2016-04-20 12:40:44 +00:00
|
|
|
|
|
2016-05-03 08:23:48 +00:00
|
|
|
|
/* (2) Si une erreur occure -> 'UploadError' */
|
2016-04-20 12:40:44 +00:00
|
|
|
|
}else
|
|
|
|
|
return ManagerError::UploadError;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-05-09 07:34:17 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-04-20 12:40:44 +00:00
|
|
|
|
/* IMPORT D'UN JOURNAL D'APPEL
|
|
|
|
|
*
|
|
|
|
|
* @file<FILE> Pointeur vers $_FILES['']
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
public static function call_log($params){
|
|
|
|
|
extract($params);
|
|
|
|
|
|
2016-05-03 09:47:05 +00:00
|
|
|
|
/* [1] Gestion de l'upload du fichier et de la vérification du format
|
|
|
|
|
=========================================================*/
|
|
|
|
|
$uploadError = self::simpleFile(
|
|
|
|
|
'call_log', // nom du dossier d'upload
|
|
|
|
|
'xml', // format du fichier
|
|
|
|
|
$file, // Fichier lui-même
|
|
|
|
|
function($content){ // Vérification du format du fichier
|
|
|
|
|
/* (1) Vérification du format XML */
|
|
|
|
|
$xml = simplexml_load_string($content);
|
|
|
|
|
if( $xml === false ) return false; // Si erreur de parsage, on retourne une erreur
|
|
|
|
|
|
|
|
|
|
/* (2) Vérification du contenu (balises) */
|
|
|
|
|
// Doit avoir des Item(s)
|
|
|
|
|
if( !isset($xml->Item) )
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
// Vérification de tous les champs
|
|
|
|
|
foreach($xml->Item as $log){
|
2016-05-03 10:08:24 +00:00
|
|
|
|
$checkAttributes = isset($log['Id']);
|
2016-05-03 09:47:05 +00:00
|
|
|
|
$checkAttributes = $checkAttributes && isset($log['Number']);
|
|
|
|
|
$checkAttributes = $checkAttributes && isset($log['Name']);
|
|
|
|
|
$checkAttributes = $checkAttributes && isset($log['Date']);
|
|
|
|
|
$checkAttributes = $checkAttributes && isset($log['Duration']);
|
|
|
|
|
$checkAttributes = $checkAttributes && isset($log['Direction']);
|
|
|
|
|
$checkAttributes = $checkAttributes && isset($log['Type']);
|
|
|
|
|
|
|
|
|
|
// Si on a pas tout les champs, on retourne une erreur
|
|
|
|
|
if( !$checkAttributes )
|
2016-05-03 08:23:48 +00:00
|
|
|
|
return false;
|
|
|
|
|
}
|
2016-05-03 09:47:05 +00:00
|
|
|
|
|
|
|
|
|
/* (3) Si tout s'est bien passé, le format est bon */
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* [2] Gestion du retour (unserialize)
|
|
|
|
|
=========================================================*/
|
|
|
|
|
/* (1) Si erreur d'upload, on la renvoie */
|
|
|
|
|
if( $uploadError != ManagerError::Success )
|
|
|
|
|
return array( 'ModuleError' => $uploadError );
|
|
|
|
|
|
|
|
|
|
/* (2) Gestion du parsage (unserialize) du journal d'appel */
|
|
|
|
|
$request = new ModuleRequest('call_log/unserialize', array( 'phone_number' => $phone_number ) );
|
|
|
|
|
$response = $request->dispatch();
|
|
|
|
|
|
|
|
|
|
/* (3) Restitution du retour de `unserialize` */
|
|
|
|
|
return array_merge(
|
|
|
|
|
array( 'ModuleError' => $response->error ),
|
|
|
|
|
$response->getAll()
|
|
|
|
|
);
|
2016-05-03 08:23:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-05-03 09:47:05 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-05-09 07:34:17 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-05-03 08:23:48 +00:00
|
|
|
|
/* IMPORT D'UNE SAUVEGARDE DE FORMULAIRE LOCAL
|
|
|
|
|
*
|
|
|
|
|
* @file<FILE> Pointeur vers $_FILES['']
|
|
|
|
|
*
|
|
|
|
|
*/
|
2016-05-03 09:11:41 +00:00
|
|
|
|
public static function local_data($params){
|
2016-05-03 08:23:48 +00:00
|
|
|
|
extract($params);
|
|
|
|
|
|
2016-05-03 09:47:05 +00:00
|
|
|
|
/* [1] Upload et vérifiaction du format du fichier
|
|
|
|
|
=========================================================*/
|
|
|
|
|
$uploadError = self::simpleFile(
|
|
|
|
|
'local_data', // nom du dossier d'upload
|
|
|
|
|
'json', // format du fichier
|
|
|
|
|
$file, // Fichier lui-même
|
|
|
|
|
function($content){ // Vérification du format du fichier
|
|
|
|
|
/* (1) Vérification du format JSON */
|
|
|
|
|
$json = json_decode($content, true);
|
|
|
|
|
if( $json == null )
|
|
|
|
|
return false; // Si erreur de parsage, on retourne une erreur
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* (2) Vérification du contenu de premier niveau */
|
|
|
|
|
$checkLevel0 = isset($json['subject']) && is_array($json['subject']);
|
|
|
|
|
$checkLevel0 = $checkLevel0 && isset($json['contacts']) && is_array($json['contacts']);
|
|
|
|
|
$checkLevel0 = $checkLevel0 && isset($json['mini']) && is_array($json['mini']);
|
|
|
|
|
$checkLevel0 = $checkLevel0 && isset($json['fiches']) && is_array($json['fiches']);
|
2016-05-09 07:34:17 +00:00
|
|
|
|
$checkLevel0 = $checkLevel0 && isset($json['matrice']) && is_array($json['matrice']);
|
2016-05-03 09:47:05 +00:00
|
|
|
|
|
|
|
|
|
// Erreur si level 0 incorrect
|
|
|
|
|
if( !$checkLevel0 )
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* (3) Vérification du sujet */
|
|
|
|
|
$checkSubject = isset($json['subject']['username']) && is_string($json['subject']['username']);
|
|
|
|
|
$checkSubject = $checkSubject && isset($json['subject']['firstname']) && is_string($json['subject']['firstname']);
|
|
|
|
|
$checkSubject = $checkSubject && isset($json['subject']['lastname']) && is_string($json['subject']['lastname']);
|
|
|
|
|
$checkSubject = $checkSubject && isset($json['subject']['number']) && is_string($json['subject']['number']);
|
|
|
|
|
|
|
|
|
|
// Erreur des attributs du sujet incorrects ou manquants
|
|
|
|
|
if( !$checkSubject )
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* (4) Vérification des contacts */
|
|
|
|
|
foreach($json['contacts'] as $contact){
|
2016-05-03 15:38:54 +00:00
|
|
|
|
$checkContact = isset($contact['uid']) && is_numeric($contact['uid']);
|
|
|
|
|
$checkContact = $checkContact && isset($contact['username']) && is_string($contact['username']);
|
2016-05-03 09:47:05 +00:00
|
|
|
|
$checkContact = $checkContact && isset($contact['firstname']) && is_string($contact['firstname']);
|
|
|
|
|
$checkContact = $checkContact && isset($contact['lastname']) && is_string($contact['lastname']);
|
|
|
|
|
$checkContact = $checkContact && isset($contact['number']) && ( is_numeric($contact['number']) || is_string($contact['number']) );
|
2016-05-03 15:38:54 +00:00
|
|
|
|
$checkContact = $checkContact && isset($contact['sms']) && is_numeric($contact['sms']);
|
|
|
|
|
$checkContact = $checkContact && isset($contact['call']) && is_numeric($contact['call']);
|
|
|
|
|
$checkContact = $checkContact && isset($contact['countsms']) && is_numeric($contact['countsms']);
|
|
|
|
|
$checkContact = $checkContact && isset($contact['countcall']) && is_numeric($contact['countcall']);
|
2016-05-03 09:47:05 +00:00
|
|
|
|
|
|
|
|
|
// Si erreur des attributs du contact incorrects ou manquants
|
|
|
|
|
if( !$checkContact )
|
2016-05-03 09:11:41 +00:00
|
|
|
|
return false;
|
2016-05-03 09:47:05 +00:00
|
|
|
|
}
|
2016-05-03 09:11:41 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-05-03 09:47:05 +00:00
|
|
|
|
/* (5) Vérification des mini-fiches */
|
|
|
|
|
foreach($json['mini'] as $mini){
|
|
|
|
|
$checkMini = isset($mini['uid']) && is_numeric($mini['uid']);
|
2016-05-11 14:49:59 +00:00
|
|
|
|
$checkMini = $checkMini && isset($mini['sexe']) && is_string($mini['sexe']);
|
2016-05-03 09:47:05 +00:00
|
|
|
|
$checkMini = $checkMini && isset($mini['age']) && is_string($mini['age']);
|
2016-05-06 11:59:11 +00:00
|
|
|
|
$checkMini = $checkMini && isset($mini['studies']) && is_string($mini['studies']);
|
2016-05-11 14:49:59 +00:00
|
|
|
|
$checkMini = $checkMini && isset($mini['loc']) && is_numeric($mini['loc']);
|
2016-05-03 09:47:05 +00:00
|
|
|
|
|
|
|
|
|
// Si erreur des attributs des mini-fiches incorrects ou manquants
|
|
|
|
|
if( !$checkMini )
|
2016-05-03 09:11:41 +00:00
|
|
|
|
return false;
|
2016-05-03 09:47:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2016-05-03 09:11:41 +00:00
|
|
|
|
|
|
|
|
|
|
2016-05-03 09:47:05 +00:00
|
|
|
|
/* (6) Vérification des fiches */
|
|
|
|
|
foreach($json['fiches'] as $fiches){
|
|
|
|
|
$checkFiche = isset($fiches['uid']) && is_numeric($fiches['uid']);
|
2016-05-03 15:38:54 +00:00
|
|
|
|
$checkFiche = $checkFiche && isset($fiches['contact']) && is_numeric($fiches['contact']);
|
2016-05-11 14:49:59 +00:00
|
|
|
|
$checkFiche = $checkFiche && isset($fiches['sexe']) && is_string($fiches['sexe']);
|
2016-05-03 09:47:05 +00:00
|
|
|
|
$checkFiche = $checkFiche && isset($fiches['age']) && is_string($fiches['age']);
|
|
|
|
|
$checkFiche = $checkFiche && isset($fiches['job']) && is_string($fiches['job']);
|
2016-05-11 14:49:59 +00:00
|
|
|
|
$checkFiche = $checkFiche && isset($fiches['loc']) && is_numeric($fiches['loc']);
|
2016-05-03 09:47:05 +00:00
|
|
|
|
$checkFiche = $checkFiche && isset($fiches['studies']) && is_string($fiches['studies']);
|
2016-05-11 14:49:59 +00:00
|
|
|
|
$checkFiche = $checkFiche && isset($fiches['famsit']) && is_numeric($fiches['famsit']);
|
|
|
|
|
$checkFiche = $checkFiche && isset($fiches['reltype']) && is_numeric($fiches['reltype']);
|
2016-05-03 09:47:05 +00:00
|
|
|
|
$checkFiche = $checkFiche && isset($fiches['reltypeSpecial']) && is_string($fiches['reltypeSpecial']);
|
|
|
|
|
$checkFiche = $checkFiche && isset($fiches['city']) && is_string($fiches['city']);
|
2016-05-11 14:49:59 +00:00
|
|
|
|
$checkFiche = $checkFiche && isset($fiches['cp']) && is_string($fiches['cp']);
|
2016-05-03 09:47:05 +00:00
|
|
|
|
$checkFiche = $checkFiche && isset($fiches['duration']) && is_array($fiches['duration']);
|
2016-05-11 14:49:59 +00:00
|
|
|
|
$checkFiche = $checkFiche && isset($fiches['context']) && is_numeric($fiches['context']);
|
2016-05-03 09:47:05 +00:00
|
|
|
|
$checkFiche = $checkFiche && isset($fiches['contextSpecial']) && is_array($fiches['contextSpecial']);
|
|
|
|
|
$checkFiche = $checkFiche && isset($fiches['freq']) && is_array($fiches['freq']);
|
|
|
|
|
$checkFiche = $checkFiche && isset($fiches['connect']) && is_array($fiches['connect']);
|
|
|
|
|
$checkFiche = $checkFiche && isset($fiches['connectSpecial']) && is_array($fiches['connectSpecial']);
|
|
|
|
|
|
|
|
|
|
// Si erreur des attributs des fiches incorrects ou manquants
|
|
|
|
|
if( !$checkFiche )
|
|
|
|
|
return false;
|
2016-05-03 08:23:48 +00:00
|
|
|
|
}
|
2016-05-03 09:47:05 +00:00
|
|
|
|
|
|
|
|
|
|
2016-05-09 07:34:17 +00:00
|
|
|
|
/* (7) Vérification de la matrice */
|
|
|
|
|
foreach($json['matrice'] as $idA=>$Bs){
|
|
|
|
|
$checkMatrice = is_numeric($idA);
|
|
|
|
|
|
|
|
|
|
if( !is_array($Bs) )
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
// Pour chaque relation entre le sujet d'id @idA et le sujet d'id $B
|
|
|
|
|
foreach($Bs as $B)
|
|
|
|
|
$checkMatrice = $checkMatrice && is_numeric($B);
|
|
|
|
|
|
|
|
|
|
if( !$checkMatrice )
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2016-05-03 09:47:05 +00:00
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* [2] Renvoi du contenu du fichier
|
|
|
|
|
=========================================================*/
|
2016-05-03 10:08:24 +00:00
|
|
|
|
/* (1) Si erreur d'upload, on la renvoie */
|
|
|
|
|
if( $uploadError != ManagerError::Success )
|
|
|
|
|
return array( 'ModuleError' => $uploadError );
|
|
|
|
|
|
|
|
|
|
/* (2) On récupère le fichier */
|
|
|
|
|
$responsePath = self::getPath('local_data', 'json');
|
|
|
|
|
// Si erreur, on la renvoie
|
|
|
|
|
if( $responsePath['error'] != ManagerError::Success )
|
|
|
|
|
return array( 'ModuleError' => $responsePath['error'] );
|
|
|
|
|
|
|
|
|
|
// On lit le fichier
|
|
|
|
|
$json = json_decode( file_get_contents($responsePath['path']), true );
|
|
|
|
|
|
|
|
|
|
// Si erreur de parsage, on le retourne
|
|
|
|
|
if( $json === false )
|
|
|
|
|
return ManagerError::ParsingFailed;
|
|
|
|
|
|
|
|
|
|
/* (3) On renvoie le contenu du fichier */
|
2016-05-03 09:47:05 +00:00
|
|
|
|
return array(
|
2016-05-03 10:08:24 +00:00
|
|
|
|
'ModuleError' => ManagerError::Success,
|
|
|
|
|
'local_data' => $json
|
2016-05-03 09:47:05 +00:00
|
|
|
|
);
|
2016-04-20 12:40:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
2016-04-20 13:21:01 +00:00
|
|
|
|
|
2016-04-20 12:40:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
?>
|