Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 615 | Rev 783 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 615 Rev 761
1
<?php
1
<?php
2
 
2
 
3
/**
3
/**
4
* Classe Informations.php interroge la table Index   
4
* Classe Informations.php interroge la table Index   
5
* et redirige vers une autre classe si besoin 
5
* et redirige vers une autre classe si besoin 
6
* d'interroger une autre table (comme baseflor ou baseflor_rang_sup)
6
* d'interroger une autre table (comme baseflor ou baseflor_rang_sup)
7
* elle traite également le retour du web service : /informations
7
* elle traite également le retour du web service : /informations
8
*  
8
*  
9
* Encodage en entrée : utf8
9
* Encodage en entrée : utf8
10
* Encodage en sortie : utf8
10
* Encodage en sortie : utf8
11
* @package eflore-projets
11
* @package eflore-projets
12
* @author Mathilde SALTHUN-LASSALLE <mathilde@tela-botanica.org>
12
* @author Mathilde SALTHUN-LASSALLE <mathilde@tela-botanica.org>
13
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
13
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
14
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
14
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
15
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
15
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
16
* @version 1.0
16
* @version 1.0
17
* @copyright 1999-2012 Tela Botanica (accueil@tela-botanica.org)
17
* @copyright 1999-2012 Tela Botanica (accueil@tela-botanica.org)
18
* 
18
* 
19
* 
19
* 
20
*/
20
*/
21
 
21
 
22
 
22
 
23
 
23
 
24
class Informations extends Commun {
24
class Informations extends Commun {
25
	
25
	
26
	protected $limite_requete = array( 'depart' => 0, 'limite' => 10);
26
	protected $limite_requete = array( 'depart' => 0, 'limite' => 10);
27
	private $tables;
27
	private $tables;
28
	private $champs_recherches = '*';
28
	private $champs_recherches = '*';
29
	private $requete_jointure = "";
29
	private $requete_jointure = "";
30
	private $requete_condition = "";
30
	private $requete_condition = "";
31
	private $total_resultat;
31
	private $total_resultat;
32
	protected $serviceNom = 'informations';
32
	protected $serviceNom = 'informations';
33
	private $masque;
33
	private $masque;
34
	
34
	
35
	public function consulter($ressources, $parametres) {
35
	public function consulter($ressources, $parametres) {
36
			$this->ressources = $ressources;
36
			$this->ressources = $ressources;
37
			$this->parametres =  $parametres;
37
			$this->parametres =  $parametres;
38
			$versionResultat = null;
38
			$versionResultat = null;
39
			if (empty($this->ressources)){
39
			if (empty($this->ressources)){
40
				$this->traiterParametres();
40
				$this->traiterParametres();
41
			}
41
			}
42
			$this->definirTables(array ('index' => config::get('bdd_table_index'),
42
			$this->definirTables(array ('index' => config::get('bdd_table_index'),
43
										'baseflor' => config::get('bdd_table'),
43
										'baseflor' => config::get('bdd_table'),
44
										'rangSup' => config::get('bdd_table_rang_sup')
44
										'rangSup' => config::get('bdd_table_rang_sup')
45
										)
45
										)
46
								);
46
								);
47
			$this->traiterRessources();		
47
			$this->traiterRessources();		
48
			$requete = $this->assemblerLaRequete();
48
			$requete = $this->assemblerLaRequete();
-
 
49
			// exemple:
-
 
50
			// SELECT * FROM baseflor_index_v2012_12_31 WHERE `bdnt.nn` = 'bdtfx.nn:XXXXX';
49
			$resultat = $this->Bdd->recupererTous($requete);
51
			$resultat = $this->Bdd->recupererTous($requete . ' -- ' . __FILE__ . ':' .__LINE__);
50
			$versionResultat = $this->renvoyerResultat($resultat);
52
			$versionResultat = $this->renvoyerResultat($resultat);
51
			if ($versionResultat == null) {
53
			if ($versionResultat == null) {
52
				$message = 'Les données recherchées sont introuvables.';
54
				$message = 'Les données recherchées sont introuvables.';
53
				$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
55
				$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
54
				throw new Exception($message, $code);
56
				throw new Exception($message, $code);
55
			}
57
			}
56
		return $versionResultat;
58
		return $versionResultat;
57
	}
59
	}
58
 
60
 
59
	public function __construct() {
61
	public function __construct() {
60
		$Conteneur = new Conteneur();
62
		$Conteneur = new Conteneur();
61
		$this->Bdd = $Conteneur ->getBdd();
63
		$this->Bdd = $Conteneur ->getBdd();
62
	}
64
	}
63
	
65
	
64
	public function renvoyerResultat($resultat) {
66
	public function renvoyerResultat($resultat) {
65
	$res_formate = array();
67
	$res_formate = array();
66
	if (empty($this->ressources)) {
68
	if (empty($this->ressources)) {
67
		$res_formate = $this->retournerResultatFormate($resultat);
69
		$res_formate = $this->retournerResultatFormate($resultat);
68
	} else {
70
	} else {
69
		$classe = empty($resultat[0]['baseflor']) ? 'InformationsTaxonsSup' : 'InformationsBaseflor';
71
		$classe = empty($resultat[0]['baseflor']) ? 'InformationsTaxonsSup' : 'InformationsBaseflor';
70
		$info = new $classe(new Conteneur());
72
		$info = new $classe(new Conteneur());
71
		$res_formate = $info->consulter($this->ressources, $this->parametres);
73
		$res_formate = $info->consulter($this->ressources, $this->parametres);
72
	}
74
	}
73
	return $res_formate;
75
	return $res_formate;
74
	}
76
	}
75
	
77
	
76
	
78
	
77
	
79
	
78
	//+--------------------------traitement ressources ou paramètres  -------------------------------------+
80
	//+--------------------------traitement ressources ou paramètres  -------------------------------------+
79
	
81
	
80
 
82
 
81
	public function traiterRessources() {
83
	public function traiterRessources() {
82
		if (empty($this->ressources)) {	
84
		if (empty($this->ressources)) {	
83
			$this->requete_jointure = array(
85
			$this->requete_jointure = array(
84
				'LEFT JOIN '. $this->tables['baseflor'].' ON '
86
				'LEFT JOIN '. $this->tables['baseflor'].' ON '
85
				.$this->tables['baseflor'].".cle =".$this->tables['index'].".baseflor",
87
				.$this->tables['baseflor'].".cle =".$this->tables['index'].".baseflor",
86
				'LEFT JOIN '. $this->tables['rangSup'].' ON '
88
				'LEFT JOIN '. $this->tables['rangSup'].' ON '
87
				.$this->tables['rangSup'].".cle = ".$this->tables['index'].".RangSup");
89
				.$this->tables['rangSup'].".cle = ".$this->tables['index'].".RangSup");
88
			
90
			
89
			$this->champs_recherches = " {$this->tables['baseflor']}.num_nomen as 'baseflor.nn',
91
			$this->champs_recherches = " {$this->tables['baseflor']}.num_nomen as 'baseflor.nn',
90
						{$this->tables['baseflor']}.BDNT as 'baseflor.bdnt', 
92
						{$this->tables['baseflor']}.BDNT as 'baseflor.bdnt', 
91
						{$this->tables['baseflor']}.catminat_code,
93
						{$this->tables['baseflor']}.catminat_code,
92
						{$this->tables['baseflor']}.num_taxon , 
94
						{$this->tables['baseflor']}.num_taxon , 
93
						{$this->tables['baseflor']}.idiotaxon , 
95
						{$this->tables['baseflor']}.idiotaxon , 
94
						{$this->tables['rangSup']}.num_nomen as 'rangSup.nn', 
96
						{$this->tables['rangSup']}.num_nomen as 'rangSup.nn', 
95
						{$this->tables['rangSup']}.bdnt as 'rangSup.bdnt',
97
						{$this->tables['rangSup']}.bdnt as 'rangSup.bdnt',
96
						{$this->tables['index']}.cle as 'index.cle' ";
98
						{$this->tables['index']}.cle as 'index.cle' ";
97
		} else {
99
		} else {
98
			if(preg_match('/^(.+)\.nn:([0-9]+)$/', $this->ressources[0], $retour)){
100
			if(preg_match('/^(.+)\.nn:([0-9]+)$/', $this->ressources[0], $retour)){
99
				$this->champs_recherches = " baseflor, rangSup ";
101
				$this->champs_recherches = " baseflor, rangSup ";
100
				$this->requete_condition[] = " `bdnt.nn` = '{$retour[0]}'  ";
102
				$this->requete_condition[] = " `bdnt.nn` = '{$retour[0]}'  ";
101
			} else {
103
			} else {
102
				$e = 'Erreur dans l\'url de votre requête : </br> La ressource demandée n\'existe pas.';
104
				$e = 'Erreur dans l\'url de votre requête : </br> La ressource demandée n\'existe pas.';
103
				throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
105
				throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
104
				break;
106
				break;
105
			}
107
			}
106
		}		
108
		}		
107
	}
109
	}
108
	
110
	
109
	
111
	
110
	
112
	
111
	public function traiterParametres() {
113
	public function traiterParametres() {
112
		if (isset($this->parametres) && !empty($this->parametres) ) {
114
		if (isset($this->parametres) && !empty($this->parametres) ) {
113
			foreach ($this->parametres as $param => $valeur) {
115
			foreach ($this->parametres as $param => $valeur) {
114
				switch ($param) {
116
				switch ($param) {
115
					case 'navigation.depart'  :
117
					case 'navigation.depart'  :
116
						$this->definirNavigationDepart($valeur);
118
						$this->definirNavigationDepart($valeur);
117
						break;
119
						break;
118
					case 'navigation.limite'  :
120
					case 'navigation.limite'  :
119
						$this->definirNavigationLimite($valeur);
121
						$this->definirNavigationLimite($valeur);
120
						break;
122
						break;
121
					case 'version.projet' : 
123
					case 'version.projet' : 
122
						$this->traiterVersion($valeur);
124
						$this->traiterVersion($valeur);
123
						break;
125
						break;
124
					case 'masque.cat' :
126
					case 'masque.cat' :
125
						$this->masque = 'catminat='.str_replace('-','/',$valeur);
127
						$this->masque = 'catminat='.str_replace('-','/',$valeur);
126
						$this->requete_condition[] = " catminat_code = '".str_replace('-','/',$valeur)."' ";
128
						$this->requete_condition[] = " catminat_code = '".str_replace('-','/',$valeur)."' ";
127
						break;
129
						break;
128
					default :
130
					default :
129
						$e = 'Erreur dans les parametres de votre requête : </br> Le paramètre " '
131
						$e = 'Erreur dans les parametres de votre requête : </br> Le paramètre " '
130
					.$param.' " n\'existe pas.';
132
					.$param.' " n\'existe pas.';
131
					$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $e);	break;
133
					$this->renvoyerErreur(RestServeur::HTTP_CODE_MAUVAISE_REQUETE, $e);	break;
132
				}
134
				}
133
			}
135
			}
134
		}
136
		}
135
	}
137
	}
136
	
138
	
137
	
139
	
138
	
140
	
139
	//+++------------------------------traitement des versions----------------------------------------++
141
	//+++------------------------------traitement des versions----------------------------------------++
140
	
142
	
141
	public function traiterVersion($valeur) {
143
	public function traiterVersion($valeur) {
142
		if (preg_match('/^[0-9]+(?:[._][0-9]+)*$/', $valeur) || $valeur == '*' || $valeur == '+') {
144
		if (preg_match('/^[0-9]+(?:[._][0-9]+)*$/', $valeur) || $valeur == '*' || $valeur == '+') {
143
			$this->version_projet = $valeur;
145
			$this->version_projet = $valeur;
144
		} else {
146
		} else {
145
			$e = "Erreur : La version est inconnue.";
147
			$e = "Erreur : La version est inconnue.";
146
			throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
148
			throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
147
		}
149
		}
148
		if ($this->version_projet == '*' && empty($this->ressources)) {
150
		if ($this->version_projet == '*' && empty($this->ressources)) {
149
			$message = "L'affichage de plusieurs versions ne fonctionne que pour les ressources de type /ressources/#id";
151
			$message = "L'affichage de plusieurs versions ne fonctionne que pour les ressources de type /ressources/#id";
150
			$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;
152
			$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;
151
			throw new Exception($message, $code);
153
			throw new Exception($message, $code);
152
		}
154
		}
153
	}
155
	}
154
	
156
	
155
	public function definirTables($prefixe_table) {
157
	public function definirTables($prefixe_table) {
156
		$table_num_version = $this->recupererVersionDisponible();
158
		$table_num_version = $this->recupererVersionDisponible();
157
		foreach ($prefixe_table as $nom => $prefixe ) {
159
		foreach ($prefixe_table as $nom => $prefixe ) {
158
			if ( in_array($this->version_projet,$table_num_version) ) {
160
			if ( in_array($this->version_projet,$table_num_version) ) {
159
				$tables[$nom] = $prefixe.'_v'.$this->version_projet;
161
				$tables[$nom] = $prefixe.'_v'.$this->version_projet;
160
			} elseif ($this->version_projet == '+') {
162
			} elseif ($this->version_projet == '+') {
161
				$derniere_version = $table_num_version[count($table_num_version) - 1];
163
				$derniere_version = $table_num_version[count($table_num_version) - 1];
162
				$tables[$nom] = $prefixe.'_v'.str_replace('.', '_', $derniere_version);
164
				$tables[$nom] = $prefixe.'_v'.str_replace('.', '_', $derniere_version);
163
			} else {
165
			} else {
164
				$e = "Erreur : La version est inconnue.";
166
				$e = "Erreur : La version est inconnue.";
165
				throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
167
				throw new Exception($e, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
166
			}
168
			}
167
		}
169
		}
168
		$this->tables = $tables;
170
		$this->tables = $tables;
169
	}
171
	}
170
	
172
	
171
 
173
 
172
	//+--------------------------formatages de resultats  -------------------------------------------+
174
	//+--------------------------formatages de resultats  -------------------------------------------+
173
 
175
 
174
	public function retournerResultatFormate($resultat) {
176
	public function retournerResultatFormate($resultat) {
175
		$resultat_json = array();
177
		$resultat_json = array();
176
		$resultat_json['entete'] = $this->ajouterEnteteResultat();
178
		$resultat_json['entete'] = $this->ajouterEnteteResultat();
177
		$resultat_json['resultats'] = array();
179
		$resultat_json['resultats'] = array();
178
		foreach ($resultat as $ligne => $tab) {
180
		foreach ($resultat as $ligne => $tab) {
179
			$num = $tab['index.cle'];
181
			$num = $tab['index.cle'];
180
			
182
			
181
			$json['resultats'][$num]['num_nomen'] = 
183
			$json['resultats'][$num]['num_nomen'] = 
182
				(empty ($tab['baseflor.nn'])) ? $tab['rangSup.nn'] : $tab['baseflor.nn'];
184
				(empty ($tab['baseflor.nn'])) ? $tab['rangSup.nn'] : $tab['baseflor.nn'];
183
			
185
			
184
			$resultat_json['resultats'][$num]['bdnt'] =
186
			$resultat_json['resultats'][$num]['bdnt'] =
185
				(empty ($tab['baseflor.bdnt'])) ? $tab['rangSup.bdnt'] : $tab['baseflor.bdnt'];
187
				(empty ($tab['baseflor.bdnt'])) ? $tab['rangSup.bdnt'] : $tab['baseflor.bdnt'];
186
			
188
			
187
			$resultat_json['resultats'][$num]['catminat_code'] =
189
			$resultat_json['resultats'][$num]['catminat_code'] =
188
				(empty ($tab['catminat_code'])) ? '' : $tab['catminat_code'];
190
				(empty ($tab['catminat_code'])) ? '' : $tab['catminat_code'];
189
			
191
			
190
			$resultat_json['resultats'][$num]['idiotaxon'] =
192
			$resultat_json['resultats'][$num]['idiotaxon'] =
191
				(empty ($tab['idiotaxon'])) ? '' : $tab['idiotaxon'];
193
				(empty ($tab['idiotaxon'])) ? '' : $tab['idiotaxon'];
192
			
194
			
193
			$resultat_json['resultats'][$num]['num_taxon'] =
195
			$resultat_json['resultats'][$num]['num_taxon'] =
194
				(empty ($tab['num_taxon'])) ? '' : $tab['num_taxon'];
196
				(empty ($tab['num_taxon'])) ? '' : $tab['num_taxon'];
195
			
197
			
196
			if ($resultat_json['resultats'][$num]['num_nomen'] != 0) {
198
			if ($resultat_json['resultats'][$num]['num_nomen'] != 0) {
197
				$bdnt = strtolower($resultat_json['resultats'][$num]['bdnt']);
199
				$bdnt = strtolower($resultat_json['resultats'][$num]['bdnt']);
198
				$nn = $resultat_json['resultats'][$num]['num_nomen'];
200
				$nn = $resultat_json['resultats'][$num]['num_nomen'];
199
				$resultat_json['resultats'][$num]['href'] =
201
				$resultat_json['resultats'][$num]['href'] =
200
				$this->ajouterHref('informations',$bdnt.".nn:".$nn);
202
				$this->ajouterHref('informations',$bdnt.".nn:".$nn);
201
			}
203
			}
202
		}
204
		}
203
		return $resultat_json;
205
		return $resultat_json;
204
	}
206
	}
205
	
207
	
206
	
208
	
207
	public function ajouterEnteteResultat() {
209
	public function ajouterEnteteResultat() {
208
		$entete['depart'] = $this->limite_requete['depart'];
210
		$entete['depart'] = $this->limite_requete['depart'];
209
		$entete['limite'] = $this->limite_requete['limite'];
211
		$entete['limite'] = $this->limite_requete['limite'];
210
		$entete['total']  =  $this->total_resultat;
212
		$entete['total']  =  $this->total_resultat;
211
		if ($this->masque) {
213
		if ($this->masque) {
212
			$entete['masque']  =  $this->masque;
214
			$entete['masque']  =  $this->masque;
213
		}
215
		}
214
		$entete['version']  = $this->version_projet;
216
		$entete['version']  = $this->version_projet;
215
		$url = $this->formulerUrl($this->total_resultat, '/informations');
217
		$url = $this->formulerUrl($this->total_resultat, '/informations');
216
		if (isset($url['precedent']) && $url['precedent'] != '') {
218
		if (isset($url['precedent']) && $url['precedent'] != '') {
217
			$entete['href.precedent'] = $url['precedent'];
219
			$entete['href.precedent'] = $url['precedent'];
218
		}
220
		}
219
		if (isset($url['suivant']) && $url['suivant'] != '') {
221
		if (isset($url['suivant']) && $url['suivant'] != '') {
220
			$entete['href.suivant']   = $url['suivant'];
222
			$entete['href.suivant']   = $url['suivant'];
221
		}
223
		}
222
		return $entete;
224
		return $entete;
223
	}
225
	}
224
	
226
	
225
	
227
	
226
	//+-------------------------------------assemblage de requête------------------------------------//
228
	//+-------------------------------------assemblage de requête------------------------------------//
227
	
229
	
228
	
230
	
229
	public function assemblerLaRequete() {
231
	public function assemblerLaRequete() {
230
		$requete = 	' SELECT '.$this->champs_recherches.' FROM '.$this->tables['index'].' '
232
		$requete = 	' SELECT '.$this->champs_recherches.' FROM '.$this->tables['index'].' '
231
		.$this->retournerRequeteJointure().' '.$this->retournerRequeteCondition().
233
		.$this->retournerRequeteJointure().' '.$this->retournerRequeteCondition().
232
		' '.$this->delimiterResultatsRequete();
234
		' '.$this->delimiterResultatsRequete();
233
		return $requete;
235
		return $requete;
234
	}
236
	}
235
	
237
	
236
	public function retournerRequeteCondition() {
238
	public function retournerRequeteCondition() {
237
		$condition = '';
239
		$condition = '';
238
		if ($this->requete_condition !== "") {
240
		if ($this->requete_condition !== "") {
239
			$condition = ' WHERE '.implode(' AND ', $this->requete_condition);
241
			$condition = ' WHERE '.implode(' AND ', $this->requete_condition);
240
		}
242
		}
241
		return $condition;
243
		return $condition;
242
	}
244
	}
243
	
245
	
244
	
246
	
245
	public function calculerTotalResultat() {
247
	public function calculerTotalResultat() {
246
		$requete = 'SELECT count(*) as nombre FROM '.$this->tables['index'].' '
248
		$requete = 'SELECT count(*) as nombre FROM '.$this->tables['index'].' '
247
		.$this->retournerRequeteJointure().' '.$this->retournerRequeteCondition();
249
		.$this->retournerRequeteJointure().' '.$this->retournerRequeteCondition();
248
		$res = $this->getBdd()->recuperer($requete);
250
		$res = $this->getBdd()->recuperer($requete);
249
		if ($res) {
251
		if ($res) {
250
			$this->total_resultat = $res['nombre'];
252
			$this->total_resultat = $res['nombre'];
251
		} else { 
253
		} else { 
252
			$this->total_resultat = 0;
254
			$this->total_resultat = 0;
253
			$e = 'Données introuvables dans la base';
255
			$e = 'Données introuvables dans la base';
254
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $e);
256
			$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE, $e);
255
		}
257
		}
256
	}
258
	}
257
	
259
	
258
	public function delimiterResultatsRequete() {
260
	public function delimiterResultatsRequete() {
259
		$this->calculerTotalResultat();
261
		$this->calculerTotalResultat();
260
		$requete_limite = '';
262
		$requete_limite = '';
261
			if (($this->limite_requete['depart'] <=  $this->total_resultat) ){
263
			if (($this->limite_requete['depart'] <=  $this->total_resultat) ){
262
				if ( $this->limite_requete['depart'] < $this->total_resultat  ){
264
				if ( $this->limite_requete['depart'] < $this->total_resultat  ){
263
					$requete_limite = 'LIMIT '.$this->limite_requete['depart'].', '
265
					$requete_limite = 'LIMIT '.$this->limite_requete['depart'].', '
264
					.$this->limite_requete['limite'];
266
					.$this->limite_requete['limite'];
265
				}
267
				}
266
			} else {
268
			} else {
267
				$e = "Erreur : la valeur pour le paramètre navigation.départ est supérieure".
269
				$e = "Erreur : la valeur pour le paramètre navigation.départ est supérieure".
268
					" au nombre total de résultats.";
270
					" au nombre total de résultats.";
269
				throw new Exception($e, RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE);
271
				throw new Exception($e, RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE);
270
			}
272
			}
271
		return $requete_limite;
273
		return $requete_limite;
272
	}
274
	}
273
	
275
	
274
	public  function retournerRequeteJointure() {
276
	public  function retournerRequeteJointure() {
275
		$jointure = '';
277
		$jointure = '';
276
		if ($this->requete_jointure !== "") {
278
		if ($this->requete_jointure !== "") {
277
			$jointure = implode(' ', $this->requete_jointure);
279
			$jointure = implode(' ', $this->requete_jointure);
278
		}
280
		}
279
		return $jointure;
281
		return $jointure;
280
	}
282
	}
281
	
283
	
282
}
284
}