diff options
Diffstat (limited to 'beta_accents')
94 files changed, 9683 insertions, 0 deletions
diff --git a/beta_accents/app/admin.php b/beta_accents/app/admin.php new file mode 100644 index 0000000..4248d2a --- /dev/null +++ b/beta_accents/app/admin.php @@ -0,0 +1,63 @@ +<?php +require('include/ludo/session_verify.inc.php'); +require_once('include/ludo/html_elements.inc.php'); +require_once('include/ludo/fonctions.inc.php'); +//~ require_once('include/je.inc.php'); +//~ require_once('include/ju.inc.php'); +include('include/ludo/config.inc.php'); + +generate_html_doctype_and_head("Administration"); +echo "<body>\n"; + +generate_html_divs_menu(); +?> + <div id="sous_menu"> + <p class="arbre"> + > <a href="index.php">Accueil</a> + > Administration + </p> + </div> +<?php + generate_html_div_help(); + echo '<div id="contenu">' . "\n"; + + if ( isset($_REQUEST['action']) ) + { + switch ($_REQUEST['action']) + { + case 'delete_from_AWOR_Liste': + case 'delete_from_AWOR_Fichier': + case 'delete_from_AWOR_Reunion': + case 'delete_from_AWOR_Personne': + $_REQUEST['action'](); + break; + default: + $errmsg = 'Impossible de traiter la requete : paramètre erroné'."\n"; + } + } + + if ( !isset($_SESSION['session_loginP']) || ( !is_integer(array_search($_SESSION['session_loginP'],$CONFIG['SUPERUSERS'],true))) ) + { + $errmsg='Vous n\'avez pas le droit de consulter cette page : vous n\'êtes pas un administrateur !'; + generate_html_div_errmsg($errmsg); + echo '</body></html>'; + exit(); + } + + + // TODO : fonctions qui purgent les tables filles selon un id donné, pour chaque cas mère-fille (indiqués plus bas) + + // Fonctions qui génèrent des tableaux listant tous les objets de la base, et permettant la sélection multiple et l'éffacement (en cascade) + html_generate_MySQLTableSuppr('AWOR_Liste','idL'); // Permet de virer des liste + echo "<br />\n"; + html_generate_MySQLTableSuppr('AWOR_Fichier','idFic'); // Permet de virer des fichiers, doit purger physiquement sur le disque + echo "<br />\n"; + html_generate_MySQLTableSuppr('AWOR_Reunion','idR', 'idR,objetR,estAnnulee,idP_Orga,idC_Fixe,idL'); // Permet de virer des gens, doit purger les tables Creneau et Choisir, Repondre, Fichiers + echo "<br />\n"; + html_generate_MySQLTableSuppr('AWOR_Personne','idP'); // Permet de virer des gens, doit purger les tables Appartenir, Reunion + +echo " </div>\n"; +generate_html_div_footer(); +?> +</body> +</html> diff --git a/beta_accents/app/auth_dialog.php b/beta_accents/app/auth_dialog.php new file mode 100644 index 0000000..55e6c16 --- /dev/null +++ b/beta_accents/app/auth_dialog.php @@ -0,0 +1,121 @@ +<?php + // Récupération des paramètres + if ( isset($_GET['retour']) && $_GET['retour']!='' ) + { $retour=addslashes( $_GET['retour'] ); } else { $retour='index.php'; } + + // Si le formulaire à été envoyé, on le traite ici + if ( isset($_POST['envoi']) && $_POST['envoi'] === '1' ) + { + if ( ! ( isset($_POST['loginP']) && isset($_POST['pass']) ) ) + { + $errmsg = 'Paramètres incorrects'; + } + else + { + $loginP=addslashes( $_POST['loginP'] ); + + + include 'include/ludo/auth.inc.php'; + + // Code vérifiant que la personne qui tente de se connecter est bien référencée dans notre base + include 'include/ludo/fonctions.inc.php'; + // Connexion à la base et sélection de la database + include 'include/connect.inc.php'; + include 'include/ludo/config.inc.php'; + + // Requete SQL + $query = "SELECT idP, loginP, nomP, prenomP, methodeAuth FROM AWOR_Personne WHERE loginP='$loginP';"; + if ( ! $result = @mysql_query($query) ) + { + // Cas d'erreur + $errmsg =mysql_generate_errmsg(); + } + else + { + // Initialisation par défaut + $methodeAuth=''; + // Chargement des préférences d'authentification de l'utilisateur + if ( mysql_num_rows($result) === 1) + { + list($idP, $loginP, $nomP, $prenomP, $methodeAuth) = mysql_fetch_row($result); + } + // Si le script est lancé en local, on saute l'authentification + if ( ($CONFIG['AUTH']['bypass_if_local'] === true ) + && ( ($_SERVER['REMOTE_ADDR'] == 'localhost') || ($_SERVER['REMOTE_ADDR'] == '127.0.0.1') ) ) + { + $methodeAuth='bypass'; + } + + $auth_is_ok=false; + switch ( $methodeAuth ) + { + case 'webetud': + // TODO + break; + // Vous pouvez ajouter d'autres mode d'authentification ici ! + case 'bypass': + $auth_is_ok=true; + break; + default: + // Tentative d'authentification POP + if ( ($errno = pop3_auth_simple($loginP, $_POST['pass']) ) != 0 ) + { + // Authentification échouée + $errmsg=pop3_generate_errmsg($errno); + } + else + { + $auth_is_ok=true; + } + break; + } + if ( $auth_is_ok === true ) + { + // Authentification réussie + session_start(); + $_SESSION['session_loginP']=$loginP; + $_SESSION['session_nomP']=$nomP; + $_SESSION['session_prenomP']=$prenomP; + $_SESSION['session_idP']=$idP; + require('include/ludo/redir.inc.php'); + html_redir($retour); + } + } + } + } +require_once('include/ludo/html_elements.inc.php'); +generate_html_doctype_and_head("Identification"); +?> +<body onload="javascript:document.forms['auth'].elements['loginP'].focus()"> +<div id="titre"><h2>AWOR</h2></div> + +<?php +generate_html_div_help(); +?> +<div id="page_accueil"> + <h1>Application Web d'Organisation de Réunion</h1> + <h2>Veuillez vous identifier</h2> + <?php echo '<form id="auth" method="post" action="' . $_SERVER['PHP_SELF'] . '">' . "\n"; ?> + <input type="hidden" name="envoi" value="1" /> + <?php echo '<input type="hidden" name="retour" value="' . $retour . '" />' . "\n" ; ?> + <div class="aligned"> + <div> + <span class="label">Votre identifiant :</span> + <span class="field"><input name="loginP" type="text" size="20" tabindex="1" /></span> + </div> + <div> + <span class="label">Votre mot de passe :</span> + <span class="field"><input name="pass" type="password" size="20" tabindex="2" /></span> + </div> + <div> + <span class="label"><input type="reset" value="Vider" /></span> + <span class="field"><input type="submit" value="Valider" /></span> + </div> + </div> +<?php if ( isset ($debug) ) { echo ' <input type="hidden" name="debug" value="true" />' . "\n"; } ?> + </form> +</div> +<?php if ( isset ($errmsg) ) { generate_html_div_errmsg($errmsg); } +generate_html_div_footer(); ?> +</body> +</html> diff --git a/beta_accents/app/css/default.css b/beta_accents/app/css/default.css new file mode 100644 index 0000000..b8ecc3d --- /dev/null +++ b/beta_accents/app/css/default.css @@ -0,0 +1,240 @@ + +img { border : none ; } +body { + color: #000000; + background-color:#F5F5DC; + font-family: Verdana, Arial, Helvetica, sans-serif; + padding:0px; + margin:0px; + min-width:750px; /*Pour eviter le chevauchement pour FireFox, ne change rien pour IE (qui gere pas trop mal sans ca) */ +} +table { + border-spacing:0px; + margin: auto; + padding: 0px; + width:98%; + text-align:center; + border: thin solid #E0E0E0; + border-collapse:collapse; /* Imite le cellspacing=0 et fonctionne sous IE */ + background-color:#F7F7F7; +} +th { + border-right:none; + font-weight: bold; + color: #FFFFFF; + background-color: #551A8B; +} +td { + border-bottom-width: thin; + border-bottom-style: solid; + border-bottom-color: #E0E0E0; +} +th a:link, th a:visited { + font-size: x-small; + color: #FFFFFF; +} +h1 { + font-weight: bold; + color: #9999FF; + text-align: center; +} +h2 { + color: #5C5CFF; + margin: 0px; +} +select { width:auto; } +/***** Titre *****/ +#titre h2 { + color: #551A8B; + margin-left:50px; + height:50px; + width:200px; + background-image:url(default_img/titre.png); + background-position:left; + background-repeat:no-repeat; + color:#FFFFFF; + font-size:0px; +} +#titre { + height:50px; + clear:left; + background-color:#FFFFFF; + background-image:url(../images/logo.png); + background-position:left; + background-repeat:no-repeat; +} + +/*****************/ +/***** Menu *****/ +#menu { + padding:0px; + margin:0px; + width:100%; + height:20px; + background-color:#551A8B; +} +#menu a { + text-decoration:none; + display:block; + font-weight:bold; + text-align:center; + color:#FFFFFF; +} +#menu a:hover { + color:#000000; + background-color:#FFFFFF; +} +/* Pour IE5/MAC \*/#menu a{float:none;}/**/ +#menu li { + list-style: none; + float:left; + padding:0; + margin:0; + width:120px; + white-space:nowrap;/*Evite l'étalement sur deux ligne*/ + vertical-align:middle; +} +#menu #deconnection { + float:right; +} + +#main_menu { + +} +/*********************/ +/***** Sous Menu *****/ +#sous_menu { + clear:left; + padding-top:5px; + padding-bottom:3px; + padding-left:15px; + border-bottom:1px solid #000000; + background-color:#8470FF; +} +/* -------------- Arbre -------------------*/ +p.arbre { + font-size: small; + color: #FFFFFF; + text-align: left; + margin-top: 0px; + margin-right: 0px; + margin-bottom: 0px; + margin-left: 0px; +} +p.arbre a:link, p.arbre a:visited {color:#FFFFFF; } + +/*******************/ +/***** Contenu *****/ +#contenu { + padding-top:10px; + padding-bottom:20px; + padding-left:5px; + padding-right:22%;/*225px;*/ /*200 + 5*2 + 2*2 + (pour ie 5*2) */ +} +#help { + text-align:justify; + color:#000000; + float:right; + margin:5px; + padding:5px; + border:thin solid #000000; + background-color:#F7F7F7; + font-size:small; + width:18%; +} +#help h2 +{ + text-align:center; + font-size:medium; + color:#FFFFFF; + background-color:#551A8B; + margin-top:0; + margin-bottom:10px; +} + +#no_help h2 +{ + display:none; +} +.popup , .popup_creneau , .popup_personne , .popup_commentaire , .popup_fichier , .popup_new { + display: none; + position: absolute; + left:50%; + top:50%; + border: 3px solid #000000; + background-color: #8470FF; + z-index: 500; + font-size: 80%; + text-align:center; +} +.popup { + width: 20em; + height: 8em; + margin-top: -4em ;/*moitié de height */ + margin-left: -10em ;/*moitié de width */ +} + +.popup_creneau { + width: 45em; + height: 22em; + margin-top: -11em ;/*moitié de height */ + margin-left: -22.5em ;/*moitié de width */ +} +.popup_personne { + width: 45em; + height: 25em; + margin-top: -12.5em ;/*moitié de height */ + margin-left: -22.5em ;/*moitié de width */ +} +.popup_commentaire { + width: 30em; + height: 8em; + margin-top: -4em ;/*moitié de height */ + margin-left: -15em ;/*moitié de width */ +} + +.popup_fichier { + width: 30em; + height: 8em; + margin-top: -4em ;/*moitié de height */ + margin-left: -15em ;/*moitié de width */ +} + +.popup_new { + width: 30em; + height: 8em; + margin-top: -4em ;/*moitié de height */ + margin-left: -15em ;/*moitié de width */ +} + +.popup h2 , .popup_creneau h2 , .popup_personne h2 , .popup_commentaire h2 , .popup_fichier h2 , .popup_new h2 +{ + background:#551A8B; + color:#FFFFFF; + font-size:small; + border-bottom:inherit; +} + +div.popup_contenu +{ + margin-top:1em; + vertical-align:middle; +} + +.popup input , .popup_creneau input , .popup_personne input , .popup_commentaire input , .popup_fichier input , .popup_new input +{ + cursor:pointer; +} + +#masque +{ + width:100%; + height:100%; + display: none; + position: absolute; + left:0px; + top:0px; + background-image:url(../images/masque.png); + background-repeat:repeat; + z-index: 499; +}
\ No newline at end of file diff --git a/beta_accents/app/css/default_img/README.txt b/beta_accents/app/css/default_img/README.txt new file mode 100644 index 0000000..fec6abf --- /dev/null +++ b/beta_accents/app/css/default_img/README.txt @@ -0,0 +1 @@ +C'est ici qu'on stockera les images propre au style default.css diff --git a/beta_accents/app/css/default_img/README.txt~ b/beta_accents/app/css/default_img/README.txt~ new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/beta_accents/app/css/default_img/README.txt~ diff --git a/beta_accents/app/css/default_img/titre.png b/beta_accents/app/css/default_img/titre.png Binary files differnew file mode 100644 index 0000000..d8d9ce6 --- /dev/null +++ b/beta_accents/app/css/default_img/titre.png diff --git a/beta_accents/app/css/ice.css b/beta_accents/app/css/ice.css new file mode 100644 index 0000000..9418fd9 --- /dev/null +++ b/beta_accents/app/css/ice.css @@ -0,0 +1,342 @@ +em {color:#F00;} +img { border : none ; } +img.spacing{ margin: 0 0.2em 0 0.2em;} +body { + color: #000000; + background-color:#F5F5DC; + font-family: Verdana, Arial, Helvetica, sans-serif; + padding:0px; + margin:0px; + min-width:750px; /*Pour eviter le chevauchement pour FireFox, ne change rien pour IE (qui gere pas trop mal sans ca) */ +} +table { + border-spacing:0px; + margin: auto; + padding: 0px; + width:98%; + text-align:center; + border: thin solid #E0E0E0; + border-collapse:collapse; /* Imite le cellspacing=0 et fonctionne sous IE */ + background-color:#F7F7F7; +} +th { + border-right:none; + font-weight: bold; + color: #FFFFFF; + background-color:#551A8B; +} +th.selected {color:#FFF;background-color:#8470FF} +td { + border-bottom-width: thin; + border-bottom-style: solid; + border-bottom-color: #E0E0E0; +} +th a:link, th a:visited { + font-size: x-small; + color: #FFFFFF; +} + +h1 { + font-weight: bold; + color: #9999FF; + text-align: center; +} +h2 { + color: #5C5CFF; + margin: 0px; +} +.reunion_fixee { + color:#bf7e00; +} +.reunion_en_cours { + color:#9fbf00; +} +.reunion_annulee { + color:#bf2000; +} +select { width:auto; } +/***** Titre *****/ +#titre h2 { + color: #551A8B; + margin-left:50px; + height:50px; + width:200px; + background-image:url(ice_img/titre.png); + background-position:left; + background-repeat:no-repeat; + color:#FFFFFF; + font-size:0px; +} +#titre { + height:50px; + clear:left; + background-color:#FFFFFF; + background-image:url(ice_img/logo.png); + background-position:left; + background-repeat:no-repeat; +} + +/*****************/ +/***** Menu *****/ +#menu { + padding:0px; + margin:0px; + width:100%; + height:1.5em; + background-color:#551A8B; +} +#menu a { + text-decoration:none; + display:block; + font-weight:bold; + text-align:center; + color:#FFFFFF; + height:1.5em; +} +#menu a:hover { + color:#000000; + background-color:#FFFFFF; + height:1.5em; +} +/* Pour IE5/MAC \*/#menu a{float:none;}/**/ +#menu li { + list-style: none; + float:left; + padding:0; + margin:0; + width:10em; + white-space:nowrap;/*Evite l'étalement sur deux ligne*/ + vertical-align:middle; +} +#menu #deconnection { + float:right; +} + +#main_menu { + +} +/*********************/ +/***** Sous Menu *****/ +#sous_menu { + clear:left; + padding-top:5px; + padding-bottom:3px; + padding-left:15px; + border-bottom:1px solid #000000; + background-color:#8470FF; +} +/* -------------- Arbre -------------------*/ +p.arbre { + font-size: small; + color: #FFFFFF; + text-align: left; + margin-top: 0px; + margin-right: 0px; + margin-bottom: 0px; + margin-left: 0px; +} +p.arbre a:link, p.arbre a:visited {color:#FFFFFF; } + +/*******************/ +/***** Contenu *****/ +#contenu { + padding-top:10px; + padding-bottom:20px; + padding-left:5px; + float:left; + width:78%; +} +#help { + text-align:justify; + color:#000000; + float:right; + margin:5px; + padding:5px; + border:thin solid #000000; + background-color:#F7F7F7; + font-size:small; + width:18%; +} + +#help h2 , #help a +{ + text-align:center; + font-size:medium; + color:#FFFFFF; + background-color:#551A8B; + color:#FFFFFF; + margin-top:0; + margin-bottom:10px; +} +#no_help, #no_help h2 +{ + display:none; +} + + +.popup , .popup_creneau , .popup_personne , .popup_commentaire , .popup_fichier , .popup_deletelist { + display: none; + position: absolute; + left:50%; + top:50%; + border: 3px solid #000000; + background-color: #8470FF; + z-index: 500; + font-size: 80%; + text-align:center; +} +.popup { + width: 20em; + height: 10em; + margin-top: -4em ;/*moitié de height */ + margin-left: -10em ;/*moitié de width */ +} + +.popup_creneau { + width: 45em; + height: 22em; + margin-top: -11em ;/*moitié de height */ + margin-left: -22.5em ;/*moitié de width */ +} +.popup_personne { + width: 45em; + height: 30em; + margin-top: -15em ;/*moitié de height */ + margin-left: -22.5em ;/*moitié de width */ +} +.popup_commentaire { + width: 30em; + height: 14em; + margin-top: -7em ;/*moitié de height */ + margin-left: -15em ;/*moitié de width */ +} + +.popup_fichier { + width: 30em; + height: 8em; + margin-top: -4em ;/*moitié de height */ + margin-left: -15em ;/*moitié de width */ +} +.popup_deletelist { + width: 26em; + height: 8em; + margin-top: -4em ;/*moitié de height */ + margin-left: -13em ;/*moitié de width */ +} + +.popup h2 , .popup_creneau h2 , .popup_personne h2 , .popup_commentaire h2 , .popup_fichier h2 , .popup_deletelist h2 +{ + background:#551A8B; + color:#FFFFFF; + font-size:small; + border-bottom:inherit; +} + +div.popup_contenu +{ + margin-top:1em; + vertical-align:middle; +} +div.popup_contenu em +{ + font-size:x-small; + color:#FFF; +} + +.popup input , .popup_creneau input , .popup_personne input , .popup_commentaire input , .popup_fichier input , .popup_deletelist input +{ + cursor:pointer; +} + +#masque +{ + width:100%; + height:100%; + display: none; + position: absolute; + left:0px; + top:0px; + background-image:url(ice_img/masque.png); + background-repeat:repeat; + z-index: 499; +} + +#page_accueil h1 +{ + background:#551A8B; + color:#FFF; + margin-top:0; +} + +#page_accueil +{ + text-align:center; +} + +#msg +{ + display:none; + position:absolute; + text-align:center; + left:50%; + margin-left:-20%; + width:40%; + background-color:#551A8B; + top:-10px; + padding-top:15px; + padding-bottom:10px; + color:#FFF; + -moz-border-radius:16px; +} +#msg em +{ + color:#FFF; +} + + +#footer +{ + display:block; + + position:fixed; + left:0px; + width:100%; + background-color:#551A8B; + top:100%; + height:2.3em; + padding-top:-2.3em; + margin-top:-2.3em; + color:#FFF; + font-size:x-small; +} +#footer ul +{ + display:inline; + list-style-type:none; + white-space:nowrap; +} +#footer li.right { + list-style: none; + float:right; + white-space:nowrap;/*Evite l'étalement sur deux ligne*/ + vertical-align:middle; + padding-top:0.5em; + margin-top:0px; + padding-right:10px; +} +#footer li { + list-style: none; + float:right; + white-space:nowrap;/*Evite l'étalement sur deux ligne*/ + vertical-align:middle; + margin-top:-14px; + padding-right:30px; +} +#footer li.left { + list-style: none; + float:left; + white-space:nowrap;/*Evite l'étalement sur deux ligne*/ + vertical-align:middle; + margin-top:0px; + padding-left:30px; +} diff --git a/beta_accents/app/css/ice_img/README.txt b/beta_accents/app/css/ice_img/README.txt new file mode 100644 index 0000000..b81d613 --- /dev/null +++ b/beta_accents/app/css/ice_img/README.txt @@ -0,0 +1 @@ +C'est ici qu'on stockera les images propre au style Ice.css diff --git a/beta_accents/app/css/ice_img/logo.png b/beta_accents/app/css/ice_img/logo.png Binary files differnew file mode 100644 index 0000000..a768d45 --- /dev/null +++ b/beta_accents/app/css/ice_img/logo.png diff --git a/beta_accents/app/css/ice_img/masque.png b/beta_accents/app/css/ice_img/masque.png Binary files differnew file mode 100644 index 0000000..45a6027 --- /dev/null +++ b/beta_accents/app/css/ice_img/masque.png diff --git a/beta_accents/app/css/ice_img/titleTable.png b/beta_accents/app/css/ice_img/titleTable.png Binary files differnew file mode 100644 index 0000000..e6c02d9 --- /dev/null +++ b/beta_accents/app/css/ice_img/titleTable.png diff --git a/beta_accents/app/css/ice_img/titre.png b/beta_accents/app/css/ice_img/titre.png Binary files differnew file mode 100644 index 0000000..d8d9ce6 --- /dev/null +++ b/beta_accents/app/css/ice_img/titre.png diff --git a/beta_accents/app/css/ice_moche.css b/beta_accents/app/css/ice_moche.css new file mode 100644 index 0000000..0004b1a --- /dev/null +++ b/beta_accents/app/css/ice_moche.css @@ -0,0 +1,233 @@ +img { border : none ; } +body { + color: #000000; + background-color:#F5F5DC; + font-family: Verdana, Arial, Helvetica, sans-serif; + padding:0px; + margin:0px; + min-width:750px; /*Pour eviter le chevauchement pour FireFox, ne change rien pour IE (qui gere pas trop mal sans ca) */ +} +table { + border-spacing:0px; + margin: auto; + padding: 0px; + width:98%; + text-align:center; + border: thin solid #E0E0E0; + border-collapse:collapse; /* Imite le cellspacing=0 et fonctionne sous IE */ + background-color:#F7F7F7; +} +th { + border-right:none; + font-weight: bold; + color: #FFFFFF; + background-color:#551A8B; +} + +th.selected {color:#8470FF;} +td { + border-bottom-width: thin; + border-bottom-style: solid; + border-bottom-color: #E0E0E0; +} +th a:link, th a:visited { + font-size: x-small; + color: #FFFFFF; +} + +h1 { + font-weight: bold; + color: #9999FF; + text-align: center; +} +h2 { + color: #5C5CFF; + margin: 0px; +} +select { width:auto; } +/***** Titre *****/ +#titre h2 { + color: #551A8B; + height:60px; + width:200px; + margin-left:60px; + padding-top:5px; +/* background-image:url(ice_img/titre.png); + background-position:left; + background-repeat:no-repeat;*/ + color:#FFFFFF; + font-size:40px; + +} +#titre { + height:60px; + padding-top:5px; + width:100%; + clear:left; + background-color:#551A8B; + background-image:url(ice_img/logo.png); + background-position:left; + background-repeat:no-repeat; +} + +/*****************/ +/***** Menu *****/ +#menu { + padding:0px; + margin:0px; + color:#551A8B; + width:15em; + background-color:#FFFFFF; +} +#menu a { + text-decoration:none; + display:block; + font-weight:bold; + text-align:center; + color:#551A8B; +} +#menu a:hover { + color:#FFFFFF; + background-color:#551A8B; +} +/* Pour IE5/MAC \*/#menu a{float:none;}/**/ +#menu li { + list-style: none; + padding:0px; + margin:0px; + vertical-align:middle; +} +#menu #deconnection { +} + +#main_menu { + +} +/*********************/ +/***** Sous Menu *****/ +#sous_menu { + display:none; +} + +/*******************/ +/***** Contenu *****/ +#contenu { + padding-top:10px; + padding-bottom:10px; + padding-right:3em; + padding_left:3em; + position:absolute; + top:60px; + left:15em; + +} +#help { + text-align:justify; + color:#000000; + float:left; + margin-top:20px; + margin-left:10px; + padding:5px; + border:thin solid #000000; + background-color:#F7F7F7; + font-size:small; + width:15em; +} + +#help h2 , #help a +{ + text-align:center; + font-size:medium; + color:#FFFFFF; + background-color:#551A8B; + color:#FFFFFF; + margin-top:0; + margin-bottom:10px; +} +#no_help, #no_help h2 +{ + display:none; +} + + +.popup , .popup_creneau , .popup_personne , .popup_commentaire , .popup_fichier , .popup_deletelist { + display: none; + position: absolute; + left:50%; + top:50%; + border: 3px solid #000000; + background-color: #8470FF; + z-index: 500; + font-size: 80%; + text-align:center; +} +.popup { + width: 20em; + height: 8em; + margin-top: -4em ;/*moitié de height */ + margin-left: -10em ;/*moitié de width */ +} + +.popup_creneau { + width: 45em; + height: 22em; + margin-top: -11em ;/*moitié de height */ + margin-left: -22.5em ;/*moitié de width */ +} +.popup_personne { + width: 45em; + height: 30em; + margin-top: -15em ;/*moitié de height */ + margin-left: -22.5em ;/*moitié de width */ +} +.popup_commentaire { + width: 30em; + height: 8em; + margin-top: -4em ;/*moitié de height */ + margin-left: -15em ;/*moitié de width */ +} + +.popup_fichier { + width: 30em; + height: 8em; + margin-top: -4em ;/*moitié de height */ + margin-left: -15em ;/*moitié de width */ +} +.popup_deletelist { + width: 26em; + height: 8em; + margin-top: -4em ;/*moitié de height */ + margin-left: -13em ;/*moitié de width */ +} + +.popup h2 , .popup_creneau h2 , .popup_personne h2 , .popup_commentaire h2 , .popup_fichier h2 , .popup_deletelist h2 +{ + background:#551A8B; + color:#FFFFFF; + font-size:small; + border-bottom:inherit; +} + +div.popup_contenu +{ + margin-top:1em; + vertical-align:middle; +} + +.popup input , .popup_creneau input , .popup_personne input , .popup_commentaire input , .popup_fichier input , .popup_deletelist input +{ + cursor:pointer; +} + +#masque +{ + width:100%; + height:100%; + display: none; + position: absolute; + left:0px; + top:0px; + background-image:url(ice_img/masque.png); + background-repeat:repeat; + z-index: 499; +} diff --git a/beta_accents/app/css/ice_moche_img/README.txt b/beta_accents/app/css/ice_moche_img/README.txt new file mode 100644 index 0000000..b81d613 --- /dev/null +++ b/beta_accents/app/css/ice_moche_img/README.txt @@ -0,0 +1 @@ +C'est ici qu'on stockera les images propre au style Ice.css diff --git a/beta_accents/app/css/ice_moche_img/logo.png b/beta_accents/app/css/ice_moche_img/logo.png Binary files differnew file mode 100644 index 0000000..a768d45 --- /dev/null +++ b/beta_accents/app/css/ice_moche_img/logo.png diff --git a/beta_accents/app/css/ice_moche_img/masque.png b/beta_accents/app/css/ice_moche_img/masque.png Binary files differnew file mode 100644 index 0000000..45a6027 --- /dev/null +++ b/beta_accents/app/css/ice_moche_img/masque.png diff --git a/beta_accents/app/css/ice_moche_img/titleTable.png b/beta_accents/app/css/ice_moche_img/titleTable.png Binary files differnew file mode 100644 index 0000000..e6c02d9 --- /dev/null +++ b/beta_accents/app/css/ice_moche_img/titleTable.png diff --git a/beta_accents/app/css/ice_moche_img/titre.png b/beta_accents/app/css/ice_moche_img/titre.png Binary files differnew file mode 100644 index 0000000..d8d9ce6 --- /dev/null +++ b/beta_accents/app/css/ice_moche_img/titre.png diff --git a/beta_accents/app/css/ice_moche_nohelp.css b/beta_accents/app/css/ice_moche_nohelp.css new file mode 100644 index 0000000..9032594 --- /dev/null +++ b/beta_accents/app/css/ice_moche_nohelp.css @@ -0,0 +1,252 @@ + +img { border : none ; } +body { + color: #000000; + background-color:#F5F5DC; + font-family: Verdana, Arial, Helvetica, sans-serif; + padding:0px; + margin:0px; + min-width:750px; /*Pour eviter le chevauchement pour FireFox, ne change rien pour IE (qui gere pas trop mal sans ca) */ +} +table { + border-spacing:0px; + margin: auto; + padding: 0px; + width:98%; + text-align:center; + border: thin solid #E0E0E0; + border-collapse:collapse; /* Imite le cellspacing=0 et fonctionne sous IE */ + background-color:#F7F7F7; +} +th { + border-right:none; + font-weight: bold; + color: #FFFFFF; + background-color: #551A8B; +} +th.selected {color:#8470FF;} +td { + border-bottom-width: thin; + border-bottom-style: solid; + border-bottom-color: #E0E0E0; +} +th a:link, th a:visited { + font-size: x-small; + color: #FFFFFF; +} +h1 { + font-weight: bold; + color: #9999FF; + text-align: center; +} +h2 { + color: #5C5CFF; + margin: 0px; +} +select { width:auto; } +/***** Titre *****/ +#titre h2 { + color: #551A8B; + margin-left:50px; + height:50px; + width:200px; + background-image:url(ice_img/titre.png); + background-position:left; + background-repeat:no-repeat; + color:#FFFFFF; + font-size:0px; +} +#titre { + height:50px; + clear:left; + background-color:#FFFFFF; + background-image:url(ice_img/logo.png); + background-position:left; + background-repeat:no-repeat; +} + +/*****************/ +/***** Menu *****/ +#menu { + padding:0px; + margin:0px; + width:100%; + height:1.5em; + background-color:#551A8B; +} +#menu a { + text-decoration:none; + display:block; + font-weight:bold; + text-align:center; + color:#FFFFFF; + height:1.5em; +} +#menu a:hover { + color:#000000; + background-color:#FFFFFF; + height:1.5em; +} +/* Pour IE5/MAC \*/#menu a{float:none;}/**/ +#menu li { + list-style: none; + float:left; + padding:0; + margin:0; + width:10em; + white-space:nowrap;/*Evite l'étalement sur deux ligne*/ + vertical-align:middle; +} +#menu #deconnection { + float:right; +} + +#main_menu { + +} +/*********************/ +/***** Sous Menu *****/ +#sous_menu { + clear:left; + padding-top:5px; + padding-bottom:3px; + padding-left:15px; + border-bottom:1px solid #000000; + background-color:#8470FF; +} +/* -------------- Arbre -------------------*/ +p.arbre { + font-size: small; + color: #FFFFFF; + text-align: left; + margin-top: 0px; + margin-right: 0px; + margin-bottom: 0px; + margin-left: 0px; +} +p.arbre a:link, p.arbre a:visited {color:#FFFFFF; } + + +/*******************/ +/***** Contenu *****/ + +#contenu { + padding-top:10px; + padding-bottom:20px; + padding-left:5px; + padding-right:5px; + float:left; + width:95%; +} +#no_help { + display:block; + text-align:justify; + color:#000000; + float:right; + margin:0px; + padding:1px; + border:thin solid #000000; + background-color:#F7F7F7; + font-size:small; + width:3%; +} +#no_help h2 , #no_help a +{ + display:block; + text-align:center; + font-size:medium; + color:#FFFFFF; + background-color:#551A8B; + margin:0px; + padding:0px; +} +#help,#help h2 +{ + display:none; +} + + + + +.popup , .popup_creneau , .popup_personne , .popup_commentaire , .popup_fichier , .popup_deletelist { + display: none; + position: absolute; + left:50%; + top:50%; + border: 3px solid #000000; + background-color: #8470FF; + z-index: 500; + font-size: 80%; + text-align:center; +} +.popup { + width: 20em; + height: 8em; + margin-top: -4em ;/*moitié de height */ + margin-left: -10em ;/*moitié de width */ +} + +.popup_creneau { + width: 45em; + height: 22em; + margin-top: -11em ;/*moitié de height */ + margin-left: -22.5em ;/*moitié de width */ +} +.popup_personne { + width: 45em; + height: 30em; + margin-top: -15em ;/*moitié de height */ + margin-left: -22.5em ;/*moitié de width */ +} +.popup_commentaire { + width: 30em; + height: 8em; + margin-top: -4em ;/*moitié de height */ + margin-left: -15em ;/*moitié de width */ +} + +.popup_fichier { + width: 30em; + height: 8em; + margin-top: -4em ;/*moitié de height */ + margin-left: -15em ;/*moitié de width */ +} + +.popup_deletelist { + width: 26em; + height: 8em; + margin-top: -4em ;/*moitié de height */ + margin-left: -13em ;/*moitié de width */ +} + +.popup h2 , .popup_creneau h2 , .popup_personne h2 , .popup_commentaire h2 , .popup_fichier h2 , .popup_deletelist h2 +{ + background:#551A8B; + color:#FFFFFF; + font-size:small; + border-bottom:inherit; +} + +div.popup_contenu +{ + margin-top:1em; + vertical-align:middle; +} + +.popup input , .popup_creneau input , .popup_personne input , .popup_commentaire input , .popup_fichier input , .popup_deletelist input +{ + cursor:pointer; +} + +#masque +{ + width:100%; + height:100%; + display: none; + position: absolute; + left:0px; + top:0px; + background-image:url(ice_img/masque.png); + background-repeat:repeat; + z-index: 499; +}
\ No newline at end of file diff --git a/beta_accents/app/css/ice_nohelp.css b/beta_accents/app/css/ice_nohelp.css new file mode 100644 index 0000000..03c382f --- /dev/null +++ b/beta_accents/app/css/ice_nohelp.css @@ -0,0 +1,345 @@ +em {color:#F00;} +img { border : none ; } +img.spacing{ margin: 0 0.5em 0 0.5em;} +body { + color: #000000; + background-color:#F5F5DC; + font-family: Verdana, Arial, Helvetica, sans-serif; + padding:0px; + margin:0px; + min-width:750px; /*Pour eviter le chevauchement pour FireFox, ne change rien pour IE (qui gere pas trop mal sans ca) */ + height: 100%; +} +table { + border-spacing:0px; + margin: auto; + padding: 0px; + width:98%; + text-align:center; + border: thin solid #E0E0E0; + border-collapse:collapse; /* Imite le cellspacing=0 et fonctionne sous IE */ + background-color:#F7F7F7; +} +th { + border-right:none; + font-weight: bold; + color: #FFFFFF; + background-color: #551A8B; +} +th.selected {color:#FFF;background-color:#8470FF} +td { + border-bottom-width: thin; + border-bottom-style: solid; + border-bottom-color: #E0E0E0; +} +th a:link, th a:visited { + font-size: x-small; + color: #FFFFFF; +} +h1 { + font-weight: bold; + color: #9999FF; + text-align: center; +} +h2 { + color: #5C5CFF; + margin: 0px; +} +.reunion_fixee { + color:#bf7e00; +} +.reunion_en_cours { + color:#9fbf00; +} +.reunion_annulee { + color:#bf2000; +} +select { width:auto; } +/***** Titre *****/ +#titre h2 { + color: #551A8B; + margin-left:50px; + height:50px; + width:200px; + background-image:url(ice_img/titre.png); + background-position:left; + background-repeat:no-repeat; + color:#FFFFFF; + font-size:0px; +} +#titre { + height:50px; + clear:left; + background-color:#FFFFFF; + background-image:url(ice_img/logo.png); + background-position:left; + background-repeat:no-repeat; +} + +/*****************/ +/***** Menu *****/ +#menu { + padding:0px; + margin:0px; + width:100%; + height:1.5em; + background-color:#551A8B; +} +#menu a { + text-decoration:none; + display:block; + font-weight:bold; + text-align:center; + color:#FFFFFF; + height:1.5em; +} +#menu a:hover { + color:#000000; + background-color:#FFFFFF; + height:1.5em; +} +/* Pour IE5/MAC \*/#menu a{float:none;}/**/ +#menu li { + list-style: none; + float:left; + padding:0; + margin:0; + width:10em; + white-space:nowrap;/*Evite l'étalement sur deux ligne*/ + vertical-align:middle; +} +#menu #deconnection { + float:right; +} + +#main_menu { + +} +/*********************/ +/***** Sous Menu *****/ +#sous_menu { + clear:left; + padding-top:5px; + padding-bottom:3px; + padding-left:15px; + border-bottom:1px solid #000000; + background-color:#8470FF; +} +/* -------------- Arbre -------------------*/ +p.arbre { + font-size: small; + color: #FFFFFF; + text-align: left; + margin-top: 0px; + margin-right: 0px; + margin-bottom: 0px; + margin-left: 0px; +} +p.arbre a:link, p.arbre a:visited {color:#FFFFFF; } + + +/*******************/ +/***** Contenu *****/ + +#contenu { + padding-top:10px; + padding-bottom:20px; + padding-left:5px; + padding-right:5px; + float:left; + width:95%; +} + +#no_help { + display:block; + text-align:justify; + color:#000000; + float:right; + margin:0px; + padding:1px; + border:thin solid #000000; + background-color:#F7F7F7; + font-size:small; + width:3%; +} +#no_help h2 , #no_help a +{ + display:block; + text-align:center; + font-size:medium; + color:#FFFFFF; + background-color:#551A8B; + margin:0px; + padding:0px; +} +#help,#help h2 +{ + display:none; +} + + + + +.popup , .popup_creneau , .popup_personne , .popup_commentaire , .popup_fichier , .popup_deletelist { + display: none; + position: absolute; + left:50%; + top:50%; + border: 3px solid #000000; + background-color: #8470FF; + z-index: 500; + font-size: 80%; + text-align:center; +} +.popup { + width: 20em; + height: 10em; + margin-top: -4em ;/*moitié de height */ + margin-left: -10em ;/*moitié de width */ +} + +.popup_creneau { + width: 45em; + height: 22em; + margin-top: -11em ;/*moitié de height */ + margin-left: -22.5em ;/*moitié de width */ +} +.popup_personne { + width: 45em; + height: 30em; + margin-top: -15em ;/*moitié de height */ + margin-left: -22.5em ;/*moitié de width */ +} +.popup_commentaire { + width: 30em; + height: 14em; + margin-top: -7em ;/*moitié de height */ + margin-left: -15em ;/*moitié de width */ +} + +.popup_fichier { + width: 30em; + height: 8em; + margin-top: -4em ;/*moitié de height */ + margin-left: -15em ;/*moitié de width */ +} + +.popup_deletelist { + width: 26em; + height: 8em; + margin-top: -4em ;/*moitié de height */ + margin-left: -13em ;/*moitié de width */ +} + +.popup h2 , .popup_creneau h2 , .popup_personne h2 , .popup_commentaire h2 , .popup_fichier h2 , .popup_deletelist h2 +{ + background:#551A8B; + color:#FFFFFF; + font-size:small; + border-bottom:inherit; +} + +div.popup_contenu +{ + margin-top:1em; + vertical-align:middle; +} +div.popup_contenu em +{ + font-size:x-small; + color:#FFF; +} + +.popup input , .popup_creneau input , .popup_personne input , .popup_commentaire input , .popup_fichier input , .popup_deletelist input +{ + cursor:pointer; +} + +#masque +{ + width:100%; + height:100%; + display: none; + position: absolute; + left:0px; + top:0px; + background-image:url(ice_img/masque.png); + background-repeat:repeat; + z-index: 499; +} + +#page_accueil h1 +{ + background:#551A8B; + color:#FFF; + margin-top:0; +} + +#page_accueil +{ + text-align:center; +} + +#msg +{ + display:none; + position:fixed; + text-align:center; + left:50%; + margin-left:-20%; + width:40%; + background-color:#551A8B; + top:-10px; + padding-top:15px; + padding-bottom:10px; + color:#FFF; + -moz-border-radius:16px; +} + +#footer +{ + display:block; + position:absolute; + text-align:center; + left:0px; + width:100%; + background-color:#551A8B; + bottom:0; + height:2.3em; + padding-top:-2.3em; + margin-top:-2.3em; + color:#FFF; + font-size:x-small; +} +#footer ul +{ + display:inline; + list-style-type:none; + white-space:nowrap; + +} +#footer li.right { + list-style: none; + float:right; + white-space:nowrap;/*Evite l'étalement sur deux ligne*/ + vertical-align:middle; + padding-top:0.5em; + margin-top:0px; + padding-right:10px; +} +#footer li { + list-style: none; + float:right; + white-space:nowrap;/*Evite l'étalement sur deux ligne*/ + vertical-align:middle; + margin-top:-14px; + padding-right:30px; +} +#footer li.left { + list-style: none; + float:left; + white-space:nowrap;/*Evite l'étalement sur deux ligne*/ + vertical-align:middle; + margin-top:0px; + padding-left:30px; +} diff --git a/beta_accents/app/deco.php b/beta_accents/app/deco.php new file mode 100644 index 0000000..57a56bc --- /dev/null +++ b/beta_accents/app/deco.php @@ -0,0 +1,36 @@ +<?php +session_start(); + +// Si vous voulez détruire complètement la session, effacez également le cookie de session. +// Note : cela détruira la session et pas seulement les données de session ! +if (isset($_COOKIE[session_name()])) { +setcookie(session_name(), '', time()-42000, '/'); +} + +require_once('include/ludo/html_elements.inc.php'); +generate_html_doctype_and_head("Déconnexion"); +?> +<body> + <h1>Deconnexion</h1> + <div> + <?php + if ( isset($_SESSION['session_loginP']) ) + { + // Détruit toutes les variables de session + $_SESSION = array(); + + // On a déjà détruit le cookie qui permet la ré-emission par le client du sessionid + + // Finalement, on détruit la session. + session_destroy(); + echo 'Vous avez bien été déconnecté' . "\n"; + } + else + { + echo 'Deconnexion impossible : aucune session en cours' . "\n"; + } + ?> + </div> +<?php generate_html_div_back(); ?> +</body> +</html>
\ No newline at end of file diff --git a/beta_accents/app/details_reunion.php b/beta_accents/app/details_reunion.php new file mode 100644 index 0000000..845e688 --- /dev/null +++ b/beta_accents/app/details_reunion.php @@ -0,0 +1,121 @@ +<?php +require('include/ludo/session_verify.inc.php'); +require_once('include/connect.inc.php'); +require_once('include/ludo/html_elements.inc.php'); +require_once('include/ludo/fonctions.inc.php'); + +require_once('include/je.inc.php'); +require_once('include/ju.inc.php'); + + + +generate_html_doctype_and_head("Détail de la réunion"); +echo "<body>\n"; + +// DEBUG +//~ echo '<pre>'; +//~ print_r($_REQUEST); +//~ echo '</pre>'; + +generate_html_divs_menu(); +?> + <div id="sous_menu"> + <p class="arbre"> + > <a href="index.php">Accueil</a> + > <a href="index.php">Réunions</a> + > Détails d'une réunion + </p> + </div> +<?php + if ( isset($_REQUEST['action']) ) + { + switch ($_REQUEST['action']) + { + case 'creer_reunion': + $ret=traiter_formulaire_creer_reunion(); + //~ echo "DEBUG : idR==$ret\n"; + if ( is_string($ret) ) { $errmsg=$ret; } else { $idR=$ret;} + break; + case 'popfichier': + case 'maj_profil': + case 'valider_modif_personnes': + case 'valider_creneau': + case 'delete_list': + case 'commentaire': + case 'fixer_creneau': + case 'modif_detail_reunion': + $nom_func = 'traiter_formulaire_' . $_REQUEST['action']; + $errmsg = $nom_func(); + break; + default: + $errmsg = 'Impossible de traiter la requete : type de formulaire non enregistré !'."\n"; + } + } + // Connexion à la base et sélection de la database + require_once 'include/connect.inc.php'; + if ( ! isset($idR) && ( ! isset($_REQUEST['idR'] ) || ! is_numeric($_REQUEST['idR']) ) || ! isset($_SESSION['session_idP']) ) + { + $errmsg='Erreur de génération de la page : paramètres erronés ou manquant'; + } + else + { + if ( ! isset($idR) ) { $idR=addslashes($_REQUEST['idR']); } + $idP=$_SESSION['session_idP']; + + // Vérification que la réunion nous concerne bien + $query="SELECT * FROM AWOR_Appartenir a WHERE a.idL=$idR, a.idP=$idP;"; + if ( ( $result = @mysql_query($query) ) && ( mysql_num_rows($result) === 1 ) ) + { + $errmsg='Vous n\'avez pas le droit de consulter cette page : cette réunion n\'existe pas ou ne vous concerne pas !'; + } + } + if ( isset($errmsg) && is_string($errmsg) ) + { + generate_html_div_errmsg($errmsg); + echo '</body></html>'; + exit(); + } + generate_html_div_help('help/details_reunion_admin.php.hlp'); + echo '<div id="contenu">' . "\n"; + echo '<div id="details_reunion">' . "\n"; + generate_html_reunion_detail2($idR); + echo "</div>\n"; + echo "<br />\n"; + generate_html_array_personnes_crenaux($idR, $idP); + echo "<br />\n"; + generate_html_reunion_commentaires($idR); + echo "<br />\n"; + generate_html_reunion_fichiers($idR); +?> +</div> +<div id="popcommentaire" class="popup_commentaire"> +<h2>Editer votre commentaire</h2> +<div class="popup_contenu"> +<form id="formcommentaire" method="get" action="details_reunion_admin.php"> +Commentaire : <input name="txtCommentaire" type="text" id="txtCommentaire" /> +<br/><br/> +<input type="submit" name="Submit" value="Enregistrer" /><input type="button" name="fermer" value="Fermer" alt="commentaire" /> +</form> +</div> +</div> + +<div id="popfichier" class="popup_fichier"> +<h2>Ajouter un fichier</h2> +<div class="popup_contenu"> +<form id="formfichier" method="post" action="details_reunion.php?idR=<?php echo $idR; ?>" enctype="multipart/form-data"> +Fichier : <input name="fichier" type="file" id="fichier"/> +<br/><br/> +<input type="hidden" name="action" value="popfichier" /> +<input type="submit" name="Submit" value="Valider" onclick="popoff('popfichier');"/> +<input type="button" value="fermer" onclick="popoff('popfichier');"/> +</form> +</div> +</div> +<?php generate_html_div_footer(); ?> +<div class="popup" id="popfixer"></div> +<div class="popup_creneau" id="popcreneau"></div> +<div id="poppersonne" class="popup_personne"></div> +<div id="masque"></div> +<div id="msg"></div> +</body> +</html> diff --git a/beta_accents/app/help/admin.php.hlp b/beta_accents/app/help/admin.php.hlp new file mode 100644 index 0000000..3d669ec --- /dev/null +++ b/beta_accents/app/help/admin.php.hlp @@ -0,0 +1,23 @@ +Cette page vous permet de visualiser les objets principaux de la base de données.<br /> +Vous pouvez depuis cette page purger la base, ainsi que les fichiers attachés qui sont stockés sur disque.<br /> +Lorsque vous supprimez par exemple une personne inscrite, tout les enregistrements relatifs à cette personne seront effacés : +<ul> + <li>Les liens indicant que cette personne participe à des réunions</li> + <li> + Les réunions qu'elle à créée + <ul> + <li>Les réponses des participants à ses réunions pour chaque créneau</li> + <li>Les commentaires des réponses des participants</li> + <li>Les créneaux de ses réunions</li> + <li> + Les liens vers les fichiers attachés + <ul> + <li>Les fichiers physiquement écrits sur le disque</li> + </ul> + </li> + </ul> + </li> +</ul> +Ces cascades peuvent s'avérer dangereuses, mais permettent de garder la base dans un état consitant.<br /> +Il est vivement conseillé de sauvegarder la base de donnée et le répertoire des ficheirs attachés avant d'utiliser cet outil, +l'erreur de manipulation est facile, et les bugs de programmation ne peuvent être totalement exclus...
\ No newline at end of file diff --git a/beta_accents/app/help/auth_dialog.php.hlp b/beta_accents/app/help/auth_dialog.php.hlp new file mode 100644 index 0000000..b83937b --- /dev/null +++ b/beta_accents/app/help/auth_dialog.php.hlp @@ -0,0 +1,2 @@ +Merci de vous identifier pour utiliser l'application.<br /> +Par défaut, vous pouvez vous logguer avec votre adresse email et le mot de passe qui y est associé.
\ No newline at end of file diff --git a/beta_accents/app/help/details_reunion.php.hlp b/beta_accents/app/help/details_reunion.php.hlp new file mode 100644 index 0000000..5434937 --- /dev/null +++ b/beta_accents/app/help/details_reunion.php.hlp @@ -0,0 +1,4 @@ +Cette page vous permet de visualiser les détails d'une réunion. <br /> +Vous pouvez modifier votre disponibilité en fonction des créneaux prévu par le createur de la réunion.<br /> +Il est possible à tout instant de se déconnecter en cliquant sur le bouton Déconnexion situé en haut à droite de l'écran.<br /> +Astuce : grâce à AWOR, vous pouvez transferer vos réunions sur votre agenda personnel. diff --git a/beta_accents/app/help/details_reunion_admin.php.hlp b/beta_accents/app/help/details_reunion_admin.php.hlp new file mode 100644 index 0000000..41047ab --- /dev/null +++ b/beta_accents/app/help/details_reunion_admin.php.hlp @@ -0,0 +1,17 @@ +Cette page vous permet de visualiser les détails d'une réunion.<br /> +<br /> +Vous pouvez modifier votre disponibilité en fonction des créneaux prévu par le createur de la réunion.<br /> +<br /> +Il est possible à tout instant de se déconnecter en cliquant sur le bouton Déconnexion situé en haut à droite de l'écran.<br /> +<br /> +Ajouter ou Supprimer un créneau<br /> +en appuyant sur le bouton <img src="./images/editCreneau2.gif" alt="Ajouter une personne" title="Ajouter un creneau" width="22" height="21" /><br /> +<br /> +Fixer un Créneau, en cliquant dessus et confirmer l'action (aucune modification ne sera possible après)<br /> +<br /> +Ajouter ou Supprimer un +participant en appuyant sur le bouton <img src="images/addP.gif" alt="Ajouter une personne" title="Ajouter une personne" width="19" height="17"/><br /> +<br /> +Ajouter +<br /> +Astuce : grâce à AWOR, vous pouvez transferer vos réunions sur votre agenda personnel. diff --git a/beta_accents/app/help/groupe.hlp b/beta_accents/app/help/groupe.hlp new file mode 100644 index 0000000..0869bd5 --- /dev/null +++ b/beta_accents/app/help/groupe.hlp @@ -0,0 +1 @@ +Cette page vous permet de gérer les différentes listes de contacts
\ No newline at end of file diff --git a/beta_accents/app/help/index.php.hlp b/beta_accents/app/help/index.php.hlp new file mode 100644 index 0000000..be1ef30 --- /dev/null +++ b/beta_accents/app/help/index.php.hlp @@ -0,0 +1,7 @@ +Cette page vous permet de visualiser les réunions qui vous concernent.<br /> +Les éléments requièrant votre attention sont en rouge.<br /> +Cliquer sur l'icone à droite pour afficher les détails d'une réunion.<br /> + +Il est possible à tout instant de se déconnecter en cliquant sur le bouton Déconnexion situé en haut à droite de l'écran. +<br /> +Astuce : grâce à AWOR, vous pouvez transferer vos réunions sur votre agenda personnel. diff --git a/beta_accents/app/help/listes.php.hlp b/beta_accents/app/help/listes.php.hlp new file mode 100644 index 0000000..c619e70 --- /dev/null +++ b/beta_accents/app/help/listes.php.hlp @@ -0,0 +1 @@ +Cette page vous permet de gérer les différentes listes de contacts. diff --git a/beta_accents/app/help/modele_page.php.hlp b/beta_accents/app/help/modele_page.php.hlp new file mode 100644 index 0000000..75a26d5 --- /dev/null +++ b/beta_accents/app/help/modele_page.php.hlp @@ -0,0 +1,17 @@ + Cette page vous permet de visualiser les détails d'une réunion.<br /> + <br /> + Vous pouvez modifier votre disponibilité en fonction des créneaux prévu par le createur de la réunion.<br /> + <br /> + Il est possible à tout instant de se déconnecter en cliquant sur le bouton Déconnexion situé en haut à droite de l'écran.<br /> + <br /> + Ajouter ou Supprimer un créneau<br /> + en appuyant sur le bouton <a href="#" onclick="loadpop('popcreneau.php?idR=2','popcreneau');popon('popcreneau');"><img src="./images/editCreneau2.gif" alt="Ajouter une personne" title="Ajouter un creneau" width="22" height="21" /></a><br /> + <br /> + Fixer un Créneau, en cliquant dessus et confirmer l'action (aucune modification ne sera possible après)<br /> + <br /> + Ajouter ou Supprimer un + participant en appuyant sur le bouton <a href="#" onclick="popon('poppersonne');"><img src="images/addP.gif" alt="Ajouter une personne" title="Ajouter une personne" width="19" height="17"/></a><br /> + <br /> + Ajouter + <br /> + Astuce : grâce à AWOR, vous pouvez transferer vos réunions sur votre agenda personnel.
\ No newline at end of file diff --git a/beta_accents/app/help/organiser.php.hlp b/beta_accents/app/help/organiser.php.hlp new file mode 100644 index 0000000..b24adaf --- /dev/null +++ b/beta_accents/app/help/organiser.php.hlp @@ -0,0 +1,2 @@ +Depuis cette page, vous pouvez créer une nouvelle réunion :<br /> +renseignez les champs ci-contre puis validez. Vous pourrez ensuite associer une liste de personnes ainsi que des créneaux possibles.
\ No newline at end of file diff --git a/beta_accents/app/help/profil.php.hlp b/beta_accents/app/help/profil.php.hlp new file mode 100644 index 0000000..9328ff5 --- /dev/null +++ b/beta_accents/app/help/profil.php.hlp @@ -0,0 +1,2 @@ +Vous pouvez renseigner votre nom et prénom. <br/> +Vous avez la possibilité de changer votre méthode de d'identification. <br/> diff --git a/beta_accents/app/help/sendmail.php.hlp b/beta_accents/app/help/sendmail.php.hlp new file mode 100644 index 0000000..4a31a5b --- /dev/null +++ b/beta_accents/app/help/sendmail.php.hlp @@ -0,0 +1,2 @@ +Ce formulaire vous permet d'envoyer un courriel de notification aux personnes sélectionnées.<br/> +Vous pouvez charger un des modèles disponibles pour gagner du temps. diff --git a/beta_accents/app/ical.php b/beta_accents/app/ical.php new file mode 100644 index 0000000..f2aeb26 --- /dev/null +++ b/beta_accents/app/ical.php @@ -0,0 +1,36 @@ +<?php +$_SESSION['session_idP'] = 1; +//require_once('include/ludo/session_verify.inc.php'); +require_once('include/ical.inc.php'); + +$res=ERR_ICAL_NO_DATA; +if ( isset($_SESSION['session_idP']) ) +{ + $res = generationIcal($_SESSION['session_idP'], $iCal_name, $iCal_content, $errmsg); + + if ( $res === 0 ) + { + header("Content-disposition: attachment; filename=$iCal_name"); + header("Content-Type: application/force-download"); + header("Content-Transfer-Encoding: text/calendar\n"); // Surtout ne pas enlever le \n + header("Content-Length: ". strlen($iCal_content) ); + header("Pragma: no-cache"); + header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public"); + header("Expires: 0"); + /* + header("Accept-Ranges: bytes"); + header("Content-Length: ". strlen($iCal_content) ); + header("Content-Type: text/calendar"); + */ + echo $iCal_content; + exit(); + } +} +require_once('include/ludo/html_elements.inc.php'); +generate_html_doctype_and_head("Génération iCal"); +echo "<body>\n"; +generate_html_div_errmsg($errmsg); +?> +</body> +</html> + diff --git a/beta_accents/app/images/addP.gif b/beta_accents/app/images/addP.gif Binary files differnew file mode 100644 index 0000000..aa77bef --- /dev/null +++ b/beta_accents/app/images/addP.gif diff --git a/beta_accents/app/images/button_del.png b/beta_accents/app/images/button_del.png Binary files differnew file mode 100644 index 0000000..899b785 --- /dev/null +++ b/beta_accents/app/images/button_del.png diff --git a/beta_accents/app/images/button_ok.png b/beta_accents/app/images/button_ok.png Binary files differnew file mode 100644 index 0000000..229550e --- /dev/null +++ b/beta_accents/app/images/button_ok.png diff --git a/beta_accents/app/images/del.gif b/beta_accents/app/images/del.gif Binary files differnew file mode 100644 index 0000000..cc89b0b --- /dev/null +++ b/beta_accents/app/images/del.gif diff --git a/beta_accents/app/images/details.png b/beta_accents/app/images/details.png Binary files differnew file mode 100644 index 0000000..11982cc --- /dev/null +++ b/beta_accents/app/images/details.png diff --git a/beta_accents/app/images/editCreneau2.gif b/beta_accents/app/images/editCreneau2.gif Binary files differnew file mode 100644 index 0000000..ba90a82 --- /dev/null +++ b/beta_accents/app/images/editCreneau2.gif diff --git a/beta_accents/app/images/logo.png b/beta_accents/app/images/logo.png Binary files differnew file mode 100644 index 0000000..a768d45 --- /dev/null +++ b/beta_accents/app/images/logo.png diff --git a/beta_accents/app/images/masque.png b/beta_accents/app/images/masque.png Binary files differnew file mode 100644 index 0000000..45a6027 --- /dev/null +++ b/beta_accents/app/images/masque.png diff --git a/beta_accents/app/images/ok.gif b/beta_accents/app/images/ok.gif Binary files differnew file mode 100644 index 0000000..1935a84 --- /dev/null +++ b/beta_accents/app/images/ok.gif diff --git a/beta_accents/app/images/question.gif b/beta_accents/app/images/question.gif Binary files differnew file mode 100644 index 0000000..d57516b --- /dev/null +++ b/beta_accents/app/images/question.gif diff --git a/beta_accents/app/images/supprimer.png b/beta_accents/app/images/supprimer.png Binary files differnew file mode 100644 index 0000000..a87033a --- /dev/null +++ b/beta_accents/app/images/supprimer.png diff --git a/beta_accents/app/images/vcss.gif b/beta_accents/app/images/vcss.gif Binary files differnew file mode 100644 index 0000000..020c75a --- /dev/null +++ b/beta_accents/app/images/vcss.gif diff --git a/beta_accents/app/images/vxhtml.gif b/beta_accents/app/images/vxhtml.gif Binary files differnew file mode 100644 index 0000000..739585d --- /dev/null +++ b/beta_accents/app/images/vxhtml.gif diff --git a/beta_accents/app/images/wai.gif b/beta_accents/app/images/wai.gif Binary files differnew file mode 100644 index 0000000..b82d6e7 --- /dev/null +++ b/beta_accents/app/images/wai.gif diff --git a/beta_accents/app/include/connect.inc.php b/beta_accents/app/include/connect.inc.php new file mode 100644 index 0000000..b985b10 --- /dev/null +++ b/beta_accents/app/include/connect.inc.php @@ -0,0 +1,14 @@ +<?php +/* + * Paramètres de connexion à la base MySQL + */ + +// $bd représente le nom de la database à utiliser +$bd = "awor"; +// mysql_connect(<nom_ou_ip_serveur_mysql>, <utilisateur_mysql>, <mot_de_passe_en_clair_mysql>); +$link = @mysql_connect('localhost', 'lud_restricted', 'maille_ess_ku_elle'); + +@mysql_select_db($bd , $link); + +// NB : La gestion d'erreur est inhibée. Cet include ne génèrera jamais de code, même si la connexion n'a pas pu être établie +?>
\ No newline at end of file diff --git a/beta_accents/app/include/ical.inc.php b/beta_accents/app/include/ical.inc.php new file mode 100644 index 0000000..0d858e3 --- /dev/null +++ b/beta_accents/app/include/ical.inc.php @@ -0,0 +1,68 @@ +<?php +/* + * Fonction de génération d'iCal + */ + +// Constantes d'erreur +define("ERR_ICAL_NO_DATA", -1); +define("ERR_ICAL_SQL_ERROR", -2); + + function generationIcal($idP, &$iCal_name, &$iCal_content, &$errmsg) +{ + require_once('connect.inc.php'); + $query = 'SELECT DISTINCT R.idR,R.objetR,P.courrielP,UNIX_TIMESTAMP(C.dateHeure),C.duree,R.lieuR,R.ordreJourR,L.idL' + . ' FROM AWOR_Liste L,AWOR_Reunion R,AWOR_Appartenir A,AWOR_Creneau C,AWOR_Personne P' + . " WHERE ((A.idP = $idP AND A.idL = L.idL) OR R.idP_Orga = $idP)" + . ' AND R.idL = L.idL AND C.idC = R.idC_Fixe AND P.idP = R.idP_Orga' + . ' AND C.dateHeure > NOW() '; + if ( ! $result = @mysql_query($query) ) + { + // Cas d'erreur + $errmsg =mysql_generate_errmsg(); + return ERR_ICAL_SQL_ERROR; + } + else + { + if (mysql_num_rows($result)<1) + { + return ERR_ICAL_NO_DATA; + } + else + { + $time = time(); + $iCal_name = "iCal_${idP}_${time}.ics"; + $iCal_content = "BEGIN:VCALENDAR\r\n" . "VERSION:2.0\r\n"; + while ( list($idR, $objetR, $courrielP, $dateDeb, $duree, $lieuR, $ordreJourR, $idL) = mysql_fetch_array($result) ) + { + // TODO : Il est probablement judicieux d'ajouter à l'UID un timestamp unix !!!!! + $iCal_content .= "BEGIN:VEVENT\r\n" . "UID:awor_${idP}.${idR}\r\n" . "SUMMARY:$objetR ($courrielP)\r\n"; + $iCal_content .= 'DTSTART:' . date('Ymd\THis', $dateDeb) . "\r\n"; + $iCal_content .= 'DTEND:' . date('Ymd\THis', $dateDeb+60*$duree) . "\r\n"; + $iCal_content .= "LOCATION:$lieuR\r\n"; + $iCal_content .= "DESCRIPTION:$ordreJourR\r\n"; + + $query = 'SELECT P.courrielP FROM AWOR_Appartenir A,AWOR_Personne P' . " WHERE A.idP=P.idP AND A.idL='$idL'"; + if ( ! $result = mysql_query($query) ) + { + // Cas d'erreur + $errmsg =mysql_generate_errmsg(); + $ret=ERR_ICAL_SQL_ERROR; + break; + } + else + { + while ( list($mail_autres) = mysql_fetch_array($result) ) + { + $iCal_content .= "ATTENDEE:mailto:$mail_autres\r\n"; + } + } + // TODO : vérifier la pertinance de la variable utilisée + $iCal_content .= 'URL:http://' . $_SERVER['HTTP_HOST'] . "\r\n"; + $iCal_content .= "END:VEVENT\r\n"; + } + $iCal_content .= "END:VCALENDAR\r\n"; + return 0; + } + } +} +?>
\ No newline at end of file diff --git a/beta_accents/app/include/je.inc.php b/beta_accents/app/include/je.inc.php new file mode 100644 index 0000000..dcbb75e --- /dev/null +++ b/beta_accents/app/include/je.inc.php @@ -0,0 +1,244 @@ +<?php +require_once ('include/connect.inc.php'); + + function traiter_formulaire_valider_modif_personnes() + { + //Vérification a faire pour savoir si c'est bien le propriétaire ?!! $_SESSION['session_idP'] + $tabParticipant = array(); + if (isset($_GET['dataParticipants'])) $tabParticipant = $_GET['dataParticipants']; + $idL=-1; + if (!isset($_GET['idL']) && isset($_GET['listname'])) + { + if (isset($_GET['isPrivate'])) $isPrivate = 'oui'; else $isPrivate = 'non'; + $idL = list_new($_GET['listname'],$_GET['idP'],$isPrivate); + } + else {$idL = $_GET['idL'];} + + if ($idL != -1) list_modif($idL,$tabParticipant); + } + + function traiter_formulaire_delete_list() + { + //Vérification a faire pour savoir si c'est bien le propriétaire ?!! $_SESSION['session_idP'] + if (isset($_GET['idL'])) list_delete($_GET['idL']); + } + + function list_delete($idL) + { + $result = mysql_query("DELETE FROM AWOR_Appartenir WHERE idL=$idL;"); + $result = mysql_query("DELETE FROM AWOR_Liste WHERE idL=$idL;"); + } + + function list_new($listname,$idP,$isPrivate) + { + $result = mysql_query("INSERT INTO AWOR_Liste (libelleL,estPrivee,idP_Createur) VALUES ('$listname','$isPrivate',$idP)") or die (mysql_error()); + if (mysql_affected_rows() > 0) + { + return (mysql_insert_id()); + } + return (false); + } + + function list_modif($idL,$tabParticipant) + { + $result = mysql_query("SELECT P.idP,P.courrielP FROM AWOR_Appartenir A, AWOR_Personne P WHERE P.idP = A.idP AND A.idL=$idL") or die (mysql_error()); + if (mysql_num_rows($result)>=0) + { + //Fabrication des trois tableaux + $tabOldPers = array(); + $tabOldPersMail = array(); + $tabNewPers = array(); + if (!empty($tabParticipant)) $tabNewPers = $tabParticipant; + for($i=0;$i<mysql_num_rows($result);$i++) + { + $row = mysql_fetch_array($result); + $tabOldPers[$i] = $row[0]; + $tabOldPersMail[$i] = $row[1]; + } + //Boucle permettant de mettre a NULL les élements identiques aux deux tableaux + $i = 0; + while ($i < count($tabOldPers)) + { + $exist=false; + for ($j=0;$j<count($tabNewPers);$j++) + { + if (($tabOldPers[$i] == $tabNewPers[$j]) or ($tabOldPersMail[$i] == $tabNewPers[$j])) + { + $exist = true; + $tabNewPers[$j]=NULL; + } + } + if ($exist) + { + $tabOldPers[$i]=NULL; + $tabOldPersMail[$i]=NULL; + } + $i++; + } + } + + //Construction du tableau des participants a ajouter + $tabAdd = array(); + foreach ($tabNewPers as $pers) + { + //Si c'est une adresse Mail : Inscription + Ajout Sinon Ajour simplement + if (!stristr($pers,'@')===false) + { + $tabAdd[] = new_pers($pers); + } + else + { + if ($pers != NULL) $tabAdd[] = $pers; + } + } + //Enleve les redondances d'idP + $tabAdd=array_unique($tabAdd); + //Envoie a la fonction d'ajout de personne + list_add_pers($tabAdd,$idL); + + //Construction du tableau des participants a ajouter + $tabRemove = array(); + foreach ($tabOldPers as $pers) + { + if ($pers != NULL) $tabRemove[] = $pers; + } + //Envoie a la fonction de suppression de personne + list_remove_pers($tabRemove,$idL); + + } + + function list_add_pers ($tabPers,$idL) + { + foreach ($tabPers as $pers) + { + $result=mysql_query("INSERT INTO AWOR_Appartenir (idP,idL) VALUES ($pers,$idL);"); + } + + } + + function list_remove_pers ($tabPers,$idL) + { + + foreach ($tabPers as $pers) + { + $result = mysql_query("DELETE FROM AWOR_Appartenir WHERE idP=$pers AND idL=$idL;"); + } + + } + + + //Fonction Inscription qui prends en parametre une adresse mail $persMail et qui retourne l'id de la perssonne (s'il elle existe) + // ou Insert une personne et retourne son identifiant + function new_pers ($persMail) + { + $result = mysql_query("SELECT idP,courrielP FROM AWOR_Personne WHERE courrielP = '$persMail'"); + if (mysql_num_rows($result)>0) + { + $row = mysql_fetch_array($result); + return ($row['idP']); + } + else + { + $result = mysql_query("INSERT INTO AWOR_Personne (courrielP,loginP,nomP) VALUES ('$persMail','$persMail','$persMail')"); + return (mysql_insert_id()); + } + + return (false); + } + + + + //Fonction qui affiche toutes les liste public ainsi que les liste privée possédées par idP + function generate_html_array_list ($idP) + { + $result = mysql_query("SELECT idL,libelleL,estPrivee,idP_Createur FROM AWOR_Liste WHERE idP_Createur=$idP OR estPrivee='non' ORDER BY estPrivee,libelleL"); + echo "<table>\n<tr>\n<th>Supprimer</th>\n<th>Type</th>\n<th>Libellé</th>\n</tr>\n"; + if (mysql_num_rows($result)>0) + { + + for($i=0;$i<mysql_num_rows($result);$i++) + { + $row = mysql_fetch_array($result); + echo "<tr>\n<td>"; + if ($row['estPrivee'] == 'oui' || $row['idP_Createur']==$idP) echo "<a href=\"#\" onclick=\"loadid('popdeletelist.php?idL=".$row[0]."','popdeletelist',true);popon('popdeletelist')\"><img src=\"images/supprimer.png\" alt=\"Supprimer ".$row[1]."\" /></a></td>\n" ; else echo "</td>\n"; + if ($row['estPrivee'] == 'oui') echo "<td>estPrivée" ; else echo "<td>Public"; + echo "</td>\n<td>"; + echo "<a href=\"#\" onclick=\"loadid('poppersonne.php?idL=".$row['idL']."&idP_orga=".$idP."','poppersonne',true);popon('poppersonne')\">"; + echo $row['libelleL']; + echo "</a></td>\n"; + echo "</tr>\n"; + } + + } + echo "</table>\n"; + + } + + function traiter_formulaire_commentaire() + { + if ($_GET['txtCommentaire'] != "") + { + require_once ('include/connect.inc.php'); + if (isset($_GET['idR'])) + { + $query="UPDATE AWOR_Repondre SET commentaireReponse ='".$_GET['txtCommentaire']."' WHERE idR=".$_GET['idR']." AND idP=".$_SESSION['session_idP']; + $result = @mysql_query($query); + if ( ! $result || ( mysql_affected_rows() !== 1 ) ) + { + $query="INSERT INTO AWOR_Repondre(idR,idP,commentaireReponse) VALUES (".$_GET['idR'].", ".$_SESSION['session_idP'].", '".$_GET['txtCommentaire']."')"; + + $result = mysql_query($query); + if ( ! $result || ( mysql_affected_rows() !== 1 )) + { + echo $query; + echo "Erreur BD\n"; + return; + } + } + } + } + else + { + $query="DELETE FROM AWOR_Repondre WHERE idR=".$_GET['idR']." AND idP=".$_SESSION['session_idP']; + $result = mysql_query($query); + } + } + + // Modifiée par Ludo pour les problèmes de vriables de session et pour d'autres détails : + // S'il n'y a pas de commentaire, on affiche le tableau vide + function generate_html_reunion_commentaires($idR) + { + $idP = $_SESSION['session_idP']; + echo '<table cellspacing="0" class="commentaires" summary="Liste des commentaires laissés pour les personnes conviées à cette réunion">'; + echo '<thead>'; + echo '<tr>'; + echo "<th>Commentaires <a href=\"#\" onclick=\"loadid('popcommentaire.php?idR=".$idR."&idP=".$idP."','popcommentaire',true);popon('popcommentaire');\">(Editer votre commentaire)</a></th>"; + echo '</tr>'; + echo '</thead>'; + $requete = "SELECT P.nomP,P.prenomP,P.courrielP,R.commentaireReponse FROM AWOR_Repondre R,AWOR_Personne P WHERE P.idP = R.idP AND R.idR = '".$idR."'"; + //echo "DEBUG : requete : $requete\n"; + $resultat = mysql_query($requete); + if($resultat != false) + { + if(mysql_num_rows($resultat) > 0) + { + while($pers = mysql_fetch_array($resultat)) + { + echo '<tr><td>'; + if ($pers["nomP"] !== "" || $pers["prenomP"] !== "") echo $pers["nomP"] . " " . $pers["prenomP"]; else echo $row["courrielP"]; + echo " : ".$pers["commentaireReponse"]."</td></tr>\n"; + + } + } + else + { + echo "<tr><td>Aucun commentaire pour le moment.</td></tr>\n"; + } + } + + echo '</table>'; + + } + + +?>
\ No newline at end of file diff --git a/beta_accents/app/include/ju.inc.php b/beta_accents/app/include/ju.inc.php new file mode 100644 index 0000000..75fb4ee --- /dev/null +++ b/beta_accents/app/include/ju.inc.php @@ -0,0 +1,237 @@ +<?php +function traiter_formulaire_popfichier() +{ + require("include/ludo/config.inc.php"); + $file = "fichier"; + if ( isset($CONFIG['UPLOAD']['relative_path']) ) { $basepath=$CONFIG['UPLOAD']['relative_path']; } else { $basepath='fichiers/';} + $basepath=$_SERVER['DOCUMENT_ROOT'].'/'.$basepath; + + if(isset($_FILES[$file])) + { + if($_FILES[$file]["error"] == 0) + { + //Récupération de l'extension + $ext = explode(".", $_FILES[$file]["name"]); + $ext = array_pop($ext); + if(is_numeric(array_search(strtolower($ext), $CONFIG["UPLOAD"]["accepted_files"]))) + { + $filepath=$basepath."r".$_GET["idR"]."_".$_FILES[$file]["name"]; + if(!file_exists($filepath)) + { + if(move_uploaded_file($_FILES[$file]["tmp_name"], $filepath)) + { + if(isset($debug)) echo "DEBUG : basepath==$basepath\n"; + $requete = "INSERT INTO AWOR_Fichier(nomFic, idR) VALUES ('"."r".$_GET["idR"]."_".$_FILES[$file]["name"]."', '".$_GET["idR"]."')"; + if(mysql_query($requete) == false) + { + if(isset($debug)) echo "DEBUG : ".mysql_error()."<br/>\n"; + if(isset($debug)) echo "DEBUG : ".$requete."<br/>\n"; + return "Erreur : Une erreur MySQL est survenu."; + } + } + else + { + return "Erreur Uploader file"; + } + } + else + { + return "Erreur : Un fichier de meme nom existe deja"; + } + } + else + { + return "Erreur : Le fichier n'a pas ete uploader correctement."; + } + } + else + { + switch($_FILES[$file]["error"]) + { + case 1 : + case 2 : return "Erreur : Le fichier a une taille trop importante."; break; + case 3 : return "Erreur : Le fichier n'a pas ete envoye en entier."; break; + case 4 : return "Erreur : Aucun fichier recu."; break; + } + echo $erreur; + } + } + else + { + return "isset"; + } +} + + +function generate_html_reunion_fichiers($idR) +{ + require("include/ludo/config.inc.php"); + if ( isset($CONFIG['UPLOAD']['relative_path']) ) { $basepath='/'.$CONFIG['UPLOAD']['relative_path']; } else { $basepath='/fichiers/';} + + $requete = "SELECT * FROM AWOR_Fichier WHERE idR = '".$idR."'"; + $resultat = mysql_query($requete); + if($resultat != false) + { + echo '<table cellspacing="0" class="fichiers" summary="Liste des fichiers postés par les participants de la réunion.">'; + echo '<thead>'; + echo '<tr>'; + echo '<th>Fichiers attachés <a href="#" onclick="popon(\'popfichier\')">(Ajouter un fichier)</a></th>'; + echo '</tr>'."\n"; + echo '</thead>'; + if(mysql_num_rows($resultat) > 0) + { + while($fichier = mysql_fetch_array($resultat)) + { + echo '<tr><td><a href="' . $basepath . $fichier["nomFic"].'" target="_blank" >'.$fichier["nomFic"]."</a></td></tr>\n"; + } + } + else + { + echo "<tr><td>Aucun fichier pour cette reunion.</td></tr>\n"; + } + echo '</table>'; + } +} + +function traiter_formulaire_valider_creneau() +{ + $tabCreneau = array(); + if(isset($_REQUEST["dataCreneaux"])) + { + //Pour chaque creneau poste, on verifie s'il existe, si non on le creer + foreach($_REQUEST['dataCreneaux'] as $creneau) + { + $tabCreneau = explode(".", $creneau); + $heureD = substr($tabCreneau[0], 0, 2); + $minD = substr($tabCreneau[0], 2, 2); + $heureA = substr($tabCreneau[1], 0, 2); + $minA = substr($tabCreneau[1], 2, 2); + $jourA = $tabCreneau[2]; + $moisA = $tabCreneau[3]; + $anneeA = $tabCreneau[4]; + //Si un creneau n'existe pas on le creer + $idCreneau = creneauExiste($_REQUEST["idR"], $heureD, $minD, $heureA, $minA, $jourA, $moisA, $anneeA); + if($idCreneau == false) + { + $newIdC = ajouterCreneau($_REQUEST["idR"], $heureD, $minD, $heureA, $minA, $jourA, $moisA, $anneeA); + if($newIdC != false) + { + $tabNewCreneau[] = $newIdC; + } + + } + else + { + $tabNewCreneau[] = $idCreneau; + } + } + // tabCreneau contient les tous les creneaux dont on a besoin pour la reunion, il faut maintenant supprimer de la base + // tous les creneaux de la reunion qui n'apparaissent pas dans cette liste + $listeCreneau = "("; + foreach($tabNewCreneau as $creneau) + { + $listeCreneau .= "'".$creneau."', "; + } + $listeCreneau .= "'XXX')"; + if(isset($debug)) echo $listeCreneau; + + //On recupere les creneaux ne faisant plus partie de la novuelle liste des creneaux + $requete = "SELECT * FROM AWOR_Creneau WHERE idR='".$_REQUEST["idR"]."' AND idC NOT IN ".$listeCreneau; + //echo "DEBUG : $requete"; + if($resultat = mysql_query($requete)) + { + while($ligne = mysql_fetch_array($resultat)) + { + supprimerCreneau($ligne["idC"]); + } + } + } +} + +function traiter_formulaire_maj_profil() +{ + $requete = "UPDATE AWOR_Personne SET courrielP = '".$_POST["courrielP"]."', loginP = '".$_POST["loginP"]."', nomP = '".$_POST["nomP"]."', prenomP = '".$_POST["prenomP"]."', methodeAuth = '".$_POST["methodeAuth"]."' WHERE idP = '".$_SESSION['session_idP']."'"; + if(mysql_query($requete) == false) return "Une erreur MySQL est survenu : ".mysql_error(); + $_SESSION['session_prenomP'] = $_POST["prenomP"]; + $_SESSION['session_nomP'] = $_POST["nomP"]; + //print_r($_POST); +} + +function ajouterCreneau($idR, $heureD, $minD, $heureA, $minA, $jourA, $moisA, $anneeA) +{ + $dateD = mktime($heureD, $minD, 0, $moisA, $jourA, $anneeA); + $dateA = mktime($heureA, $minA, 0, $moisA, $jourA, $anneeA); + $duree = $dateA - $dateD; + $dateD = date("Y-m-d G:i:s", $dateD); + $duree = $duree / 60; + $requete = "INSERT INTO AWOR_Creneau (dateHeure, duree, idR) VALUES ('".$dateD."', '".$duree."', '".$idR."')"; + if(isset($debug)) echo $requete."<br/>"; + if(mysql_query($requete)) { return mysql_insert_id(); } else { return false; } +} + +function ajouterCreneau2($idR, $dateHeure, $duree) +{ + $requete = "INSERT INTO AWOR_Creneau (dateHeure, duree, idR) VALUES ('".$dateHeure."', '".$duree."', '".$idR."')"; + if(mysql_query($requete)) + { + return mysql_insert_id(); + } + else + { + return false; + } +} + +function supprimerCreneau($idC) +{ + if(mysql_query("DELETE FROM AWOR_Creneau WHERE idC='".$idC."'")) + { + if(mysql_query("DELETE FROM AWOR_Choisir WHERE idC='".$idC."'")) + { + return true; + } + else + { + return false; + } + } + else + { + return false; + } +} + +function creneauExiste($idR, $heureD, $minD, $heureA, $minA, $jourA, $moisA, $anneeA) +{ + $dateD = mktime($heureD, $minD, 0, $moisA, $jourA, $anneeA); + $dateA = mktime($heureA, $minA, 0, $moisA, $jourA, $anneeA); + $duree = $dateA - $dateD; + $dateD = date("Y-m-d G:i:s", $dateD); + $duree = $duree / 60; + $requete = "SELECT * FROM AWOR_Creneau WHERE idR='".$idR."' AND dateHeure='".$dateD."' AND duree=".$duree.""; + if($result = mysql_query($requete)) + { + if(mysql_num_rows($result) > 0) + { + $ligne = mysql_fetch_array($result); + return $ligne["idC"]; + } + else + { + return false; + } + } +} + +function addslashes_if_needed($texte) +{ + if(get_magic_quotes_gpc() == 0) + { + return addslashes($texte); + } + else + { + return $texte; + } +} +?>
\ No newline at end of file diff --git a/beta_accents/app/include/ludo/TODO_list.txt b/beta_accents/app/include/ludo/TODO_list.txt new file mode 100644 index 0000000..724c46c --- /dev/null +++ b/beta_accents/app/include/ludo/TODO_list.txt @@ -0,0 +1,24 @@ +Accueil > _Listes_ (virer le lien) + +mysql_free_result après les requetes et mysql_close ? + +configuration de PHP dans un fichier INI : +array parse_ini_file ( string filename [, bool process_sections] ) + + +Vérifier que les redirections vers authentification et le retour fasse bien suivre les paramètres +--> bookmarque details_reunion?idR=1 + + +faire une fonction JS qui appelle une page php ou créer toute seule un cookie qui gère la préférence du css. + +Se préoccuper des accents et des encodages de pages ! + +Faire un pied de page avec nos noms, et les logos valide XHTML, CSS... + +TODO : un script php qui purge la base +-> export SQL ancienne base ? +-> suppression des réunions plus vielles que... +-> suppression des Personnes n'ayant jamais changé leur profil et n'ayant plus de réunion les concernant +-> suppression de tout les créneaux non référencés +-> suppression de toutes les listes privées obsoletes diff --git a/beta_accents/app/include/ludo/auth.inc.php b/beta_accents/app/include/ludo/auth.inc.php new file mode 100644 index 0000000..18b339d --- /dev/null +++ b/beta_accents/app/include/ludo/auth.inc.php @@ -0,0 +1,78 @@ +<?php +/* + * Collection de fonctions pour une authentification externe POP3 + */ + +// Constantes d'erreur +define("ERR_POP3_AUTH_BADSOCK", -1); +define("ERR_POP3_AUTH_SERVERNACK", -2); +define("ERR_POP3_AUTH_BADUSER", -3); +define("ERR_POP3_AUTH_BADPASS", -4); +define("ERR_BAD_PARAMS", -100); + +// Fonction d'authentification pop3 +function pop3_auth_simple($mail, $upw) +{ + if ( ($ret = ereg ( "(^.*)@([[:alnum:]]+\.[[:alnum:]]+)", $mail, $re_tokens ) ) ) + { + /* $re_tokens [] + * [0] : email complet + * [1] : nom_mail + * [2] : serveur_mail + */ + require_once('config.inc.php'); + $srv_conf = $CONFIG['AUTH']['POP']['SERVERS'][strtolower($re_tokens[2])]; + if ( is_array($srv_conf) ) + { + $server=$srv_conf['subdomain']; + $port=$srv_conf['port']; + if ( $srv_conf['username_is_full_mail'] ) + { $user = $mail; } else { $user = $re_tokens[1]; } + return pop3_auth ($server, $port, $user, $upw); + } + } + /* DEBUG + echo $mail . "\n" . $ret . "\n";; + print_r($re_tokens); + */ + return ERR_BAD_PARAMS; +} + +function pop3_auth ($server, $port, $user, $upw) +{ + //echo "DEBUG : fsockopen($server, $port, $errno, $errstr, 10);"; + $sock = @fsockopen($server, $port, $errno, $errstr, 10); + if ( $sock === false) + { + return ERR_POP3_AUTH_BADSOCK; + } + + //stream_set_timeout ( $sock, 1, 0 ); + + fputs($sock, "user $user\r\n"); + + if ( pop3_GetAndTestReply($sock) === false ) + { + return ERR_POP3_AUTH_BADUSER; + } + + fputs($sock, "pass $upw\r\n"); + + if ( pop3_GetAndTestReply($sock) === false ) + { + return ERR_POP3_AUTH_BADPASS; + } + + fputs($sock, "quit\r\n"); + + return 0; +} + +// Fonction interne testant les réponses du serveur POP3 +function pop3_GetAndTestReply($sock) +{ + $reply = fgets($sock, 128); + echo $reply . "\n"; + return ( substr($reply, 0, 4) == "+OK " ); +} +?>
\ No newline at end of file diff --git a/beta_accents/app/include/ludo/config.inc.php b/beta_accents/app/include/ludo/config.inc.php new file mode 100644 index 0000000..6d6504b --- /dev/null +++ b/beta_accents/app/include/ludo/config.inc.php @@ -0,0 +1,74 @@ +<?php +$CONFIG = array +( + 'adminMail' => 'jmi@iut-blagnac.fr', + 'automatedMail' => 'no_reply@iut-blagnac.fr', + 'AUTH' => array + ( + 'POP' => array + ( + 'SERVERS' => array + ( + 'wanadoo.fr' => array + ( + 'subdomain' => 'pop.orange.fr', + 'port' => 110, + 'username_is_full_mail' => false + ), + 'orange.fr' => array + ( + 'subdomain' => 'pop.orange.fr', + 'port' => 110, + 'username_is_full_mail' => false + ) + ) + ), + 'bypass_if_local' => false + ), + 'CSS' => array + ( + 'CHOOSER_LIST' => array + ( + // 'nom à afficher' => 'nom_fichier_sans_extension' + 'standard' => 'ice', + 'Glace (ancien)' => 'ice_moche', + 'bleu' => 'style1' + ) + ), + 'MAIL' => array + ( + 'TEMPLATES' => array + ( + 'cree' => array + ( + 'caption' => 'Nouvelle Réunion', + 'tpl_file' => 'mail_cree.php' + ), + 'modif' => array + ( + 'caption' => 'Réunion modifiée', + 'tpl_file' => 'mail_modif.php' + ), + 'annul' => array + ( + 'caption' => 'Réunion annulée', + 'tpl_file' => 'mail_annul.php' + ), + 'fixee' => array + ( + 'caption' => 'Réunion fixée', + 'tpl_file' => 'mail_fixee.php' + ) + ) + ), + 'SUPERUSERS' => array ('jeremie.denoyer', 'lpouzenc'), + 'UPLOAD' => array + ( + 'accepted_files' => array + ( + 'jpg', 'jpeg', 'gif', 'png', 'svg', 'pdf', 'ps', 'txt', 'rtf', 'csv', 'doc', 'docx', 'ppt', 'xls', 'sxw','sxp','sxd', 'odt', 'odg', 'odp', 'avi', 'mpg', 'mpeg', 'rm', 'flv', 'mp3', 'mp4', 'ogg','htm','html','zip', 'rar', 'tar', 'gz', 'bz2', 'ace' + ), + 'relative_path' => 'beta/upload_files/' + ) +); +?> diff --git a/beta_accents/app/include/ludo/div_create_or_modif.php b/beta_accents/app/include/ludo/div_create_or_modif.php new file mode 100644 index 0000000..c386060 --- /dev/null +++ b/beta_accents/app/include/ludo/div_create_or_modif.php @@ -0,0 +1,72 @@ +<?php +$isModif=false; +if ( isset ( $_GET['idR']) ) +{ + if ( ! isset($_GET['objetR']) || ! isset($_GET['lieuR']) || ! isset($_GET['ordreJourR']) || ! isset($_GET['remarquesR']) ) + { + $errmsg="Impossible de modifier la réunion : Paramètres incorrects\n"; + return; + } + $idR=addslashes($_GET['idR']); + $objetR=addslashes($_GET['objetR']); + $lieuR=addslashes($_GET['lieuR']); + $ordreJourR=addslashes($_GET['ordreJourR']); + $remarquesR=addslashes($_GET['remarquesR']); + + $isModif=true; +} +?> +<form action="" method="post"> + <input name="action" type="hidden" value="modif_detail_reunion" /> +<?php + echo ' <input name="idR" type="hidden" value="' . $idR . '" />' +?> + <table class="detail_reunion" summary="Détail de la réunion que vous avez sélectionnée"> + <thead> + <tr> + <th colspan="2"> + <?php if ($isModif) { echo 'Modification des détails de la réunion'; } else { echo 'Création d\'une réunion'; } ?> + </th> + </tr> + </thead> + <tbody> + <tr> + <td><strong>Objet :</strong></td> + <td> + <input name="objetR" type="text" size="40" <?php if ($isModif) { echo 'value="' . $objetR .'"'; } ?>></input> + </td> + </tr> + <tr> + <td><strong>Lieu :</strong></td> + <td> + <input name="lieuR" type="text" size="40" <?php if ($isModif) { echo 'value="' . $lieuR .'"'; } ?>></input> + </td> + </tr> + <tr> + <td><strong>Ordre du jour :</strong></td> + <td> + <textarea name="ordreJourR" cols="40" rows="3"><?php if ($isModif) { echo $ordreJourR; } ?></textarea> + </td> + </tr> + <tr> + <td><strong>Remarques :</strong></td> + <td> + <textarea name="remarquesR" cols="40" rows="3"><?php if ($isModif) { echo $remarquesR; } ?></textarea> + </td> + </tr> + <tr> + <td><strong>Etat :</strong></td> + <td> + <input name="isCancelled" type="checkbox">Annulée</input> + <input name="isHidden" type="checkbox" checked="checked">Disponibilités masquées</input> + </td> + </tr> + <tr> + <!--<td> </td>--> + <td colspan="2"> + <input name="Valider" type="submit" value="Valider"></input> + </td> + </tr> + </tbody> + </table> +</form>
\ No newline at end of file diff --git a/beta_accents/app/include/ludo/fonctions.inc.php b/beta_accents/app/include/ludo/fonctions.inc.php new file mode 100644 index 0000000..74b7ca7 --- /dev/null +++ b/beta_accents/app/include/ludo/fonctions.inc.php @@ -0,0 +1,550 @@ +<?php +/* + * Fonctions de génération de message d'erreur pour utilisateur (et le debuggueur !) + */ +// Fonction retournant un message d'erreur correspondant à une erreur mysql +function mysql_generate_errmsg() +{ + if ( isset($_REQUEST['debug']) ) + { + return 'Erreur SQL numéro ' . mysql_errno() . ' : ' . mysql_error(); + }else{ + return 'Une erreur de base de données s\'est produite, veuillez réessayer ultérieurement.'; + } +} + +// Fonction retournant un message d'erreur correspondant à un numero d'erreur de pop3_auth(...) +function pop3_generate_errmsg($errno) +{ + require_once 'auth.inc.php'; + + if ( isset($_REQUEST['debug']) ) + { + $msg = 'Erreur authentification POP3 de code ' . $errno; + }else{ + switch ($errno) + { + case ERR_POP3_AUTH_BADUSER : + case ERR_POP3_AUTH_BADPASS : + $msg = 'Authentification rejetée : Vérifiez votre identifiant et saisissez votre mot de passe à nouveau'; + break; + case ERR_BAD_PARAMS : + $msg = 'Adresse email invalide, ou serveur mail non répertorié'; + break; + default : + $msg = 'Une erreur de communication avec le service d\'authentification s\'est produite,' . + 'veuillez réessayer ultérieurement.'; + break; + } + } + return $msg; +} + +/* + * Génération du code html d'une case du tableau croisé Créneau/Presonnes ayant comme personne $idP, + * comme créneau $idC. Si $idEditable est vrai je pourrai cliquer sur le bouton + * pour donner ma disponibilité. $estDispo peut-être 'oui', 'non', ou '' et signifie que la personne a déjà répondu 'oui', non' + * ou n'a pas encore répondu. + */ +// Génération d'une case +function generate_html_dispo_case($idR, $idP, $idC, $isEditable, $estDispo, $withTD=false, $class='') +{ + // Alignement html + require_once('html_elements.inc.php'); + if ( ! $isEditable ) + { + if ( $withTD ) { echo " <td $class>\n "; } + // Cas général, on n'est pas la personne concernée + if ( ! isset($estDispo) || $estDispo == '' ) + { // Dispo Inconnue (icone ?) + generate_html_dispo_inconnu($idP, $idC); + } + else + { + if ( $estDispo == 'oui' ) + { // Disponible + generate_html_dispo_oui($idP, $idC); + }else + { // Non Disponible + generate_html_dispo_non($idP, $idC); + } + } + } + else + { + if ( $withTD ) { echo " <td id=\"dispo_idC${idC}\" $class>\n "; } + // On est la personne concernée, on peut donc choisir le créneau + if ( ! isset($estDispo) || $estDispo == '' ) + { // Dispo Inconnue + generate_html_dispo_dire_oui($idR, $idC); + //~ echo ' '; + generate_html_dispo_dire_non($idR, $idC); + } + else + { + if ( $estDispo == 'oui' ) + { // Disponible + generate_html_dispo_oui($idP, $idC); + //~ echo ' '."\n "; + generate_html_dispo_dire_non($idR, $idC); + }else + { + // Non Disponible + generate_html_dispo_dire_oui($idR, $idC); + //~ echo ' '."\n "; + generate_html_dispo_non($idP, $idC); + } + } + } + if ( $withTD ) { echo " </td>\n"; } +} + +// Génération du tableau complet +// TODO : idée : class du tableau différnete quand annulée -> tableau grisé... + +function generate_html_array_personnes_crenaux($idR) +{ + if ( isset($_SESSION['session_idP']) ) + { + $idP_Self=$_SESSION['session_idP']; + } + else + { + // TODO : Erreur + } + + // Connexion à la base et sélection de la database + require_once 'include/connect.inc.php'; + + // Récupération des paramètres de la réunion... + $montrerDispoR=$estAnnulee=$is_admin=$estFixee=false; + $idP_orga=null; + $query="SELECT r.montrerDispoR, r.estAnnulee, r.idP_Orga, r.idC_Fixe, r.idL FROM AWOR_Reunion r WHERE r.idR='$idR'"; + $result = @mysql_query($query); + if ( $result && ( mysql_num_rows($result) === 1 ) ) + { + list($montrerDispoR, $estAnnulee, $idP_orga, $idC_Fixe, $idL_interne) = mysql_fetch_row($result); + $is_admin = ( $idP_Self == $idP_orga ); + $montrerDispoR = ( ( $montrerDispoR === 'oui' ) || $is_admin ) ; + //echo "DEBUG : annulée $estAnnulee\n"; + $estAnnulee = ( $estAnnulee == 'oui' ); + $estFixee = ( $idC_Fixe != null); + } + else + { + // TODO : erreur + } + // DEBUG : tests en forçant les variables + //$estAnnulee=true; + + //~ echo "DEBUG : \nmontrerDispoR==$montrerDispoR\nestAnnulee==$estAnnulee\nestFixee==$estFixee\nis_admin==$is_admin\n"; +?> +<form id="formmail" action="sendmail.php" method="post"> + <table class="details" summary="Disponibilité des personnes pour chaque créneau possible de la réunion"> + <thead> + <tr> +<?php + if ( $is_admin ) + { + echo ' <th>Mail</th>' . "\n"; + } + echo ' <th>' ."\n"; + if ( $is_admin ) + { + echo ' <a href="#poppersonne" onclick="loadid(\'poppersonne.php?idR=' . $idR; + echo '&idL=' . $idL_interne . '&idP_orga=' . $idP_orga . '\',\'poppersonne\',true);popon(\'poppersonne\');">' . "\n"; + echo ' <img src="images/addP.gif" alt="Ajouter une personne" title="Ajouter une personne" height="17" width="19" />' . "\n"; + echo ' </a> '; + } + echo 'Personnes' . "\n"; + echo ' </th>' . "\n"; + + // Remplissage des entêtes de colonnes (créneaux) + $query="SELECT idC, UNIX_TIMESTAMP(dateHeure), duree FROM AWOR_Creneau WHERE idR='$idR' ORDER BY dateHeure ASC;"; + $creneaux=array(); + $dispos=array(); + if ( $result = @mysql_query($query) ) + { + while ( list($idC, $date_deb, $duree) = mysql_fetch_row($result) ) + { + // Calcul des dates + //echo $date_deb . "\n"; + $date_fin = $date_deb + 60 * $duree; + if ( $idC != $idC_Fixe ) { echo ' <th>'; } else { echo ' <th class="selected">'; } + if ( $is_admin && ! $estFixee && ! $estAnnulee ) + { + echo '<a href="#popfixer" onclick="loadid(\'popfixer.php?idC=' . $idC; + echo '&idR=' . $idR . '\',\'popfixer\',true);popon(\'popfixer\');">'; + } + echo date('d/m/y', $date_deb) . '<br />' . date('H:i', $date_deb) . ' - ' . date('H:i', $date_fin); + if ( $is_admin && ! $estFixee && ! $estAnnulee ) { echo '</a>'; } + echo "</th>\n"; + + // Comptage des personnes disponibles et indisponibles + $creneaux[] = $idC; + $dispos[$idC]['nbDispo']=0; + $dispos[$idC]['nbNonDispo']=0; + $dispo_max_id=-1; + $dispo_max_val=0; + } + } + if ( $is_admin && ! $estFixee && ! $estAnnulee ) + { +?> + <th> + <a href="#popcreneau" onclick="loadid('popcreneau.php?idR=<?php echo $idR; ?>','popcreneau',true);popon('popcreneau');"> + <img src="./images/editCreneau2.gif" alt="Editer les creneaux" title="Editer les creneaux" height="21" width="22" /> + </a> + </th> +<?php + } + //print_r($creneaux); +?> + </tr> + </thead> + <tbody> +<?php + // Remplissage du tableau, ligne à ligne + // Requette écrivant les disponibilités dans un tableau associatif en une seule fois + if ( $montrerDispoR ) + { + $query='SELECT ch.idC, ch.idP, ch.estDispo FROM AWOR_Choisir ch, AWOR_Creneau c, AWOR_Personne p, AWOR_Appartenir a, AWOR_Reunion r WHERE ' + ."c.idR=$idR AND r.idR=$idR AND a.idL=r.idL AND p.idP=a.idP AND ch.idC = c.idC AND ch.idP = p.idP;"; + } + else + { + $query='SELECT ch.idC, ch.idP, ch.estDispo FROM AWOR_Choisir ch, AWOR_Creneau c WHERE ' + ."c.idR='$idR' AND ch.idC=c.idC AND ch.idP='$idP_Self';"; + } + //echo $query . "\n"; + if ( $result = @mysql_query($query) ) + { + while ( list($idC, $idP, $estDispo) = mysql_fetch_row($result) ) + { + //echo "idC == '$idC'\n"; + $dispos[$idC][$idP]=$estDispo; + if ( $estDispo=='non' ) { $dispos[$idC]['nbNonDispo']++; } + if ( $estDispo=='oui' ) + { + $dispos[$idC]['nbDispo']++; + if ( $dispos[$idC]['nbDispo'] > $dispo_max_val ) + { + $dispo_max_id=$idC; + $dispo_max_val=$dispos[$idC]['nbDispo']; + } + } + } + } + //print_r($dispos); + + + $query='SELECT p.idP, p.prenomP, p.nomP FROM AWOR_Personne p, AWOR_Appartenir a, AWOR_Reunion r WHERE ' + . "r.idR='$idR' AND a.idL=r.idL AND p.idP=a.idP ORDER BY p.nomP, p.prenomP;"; + + if ( $result = @mysql_query($query) ) + { + // On écrit ligne à ligne les personnes et les disponibilités + while ( $p = mysql_fetch_array($result) ) // Boucle sur chaque personne + { + echo " <tr>\n"; + // Colonne de checkbox pour envoi email si $is_admin == true + if ( $is_admin ) { echo ' <td><input name="mail_idP' . $p[0] . '" type="checkbox" checked="checked" /></td>' . "\n"; } + // Nom prénom + echo " <td>$p[1] $p[2]</td>\n"; + // Disponibilités + foreach ( $creneaux as $c_id ) // Pour chaque créneau + { + if (isset($dispos[$c_id][$p[0]])) + { + $estDispo=$dispos[$c_id][$p[0]]; + } + else + { + $estDispo=''; + } + //echo "DEBUG : generate_html_dispo_case($p[0], $c_id, ( $p[0]==$idP_Self ), $estDispo);\n"; + if ( $c_id != $idC_Fixe ) { $class=''; } else { $class='class="selected"'; } + + generate_html_dispo_case($idR, $p[0], $c_id, ( ! $estFixee && ! $estAnnulee && ( $p[0]==$idP_Self ) ),$estDispo, true, $class); + } + // Colonne vide pour l'ajout de personnes + if ( $is_admin && ! $estFixee && ! $estAnnulee ) { echo " <td> </td>\n"; } + echo " </tr>\n"; + } + // Si $is_admin, on met une ligne avec bouton envoyer pour les mails et icône ajout de personnes + if ( $is_admin ) + { + echo " <tr>\n <td>\n"; + echo ' <input name="idR" value="' . $idR . '" type="hidden" />' . "\n"; +?> + <input value="Envoyer" type="submit" /> + </td> + <td> + <?php + echo '<a href="#poppersonne" onclick="loadid(\'poppersonne.php?idR=' . $idR; + echo '&idL=' . $idL_interne . '&idP_orga=' . $idP_orga . '\',\'poppersonne\',true);popon(\'poppersonne\');">' . "\n"; + ?> + <img src="images/addP.gif" alt="Ajouter une personne" title="Ajouter une personne" height="17" width="19" /> + </a> + </td> +<?php + foreach ( $creneaux as $c ) { echo " <td> </td>\n"; } + if ( $is_admin && ! $estFixee && ! $estAnnulee ) { echo " <td> </td>\n"; } + echo " </tr>\n"; + } + + // On inscrit les lignes de totaux si les disponibilités sont révélées + if ( $is_admin && ! $estFixee && ! $estAnnulee) + { + echo " <tr>\n"; + echo " <td> </td>\n"; + echo " <td>Personnes présentes</td>\n"; + foreach ( $creneaux as $c_id ) + { + if ( $c_id == $dispo_max_id ) + { + echo ' <td><em>' . $dispos[$c_id]['nbDispo'] . "</em></td>\n"; + } + else + { + echo ' <td>' . $dispos[$c_id]['nbDispo'] . "</td>\n"; + } + } + echo " <td> </td>\n"; + echo " </tr>\n"; + + echo " <tr>\n"; + echo " <td> </td>\n"; + echo " <td>Personnes absentes</td>\n"; + foreach ( $creneaux as $c_id ) + { + echo ' <td>' . $dispos[$c_id]['nbNonDispo'] . "</td>\n"; + } + echo " <td> </td>\n"; + echo " </tr>\n"; + } + } + echo " </tbody>\n"; + echo " </table>\n</form>\n"; +} + +function traiter_formulaire_fixer_creneau() +{ + if ( ! isset($_GET['idR']) || !isset($_GET['idC']) ) + { + $errmsg="Impossible de fixer la réunion : paramètres manquants ou erroné"; + return $errmsg; + } + $idR=addslashes($_GET['idR']); + $idC=addslashes($_GET['idC']); + + $query="UPDATE AWOR_Reunion SET idC_Fixe=$idC WHERE idR=$idR;"; + if ( ! mysql_query($query) || mysql_affected_rows() != 1 ) + { + $errmsg='Impossible de fixer la réunion : ' . mysql_generate_errmsg(); + return $errmsg; + } + return; +} + +function traiter_formulaire_creer_reunion() +{ + include_once('include/je.inc.php'); + $idP=$_SESSION['session_idP']; + + // Recherche d'une réunion vierge déjà existante + $query='SELECT idR FROM AWOR_Reunion WHERE idP_Orga=' . "('$idP') AND objetR='Renseignez';"; + if ( ( $result = mysql_query($query) ) && (mysql_num_rows($result) > 0) ) + { + list($idR)=mysql_fetch_array($result); + } + else + { + // Création de la Réunion sauf si une réunion vierge existe déjà + $query='INSERT INTO AWOR_Reunion(idP_Orga, objetR) VALUES' . "('$idP', 'Renseignez');"; + if ( ! $result = @mysql_query($query) || (mysql_affected_rows() != 1) ) + { + // Cas d'erreur + $errmsg ='Erreur lors de la création de la liste de participants : ' . mysql_generate_errmsg(); + return $errmsg; + } + $idR=mysql_insert_id(); + + // Création de la Liste des participants + if ( ! $idL=list_new("interne_idR_$idR","NULL",true) ) + { + $errmsg ='Erreur lors de la création de la liste de participants : Erreur de base de données'; + return $errmsg; + } + + $query="UPDATE AWOR_Reunion SET idL='$idL' WHERE idR='$idR'"; + if ( ! $result = @mysql_query($query) || (mysql_affected_rows() != 1) ) + { + // Cas d'erreur + $errmsg = 'Erreur lors de la création de la liste de participants : ' . mysql_generate_errmsg(); + return $errmsg; + } + } + + return (int) $idR; +} + +function traiter_formulaire_modif_detail_reunion() +{ + if ( ! isset($_REQUEST['idR']) || !isset($_POST['objetR']) || !isset($_POST['lieuR']) || !isset($_POST['ordreJourR']) || !isset($_POST['remarquesR']) ) + { + $errmsg = 'Impossible de modifier de détail de la réunion : Paramètres manquants'; + // DEBUG : + //echo "DEBUG : $query\n$errmsg\n"; + return $errmsg; + } + + $idR=addslashes($_REQUEST['idR']); + $objetR=addslashes($_POST['objetR']); + $lieuR=addslashes($_POST['lieuR']); + $ordreJourR=addslashes($_POST['ordreJourR']); + $remarquesR=addslashes($_POST['remarquesR']); + $estAnnulee=( isset($_POST['isCancelled']) && ($_POST['isCancelled']==='on') )?'oui':'non'; + $montrerDispoR=( isset($_POST['isHidden']) && ($_POST['isHidden']==='on') )?'non':'oui'; + + $query="UPDATE AWOR_Reunion SET objetR='$objetR', lieuR='$lieuR', ordreJourR='$ordreJourR', " + ." remarquesR='$remarquesR', estAnnulee='$estAnnulee', montrerDispoR='$montrerDispoR' WHERE idR='$idR'"; + if ( ! $result = @mysql_query($query) || (mysql_affected_rows() != 1) ) + { + // Cas d'erreur + $errmsg = 'Erreur lors de la modification de la réunion : ' . mysql_generate_errmsg(); + // DEBUG : + //echo "DEBUG : $query\n$errmsg\n"; + return $errmsg; + } + // DEBUG : + //echo "DEBUG : $query\n$errmsg\n"; + return; +} + +function generate_html_reunion_detail2($idR) +{ + $query='SELECT r.objetR, r.ordreJourR, r.lieuR, r.remarquesR, r.montrerDispoR, r.estAnnulee, r.idP_Orga, r.idC_Fixe, p.nomP, p.prenomP' + . " FROM AWOR_Reunion r, AWOR_Personne p WHERE r.idR='$idR' AND p.idP=r.idP_Orga"; + $result = @mysql_query($query); + if ( ! $result || ( mysql_num_rows($result) !== 1 ) ) + { + $errmsg="Impossible de récuprérer les informations de la réunion : Erreur de base de données\n"; + return $errmsg; + } + + list($objetR, $ordreJourR, $lieuR, $remarquesR, $montrerDispoR, $estAnnulee, $idP_Orga, $idC_Fixe, $nomP, $prenomP) = mysql_fetch_row($result); + if ( $estAnnulee=='oui' ) { $etat = 'reunion_annulee'; } elseif ( $idC_Fixe!=null) { $etat ='reunion_fixee'; } else { $etat = 'reunion_en_cours'; } + +?> + <table class="detail_reunion" summary="Détail de la réunion que vous avez sélectionnée"> + <thead> + <tr> + <th colspan="2"> + Détails de la réunion +<?php + //~ echo "DEBUG : SESSION['session_idP']==" . $_SESSION['session_idP'] . "\n" . "idP_Orga==" . $idP_Orga; + if ( isset($_SESSION['session_idP']) && ($_SESSION['session_idP'] == $idP_Orga ) ) + { + echo ' '; + echo '<a href="#popfixer" onclick="loadid(\'include/ludo/div_create_or_modif.php?idR='; + echo $idR . '&objetR=' . urlencode($objetR) . '&lieuR=' . urlencode($lieuR) . '&ordreJourR='; + echo urlencode($ordreJourR) . '&remarquesR=' . urlencode($remarquesR); + echo "','details_reunion',false)\">(Editer)</a>\n"; + } + +?> + </th> + </tr> + </thead> + <tbody> + <tr> + <td><strong>Objet :</strong></td> + <td> + <?php echo $objetR . "\n"; ?> + </td> + </tr> + <tr> + <td><strong>Organisateur :</strong></td> + <td> + <?php echo "$prenomP $nomP\n"; ?> + </td> + </tr> + + <tr> + <td><strong>Lieu :</strong></td> + <td> + <?php echo $lieuR . "\n"; ?> + </td> + </tr> + <tr> + <td><strong>Ordre du jour :</strong></td> + <td> + <?php echo $ordreJourR . "\n"; ?> + </td> + </tr> + <tr> + <td><strong>Remarques :</strong></td> + <td> + <?php echo $remarquesR . "\n"; ?> + </td> + </tr> + <tr> + <td><strong>Etat :</strong></td> +<?php + echo ' <td class="' . $etat .'">' ."\n"; + switch($etat) + { + case 'reunion_fixee': + echo "Fixée\n"; + break; + case 'reunion_en_cours': + echo "En préparation\n"; + break; + case 'reunion_annulee': + echo "Annulée\n"; + break; + } + if ( $montrerDispoR === 'non' ) { echo ', disponibilités masquées'; } +?> + </td> + </tr> + </tbody> + </table> +<?php +} + +function html_generate_MySQLTableSuppr($table, $key_name, $columns='*', $where_clause='') +{ + require_once('include/ludo/html_elements.inc.php'); + require_once('include/connect.inc.php'); + + if ( $where_clause !== '' ) { $where_clause="WHERE $where_clause"; } + $query = "SELECT $columns FROM $table $where_clause;"; + //~ echo "DEBUG : $query\n"; + if ( ! $result = @mysql_query($query) ) + { + return "Erreur de génération de la table $table\n"; + } + else + { + $row = mysql_fetch_assoc($result); + // Affichage des entêtes du tableau et du pied de tableau + echo '<form action="" method="post">' . "\n" . '<table summary="Affichage des objets de la table ' . $table . ' pour la purger">' . "\n<thead>\n<tr>\n"; + echo '<td colspan="' . ( count($row) + 1 ) . "\">$table</td>\n</tr>\n<tr>\n"; + echo "<td></td><td>" . implode("</td>\n<td>",array_keys($row)) . "</td>\n"; + echo "</tr>\n</thead>\n<tfoot><tr>\n"; + echo '<td><input name="action" value="delete_from_' . $table . '" type="hidden" /><input value="Supprimer" type="submit" /></td>'; + for ( $i=0; $i < count($row); $i++ ) { echo "<td></td>"; } + echo "</tr>\n</tfoot>\n<tbody>\n"; + + $num=0; + do + { if ( isset($row[$key_name]) ) { $num=$row[$key_name]; } else { $num=''; } + echo "<tr>\n<td><input name=\"${key_name}_${num}\" type=\"checkbox\" /></td>\n<td>" . implode("</td>\n<td>",$row) . "</td>\n</tr>\n"; + } while ( $row = mysql_fetch_assoc($result) ); + echo "</tbody>\n</table>\n</form>\n"; + } +} + +?> diff --git a/beta_accents/app/include/ludo/html_elements.inc.php b/beta_accents/app/include/ludo/html_elements.inc.php new file mode 100644 index 0000000..b845f28 --- /dev/null +++ b/beta_accents/app/include/ludo/html_elements.inc.php @@ -0,0 +1,185 @@ +<?php +/* + * Fonctions de génération de code HTML... + */ + function generate_html_doctype_and_head($title) +{ +echo '<?xml version="1.0" encoding="ISO-8859-1"?>'."\n" +?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" lang="fr"> + <head> + <?php echo "<title>AWOR - $title</title>\n"; ?> + <meta name="keywords" content="AWOR, Application Web, Organisation, Réunion, Reunion" /> + <meta name="description" content="Application Web d'Organisation de Réunion (AWOR). Facilite la vie des organisateurs !" /> + <meta name="author" content="Jérémie Dénoyer, Ludovic Pouzenc, Andriana Semouchtchak, Julien Sérè" /> + <script type="text/javascript" src="script.js"></script> +<?php + //print_r($_COOKIE['aworcustom_css']); + if ( /*isset($_COOKIE['aworcustom_css'])*/ false ) + { + $cssfilemain = $_COOKIE['aworcustom_css']; + } + else + { + include 'config.inc.php'; + $cssfilemain=$CONFIG['CSS']['CHOOSER_LIST']['standard']; + } + echo ' <link href="css/' . $cssfilemain . '.css" rel="stylesheet" type="text/css" />' . "\n"; + echo ' <link href="css/' . $cssfilemain . '_nohelp.css" rel="stylesheet" type="text/css" title="nohelp" />' . "\n"; + + if ( isset($CONFIG['CSS']['CHOOSER_LIST']) ) + { + foreach ( $CONFIG['CSS']['CHOOSER_LIST'] as $cssname => $cssfile ) + { + if ( $cssfile != $cssfilemain ) + { + echo ' <link href="css/' . $cssfile . '.css" rel="alternate stylesheet" type="text/css" title="'.$cssname.'"/>' . "\n"; + echo ' <link href="css/' . $cssfile . '_nohelp.css" rel="alternate stylesheet" type="text/css" title="'.$cssname.'_nohelp"/>' . "\n"; + } + } + } +?> + <link href="css/print.css" rel="alternate stylesheet" type="text/css" title="print"/> + </head> +<?php +} + +function generate_html_divs_menu() +{ +include 'config.inc.php'; +?> +<div id="titre"><h2>AWOR</h2></div> +<div id="main_menu"> + <ul id="menu"> + <li><a href="index.php">Réunions</a></li> + <li><a href="listes.php">Listes</a></li> + <li><a href="profil.php">Mon profil</a></li> + <li><a href="ical.php">iCal</a></li> + <li><a href="apropos.php">A Propos</a></li> +<?php if ( isset($_SESSION['session_loginP']) && (is_integer(array_search($_SESSION['session_loginP'],$CONFIG['SUPERUSERS'],true))) ) + { echo ' <li><a href="admin.php">Administration</a></li>' . "\n"; } +?> + <li id="deconnection"><a href="deco.php">Déconnexion</a></li> + </ul> +</div> +<?php +} + +function generate_html_div_help($help_file='') +{ + //echo "DEBUG : function generate_html_div_help()\n"; + if ($help_file=='' ) { $help_file='help/' . basename($_SERVER['PHP_SELF']) . '.hlp'; } + //$help_file='modele_page.php.hlp'; + //echo "DEBUG : $help_file\n"; + if ( is_readable($help_file) ) + //if ( @fopen($help_file, 'r')!==false ) + { + echo '<div id="no_help">' . "\n<h2><a href=\"#css_standard\" onclick=\"setActiveStyleSheet('standard');\">?</a></h2>\n" . "</div>\n"; + echo '<div id="help">' . "\n"; + readfile($help_file); + echo "</div>\n"; + } +} + +function generate_html_div_errmsg($errmsg) +{ + echo '<div class="errmsg">' . "\n" . '<span class="errmsg">' . $errmsg . "</span>\n"; + require_once('config.inc.php'); + if ( isset( $CONFIG['adminMail'] ) && ( ! isset($_REQUEST['debug'] ) ) ) + { + echo '<span class="contactAdm">Si le problème persiste, vous pouvez contacter l\'administrateur par email à l\'adresse suivante : '; + echo '<a href="mailto:' . $CONFIG['adminMail'] . '">' . $CONFIG['adminMail'] . "</a></span>\n"; + } + echo "</div>\n"; +} + +function generate_html_div_css_chooser() +{ + @include 'include/ludo/config.inc.php'; + @include 'config.inc.php'; + + if ( ! is_array($CONFIG['CSS']['CHOOSER_LIST']) ) { return false; } + + if ( isset($_COOKIE['aworcustom_css'] ) ) { $css_selected=$_COOKIE['aworcustom_css']; }else{$css_selected='';}; + echo '<div class="css_chooser">' . "\n"; + //print_r($_COOKIE); + echo ' <select id="switcherCSS" onchange="switchCSS();">' . "\n"; + foreach ( $CONFIG['CSS']['CHOOSER_LIST'] as $file => $name ) + { + echo ' <option value="' . $file . '"'; + if ( $file == $css_selected ) { echo ' selected="selected"'; } + echo '>' . $name . '</option>' /*. "$DEBUG:file=$file, css_selected=$css_selected"*/ . "\n"; + } + echo ' </select>'. "\n"; + echo '</div>'. "\n"; +} + +function generate_html_div_footer() +{ +?> +<div id="footer"> + <ul> + <li class="left"> +<?php generate_html_div_css_chooser(); ?> + </li> + <li class="center"> + <a href="http://validator.w3.org/check/referer" target="_blank"> + <img src="./images/vxhtml.gif" alt="Validate" border="0" height="31" width="88" /> + </a> + <a href="http://jigsaw.w3.org/css-validator/check/referer" target="_blank"> + <img src="./images/vcss.gif" alt="Validate" border="0" height="31" width="88" /> + </a> + <a href="http://www.w3.org/WAI/WCAG1A-Conformance" title="Explanation of Level A Conformance" target="_blank"> + <img src="./images/wai.gif" alt="W3C-WAI level A conformance icon" border="0" height="31" width="88" /> + </a> + </li> + <li class="right"> + <span class="discret">Application réalisée par Jérémie Dénoyer,<br /> Ludovic Pouzenc, Julien Séré et Andriana Semouchtchak</span> + </li> + </ul> +</div> +<?php +} + +function generate_html_div_deconnect() +{ + echo '<div class="deco"><a href="deco.php">Deconnexion</a></div>'."\n"; +} +function generate_html_div_back() +{ + echo '<div class="retour"><a href="index.php">Retour</a></div>'."\n"; +} + +function generate_html_dispo_inconnu($idP, $idC) +{ + echo '<img class="spacing" src="./images/question.gif" alt="Inconnu" height="15" width="15" />' . "\n"; +} + +function generate_html_dispo_oui($idP, $idC) +{ + echo '<img class="spacing" src="./images/ok.gif" alt="Disponible" height="16" width="16" />' . "\n"; +} + +function generate_html_dispo_non($idP, $idC) +{ + echo '<img class="spacing" src="./images/del.gif" alt="Non disponible" height="15" width="15" />' . "\n"; +} + +function generate_html_dispo_dire_oui($idR, $idC) +{ + //~ echo '<img src="./images/button_ok.png" alt="Dire que je suis disponible" height="25" width="25" />' . "\n"; + echo "<a href=\"#dispo_idC${idC}\" onclick=\"loadid('include/ludo/majDispo.php?idR=$idR&idC=$idC&estDispo=oui','dispo_idC${idC}',false);\">"; + echo '<img class="spacing" src="./images/button_ok.png" alt="Dire que je suis disponible" height="25" width="25" /></a>' . "\n"; +} + +function generate_html_dispo_dire_non($idR, $idC) +{ + echo "<a href=\"#dispo_idC${idC}\" onclick=\"loadid('include/ludo/majDispo.php?idR=$idR&idC=$idC&estDispo=non','dispo_idC${idC}',false);\">"; + echo '<img class="spacing" src="./images/button_del.png" alt="Dire que je suis pas disponible" height="25" width="25" /></a>' . "\n"; +} + +function generate_html_reunion_detail_button($idR) +{ + echo '<a href="details_reunion.php?idR=' . $idR . '"><img src="images/details.png" alt="Détails" width="20" height="20" /></a>'; +} diff --git a/beta_accents/app/include/ludo/mail_textarea.php b/beta_accents/app/include/ludo/mail_textarea.php new file mode 100644 index 0000000..87f4965 --- /dev/null +++ b/beta_accents/app/include/ludo/mail_textarea.php @@ -0,0 +1,44 @@ +<?php +require_once('session_verify.inc.php'); +include('config.inc.php'); +//~ require_once('/home/lud/shares/public_html/awor/appli_3_alpha/include/connect.inc.php'); + +//include('include/connect.inc.php'); + +if ( isset($_GET['model']) ) { $model=$_GET['model']; } else { $model='empty'; } +?> + +<textarea name="msgText" cols="80" rows="15"> +<?php + if ( $model != 'empty') + { + include('../connect.inc.php'); + if ( ! isset($CONFIG['MAIL']['TEMPLATES'][$model]['tpl_file']) ) + { + echo 'Désolé, modèle indisponible...'; + } + else + { + // On récupère quelques information à propos de la réunion pour que les templates puissent être customisés + $objetR=$ordreJourR=$lieuR=$remarquesR=""; + if (isset( $_GET['idR']) ) + { + $idR=addslashes($_GET['idR']); + $result = mysql_query("SELECT objetR, ordreJourR, lieuR, remarquesR FROM AWOR_Reunion WHERE idR='$idR'"); + if (mysql_num_rows($result)===1) + { + list($objetR, $ordreJourR, $lieuR, $remarquesR) = mysql_fetch_array($result); + } + } + //echo 'DEBUG : ../../templates/' . $CONFIG['MAIL']['TEMPLATES'][$model]['tpl_file'] . "\n"; + if (!@include('../../templates/' . $CONFIG['MAIL']['TEMPLATES'][$model]['tpl_file']) ) + { + echo 'Désolé, impossible de charger le fichier modèle...'; + } + } + } + //print_r($_REQUEST); + //print_r($CONFIG); +?> +</textarea> + diff --git a/beta_accents/app/include/ludo/majDispo.php b/beta_accents/app/include/ludo/majDispo.php new file mode 100644 index 0000000..3f79fec --- /dev/null +++ b/beta_accents/app/include/ludo/majDispo.php @@ -0,0 +1,39 @@ +<?php +require('../connect.inc.php'); +require('session_verify.inc.php'); +require('fonctions.inc.php'); + +// TODO : vérification que la réunion nous concerne bien ! + +if ( /*!isset($_GET['idR']) ||*/ !isset($_GET['idC']) || !isset($_GET['estDispo']) || !isset($_SESSION['session_idP']) ) +{ + $errmsg="Paramètres incorrects\n"; +} + +if ( isset( $errmsg ) ) +{ + // TODO +} +else +{ + $idR=addslashes($_GET['idR']); + $idC=addslashes($_GET['idC']); + $estDispo=addslashes($_GET['estDispo']); + $idP=$_SESSION['session_idP']; + + $query="UPDATE AWOR_Choisir SET estDispo = '$estDispo' WHERE idC='$idC' AND idP='$idP'"; + $result = @mysql_query($query); + if ( ! $result || ( mysql_affected_rows() !== 1 ) ) + { + $query="INSERT INTO AWOR_Choisir(idC,idP,estDispo) VALUES ('$idC', '$idP', '$estDispo')"; + //echo "DEBUG :$query"; + $result = mysql_query($query); + if ( ! $result || ( mysql_affected_rows() !== 1 ) ) + { + echo "Erreur BD\n"; + return; + } + } + generate_html_dispo_case($idR, $idP, $idC, true, $estDispo, false); +} +?>
\ No newline at end of file diff --git a/beta_accents/app/include/ludo/redir.inc.php b/beta_accents/app/include/ludo/redir.inc.php new file mode 100644 index 0000000..6baf40d --- /dev/null +++ b/beta_accents/app/include/ludo/redir.inc.php @@ -0,0 +1,20 @@ +<?php +function html_redir($dest) +{ + header("Location: $dest"); +require_once('html_elements.inc.php'); +generate_html_doctype_and_head("Redirection"); +?> +<body> + <h1>Redirection</h1> + <p>Si vous voyez cette page, merci de suivre le lien ci-dessous</p> +<?php + // Ne respecte pas le XHTML s'il y a des paramètres les & doivent être remplacée par & + echo '<p><a href="' . $dest . '">' . $dest . '</a></p>' . "\n"; +?> +</body> +</html> +<?php + exit(); +} +?>
\ No newline at end of file diff --git a/beta_accents/app/include/ludo/session_verify.inc.php b/beta_accents/app/include/ludo/session_verify.inc.php new file mode 100644 index 0000000..f1cea8b --- /dev/null +++ b/beta_accents/app/include/ludo/session_verify.inc.php @@ -0,0 +1,9 @@ +<?php +session_start(); +if ( ! isset($_SESSION['session_loginP']) ) +{ + require('redir.inc.php'); + $dest='auth_dialog.php?retour=' . $_SERVER['PHP_SELF']; + html_redir($dest); +} +?>
\ No newline at end of file diff --git a/beta_accents/app/index.php b/beta_accents/app/index.php new file mode 100644 index 0000000..572c656 --- /dev/null +++ b/beta_accents/app/index.php @@ -0,0 +1,123 @@ +<?php +require('include/ludo/session_verify.inc.php'); +require_once('include/ludo/html_elements.inc.php'); +generate_html_doctype_and_head("Réunions"); +echo "<body>\n"; +generate_html_divs_menu(); +?> + <div id="sous_menu"> + <p class="arbre"> + > <a href="index.php">Accueil</a> + > <a href="index.php">Réunions</a> + > Liste des réunions + </p> + </div> +<?php +generate_html_div_help(); +?> + <div id="contenu"> +<?php + $idP= $_SESSION['session_idP']; + if ( isset( $_SESSION['session_prenomP'] ) && isset( $_SESSION['session_prenomP'] ) ) + { $nom=$_SESSION['session_prenomP'] . ' ' . $_SESSION['session_nomP']; } + else { $nom = $_SESSION['loginP']; } + + echo "Bonjour $nom, nous sommes le " . date('d/m/Y') . ' et il est ' . date('H:i'); + //~ echo "<pre>DEBUG : SESSION :\n"; + //~ print_r($_SESSION); + //~ echo "\nDEBUG : REQUEST :\n"; + //~ print_r($_REQUEST); + //~ echo "</pre>"; +?> + <br/><br/> + <a href="details_reunion.php?action=creer_reunion">Organiser une réunion</a> + <br/><br/> + <table class="listeReunions" summary="Liste des réunions vous concernant"> + <tr> + <th>Objet</th> + <th>Organisateur</th> + <th>Date</th> + <th>Etat</th> + <th>Détails</th> + </tr> +<?php + // Connexion à la base et sélection de la database + require_once 'include/connect.inc.php'; + + function fill_array_liste_reunion($query) + { + if ( ! $result = @mysql_query($query) ) + { + require_once('fonctions.inc.php'); + $errmsg=mysql_generate_errmsg(); + } + else + { + // On écrit ligne à ligne les personnes et les disponibilités + while ( list($idR, $objetR, $nomP, $prenomP, $idC_Fixe, $estAnnulee) = mysql_fetch_array($result) ) + { + // Boucle sur chaque personne + echo " <tr>\n"; + echo ' <td><a href="details_reunion.php?idR=' . $idR . '">' . "$objetR</a></td>\n"; + echo " <td>$prenomP $nomP</td>\n"; + if ( $estAnnulee=='oui' ) { $etat = 'reunion_annulee'; } elseif ( $idC_Fixe!=null) { $etat ='reunion_fixee'; } else { $etat = 'reunion_en_cours'; } + + $dateStr=''; + switch($etat) + { + case 'reunion_fixee': + echo ' <td>' . date('d/m/Y \à H:i', $idC_Fixe) . "</td>\n"; + echo " <td class='$etat'>Fixée</td>\n"; + break; + case 'reunion_en_cours': + echo " <td></td>\n"; + echo " <td class='$etat'>En préparation</td>\n"; + break; + case 'reunion_annulee': + echo " <td></td>\n"; + echo " <td class='$etat'>Annulée</td>\n"; + break; + } + + + echo ' <td>'; + generate_html_reunion_detail_button($idR); + echo "</td>\n"; + echo " </tr>\n"; + } + } + } + + + // Réunions fixées et passées + + $query = 'SELECT DISTINCT R.idR, R.objetR, P.nomP, P.prenomP, UNIX_TIMESTAMP(C.dateHeure), R.estAnnulee' + . ' FROM AWOR_Liste L,AWOR_Reunion R,AWOR_Appartenir A,AWOR_Creneau C,AWOR_Personne P' + . " WHERE ((A.idP = $idP AND A.idL = L.idL) OR R.idP_Orga = $idP)" + . ' AND R.idL = L.idL AND P.idP = R.idP_Orga AND R.idC_Fixe = C.idC' + . ' ORDER BY C.dateHeure DESC;'; + fill_array_liste_reunion($query); + + // Réunion en préparation + $query = 'SELECT DISTINCT R.idR, R.objetR, P.nomP, P.prenomP, NULL, R.estAnnulee' + . ' FROM AWOR_Liste L,AWOR_Reunion R,AWOR_Appartenir A,AWOR_Personne P' // Creneau C, + . " WHERE ((A.idP = $idP AND A.idL = L.idL) OR R.idP_Orga = $idP)" + . ' AND R.idL = L.idL AND P.idP = R.idP_Orga AND ISNULL(R.idC_Fixe);'; + //echo "DEBUG : $query\n"; + fill_array_liste_reunion($query); + + //$query = + //echo "DEBUG : $query\n"; +?> + </table> + <br/> + <a href="details_reunion.php?action=creer_reunion">Organiser une réunion</a> + </div> +<?php + if ( isset ($errmsg) ) { generate_html_div_errmsg($errmsg); } + generate_html_div_footer(); +?> +<div id="msg"></div> +</body> +</html> + diff --git a/beta_accents/app/listes.php b/beta_accents/app/listes.php new file mode 100644 index 0000000..3ec4d39 --- /dev/null +++ b/beta_accents/app/listes.php @@ -0,0 +1,48 @@ +<?php +require('include/ludo/session_verify.inc.php'); +require_once('include/connect.inc.php'); +require_once('include/ludo/html_elements.inc.php'); +require_once('include/ludo/fonctions.inc.php'); + + +require_once('include/je.inc.php'); +require_once('include/ju.inc.php'); + +if ( isset($_REQUEST['action']) ) +{ + $nom_func = 'traiter_formulaire_' . $_REQUEST['action']; + $nom_func(); +} + +generate_html_doctype_and_head("Listes"); + +echo "<body>\n"; + +generate_html_divs_menu(); +?> + <div id="sous_menu"> + <p class="arbre"> + > <a href="index.php">Accueil</a> + > Listes + </p> + </div> +<?php +generate_html_div_help('help/groupe.hlp'); +?> + +<div id="contenu"> +<a href="#" onclick="loadid('poppersonne.php?idP_orga=<?php echo $_SESSION['session_idP']; ?>','poppersonne',true);popon('poppersonne')">Créer une liste</a> +<br/><br/> +<?php generate_html_array_list($_SESSION['session_idP']) ?> +<br/> +<a href="#" onclick="loadid('poppersonne.php?idP_orga=<?php echo $_SESSION['session_idP']; ?>','poppersonne',true);popon('poppersonne')">Créer une liste</a> + +</div> + +<div id="poppersonne" class="popup_personne"></div> +<div id="popdeletelist" class="popup_deletelist"></div> +<div id="masque"></div> +<div id="msg"></div> +<?php generate_html_div_footer() ?> +</body> +</html>
\ No newline at end of file diff --git a/beta_accents/app/organiser.php b/beta_accents/app/organiser.php new file mode 100644 index 0000000..2afcbea --- /dev/null +++ b/beta_accents/app/organiser.php @@ -0,0 +1,24 @@ +<?php +require('include/ludo/session_verify.inc.php'); +require_once('include/ludo/html_elements.inc.php'); +require_once('include/connect.inc.php'); +generate_html_doctype_and_head("Modèle"); +echo "<body>\n"; +generate_html_divs_menu(); +?> + <div id="sous_menu"> + > <a href="index.php">Accueil</a> + > <a href="index.php">Réunions</a> + > Organiser une réunion + </div> +<?php +generate_html_div_help(); +echo "<div id=\"contenu\">\n"; + +include('include/ludo/div_create_or_modif.php'); +?> + +</div> +</body> +</html> + diff --git a/beta_accents/app/popcommentaire.php b/beta_accents/app/popcommentaire.php new file mode 100644 index 0000000..cb6489f --- /dev/null +++ b/beta_accents/app/popcommentaire.php @@ -0,0 +1,23 @@ +<?php require_once ('include/connect.inc.php'); ?> +<h2>Editer votre commentaire</h2> +<div class="popup_contenu"> +<form id="formcommentaire" method="get" action=""> +<textarea name="txtCommentaire" rows="4" cols="40"> +<?php + $requete = "SELECT commentaireReponse FROM AWOR_Repondre WHERE idP=".$_GET['idP']." AND idR=".$_GET['idR'].""; + $result = mysql_query($requete); + if($result && mysql_num_rows($result) > 0) + { + $com = mysql_fetch_array($result); + + echo $com['commentaireReponse']; + } + +?> +</textarea> +<br/><br/> +<?php if (isset($_GET['idR'])) echo '<input type="hidden" name="idR" value="'.$_GET['idR'].'" />' ?> +<input type="hidden" name="action" value="commentaire" /> +<input type="submit" value="Enregistrer" /><input type="button" value="Fermer" onclick="popoff('popcommentaire')" /> +</form> +</div>
\ No newline at end of file diff --git a/beta_accents/app/popcreneau.php b/beta_accents/app/popcreneau.php new file mode 100644 index 0000000..f4ba56f --- /dev/null +++ b/beta_accents/app/popcreneau.php @@ -0,0 +1,90 @@ +<?php +function generate_html_div_popcreneau($idR) +{ + require_once ('include/connect.inc.php'); + ?> + <h2>Créneaux de la réunion </h2> + <div class="popup_contenu"> + <form id="formcreneau" method="get" action="" onsubmit="return dataListe('creneaux','dataCreneaux');"> + <table> + <tr> + <td>Créer un créneau </td> + <td> </td> + <td>Créneaux</td> + </tr> + <tr> + <td>Date : + <select name="day"> + <?php + for ($i=1;$i<=31;$i++) {$i = "0$i"; $i = substr($i,-2); echo "<option value=\"$i\">$i</option>"; } + ?> + </select>/ + <select name="month"> + <?php + for ($i=1;$i<=12;$i++) {$i = "0$i"; $i = substr($i,-2); echo "<option value=\"$i\">$i</option>"; } + ?> + </select>/ + <select name="year"> + <?php + for ($i=date('Y');$i<=((int)date('Y')+4);$i++) echo "<option value=\"$i\">$i</option>"; + ?> + </select><br />Début : + <select name="hourStart"> + <?php + for ($i=0;$i<=23;$i++) {$i = "0$i"; $i = substr($i,-2); echo "<option value=\"$i\">$i</option>"; } + ?> + </select>: + <select name="minuteStart"> + <?php + for ($i=0;$i<=59;$i++) {$i = "0$i"; $i = substr($i,-2); echo "<option value=\"$i\">$i</option>"; } + ?> + </select><br />Fin : + <select name="hourEnd"> + <?php + for ($i=0;$i<=23;$i++) {$i = "0$i"; $i = substr($i,-2); echo "<option value=\"$i\">$i</option>"; } + ?> + </select>: + <select name="minuteEnd"> + <?php + for ($i=0;$i<=59;$i++) {$i = "0$i"; $i = substr($i,-2); echo "<option value=\"$i\">$i</option>"; } + ?> + </select></td> + <td><input name="AjouterCreneau" type="button" value="Ajouter" onclick="addcreneau(this.form);"/><br/><br/> + <input name="supprimerCreneau" type="button" value="Retirer" onclick="removecreneau(this.form);"/></td> + <td><select name="creneaux" size="10" id="creneaux"> + <?php + $result = mysql_query("SELECT UNIX_TIMESTAMP(dateHeure),duree FROM AWOR_Creneau WHERE idR=".$idR); + if (mysql_num_rows($result)>0) + { + for($i=0;$i<mysql_num_rows($result);$i++) + { + $row = mysql_fetch_array($result); + $date_deb =$row[0]; + $date_fin = $date_deb + 60 * $row[1]; + echo '<option value="'.date('Hi',$date_deb).'.'.date('Hi',$date_fin).'.'.date('d.m.Y',$date_deb).'">' . date('H:i',$date_deb) . ' -> ' . date('H:i',$date_fin) . ' ' . date('d/m/Y',$date_deb); + } + } + ?> + </select></td></tr></table><br/> + <input type="hidden" name="idR" value="<?php echo $idR;?>" /> + <input type="hidden" name="action" value="valider_creneau" /> + <input type="submit" value="Valider" /><input type="button" value="Fermer" onclick="popoff('popcreneau')"/> + </form> + </div> +<?php +} + +if (isset($_GET['idR'])) +{ + generate_html_div_popcreneau($_GET['idR']); +} +else +{ + echo '<div class="popup_contenu">'; + echo 'Erreur - pas d\'identifiant de réunion !'; + echo '<form id="formcreneau" method="get" action="">'; + echo '<input type="button" value="Fermer" onclick="popoff(\'popcreneau\')"/>'; + echo '</form>'; + echo '</div>'; +} +?> diff --git a/beta_accents/app/popdeletelist.php b/beta_accents/app/popdeletelist.php new file mode 100644 index 0000000..3449714 --- /dev/null +++ b/beta_accents/app/popdeletelist.php @@ -0,0 +1,20 @@ +<?php require_once('include/connect.inc.php'); ?> +<h2>Désirer vous supprimer cette liste ?</h2> +<div class="popup_contenu"> +<?php + $result = mysql_query("SELECT libelleL FROM AWOR_Liste WHERE idL=".$_GET['idL']); + if (mysql_num_rows($result)>0) + { + $row = mysql_fetch_array($result); + echo "Libellé : " . $row[0] . "<br/><br/>"; + } + echo '<form id="formdelete" method="get" action="">'; + echo '<input type="hidden" name="action" value="delete_list" />'; + echo '<input type="hidden" name="idL" value="'.$_GET['idL'].'" />'; + echo '<input type="submit" value="Supprimer"/>'; + echo '<input type="button" value="Annuler" onclick="popoff(\'popdeletelist\')"/>'; + echo '</form>'; +?> +</div> + + diff --git a/beta_accents/app/popfixer.php b/beta_accents/app/popfixer.php new file mode 100644 index 0000000..7e1c85a --- /dev/null +++ b/beta_accents/app/popfixer.php @@ -0,0 +1,42 @@ +<?php + if (isset($_GET['idC'])) + { + include ('include/connect.inc.php'); + echo '<h2>Désirez-vous fixer ce créneau ?</h2>'; + echo '<div class="popup_contenu">'; + $result = mysql_query("SELECT UNIX_TIMESTAMP(dateHeure),duree FROM AWOR_Creneau WHERE idC=".$_GET['idC']); + if (mysql_num_rows($result)>0) + { + for($i=0;$i<mysql_num_rows($result);$i++) + { + $row = mysql_fetch_array($result); + $date_deb =$row[0]; + $date_fin = $date_deb + 60 * $row[1]; + echo 'Le ' . date('d/m/y', $date_deb) . ' de ' . date('H:i', $date_deb) . ' à ' . date('H:i', $date_fin); + } + } + + echo '<br/>'; + echo '<em>(Il vous sera impossible par la suite de modifier les informations concernant la réunion)</em>'; + echo '<br/>';echo '<br/>'; + //~ echo '<form id="formfixer" method="get" action="'.$_SERVER['PHP_SELF'].'">'; + echo '<form id="formfixer" method="get" action="">'; + echo '<input type="hidden" name="action" value="fixer_creneau" />'; + echo '<input type="hidden" name="idR" value="'.$_GET['idR'].'" />'; + echo '<input type="hidden" name="idC" value="'.$_GET['idC'].'" />'; + echo '<input type="submit" value="Valider"/>'; + echo '<input type="button" value="Annuler" onclick="popoff(\'popfixer\')"/>'; + echo '</form>'; + echo '</div>'; + } + else + { + echo '<div class="popup_contenu">'; + echo 'Erreur - pas d\'identifiant de cr&eaneau !'; + echo '<form id="formfixer" method="get" action="">'; + echo '<input type="button" value="Fermer" onclick="popoff(\'popfixer\')"/>'; + echo '</form>'; + echo '</div>'; + } +?> + diff --git a/beta_accents/app/popnewlist.php b/beta_accents/app/popnewlist.php new file mode 100644 index 0000000..d8d1010 --- /dev/null +++ b/beta_accents/app/popnewlist.php @@ -0,0 +1,3 @@ +<!-- Sert a rien !! --> + + diff --git a/beta_accents/app/poppersonne.php b/beta_accents/app/poppersonne.php new file mode 100644 index 0000000..e9225ba --- /dev/null +++ b/beta_accents/app/poppersonne.php @@ -0,0 +1,112 @@ +<?php require_once('include/connect.inc.php'); ?> +<h2><?php +//Pour le choix du Titre : +if(isset($_GET['idR'])) echo "Participants de la réunion"; + else + if (isset($_GET['idL'])) echo "Modification de la liste" ; else echo "Création d'une liste"; +?></h2> +<div class="popup_contenu"> + +<?php +//Pour la création de la liste et initialisation du propriétaire +echo "<form id=\"formpersonne\" action=\"\" method=\"get\" onsubmit=\"return ("; +$isOwner= false; + +if (!isset($_GET['idL'])) +{ + echo "(true==(isNotEmpty('listname') & "; + echo "dataListe('participants','dataParticipants'))));\">"; + echo "Nom de la liste : <input type=\"text\" name=\"listname\" id=\"listname\" />\n"; + echo " est privée : <input type=\"checkbox\" name=\"isPrivate\" checked/><br/><br/>\n"; + echo "<input type=\"hidden\" name=\"idP\" value=\"".$_GET['idP_orga']."\" />\n"; + $isOwner = true; +} +else +{ + echo "dataListe('participants','dataParticipants'));\">"; + if (isset($_GET['idR'])) $req = "SELECT * FROM AWOR_Liste L,AWOR_Reunion R WHERE (L.idP_Createur=".$_GET['idP_orga']." OR R.idP_Orga=".$_GET['idP_orga'].") AND R.idL=L.idL"; + else $req = "SELECT * FROM AWOR_Liste L,AWOR_Reunion R WHERE L.idL=".$_GET['idL']." AND L.idP_Createur=".$_GET['idP_orga']; + $result = mysql_query($req); + if (mysql_num_rows($result)>0) + { + $isOwner = true; + } +} + +?> +<table> +<tr> +<td>Contacts disponibles </td> +<td> </td> +<td>Participants </td> +</tr> +<tr> +<td> +<select name="listeDispo" id="listeDispo" onChange="loadlist('poppersonneliste.php?idL=','listeDispo','divListe');" <?php if (!$isOwner) echo ' disabled' ;?>> +<option value="None">Choisir ...</option> +<option value="Tous">Tous</option> +<?php + $req = "SELECT idL,libelleL,estPrivee FROM AWOR_Liste WHERE (idP_Createur=".$_GET['idP_orga']." OR estPrivee='non')"; + if (isset($_GET['idL'])) $req .= " AND idL <>".$_GET['idL']; + $req .= " ORDER BY estPrivee"; + $result = mysql_query($req); + if (mysql_num_rows($result)>0) + { + for($i=0;$i<mysql_num_rows($result);$i++) + { + $row = mysql_fetch_array($result); + echo '<option value="'.$row[0].'">'; + echo $row[1]; + echo '</option>'; + } + } +?> +</select> +</td> +<td> </td> +<td> </td> +</tr> +<tr> +<td> +<div id="divListe"> +</div> +</td> +<td> +<input name="AjouterParticipant" type="button" id="AjouterParticipant" value="Ajouter" onclick="addPers(this.form);" <?php if (!$isOwner) echo ' disabled' ;?>/><br/> +<br/> +<input name="AjouterTous" type="button" id="AjouterTous" value="Ajouter Tous" onclick="addAllPers(this.form);" <?php if (!$isOwner) echo ' disabled' ;?> /><br/> +<br/> +<input name="supprimerParticipant" type="button" id="supprimerParticipant" value="Retirer" onclick="removePers(this.form);" <?php if (!$isOwner) echo ' disabled' ;?>/> +</td> +<td> +<select name="participants" size="10" id="participants"> +<?php + if (isset($_GET['idL'])) + { + $req = "SELECT P.idP,P.courrielP,P.nomP,P.prenomP FROM AWOR_Personne P,AWOR_Appartenir A WHERE P.idP=A.idP AND A.idL=".$_GET['idL']; + $result = mysql_query($req); + if (mysql_num_rows($result)>0) + { + for($i=0;$i<mysql_num_rows($result);$i++) + { + $row = mysql_fetch_array($result); + echo '<option value="'.$row[0].'">'; + if ($row[2] !== "" & $row[3] !== "") echo $row[2] . " " . $row[3]; else echo $row[1]; + echo '</option>'; + } + } + } +?> +</select> +</td> +</tr> +</table> +<br/> +<input type="text" name="courriel" id="courriel" value="" size="30" <?php if (!$isOwner) echo ' disabled' ;?>/><input type="button" value="inscrire" onclick="newPers(this.form);" <?php if (!$isOwner) echo ' disabled' ;?>/> +<br/><br/> +<?php if (isset($_GET['idL'])) echo '<input type="hidden" name="idL" value="'.$_GET['idL'].'" />'; ?> +<?php if (isset($_GET['idR'])) echo '<input type="hidden" name="idR" value="'.$_GET['idR'].'" />'; ?> +<input type="hidden" name="action" value="valider_modif_personnes" /> +<input type="submit" name="Submit" value="Valider" /><input type="button" value="Fermer" onclick="popoff('poppersonne');" /> +</form> +</div> diff --git a/beta_accents/app/poppersonneliste.php b/beta_accents/app/poppersonneliste.php new file mode 100644 index 0000000..a0d60b5 --- /dev/null +++ b/beta_accents/app/poppersonneliste.php @@ -0,0 +1,27 @@ +<?php + require_once 'include/connect.inc.php'; + if ($_GET['idL'] != "None") + { + $req = "SELECT P.idP , P.courrielP , P.nomP , P.prenomP FROM AWOR_Personne P"; + if ($_GET['idL'] != "Tous") {$req=$req.",AWOR_Appartenir A WHERE P.idP=A.idP AND A.idL=".$_GET['idL'];} + $result = mysql_query($req) ; + echo '<select name="contactDispo" size="10" id="contactDispo">'; + + if (mysql_num_rows($result)>0) + { + for($i=0;$i<mysql_num_rows($result);$i++) + { + $row = mysql_fetch_array($result); + echo '<option value="'.$row[0].'" onDblClick="addPers(this.form);">'; + if ($row[2] !== "" & $row[3] !== "") echo $row[2] . " " . $row[3]; else echo $row[1]; + echo '</option>'; + } + } + echo '</select>'; + } + else + { + echo " "; + } + +?> diff --git a/beta_accents/app/profil.php b/beta_accents/app/profil.php new file mode 100644 index 0000000..289b7f1 --- /dev/null +++ b/beta_accents/app/profil.php @@ -0,0 +1,59 @@ +<?php +require('include/ludo/session_verify.inc.php'); +require_once('include/ludo/html_elements.inc.php'); +require_once('include/connect.inc.php'); +require_once('include/ju.inc.php'); +if ( isset($_REQUEST['action']) ) +{ + $nom_func = 'traiter_formulaire_' . $_REQUEST['action']; + $nom_func(); +} +generate_html_doctype_and_head("Modèle"); + +echo "<body>\n"; +generate_html_divs_menu(); +?> + <div id="sous_menu"> + <p class="arbre"> + > <a href="index.php">Accueil</a> + > Administration du profil + </p> + </div> +<?php +generate_html_div_help(); +echo "<div id=\"contenu\">\n"; +$idP = $_SESSION['session_idP']; +if ( isset( $_SESSION['session_prenomP'] ) && isset( $_SESSION['session_prenomP'] ) ) +{ + $nom=$_SESSION['session_prenomP'] . ' ' . $_SESSION['session_nomP']; +} +else +{ + $nom = $_SESSION['session_loginP']; +} +$resultat = mysql_query("SELECT * FROM AWOR_Personne WHERE idP = '".$_SESSION['session_idP']."'"); +if($resultat != false) +{ + $p = mysql_fetch_array($resultat); + echo "<form method=\"post\" action=\"profil.php\" onSubmit=\"return verifProfil()\" >\n"; + echo "<table>\n"; + echo "<tr><td>Methode d'authentification : </td><td>\n<select name=\"methodeAuth\">\n"; + if($p["methodeAuth"] == "webetud") echo "<option value=\"webetud\" selected=\"selected\">Webetud</option>\n"; else echo "<option value=\"webetud\">Webetud</option>\n"; + if($p["methodeAuth"] == "pop") echo "<option value=\"pop\" selected=\"selected\">POP3</option>\n"; else echo "<option value=\"pop\">POP3</option>\n"; + echo "</select></td></tr>\n"; + echo "<tr><td>Votre login :</td><td><input type=\"text\" name=\"loginP\" id=\"loginP\" value=\"".$p["loginP"]."\"/></td></tr>\n"; + echo "<tr><td>Votre adresse mail :</td><td><input type=\"text\" name=\"courrielP\" id=\"courrielP\" value=\"".$p["courrielP"]."\"/></td></tr>\n"; + echo "<tr><td>Votre nom :</td><td><input type=\"text\" name=\"nomP\" id=\"nomP\" value=\"".$p["nomP"]."\"/></td></tr>\n"; + echo "<tr><td>Votre prenom :</td><td><input type=\"text\" name=\"prenomP\" id=\"prenomP\" value=\"".$p["prenomP"]."\"/></td></tr>\n"; + echo "<tr><td colspan=\"2\"><input type=\"submit\" /></td></tr>\n"; + echo "</table>\n"; + echo "<input type=\"hidden\" name=\"action\" value=\"maj_profil\" />\n"; + echo "</form>\n"; + echo "</div>\n"; +} +if ( isset ($errmsg) ) generate_html_div_errmsg($errmsg); +?> +<div id="msg"></div> +</body> +</html> + diff --git a/beta_accents/app/script.js b/beta_accents/app/script.js new file mode 100644 index 0000000..2c14563 --- /dev/null +++ b/beta_accents/app/script.js @@ -0,0 +1,341 @@ +function isNotEmpty (idInput) +{ + if (document.getElementById(idInput).value.length > 0) { return (true);} else {return (false);} +} + +function addPers(form) +{ + if(form.contactDispo) + { + if(form.contactDispo.options.selectedIndex>=0) + { + var oValue = form.contactDispo.options[form.contactDispo.options.selectedIndex].value; + + var exist = false; + var i = 0; + while (i<form.participants.options.length && !exist) { if (form.participants.options[i].value == oValue) exist = true; i=i+1;} + + if (!exist) + { + var oText = form.contactDispo.options[form.contactDispo.options.selectedIndex].text; + var o = new Option(oText,oValue); + form.participants.options[form.participants.options.length]=o; + } + } + } +} + +function switchCSS() +{ + + alert ( "On change de CSS !"); + var listCSS = document.getElementById('switcherCSS'); + if (listCSS) + { + if (listCSS.options.selectedIndex>=0) + { + alert ( "On passe au css :" + listCSS.options[listCSS.options.selectedIndex].value); + setActiveStyleSheet(listCSS.options[listCSS.options.selectedIndex].value); + } + } + +} + +function addAllPers(form) +{ + if(form.contactDispo) + { + for (var j=0;j<form.contactDispo.options.length;j++) + { + var oValue = form.contactDispo.options[j].value; + var exist = false; + var i = 0; + + while (i<form.participants.options.length && !exist) { if (form.participants.options[i].value == oValue) exist = true; i=i+1;} + + if (!exist) + { + var oText = form.contactDispo.options[j].text; + var o = new Option(oText,oValue); + form.participants.options[form.participants.options.length]=o; + } + } + } +} + +function newPers(form) +{ + if (verifMail(form.courriel.value)) + { + var oValue = form.courriel.value; + + var exist = false; + var i = 0; + while (i<form.participants.options.length && !exist) { if (form.participants.options[i].value == oValue) exist = true; i=i+1;} + + if (!exist) + { + var oText = form.courriel.value; + var o = new Option(oText,oValue); + form.participants.options[form.participants.options.length]=o; + } + } + else + { + alert ("Mail invalide"); + } +} + +function verifMail(mail) +{ + if ((mail.indexOf("@")>=0)&&(mail.indexOf(".")>=0)) return true; else return false; +} + + +function removePers(form) +{ + if (form.participants.options.selectedIndex>=0) + { + var i = form.participants.options.selectedIndex; + form.participants.options[form.participants.options.selectedIndex]=null; + if (parseInt(i) > 0) {form.participants.options.selectedIndex=parseInt(i)-1;} else {form.participants.options.selectedIndex=0;} + } + else + { + alert("Suppression impossible : aucune ligne sélectionnée"); + } +} + +function loadid(url,id,isPop) { + if (isPop) + document.getElementById('msg').innerHTML = "<em>Chargement en cours ...<a href=\"#\" onclick=\"popoff('"+id+"')\" >Fermer</a></em>"; + else + document.getElementById('msg').innerHTML = "<em>Chargement en cours ...</em>"; + + document.getElementById(id).innerHTML = ""; + document.getElementById('msg').style.display='block'; + + var http_request = false; + + if (window.XMLHttpRequest) { // Mozilla, Safari,... + http_request = new XMLHttpRequest(); + if (http_request.overrideMimeType) { + http_request.overrideMimeType('text/xml'); + } + } else if (window.ActiveXObject) { // IE + try { + http_request = new ActiveXObject("Msxml2.XMLHTTP"); + } catch (e) { + try { + http_request = new ActiveXObject("Microsoft.XMLHTTP"); + } catch (e) {} + } + } + + if (!http_request) { + alert('Abandon : Impossible de créer une instance XMLHTTP'); + return false; + } + + http_request.onreadystatechange = function(){ + + if (http_request.readyState == 4) { + if (http_request.status == 200) { + document.getElementById(id).innerHTML = http_request.responseText; + document.getElementById('msg').style.display='none'; + document.getElementById('msg').innerHTML = ""; + + } else { + if (isPop) + document.getElementById('msg').innerHTML = "<em>Un problème est survenu ...<a href=\"#\" onclick=\"loadid('"+url+"','"+id+"',true)\" >Réessayer</a> - <a href=\"#\" onclick=\"popoff('"+id+"')\" >Fermer</a></em>"; + else + document.getElementById('msg').innerHTML = "<em>Un problème est survenu ...<a href=\"#\" onclick=\"loadid('"+url+"','"+id+"',false)\" >Réessayer</a></em>"; + } + } + }; + + http_request.open('GET', url, true); + http_request.send(null); +} + +function popon (id) +{ + var thisPopup = document.getElementById(id); + thisPopup.style.display='block'; + //var thisMasque = document.getElementById('masque'); + //thisMasque.style.display='block'; +} + +function popoff (id) +{ + var thisPopup = document.getElementById(id); + thisPopup.style.display='none'; + //var thisMasque = document.getElementById('masque'); + //thisMasque.style.display='none'; +} + +function addcreneau(form) +{ + if(form.day.options.selectedIndex>=0 && form.month.options.selectedIndex>=0 && form.year.options.selectedIndex>=0 && form.hourStart.options.selectedIndex>=0 && form.minuteStart.options.selectedIndex>=0 && form.hourEnd.options.selectedIndex>=0 && form.minuteEnd.options.selectedIndex>=0) + { + if (verifDate(form.day.options[form.day.options.selectedIndex].value,form.month.options[form.month.options.selectedIndex].value,form.year.options[form.year.options.selectedIndex].value)) + { + //Création de la valeur + var oValue = form.hourStart.options[form.hourStart.options.selectedIndex].value + form.minuteStart.options[form.minuteStart.options.selectedIndex].value + "." + form.hourEnd.options[form.hourEnd.options.selectedIndex].value + form.minuteEnd.options[form.minuteEnd.options.selectedIndex].value; + oValue = oValue + "." + form.day.options[form.day.options.selectedIndex].value + "." + form.month.options[form.month.options.selectedIndex].value + "." + form.year.options[form.year.options.selectedIndex].value; + + //Test si la valeur est déja dans la liste + var exist = false; + var i = 0; + while (i<form.creneaux.options.length && !exist) { if (form.creneaux.options[i].value == oValue) exist = true; i=i+1;} + + //Création du texte et de l'option et insertion de l'option si la valeur n'a pas été trouvée + if (!exist) + { + var oText = form.hourStart.options[form.hourStart.options.selectedIndex].value + ":" + form.minuteStart.options[form.minuteStart.options.selectedIndex].value + " -> " + form.hourEnd.options[form.hourEnd.options.selectedIndex].value + ":" + form.minuteEnd.options[form.minuteEnd.options.selectedIndex].value; + oText = oText + " " + form.day.options[form.day.options.selectedIndex].value + "/" + form.month.options[form.month.options.selectedIndex].value + "/" + form.year.options[form.year.options.selectedIndex].value; + var o = new Option(oText,oValue); + form.creneaux.options[form.creneaux.options.length]=o; + } + } + } +} + +function removecreneau(form) +{ + if (form.creneaux.options.selectedIndex>=0) + { + var i = form.creneaux.options.selectedIndex; + form.creneaux.options[form.creneaux.options.selectedIndex]=null; + if (parseInt(i) > 0) {form.creneaux.options.selectedIndex=parseInt(i)-1;} else {form.creneaux.options.selectedIndex=0;} + } + else + { + alert("Suppression impossible : aucune ligne sélectionnée"); + } +} + +function dataListe(idSelect,idInput) +{ + var liste = document.getElementById(idSelect); + if (liste) + { + for (var i=0;i<liste.options.length;i++) + { + var newInput = document.createElement("input"); +/* newInput.setAttribute("type", "hidden"); + newInput.setAttribute("name", (idInput+"["+i+"]")); + newInput.setAttribute("value", liste.options[i].value);*/ + newInput.type = "hidden"; + newInput.name = idInput+"["+i+"]"; + newInput.value = liste.options[i].value; + liste.form.appendChild(newInput); + } + return (true); + } + else + { + return (false); + } + +} +function verifDate(day,month,year) +{ + var a= year; + var m= month; + var d= day; + var ok=true; + + var date2=new Date(a,m-1,d); + d2=date2.getDate(); + m2=date2.getMonth()+1; + a2=date2.getFullYear(); + if (a2<=100) {a2=1900+a2} //Pour depasser 2000 + if ( (d!=d2)||(m!=m2)||(a!=a2) ) + { + alert("Cette date n'existe pas !"); + ok=false; + } + return (ok); +} +function loadlist(url,id,idListe) +{ + + if (document.getElementById(id)) + { + loadid((url+document.getElementById(id).options[document.getElementById(id).options.selectedIndex].value),idListe,false); + } +} +//*************************************************************************// +// Formulaire profil +//*************************************************************************// +function verifProfil() +{ + //return(true==(isNotEmpty('nomP')) && true==(isNotEmpty('prenomP')) && true==(isNotEmpty('loginP')) && true==(isNotEmpty('courrielP'))); + if(false==isNotEmpty('nomP')) { alert("Saisissez votre nom avant de valider."); return false;} + if(false==isNotEmpty('prenomP')) { alert("Saisissez votre prenom avant de valider."); return false;} + if(false==isNotEmpty('courrielP')) { alert("Saisissez votre courriel avant de valider."); return false;} + if(false==isNotEmpty('loginP')) { alert("Saisissez votre login avant de valider."); return false;} + return true; +} + +//*************************************************************************// +// Switcher CSS +//*************************************************************************// +function setActiveStyleSheet(title) { + var i, a, main; + for(i=0; (a = document.getElementsByTagName("link")[i]); i++) { + if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) { + a.disabled = true; + if(a.getAttribute("title") == title) a.disabled = false; + } + } +} +function getActiveStyleSheet() { + var i, a; + for(i=0; (a = document.getElementsByTagName("link")[i]); i++) { + if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && !a.disabled) return a.getAttribute("title"); + } + return null; +} +function getPreferredStyleSheet() { + var i, a; + for(i=0; (a = document.getElementsByTagName("link")[i]); i++) { + if(a.getAttribute("rel").indexOf("style") != -1 + && a.getAttribute("rel").indexOf("alt") == -1 + && a.getAttribute("title") + ) return a.getAttribute("title"); + } + return null; +} +function createCookie(name,value,days) { + if (days) { + var date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + var expires = "; expires="+date.toGMTString(); + } + else expires = ""; + document.cookie = name+"="+value+expires+"; path=/"; +} +function readCookie(name) { + var nameEQ = name + "="; + var ca = document.cookie.split(';'); + for(var i=0;i < ca.length;i++) { + var c = ca[i]; + while (c.charAt(0)==' ') c = c.substring(1,c.length); + if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); + } + return null; +} +window.onload = function(e) { + var cookie = readCookie("aworcustom_css"); + var title = cookie ? cookie : getPreferredStyleSheet(); + setActiveStyleSheet(title); +} +window.onunload = function(e) { + var title = getActiveStyleSheet(); + createCookie("aworcustom_css", title, 365); +} +var cookie = readCookie("aworcustom_css"); +var title = cookie ? cookie : getPreferredStyleSheet(); +setActiveStyleSheet(title);
\ No newline at end of file diff --git a/beta_accents/app/sendmail.php b/beta_accents/app/sendmail.php new file mode 100644 index 0000000..6969701 --- /dev/null +++ b/beta_accents/app/sendmail.php @@ -0,0 +1,196 @@ +<?php +require('include/ludo/session_verify.inc.php'); +require_once('include/ludo/html_elements.inc.php'); +require_once('include/connect.inc.php'); + + + +generate_html_doctype_and_head("Envoi de courriel"); +echo "<body>\n"; +generate_html_divs_menu(); +?> + <div id="sous_menu"> + <p class="arbre"> + > <a href="index.php">Accueil</a> + > <a href="index.php">Réunions</a> + > Envoi de courriel + </p> + </div> +<?php generate_html_div_help(); +if( isset($_POST['idR']) ) +{ + $idR=addslashes($_POST['idR']); +} +else +{ +?> + <div id="errmsg"> + Erreur lors de l'émission de l'email : Paramètre manquant ou érroné + </div></body></html> +<?php + exit(); +} + +if( isset($_POST['envoi']) ) +{ + include 'include/ludo/config.inc.php'; + + if ( !isset($_POST['msgObject']) || !isset($_POST['msgText']) || !is_array($_POST['dataParticipants']) ) + { + $errmsg = "Erreur lors de l'émission de l'email : Paramètre manquant ou érroné"; + } + else + { + if ( !isset($CONFIG['automatedMail']) ) + { + $errmsg = "Erreur lors de l'émission de l'email : Erreur de configuration par l'administrateur"; + } + else + { + // Potentiellement dangereux... + $query='SELECT nomP, prenomP, courrielP FROM AWOR_Personne WHERE idP=\'' . implode("' OR idP='", $_POST['dataParticipants']) . "'"; + //~ echo " DEBUG : QUERY : $query\n"; + $result = mysql_query($query); + if ( ! $result ) + { + $errmsg = "Erreur lors de l'émission de l'email : Erreur de base de données"; + } + else + { + $to=array(); + while ( list($nomP, $prenomP, $courrielP) = mysql_fetch_row($result) ) + { + $to[]="$nomP $prenomP <$courrielP>"; + } + $to=implode(', ',$to); + + + if ( ! mail ( $to, $_POST['msgObject'], wordwrap($_POST['msgText'],70), 'From: ' . $CONFIG['automatedMail'] . "\r\n" ) ) + { + $errmsg = "Erreur lors de l'émission de l'email : Erreur inconnue"; + } + } + } + } + + if ( isset($errmsg) ) + { + echo '<div id="errmsg">' . $errmsg .'</div></body></html>'; + } + else + { + echo '<div id="contenu">Le courriel à bien été envoyé<br />'; + echo '<a href="details_reunion.php?idR=' . $idR . '">Retour au détail de la réunion</a></div></body></html>'; + } + exit(); +} + + +$result = mysql_query("SELECT idL FROM AWOR_Reunion WHERE idR='$idR'"); +if (mysql_num_rows($result)===1) +{ + list($idL) = mysql_fetch_array($result); +} +else +{ + $errmsg=""; +} + + + if ( isset($errmsg) ) + { + echo '<div id="errmsg">' . $errmsg .'</div></body></html>'; + exit(); + } + +?> + + <div id="contenu"> + <form id="formmail" action="sendmail.php" method="post" onsubmit="return dataListe('participants','dataParticipants');"> + <table> + <tbody> + <tr> + <td>Contacts disponibles</td> + <td> </td> + <td>Destinataires</td> + </tr> + <tr> + <td> + <select name="contactDispo" size="10" id="contactDispo"> +<?php + $personnes = array(); + $req = 'SELECT P.idP , P.courrielP , P.nomP , P.prenomP FROM AWOR_Personne P, AWOR_Appartenir A WHERE P.idP=A.idP AND A.idL=' . $idL; + $result = mysql_query($req) ; + + if (mysql_num_rows($result)>0) + { + for($i=0;$i<mysql_num_rows($result);$i++) + { + list($idP, $courrielP, $nomP, $prenomP) = mysql_fetch_array($result); + $personnes[$idP]=array($courrielP, $nomP, $prenomP); + echo '<option value="'.$idP.'" ondblclick="addPers(this.form);">'; + echo $nomP . " " . $prenomP; + echo "</option>\n"; + } + } + +?> + </select> + </td> + <td> + <input name="AjouterParticipant" id="AjouterParticipant" value="Ajouter" onclick="addPers(this.form);" type="button" /> + <br /> + <br /> + <input name="supprimerParticipant" id="supprimerParticipant" value="Retirer" onclick="removePers(this.form);" type="button" /> + </td> + <td> + <select name="participants" size="10" id="participants"> +<?php + foreach( $personnes as $idP=>$p) + { + if ( isset($_POST['mail_idP' . $idP] ) ) + { + echo '<option value="'.$idP.'">'; + echo $p[1] . " " . $p[2]; + echo "</option>\n"; + } + } +?> + </select> + </td> + </tr> + </tbody> + </table> + <div> + Modèle : +<?php + echo '<select name="modelsList" id="modelsList" onchange="loadlist(\'include/ludo/mail_textarea.php?idR='; + echo $idR . "&model=','modelsList','divMsg');\">\n"; +?> + <option value="empty">Vierge</option> + <option value="cree">Nouvelle Réunion</option> + <option value="modif">Réunion modifiée</option> + <option value="annul">Réunion annulée</option> + <option value="fixee">Réunion fixée</option> + </select> + </div> + <div> + Objet : <input name="msgObject" type="text" size="40" value="AWOR : Courriel de notification" /> + </div> + <div id='divMsg'> +<?php include 'include/ludo/mail_textarea.php'; ?> + </div> + <div> + <?php + echo '<input name="idR" type="hidden" value="' . $idR . '" />' . "\n"; + ?> + <input name="envoi" type="hidden" value="1" /> + <input type="submit" value="Envoyer" /> + </div> + </form> + </div> +<?php generate_html_div_footer(); ?> + <div id="msg"></div> +</body> +</html> + diff --git a/beta_accents/app/templates/mail_annul.php b/beta_accents/app/templates/mail_annul.php new file mode 100644 index 0000000..74e0d3d --- /dev/null +++ b/beta_accents/app/templates/mail_annul.php @@ -0,0 +1,12 @@ +<?php +// Vous pouvez utiliser les variables suivantes pour personnaliser le modèle +// $objetR, $ordreJourR, $lieuR, $remarquesR +?> +Bonjour, +Une réunion vient d'être annulée sur l'Application Web d'Organisation de Réunion et vous y étiez conviés. +<?php +echo "Objet de la réunion : $objetR\n"; +echo "Lieu de la réunion : $lieuR\n"; +echo "Ordre du jour : $ordreJourR\n"; +echo "Remarques : $remarquesR\n"; +?>
\ No newline at end of file diff --git a/beta_accents/app/templates/mail_cree.php b/beta_accents/app/templates/mail_cree.php new file mode 100644 index 0000000..cd18c89 --- /dev/null +++ b/beta_accents/app/templates/mail_cree.php @@ -0,0 +1,13 @@ +<?php +// Vous pouvez utiliser les variables suivantes pour personnaliser le modèle +// $objetR, $ordreJourR, $lieuR, $remarquesR +?> +Bonjour, +Une réunion vient d'être ajoutée sur l'Application Web d'Organisation de Réunion et vous y êtes conviés. +Vous pouvez aller consulter le détail de la réunion sur le site, et merci de donner vos disponibilités au plus tôt. +<?php +echo "Objet de la réunion : $objetR\n"; +echo "Lieu de la réunion : $lieuR\n"; +echo "Ordre du jour : $ordreJourR\n"; +echo "Remarques : $remarquesR\n"; +?>
\ No newline at end of file diff --git a/beta_accents/app/templates/mail_fixee.php b/beta_accents/app/templates/mail_fixee.php new file mode 100644 index 0000000..6259f9a --- /dev/null +++ b/beta_accents/app/templates/mail_fixee.php @@ -0,0 +1,14 @@ +<?php +// Vous pouvez utiliser les variables suivantes pour personnaliser le modèle +// $objetR, $ordreJourR, $lieuR, $remarquesR +?> +Bonjour, +Une réunion vient d'être fixée sur l'Application Web d'Organisation de Réunion et vous y êtes conviés. +Vous pouvez aller consulter le détail de la réunion sur le site, noter le créneau retenu, +et même télécharger le fichier iCal pour synchroniser votre logiciel de calendrier préféré. +<?php +echo "Objet de la réunion : $objetR\n"; +echo "Lieu de la réunion : $lieuR\n"; +echo "Ordre du jour : $ordreJourR\n"; +echo "Remarques : $remarquesR\n"; +?>
\ No newline at end of file diff --git a/beta_accents/app/templates/mail_modif.php b/beta_accents/app/templates/mail_modif.php new file mode 100644 index 0000000..3cbb7b1 --- /dev/null +++ b/beta_accents/app/templates/mail_modif.php @@ -0,0 +1,13 @@ +<?php +// Vous pouvez utiliser les variables suivantes pour personnaliser le modèle +// $objetR, $ordreJourR, $lieuR, $remarquesR +?> +Bonjour, +Une réunion vient d'être modifiée sur l'Application Web d'Organisation de Réunion et vous y êtes conviés. +Vous pouvez aller consulter le détail de la réunion sur le site, et merci de donner vos disponibilités au plus tôt si ce n'et déjà fait. +<?php +echo "Objet de la réunion : $objetR\n"; +echo "Lieu de la réunion : $lieuR\n"; +echo "Ordre du jour : $ordreJourR\n"; +echo "Remarques : $remarquesR\n"; +?>
\ No newline at end of file diff --git a/beta_accents/app/test.php b/beta_accents/app/test.php new file mode 100644 index 0000000..ea189ae --- /dev/null +++ b/beta_accents/app/test.php @@ -0,0 +1,8 @@ +<html> +<body> +<?php +include('include/ludo/html_elements.inc.php'); +generate_html_div_footer(); +?> +</body> +</html> diff --git a/beta_accents/app/testGet.php b/beta_accents/app/testGet.php new file mode 100644 index 0000000..03dc369 --- /dev/null +++ b/beta_accents/app/testGet.php @@ -0,0 +1,18 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>TestGEt</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> +<script type="text/javascript" src="script.js"></script> +</head> + +<body> +<?php + include("include/connect.inc.php"); + include("popcreneau.php"); + include("poppersonne.php"); +?> +<hr/> +<pre><?php print_r($_GET); ?></pre> +</body> +</html> diff --git a/beta_accents/doc/READ_ME.css b/beta_accents/doc/READ_ME.css new file mode 100644 index 0000000..2dfba7c --- /dev/null +++ b/beta_accents/doc/READ_ME.css @@ -0,0 +1,109 @@ + +/* start css.sty */ +.cmmi-10{font-style: italic;} +.cmr-17{font-size:170%;} +.cmr-12{font-size:120%;} +.cmtt-10{font-family: monospace;} +.cmbx-10{ font-weight: bold;} +p.noindent { text-indent: 0em } +p.nopar { text-indent: 0em; } +p.indent{ text-indent: 1.5em } +@media print {div.crosslinks {visibility:hidden;}} +a img { border-top: 0; border-left: 0; border-right: 0; } +center { margin-top:1em; margin-bottom:1em; } +td center { margin-top:0em; margin-bottom:0em; } +.Canvas { position:relative; } +img.math{vertical-align:middle;} +li p.indent { text-indent: 0em } +.enumerate1 {list-style-type:decimal;} +.enumerate2 {list-style-type:lower-alpha;} +.enumerate3 {list-style-type:lower-roman;} +.enumerate4 {list-style-type:upper-alpha;} +div.newtheorem { margin-bottom: 2em; margin-top: 2em;} +.obeylines-h,.obeylines-v {white-space: nowrap; } +div.obeylines-v p { margin-top:0; margin-bottom:0; } +.overline{ text-decoration:overline; } +.overline img{ border-top: 1px solid black; } +td.displaylines {text-align:center; white-space:nowrap;} +.centerline {text-align:center;} +.rightline {text-align:right;} +div.verbatim {font-family: monospace; white-space: nowrap; } +table.verbatim {width:100%;} +.fbox {padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; } +div.center div.fbox {text-align:center; clear:both; padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; } +table.minipage{width:100%;} +div.center, div.center div.center {text-align: center; margin-left:1em; margin-right:1em;} +div.center div {text-align: left;} +div.flushright, div.flushright div.flushright {text-align: right;} +div.flushright div {text-align: left;} +div.flushleft {text-align: left;} +.underline{ text-decoration:underline; } +.underline img{ border-bottom: 1px solid black; margin-bottom:1pt; } +.framebox-c, .framebox-l, .framebox-r { padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; } +.framebox-c {text-align:center;} +.framebox-l {text-align:left;} +.framebox-r {text-align:right;} +span.thank-mark{ vertical-align: super } +span.footnote-mark sup.textsuperscript, span.footnote-mark a sup.textsuperscript{ font-size:80%; } +div.tabular, div.center div.tabular {text-align: center; margin-top:0.5em; margin-bottom:0.5em; } +table.tabular td p{margin-top:0em;} +table.tabular {margin-left: auto; margin-right: auto;} +div.td00{ margin-left:0pt; margin-right:0pt; } +div.td01{ margin-left:0pt; margin-right:5pt; } +div.td10{ margin-left:5pt; margin-right:0pt; } +div.td11{ margin-left:5pt; margin-right:5pt; } +table[rules] {border-left:solid black 0.4pt; border-right:solid black 0.4pt; } +td.td00{ padding-left:0pt; padding-right:0pt; } +td.td01{ padding-left:0pt; padding-right:5pt; } +td.td10{ padding-left:5pt; padding-right:0pt; } +td.td11{ padding-left:5pt; padding-right:5pt; } +table[rules] {border-left:solid black 0.4pt; border-right:solid black 0.4pt; } +.hline hr, .cline hr{ height : 1px; margin:0px; } +.tabbing-right {text-align:right;} +span.TEX {letter-spacing: -0.125em; } +span.TEX span.E{ position:relative;top:0.5ex;left:-0.0417em;} +a span.TEX span.E {text-decoration: none; } +span.LATEX span.A{ position:relative; top:-0.5ex; left:-0.4em; font-size:85%;} +span.LATEX span.TEX{ position:relative; left: -0.4em; } +div.float img, div.float .caption {text-align:center;} +div.figure img, div.figure .caption {text-align:center;} +.marginpar {width:20%; float:right; text-align:left; margin-left:auto; margin-top:0.5em; font-size:85%; text-decoration:underline;} +.marginpar p{margin-top:0.4em; margin-bottom:0.4em;} +table.equation {width:100%;} +.equation td{text-align:center; } +td.equation { margin-top:1em; margin-bottom:1em; } +td.equation-label { width:5%; text-align:center; } +td.eqnarray4 { width:5%; white-space: normal; } +td.eqnarray2 { width:5%; } +table.eqnarray-star, table.eqnarray {width:100%;} +div.eqnarray{text-align:center;} +div.array {text-align:center;} +div.pmatrix {text-align:center;} +table.pmatrix {width:100%;} +span.pmatrix img{vertical-align:middle;} +div.pmatrix {text-align:center;} +table.pmatrix {width:100%;} +img.cdots{vertical-align:middle;} +.partToc a, .partToc, .likepartToc a, .likepartToc {line-height: 200%; font-weight:bold; font-size:110%;} +.caption td.id{font-weight: bold; white-space: nowrap; } +table.caption {text-align:center;} +h1.partHead{text-align: center} +p.bibitem { text-indent: -2em; margin-left: 2em; margin-top:0.6em; margin-bottom:0.6em; } +p.bibitem-p { text-indent: 0em; margin-left: 2em; margin-top:0.6em; margin-bottom:0.6em; } +.paragraphHead, .likeparagraphHead { margin-top:2em; font-weight: bold;} +.subparagraphHead, .likesubparagraphHead { font-weight: bold;} +.quote {margin-bottom:0.25em; margin-top:0.25em; margin-left:1em; margin-right:1em; text-align:justify;} +.verse{white-space:nowrap; margin-left:2em} +div.maketitle {text-align:center;} +h2.titleHead{text-align:center;} +div.maketitle{ margin-bottom: 2em; } +div.author, div.date {text-align:center;} +div.thanks{text-align:left; margin-left:10%; font-size:85%; font-style:italic; } +div.author{white-space: nowrap;} +.quotation {margin-bottom:0.25em; margin-top:0.25em; margin-left:1em; } +.abstract p {margin-left:5%; margin-right:5%;} +table.abstract {width:100%;} +.frenchb-nbsp{font-size:75%;} +.frenchb-thinspace{font-size:75%;} +/* end css.sty */ + diff --git a/beta_accents/doc/READ_ME.dvi b/beta_accents/doc/READ_ME.dvi Binary files differnew file mode 100644 index 0000000..836714e --- /dev/null +++ b/beta_accents/doc/READ_ME.dvi diff --git a/beta_accents/doc/READ_ME.html b/beta_accents/doc/READ_ME.html new file mode 100644 index 0000000..fd0333a --- /dev/null +++ b/beta_accents/doc/READ_ME.html @@ -0,0 +1,469 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> +<html lang="fr" > +<head><title>AWOR - Fichier Lisez-moi de l’administrateur</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> +<meta name="originator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> +<!-- html --> +<meta name="src" content="READ_ME.tex"> +<meta name="date" content="2007-03-13 12:30:00"> +<link rel="stylesheet" type="text/css" href="READ_ME.css"> +</head><body +> + <div class="maketitle"> + + + +<h2 class="titleHead">AWOR - Fichier Lisez-moi de l’administrateur</h2> +<div class="author" ></div><br /> +<div class="date" ><span +class="cmr-12">13 mars 2007</span></div> + </div> + <h3 class="likesectionHead"><a + id="x1-1000"></a>Table des matières</h3> + <div class="tableofcontents"> + <span class="sectionToc">1 <a +href="#x1-20001" id="QQ2-1-2">Compatibilité</a></span> +<br /> <span class="sectionToc">2 <a +href="#x1-50002" id="QQ2-1-5">Sécurité</a></span> +<br /> <span class="sectionToc">3 <a +href="#x1-60003" id="QQ2-1-6">Installation</a></span> +<br />  <span class="subsectionToc">3.1 <a +href="#x1-70003.1" id="QQ2-1-7">Dépaquetage des pages PHP</a></span> +<br />  <span class="subsectionToc">3.2 <a +href="#x1-80003.2" id="QQ2-1-8">Paramètres de configuration</a></span> +<br />  <span class="subsectionToc">3.3 <a +href="#x1-90003.3" id="QQ2-1-9">Initialisation de la base</a></span> +<br />  <span class="subsectionToc">3.4 <a +href="#x1-100003.4" id="QQ2-1-10">Configuration par défaut des comptes</a></span> +<br /> <span class="sectionToc">4 <a +href="#x1-110004" id="QQ2-1-11">Maintenance</a></span> +<br />  <span class="subsectionToc">4.1 <a +href="#x1-120004.1" id="QQ2-1-12">Visualisation des objets et des fichiers</a></span> +<br />  <span class="subsectionToc">4.2 <a +href="#x1-130004.2" id="QQ2-1-13">Nettoyage de la base</a></span> +<br /> <span class="sectionToc">5 <a +href="#x1-140005" id="QQ2-1-14">Authentification dédiée - Personnalisation</a></span> + </div> +<!--l. 31--><p class="indent"> + + <h3 class="sectionHead"><span class="titlemark">1 </span> <a + id="x1-20001"></a>Compatibilité</h3> +<!--l. 36--><p class="noindent">Cette application peut-être utilisée sur un serveur fonctionnant avec Apache, +MySQL(<span +class="cmmi-10">></span>=4) et PHP (<span +class="cmmi-10">></span>=4). +<!--l. 40--><p class="noindent"><span class="paragraphHead"><a + id="x1-30001"></a><span +class="cmbx-10">PHP</span></span> + L’application ne nécessite pas de configuration de PHP particulière. Elle +fonctionne quelque soit la valeur du paramètre de configuration register_globals, +utilise les sessions via les fonctions introduites en PHP4. L’application fonctionne +quelque soit la verbosité des affichages d’erreur et de warning PHP, car nous avons +travaillé à éliminer tous les messages <span +class="lasy-10">﹤﹤</span> E_NOTICE <span +class="lasy-10">﹥﹥</span> PHP qui surviennent par +exemple lors d’une comparaison avec une variable non-initialisée. +<!--l. 50--><p class="indent"> Les scripts PHP n’accèdent pas en écriture au système de fichier, sauf pour +l’upload de fichiers. Le dossier <span +class="lasy-10">﹤﹤</span> fichiers <span +class="lasy-10">﹥﹥</span> doit être accessible en écriture +par les scripts PHP sans quoi la fonctionnalité d’échange de fichier serait +inutilisable. +<!--l. 56--><p class="noindent"><span class="paragraphHead"><a + id="x1-40001"></a><span +class="cmbx-10">MySQL</span></span> + Les scripts PHP ne modifient pas structurellement la base de donnée +MySQL, il suffit donc d’un compte permettant les instructions SELECT, +INSERT, UPDATE, DELETE sur les tables de l’application. Pour indiquer à +l’application quel compte MySQL utiliser, veuillez vous reporter à la section +<a +href="#x1-90003.3">3.3<!--tex4ht:ref: sub:Initialisation-de-la-bd --></a>. +<!--l. 65--><p class="noindent"> + <h3 class="sectionHead"><span class="titlemark">2 </span> <a + id="x1-50002"></a>Sécurité</h3> +<!--l. 67--><p class="noindent">Cette application a été développée en gardant toujours à l’esprit les problèmes de +sécurités. Nous ne pouvons évidemment pas la garantir failles ni bugs, mais nous +sommes fixé des règles de programmation pour éviter les failles les plus courantes. +Toutes les données issue de l’utilisateur lors des traitements des pages web sont +traitées pour éviter des problèmes d’insertion de code dans les requetes SQL. +L’authentification des utilisateurs est systématique, vérifiée à chaque page et repose +sur le système des sessions PHP. En revanche, il faut noter que le formulaire +d’authentification n’est pas protégé contre l’usurpation de mots de passe car les +contraintes données dans le cahier des charges ne le permettent pas, dû +moins, il n’est pas possible d’utiliser un cryptage efficace (assymétrique) +sans modifier le système d’authentification déléguée et sans utiliser une +configuration de serveur Web spécifique. Considérez, pour résoudre ce problème, +l’emploi sur serveur web sécurisé (HTTPS) et l’utilisation d’une liaison entre +le serveur web et le serveur d’authentification au travers d’un réseau de +confiance. + +<!--l. 86--><p class="noindent"> + <h3 class="sectionHead"><span class="titlemark">3 </span> <a + id="x1-60003"></a>Installation</h3> +<!--l. 89--><p class="noindent"> + <h4 class="subsectionHead"><span class="titlemark">3.1 </span> <a + id="x1-70003.1"></a>Dépaquetage des pages PHP</h4> +<!--l. 91--><p class="noindent">L’application est livrée dans une archive de type tarball compressée qui contient +toute l’arborescence et les fichiers PHP nécessaires. Il suffit de décompresser cette +archive en conservant l’arborescence dans un dossier publié par votre serveur Web. +Les fichiers de configurations sont présent et contiennent des valeurs d’exemple que +vous pourrez adapter à votre situation. +<!--l. 101--><p class="noindent"> + <h4 class="subsectionHead"><span class="titlemark">3.2 </span> <a + id="x1-80003.2"></a>Paramètres de configuration</h4> +<!--l. 103--><p class="noindent">Cette application comporte deux fichiers de configuration qui sont dans le dossier +<span +class="lasy-10">﹤﹤</span>include <span +class="lasy-10">﹥﹥</span>. Les fichiers existent dans la version distribuée et ont pour but de servir +de modèle. +<!--l. 107--><p class="indent"> + <dl class="description"><dt class="description"> +<span +class="cmbx-10">connect.inc.php</span><span class="frenchb-nbsp"> </span><span +class="cmbx-10">:</span> </dt><dd +class="description">ce fichier contient les coordonnées du serveur MySQL, de + l’utilisateur SQL et de la base que l’application utilisera. + </dd><dt class="description"> +<span +class="cmbx-10">config.inc.php</span><span class="frenchb-nbsp"> </span><span +class="cmbx-10">:</span> </dt><dd +class="description">ce fichier contient tout le reste de la configuration de + l’application. Le fichier est un script PHP qui initialise un tableau + multi-dimentionnel. Ce choix à été fait par commodité, et pour permette + de bien hiérarchiser les information, en revanche, la syntaxe est fourbe... + N’oubliez pas de virgule<span class="frenchb-thinspace"> </span>! Toutes les constantes sont décrites ci-dessous. + <!--l. 117--><p class="noindent"> + <dl class="description"><dt class="description"> + <span +class="cmbx-10">$adminMail</span><span class="frenchb-nbsp"> </span><span +class="cmbx-10">:</span> </dt><dd +class="description">adresse e-mail de l’administrateur. Affichée à l’utilisateur + lorsque qu’une erreur interne à l’application s’est produite. + </dd><dt class="description"> + <span +class="cmbx-10">$automatedMail</span><span class="frenchb-nbsp"> </span><span +class="cmbx-10">:</span> </dt><dd +class="description">adresse e-mail de réponse des courriels envoyés + automatiquement par l’application. + </dd><dt class="description"> + <span +class="cmbx-10">AUTH</span><span class="frenchb-nbsp"> </span><span +class="cmbx-10">:</span> </dt><dd +class="description">Paramètres d’authentification + <!--l. 125--><p class="noindent"> + <dl class="description"><dt class="description"> + <span +class="cmbx-10">POP</span><span class="frenchb-nbsp"> </span><span +class="cmbx-10">:</span> </dt><dd +class="description">Paramètres pour les serveurs mail POP + <!--l. 128--><p class="noindent"> + + <dl class="description"><dt class="description"> + <span +class="cmbx-10">SERVERS</span><span class="frenchb-nbsp"> </span><span +class="cmbx-10">:</span> </dt><dd +class="description">Chaque élément de ce tableau à pour clef le nom + de domaine du fournisseur de service de courriel ( partie + suivant le @ dans une adresse e-mail) à pour valeur un + tableau associatif de la forme suivante + <!--l. 134--><p class="noindent"> + <dl class="description"><dt class="description"> + <span +class="cmbx-10">subdomain</span><span class="frenchb-nbsp"> </span><span +class="cmbx-10">:</span> </dt><dd +class="description">adresse complete du serveur offrant le service + POP + </dd><dt class="description"> + <span +class="cmbx-10">port</span><span class="frenchb-nbsp"> </span><span +class="cmbx-10">:</span> </dt><dd +class="description">numéro de port TCP utilisé pour se connecter au + service POP + </dd><dt class="description"> + <span +class="cmbx-10">username</span><span +class="cmbx-10">_is</span><span +class="cmbx-10">_full</span><span +class="cmbx-10">_mail</span><span class="frenchb-nbsp"> </span><span +class="cmbx-10">:</span> </dt><dd +class="description">Booléen (true ou false) indicant + si le nom d’utilisateur à utiliser pour l’authentification + est l’adresse e-mail complète. C’est utile pour les serveurs + POP gérant des adresses email sur plusieurs domaines + (comme wanadoo / orange au moment où j’écris ce + document)</dd></dl> + </dd></dl> + </dd><dt class="description"> + <span +class="cmbx-10">bypass</span><span +class="cmbx-10">_if</span><span +class="cmbx-10">_local</span><span class="frenchb-nbsp"> </span><span +class="cmbx-10">:</span> </dt><dd +class="description">Booléen indiquant si l’authentification doit + être outrepassée si la connexion s’effectue depuis le serveur + lui-même.</dd></dl> + </dd><dt class="description"> + <span +class="cmbx-10">CSS</span><span class="frenchb-nbsp"> </span><span +class="cmbx-10">:</span> </dt><dd +class="description">Paramètres des styles de pages + <!--l. 151--><p class="noindent"> + <dl class="description"><dt class="description"> + <span +class="cmbx-10">CHOOSER</span><span +class="cmbx-10">_LIST</span><span class="frenchb-nbsp"> </span><span +class="cmbx-10">:</span> </dt><dd +class="description">Ce tableau associatif contient la liste des + styles CSS à utiliser. Les clefs sont les libellés des thèmes + à afficher et les valeurs sont les noms des fichiers CSS + correspondants, sans chemin, ni extension.</dd></dl> + </dd><dt class="description"> + <span +class="cmbx-10">MAIL</span><span class="frenchb-nbsp"> </span><span +class="cmbx-10">:</span> </dt><dd +class="description">  + <!--l. 159--><p class="noindent"> + <dl class="description"><dt class="description"> + <span +class="cmbx-10">TEMPLATES</span><span class="frenchb-nbsp"> </span><span +class="cmbx-10">:</span> </dt><dd +class="description">Ce tableau contient des tableaux associatifs dont + les clefs seront utilisées dans les passages de paramètres HTML, + et contiennent des sous-tableaux de la forme suivante<span class="frenchb-nbsp"> </span>: + <!--l. 164--><p class="noindent"> + <dl class="description"><dt class="description"> + <span +class="cmbx-10">caption</span><span class="frenchb-nbsp"> </span><span +class="cmbx-10">:</span> </dt><dd +class="description">Intitulé qui sera affiché à l’utilisateur + + </dd><dt class="description"> + <span +class="cmbx-10">tpl</span><span +class="cmbx-10">_file</span><span class="frenchb-nbsp"> </span><span +class="cmbx-10">:</span> </dt><dd +class="description">Nom du fichier (avec l’extension PHP) contenant le + modèle.</dd></dl> + </dd></dl> + </dd><dt class="description"> + <span +class="cmbx-10">SUPERUSERS</span><span class="frenchb-nbsp"> </span><span +class="cmbx-10">:</span> </dt><dd +class="description">Ce tableau contient la liste des login des super-utilisateurs + (ceux qui ont le droit de supprimer des réunions) + </dd><dt class="description"> + <span +class="cmbx-10">UPLOAD</span><span class="frenchb-nbsp"> </span><span +class="cmbx-10">:</span> </dt><dd +class="description">Paramètres concernant l’attachement de fichiers aux + réunions + <!--l. 175--><p class="noindent"> + <dl class="description"><dt class="description"> + <span +class="cmbx-10">accepted</span><span +class="cmbx-10">_files</span><span class="frenchb-nbsp"> </span><span +class="cmbx-10">:</span> </dt><dd +class="description">Tableau des extensions qui sont autorisées.</dd></dl> + </dd></dl> + </dd></dl> +<!--l. 181--><p class="noindent"> + <h4 class="subsectionHead"><span class="titlemark">3.3 </span> <a + id="x1-90003.3"></a>Initialisation de la base</h4> +<!--l. 183--><p class="noindent">Tout les fichiers nécessaires sont rangés dans le dossier <span +class="lasy-10">﹤﹤</span> install <span +class="lasy-10">﹥﹥</span>. Vous utiliserez +principalement le fichier <span +class="lasy-10">﹤﹤</span> RAZBase.php <span +class="lasy-10">﹥﹥</span>. Appelé au travers du serveur web, il vous +permettra automatiquement de mettre en place la structure de la base de données, et +optionnellement, d’insérer un jeu d’essai pour tester l’application sur votre serveur. Si +vous ne souhaitez pas utiliser de compte SQL ayant le droit d’altérer la structure +des tables de votre base avec ce script php, vous pouvez exécuter le script +<span +class="lasy-10">﹤﹤</span> base.sql <span +class="lasy-10">﹥﹥</span> avec votre client SQL favori. Le jeu d’essai se trouve dans le fichier +<span +class="lasy-10">﹤﹤</span> jeu_essai.sql <span +class="lasy-10">﹥﹥</span>. +<!--l. 194--><p class="noindent"> + <h4 class="subsectionHead"><span class="titlemark">3.4 </span> <a + id="x1-100003.4"></a>Configuration par défaut des comptes</h4> +<!--l. 196--><p class="noindent">Dans le fichier de configuration modèle, un super-utilisateur est configuré<span class="frenchb-nbsp"> </span>: +inglebert@iut-blagnac.fr et le jeu d’essai proposé au paragraphe précédent permet de +créer des utilisateurs, et en particulier inglebert@iut-blagnac.fr. +<!--l. 201--><p class="indent"> Par défaut, vous pourrez donc vous connecter en tant qu’administrateur avec ce +compte. Le jeu d’essai met ce compte avec comme mode d’authentification <span +class="lasy-10">﹤﹤</span> bypass <span +class="lasy-10">﹥﹥</span>, +ce qui signifie qu’aucun mot de passe est nécessaire. Pour utiliser un vrai système +d’authentification, connectez-vous avec ce compte et allez dans la page <span +class="lasy-10">﹤﹤</span> Mon Profil <span +class="lasy-10">﹥﹥</span> +pour choisir une autre mode d’authentification. +<!--l. 209--><p class="noindent"> + <h3 class="sectionHead"><span class="titlemark">4 </span> <a + id="x1-110004"></a>Maintenance</h3> + +<!--l. 212--><p class="noindent"> + <h4 class="subsectionHead"><span class="titlemark">4.1 </span> <a + id="x1-120004.1"></a>Visualisation des objets et des fichiers</h4> +<!--l. 214--><p class="noindent">Une page d’administration est prévue à cet effet, et elle n’est accessible que par un +<span +class="lasy-10">﹤﹤</span> super-utilisateur <span +class="lasy-10">﹥﹥</span>, c’est à dire un utilisateur consigné dans le fichier de +configuration principal en tant que tel, confère <a +href="#x1-80003.2">3.2<!--tex4ht:ref: sub:Configuration --></a>. +<!--l. 220--><p class="noindent"> + <h4 class="subsectionHead"><span class="titlemark">4.2 </span> <a + id="x1-130004.2"></a>Nettoyage de la base</h4> +<!--l. 222--><p class="noindent">À partir de la page d’administration décrite dans le paragraphe précédent, vous +pouvez aussi purger les fichiers attachés et les objets de la base de données devenus +obsolètes. L’aide contextuelle de cette page vous expliquera comment faire. Il est +vivement conseillé de faire une sauvegarde de la base de données et des fichiers joints +aux réunions avant d’utiliser cet outil car l’erreur de manipulation ou de +programmation est toujours possible... +<!--l. 231--><p class="noindent"> + <h3 class="sectionHead"><span class="titlemark">5 </span> <a + id="x1-140005"></a>Authentification dédiée - Personnalisation</h3> +<!--l. 233--><p class="noindent">AWOR utilise un système d’authentification dédiée de sorte qu’aucun mot de passe +ne soit stocké, et que l’utilisateur n’ait pas besoin d’en retenir un nouveau. +Le code d’authentification à été écrit de manière à être maléable et est +extensible. Le coeur du système d’authentification se trouve dans le fichier +<span +class="lasy-10">﹤﹤</span>auth_dialog.php <span +class="lasy-10">﹥﹥</span>. Vous y trouverez une section commençant par le commentaire +ci-dessous. +<!--l. 241--><p class="noindent"> + <dl class="list1"><dt class="list"> + </dt><dd +class="list"> + <span +class="cmtt-10">/***************************************************</span> + <!--l. 244--><p class="noindent"><span +class="cmtt-10">**</span><span +class="cmtt-10"> </span><span +class="cmtt-10">Ajouter</span><span +class="cmtt-10"> </span><span +class="cmtt-10">d’autres</span><span +class="cmtt-10"> </span><span +class="cmtt-10">mode</span><span +class="cmtt-10"> </span><span +class="cmtt-10">d’authentification</span><span +class="cmtt-10"> </span><span +class="cmtt-10">ici</span><span +class="cmtt-10"> </span><span +class="cmtt-10">!</span><span +class="cmtt-10"> </span><span +class="cmtt-10">**</span> + <!--l. 246--><p class="noindent"><span +class="cmtt-10">***************************************************/</span></dd></dl> +<!--l. 249--><p class="noindent">Comme l’indique ce commentaire, vous pourrez ajouter à cet endroit une portion +de code pour utiliser un autre service d’authentification. La syntaxe est la +suivante<span class="frenchb-nbsp"> </span>: +<!--l. 253--><p class="noindent"> + <dl class="list1"><dt class="list"> + </dt><dd +class="list"> + <span +class="cmtt-10">case</span><span +class="cmtt-10"> </span><span +class="cmtt-10">’<nom</span><span +class="cmtt-10">_auth>’</span><span class="frenchb-nbsp"> </span><span +class="cmtt-10">:</span> + <!--l. 256--><p class="noindent"><span +class="cmtt-10">/*</span><span +class="cmtt-10"> </span><span +class="cmtt-10">Eventuellement</span><span +class="cmtt-10"> </span><span +class="cmtt-10">du</span><span +class="cmtt-10"> </span><span +class="cmtt-10">code</span><span +class="cmtt-10"> </span><span +class="cmtt-10">pr</span><span +class="cmtt-10">él</span><span +class="cmtt-10">éminaire</span><span +class="cmtt-10"> </span><span +class="cmtt-10">*/</span> + <!--l. 259--><p class="noindent"><span +class="cmtt-10">$auth</span><span +class="cmtt-10">_is</span><span +class="cmtt-10">_ok=<fonction</span><span +class="cmtt-10">_ou</span><span +class="cmtt-10">_variable</span><span +class="cmtt-10">_authentification>;</span> + <!--l. 261--><p class="noindent"><span +class="cmtt-10">if</span><span +class="cmtt-10"> </span><span +class="cmtt-10">(</span><span +class="cmtt-10"> </span><span +class="cmtt-10">!</span><span +class="cmtt-10"> </span><span +class="cmtt-10">$auth</span><span +class="cmtt-10">_is</span><span +class="cmtt-10">_ok</span><span +class="cmtt-10"> </span><span +class="cmtt-10">)</span> + + <!--l. 263--><p class="noindent"><span +class="cmsy-10">{</span><span +class="cmtt-10"> </span><span +class="cmtt-10">//</span><span +class="cmtt-10"> </span><span +class="cmtt-10">On</span><span +class="cmtt-10"> </span><span +class="cmtt-10">ex</span><span +class="cmtt-10">écute</span><span +class="cmtt-10"> </span><span +class="cmtt-10">la</span><span +class="cmtt-10"> </span><span +class="cmtt-10">ligne</span><span +class="cmtt-10"> </span><span +class="cmtt-10">ci-dessous</span><span +class="cmtt-10"> </span><span +class="cmtt-10">que</span><span +class="cmtt-10"> </span><span +class="cmtt-10">si</span><span +class="cmtt-10"> </span><span +class="cmtt-10">l’authentificaiton</span><span +class="cmtt-10"> </span><span +class="cmtt-10">à</span><span +class="cmtt-10"> </span><span +class="cmtt-10">échou</span><span +class="cmtt-10">ée</span> + <!--l. 265--><p class="noindent"><span +class="cmtt-10">$errmsg=<fonction</span><span +class="cmtt-10">_ou</span><span +class="cmtt-10">_chaine</span><span +class="cmtt-10">_explicant</span><span +class="cmtt-10">_l</span><span +class="cmtt-10">_erreur</span><span +class="cmtt-10">_d</span><span +class="cmtt-10">_authentification>;</span> + <!--l. 267--><p class="noindent"><span +class="cmsy-10">}</span> + <!--l. 269--><p class="noindent"><span +class="cmtt-10">break;</span></dd></dl> +<!--l. 271--><p class="noindent">Il vous suffit de remplacer les éléments entre chevrons dans le code ci-dessus et de le +coller dans <span +class="lasy-10">﹤﹤</span>auth_dialog.inc.php<span +class="lasy-10">﹥﹥</span> pour pouvoir utiliser un nouveau mode +d’authentification. Reste à donner à l’utilisateur la capacité de l’utiliser. Vous +devrez encore, d’une part, ajouter dans la base de données le <span +class="cmmi-10"><</span>nom_auth<span +class="cmmi-10">> </span>à +l’énumération du champ <span +class="lasy-10">﹤﹤</span>methodeAuth<span +class="lasy-10">﹥﹥</span> de la table <span +class="lasy-10">﹤﹤</span>Personne<span +class="lasy-10">﹥﹥</span>, et d’autre part +proposer à l’utilisateur d’utiliser ce mode d’authentification en modifiant la page +<span +class="lasy-10">﹤﹤</span>profil.php<span +class="lasy-10">﹥﹥</span>. + +</body></html> + + + diff --git a/beta_accents/doc/READ_ME.lyx b/beta_accents/doc/READ_ME.lyx new file mode 100644 index 0000000..9c5e090 --- /dev/null +++ b/beta_accents/doc/READ_ME.lyx @@ -0,0 +1,582 @@ +#LyX 1.4.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 245 +\begin_document +\begin_header +\textclass article +\language french +\inputencoding auto +\fontscheme default +\graphics default +\paperfontsize default +\spacing single +\papersize default +\use_geometry false +\use_amsmath 1 +\cite_engine basic +\use_bibtopic false +\paperorientation portrait +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation indent +\defskip medskip +\quotes_language french +\papercolumns 1 +\papersides 1 +\paperpagestyle default +\tracking_changes false +\output_changes false +\end_header + +\begin_body + +\begin_layout Title +AWOR - Fichier Lisez-moi de l'administrateur +\end_layout + +\begin_layout Standard +\begin_inset LatexCommand \tableofcontents{} + +\end_inset + + +\end_layout + +\begin_layout Standard + +\newpage + +\end_layout + +\begin_layout Section +Compatibilité +\end_layout + +\begin_layout Standard +Cette application peut-être utilisée sur un serveur fonctionnant avec Apache, + MySQL(>=4) et PHP (>=4). + +\end_layout + +\begin_layout Paragraph +PHP +\end_layout + +\begin_layout Standard +L'application ne nécessite pas de configuration de PHP particulière. + Elle fonctionne quelque soit la valeur du paramètre de configuration register_g +lobals, utilise les sessions via les fonctions introduites en PHP4. + L'application fonctionne quelque soit la verbosité des affichages d'erreur + et de warning PHP, car nous avons travaillé à éliminer tous les messages + +\begin_inset Quotes fld +\end_inset + +E_NOTICE +\begin_inset Quotes frd +\end_inset + + PHP qui surviennent par exemple lors d'une comparaison avec une variable + non-initialisée. +\end_layout + +\begin_layout Standard +Les scripts PHP n'accèdent pas en écriture au système de fichier, sauf pour + l'upload de fichiers. + Le dossier +\begin_inset Quotes fld +\end_inset + +fichiers +\begin_inset Quotes frd +\end_inset + + doit être accessible en écriture par les scripts PHP sans quoi la fonctionnalit +é d'échange de fichier serait inutilisable. +\end_layout + +\begin_layout Paragraph +MySQL +\end_layout + +\begin_layout Standard +Les scripts PHP ne modifient pas structurellement la base de donnée MySQL, + il suffit donc d'un compte permettant les instructions SELECT, INSERT, + UPDATE, DELETE sur les tables de l'application. + Pour indiquer à l'application quel compte MySQL utiliser, veuillez vous + reporter à la section +\begin_inset LatexCommand \ref{sub:Initialisation-de-la-bd} + +\end_inset + +. +\end_layout + +\begin_layout Section +Sécurité +\end_layout + +\begin_layout Standard +Cette application a été développée en gardant toujours à l'esprit les problèmes + de sécurités. + Nous ne pouvons évidemment pas la garantir failles ni bugs, mais nous sommes + fixé des règles de programmation pour éviter les failles les plus courantes. + Toutes les données issue de l'utilisateur lors des traitements des pages + web sont traitées pour éviter des problèmes d'insertion de code dans les + requetes SQL. + L'authentification des utilisateurs est systématique, vérifiée à chaque + page et repose sur le système des sessions PHP. + En revanche, il faut noter que le formulaire d'authentification n'est pas + protégé contre l'usurpation de mots de passe car les contraintes données + dans le cahier des charges ne le permettent pas, dû moins, il n'est pas + possible d'utiliser un cryptage efficace (assymétrique) sans modifier le + système d'authentification déléguée et sans utiliser une configuration + de serveur Web spécifique. + Considérez, pour résoudre ce problème, l'emploi sur serveur web sécurisé + (HTTPS) et l'utilisation d'une liaison entre le serveur web et le serveur + d'authentification au travers d'un réseau de confiance. +\end_layout + +\begin_layout Section +Installation +\end_layout + +\begin_layout Subsection +Dépaquetage des pages PHP +\end_layout + +\begin_layout Standard +L'application est livrée dans une archive de type tarball compressée qui + contient toute l'arborescence et les fichiers PHP nécessaires. + Il suffit de décompresser cette archive en conservant l'arborescence dans + un dossier publié par votre serveur Web. + Les fichiers de configurations sont présent et contiennent des valeurs + d'exemple que vous pourrez adapter à votre situation. +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Subsection +\begin_inset LatexCommand \label{sub:Configuration} + +\end_inset + +Paramètres de configuration +\end_layout + +\begin_layout Standard +Cette application comporte deux fichiers de configuration qui sont dans + le dossier +\begin_inset Quotes fld +\end_inset + +include +\begin_inset Quotes frd +\end_inset + +. + Les fichiers existent dans la version distribuée et ont pour but de servir + de modèle. +\end_layout + +\begin_layout Description +connect.inc.php\InsetSpace ~ +: ce fichier contient les coordonnées du serveur MySQL, de + l'utilisateur SQL et de la base que l'application utilisera. +\end_layout + +\begin_layout Description +config.inc.php\InsetSpace ~ +: ce fichier contient tout le reste de la configuration de l'applica +tion. + Le fichier est un script PHP qui initialise un tableau multi-dimentionnel. + Ce choix à été fait par commodité, et pour permette de bien hiérarchiser + les information, en revanche, la syntaxe est fourbe\SpecialChar \ldots{} + N'oubliez pas de virgule + ! Toutes les constantes sont décrites ci-dessous. +\end_layout + +\begin_deeper +\begin_layout Description +$adminMail\InsetSpace ~ +: adresse e-mail de l'administrateur. + Affichée à l'utilisateur lorsque qu'une erreur interne à l'application + s'est produite. +\end_layout + +\begin_layout Description +$automatedMail\InsetSpace ~ +: adresse e-mail de réponse des courriels envoyés automatiquement + par l'application. +\end_layout + +\begin_layout Description +AUTH\InsetSpace ~ +: Paramètres d'authentification +\end_layout + +\begin_deeper +\begin_layout Description +POP\InsetSpace ~ +: Paramètres pour les serveurs mail POP +\end_layout + +\begin_deeper +\begin_layout Description +SERVERS\InsetSpace ~ +: Chaque élément de ce tableau à pour clef le nom de domaine du fournisse +ur de service de courriel ( partie suivant le @ dans une adresse e-mail) + à pour valeur un tableau associatif de la forme suivante +\end_layout + +\begin_deeper +\begin_layout Description +subdomain\InsetSpace ~ +: adresse complete du serveur offrant le service POP +\end_layout + +\begin_layout Description +port\InsetSpace ~ +: numéro de port TCP utilisé pour se connecter au service POP +\end_layout + +\begin_layout Description +username_is_full_mail\InsetSpace ~ +: Booléen (true ou false) indicant si le nom d'utilisateur + à utiliser pour l'authentification est l'adresse e-mail complète. + C'est utile pour les serveurs POP gérant des adresses email sur plusieurs + domaines (comme wanadoo / orange au moment où j'écris ce document) +\end_layout + +\end_deeper +\end_deeper +\begin_layout Description +bypass_if_local\InsetSpace ~ +: Booléen indiquant si l'authentification doit être outrepassée + si la connexion s'effectue depuis le serveur lui-même. +\end_layout + +\end_deeper +\begin_layout Description +CSS\InsetSpace ~ +: Paramètres des styles de pages +\end_layout + +\begin_deeper +\begin_layout Description +CHOOSER_LIST\InsetSpace ~ +: Ce tableau associatif contient la liste des styles CSS à utiliser. + Les clefs sont les libellés des thèmes à afficher et les valeurs sont les + noms des fichiers CSS correspondants, sans chemin, ni extension. +\end_layout + +\end_deeper +\begin_layout Description +MAIL\InsetSpace ~ +: +\end_layout + +\begin_deeper +\begin_layout Description +TEMPLATES\InsetSpace ~ +: Ce tableau contient des tableaux associatifs dont les clefs seront + utilisées dans les passages de paramètres HTML, et contiennent des sous-tableau +x de la forme suivante : +\end_layout + +\begin_deeper +\begin_layout Description +caption\InsetSpace ~ +: Intitulé qui sera affiché à l'utilisateur +\end_layout + +\begin_layout Description +tpl_file\InsetSpace ~ +: Nom du fichier (avec l'extension PHP) contenant le modèle. +\end_layout + +\end_deeper +\end_deeper +\begin_layout Description +SUPERUSERS\InsetSpace ~ +: Ce tableau contient la liste des login des super-utilisateurs + (ceux qui ont le droit de supprimer des réunions) +\end_layout + +\begin_layout Description +UPLOAD\InsetSpace ~ +: Paramètres concernant l'attachement de fichiers aux réunions +\end_layout + +\begin_deeper +\begin_layout Description +accepted_files\InsetSpace ~ +: Tableau des extensions qui sont autorisées. +\end_layout + +\end_deeper +\end_deeper +\begin_layout Subsection +\begin_inset LatexCommand \label{sub:Initialisation-de-la-bd} + +\end_inset + +Initialisation de la base +\end_layout + +\begin_layout Standard +Tout les fichiers nécessaires sont rangés dans le dossier +\begin_inset Quotes fld +\end_inset + +install +\begin_inset Quotes frd +\end_inset + +. + Vous utiliserez principalement le fichier +\begin_inset Quotes fld +\end_inset + +RAZBase.php +\begin_inset Quotes frd +\end_inset + +. + Appelé au travers du serveur web, il vous permettra automatiquement de + mettre en place la structure de la base de données, et optionnellement, + d'insérer un jeu d'essai pour tester l'application sur votre serveur. + Si vous ne souhaitez pas utiliser de compte SQL ayant le droit d'altérer + la structure des tables de votre base avec ce script php, vous pouvez exécuter + le script +\begin_inset Quotes fld +\end_inset + +base.sql +\begin_inset Quotes frd +\end_inset + + avec votre client SQL favori. + Le jeu d'essai se trouve dans le fichier +\begin_inset Quotes fld +\end_inset + +jeu_essai.sql +\begin_inset Quotes frd +\end_inset + +. +\end_layout + +\begin_layout Subsection +Configuration par défaut des comptes +\end_layout + +\begin_layout Standard +Dans le fichier de configuration modèle, un super-utilisateur est configuré + : inglebert@iut-blagnac.fr et le jeu d'essai proposé au paragraphe précédent + permet de créer des utilisateurs, et en particulier inglebert@iut-blagnac.fr. +\end_layout + +\begin_layout Standard +Par défaut, vous pourrez donc vous connecter en tant qu'administrateur avec + ce compte. + Le jeu d'essai met ce compte avec comme mode d'authentification +\begin_inset Quotes fld +\end_inset + +bypass +\begin_inset Quotes frd +\end_inset + +, ce qui signifie qu'aucun mot de passe est nécessaire. + Pour utiliser un vrai système d'authentification, connectez-vous avec ce + compte et allez dans la page +\begin_inset Quotes fld +\end_inset + +Mon Profil +\begin_inset Quotes frd +\end_inset + + pour choisir une autre mode d'authentification. +\end_layout + +\begin_layout Section +Maintenance +\end_layout + +\begin_layout Subsection +Visualisation des objets et des fichiers +\end_layout + +\begin_layout Standard +Une page d'administration est prévue à cet effet, et elle n'est accessible + que par un +\begin_inset Quotes fld +\end_inset + +super-utilisateur +\begin_inset Quotes frd +\end_inset + +, c'est à dire un utilisateur consigné dans le fichier de configuration + principal en tant que tel, confère +\begin_inset LatexCommand \ref{sub:Configuration} + +\end_inset + +. +\end_layout + +\begin_layout Subsection +Nettoyage de la base +\end_layout + +\begin_layout Standard +À partir de la page d'administration décrite dans le paragraphe précédent, + vous pouvez aussi purger les fichiers attachés et les objets de la base + de données devenus obsolètes. + L'aide contextuelle de cette page vous expliquera comment faire. + Il est vivement conseillé de faire une sauvegarde de la base de données + et des fichiers joints aux réunions avant d'utiliser cet outil car l'erreur + de manipulation ou de programmation est toujours possible\SpecialChar \ldots{} + +\end_layout + +\begin_layout Section +Authentification dédiée - Personnalisation +\end_layout + +\begin_layout Standard +AWOR utilise un système d'authentification dédiée de sorte qu'aucun mot + de passe ne soit stocké, et que l'utilisateur n'ait pas besoin d'en retenir + un nouveau. + Le code d'authentification à été écrit de manière à être maléable et est + extensible. + Le coeur du système d'authentification se trouve dans le fichier +\begin_inset Quotes fld +\end_inset + +auth_dialog.php +\begin_inset Quotes frd +\end_inset + +. + Vous y trouverez une section commençant par le commentaire ci-dessous. +\end_layout + +\begin_layout LyX-Code + +\lang english +/*************************************************** +\end_layout + +\begin_layout LyX-Code + +\lang english +** Ajouter d'autres mode d'authentification ici ! ** +\end_layout + +\begin_layout LyX-Code + +\lang english +***************************************************/ +\end_layout + +\begin_layout Standard +Comme l'indique ce commentaire, vous pourrez ajouter à cet endroit une portion + de code pour utiliser un autre service d'authentification. + La syntaxe est la suivante : +\end_layout + +\begin_layout LyX-Code +case '<nom_auth>': +\end_layout + +\begin_layout LyX-Code +/* Eventuellement du code préléminaire */ +\end_layout + +\begin_layout LyX-Code + +\lang english +$auth_is_ok=<fonction_ou_variable_authentification>; +\end_layout + +\begin_layout LyX-Code + +\lang english +if ( ! $auth_is_ok ) +\end_layout + +\begin_layout LyX-Code + +\lang english +{ // On exécute la ligne ci-dessous que si l'authentificaiton à échouée +\end_layout + +\begin_layout LyX-Code + +\lang english +$errmsg=<fonction_ou_chaine_explicant_l_erreur_d_authentification>; +\end_layout + +\begin_layout LyX-Code + +\lang english +} +\end_layout + +\begin_layout LyX-Code + +\lang english +break; +\end_layout + +\begin_layout Standard + +\lang english +Il vous suffit de remplacer les éléments entre chevrons dans le code ci-dessus + et de le coller dans +\begin_inset Quotes fld +\end_inset + +auth_dialog.inc.php +\begin_inset Quotes frd +\end_inset + + pour pouvoir utiliser un nouveau mode d'authentification. + Reste à donner à l'utilisateur la capacité de l'utiliser. + Vous devrez encore, d'une part, ajouter dans la base de données le <nom_auth> + à l'énumération du champ +\begin_inset Quotes fld +\end_inset + +methodeAuth +\begin_inset Quotes frd +\end_inset + + de la table +\begin_inset Quotes fld +\end_inset + +Personne +\begin_inset Quotes frd +\end_inset + +, et d'autre part proposer à l'utilisateur d'utiliser ce mode d'authentification + en modifiant la page +\begin_inset Quotes fld +\end_inset + +profil.php +\begin_inset Quotes frd +\end_inset + +. +\end_layout + +\end_body +\end_document diff --git a/beta_accents/doc/READ_ME.lyx~ b/beta_accents/doc/READ_ME.lyx~ new file mode 100644 index 0000000..af8e3a7 --- /dev/null +++ b/beta_accents/doc/READ_ME.lyx~ @@ -0,0 +1,582 @@ +#LyX 1.4.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 245 +\begin_document +\begin_header +\textclass article +\language french +\inputencoding auto +\fontscheme default +\graphics default +\paperfontsize default +\spacing single +\papersize default +\use_geometry false +\use_amsmath 1 +\cite_engine basic +\use_bibtopic false +\paperorientation portrait +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation indent +\defskip medskip +\quotes_language french +\papercolumns 1 +\papersides 1 +\paperpagestyle default +\tracking_changes false +\output_changes false +\end_header + +\begin_body + +\begin_layout Title +AWOR - Fichier Lisez-moi de l'administrateur +\end_layout + +\begin_layout Standard +\begin_inset LatexCommand \tableofcontents{} + +\end_inset + + +\end_layout + +\begin_layout Standard + +\newpage + +\end_layout + +\begin_layout Section +Compatibilité +\end_layout + +\begin_layout Standard +Cette application peut-être utilisée sur un serveur fonctionnant avec Apache, + MySQL(>=4) et PHP (>=4). + +\end_layout + +\begin_layout Paragraph +PHP +\end_layout + +\begin_layout Standard +L'application ne nécessite pas de configuration de PHP particulière. + Elle fonctionne quelque soit la valeur du paramètre de configuration register_g +lobals, utilise les sessions via les fonctions introduites en PHP4. + L'application fonctionne quelque soit la verbosité des affichages d'erreur + et de warning PHP, car nous avons travaillé à éliminer tous les messages + +\begin_inset Quotes fld +\end_inset + +E_NOTICE +\begin_inset Quotes frd +\end_inset + + PHP qui surviennent par exemple lors d'une comparaison avec une variable + non-initialisée. +\end_layout + +\begin_layout Standard +Les scripts PHP n'accèdent pas en écriture au système de fichier, sauf pour + l'upload de fichiers. + Le dossier +\begin_inset Quotes fld +\end_inset + +fichiers +\begin_inset Quotes frd +\end_inset + + doit être accessible en écriture par les scripts PHP sans quoi la fonctionnalit +é d'échange de fichier serait inutilisable. +\end_layout + +\begin_layout Paragraph +MySQL +\end_layout + +\begin_layout Standard +Les scripts PHP ne modifient pas structurellement la base de donnée MySQL, + il suffit donc d'un compte permettant les instructions SELECT, INSERT, + UPDATE, DELETE sur les tables de l'application. + Pour indiquer à l'application quel compte MySQL utiliser, veuillez vous + reporter à la section +\begin_inset LatexCommand \ref{sub:Initialisation-de-la-bd} + +\end_inset + +. +\end_layout + +\begin_layout Section +Sécurité +\end_layout + +\begin_layout Standard +Cette application a été développée en gardant toujours à l'esprit les problèmes + de sécurités. + Nous ne pouvons évidemment pas la garantir failles ni bugs, mais nous sommes + fixé des règles de programmation pour éviter les failles les plus courantes. + Toutes les données issue de l'utilisateur lors des traitements des pages + web sont traitées pour éviter des problèmes d'insertion de code dans les + requetes SQL. + L'authentification des utilisateurs est systématique, vérifiée à chaque + page et repose sur le système des sessions PHP. + En revanche, il faut noter que le formulaire d'authentification n'est pas + protégé contre l'usurpation de mots de passe car les contraintes données + dans le cahier des charges ne le permettent pas, dû moins, il n'est pas + possible d'utiliser un cryptage efficace (assymétrique) sans modifier le + système d'authentification déléguée et sans utiliser une configuration + de serveur Web spécifique. + Considérez, pour résoudre ce problème, l'emploi sur serveur web sécurisé + (HTTPS) et l'utilisation d'une liaison entre le serveur web et le serveur + d'authentification au travers d'un réseau de confiance. +\end_layout + +\begin_layout Section +Installation +\end_layout + +\begin_layout Subsection +Dépaquetage des pages PHP +\end_layout + +\begin_layout Standard +L'application est livrée dans une archive de type tarball compressée qui + contient toute l'arborescence et les fichiers PHP nécessaires. + Il suffit de décompresser cette archive en conservant l'arborescence dans + un dossier publié par votre serveur Web. + Les fichiers de configurations sont présent et contiennent des valeurs + d'exemple que vous pourrez adapter à votre situation. +\end_layout + +\begin_layout Standard + +\end_layout + +\begin_layout Subsection +\begin_inset LatexCommand \label{sub:Configuration} + +\end_inset + +Paramètres de configuration +\end_layout + +\begin_layout Standard +Cette application comporte deux fichiers de configuration qui sont dans + le dossier +\begin_inset Quotes fld +\end_inset + +include +\begin_inset Quotes frd +\end_inset + +. + Les fichiers existent dans la version distribuée et ont pour but de servir + de modèle. +\end_layout + +\begin_layout Description +connect.inc.php\InsetSpace ~ +: ce fichier contient les coordonnées du serveur MySQL, de + l'utilisateur SQL et de la base que l'application utilisera. +\end_layout + +\begin_layout Description +config.inc.php\InsetSpace ~ +: ce fichier contient tout le reste de la configuration de l'applica +tion. + Le fichier est un script PHP qui initialise un tableau multi-dimentionnel. + Ce choix à été fait par commodité, et pour permette de bien hiérarchiser + les information, en revanche, la syntaxe est fourbe\SpecialChar \ldots{} + N'oubliez pas de virgule + ! Toutes les constantes sont décrites ci-dessous. +\end_layout + +\begin_deeper +\begin_layout Description +$adminMail\InsetSpace ~ +: adresse e-mail de l'administrateur. + Affichée à l'utilisateur lorsque qu'une erreur interne à l'application + s'est produite. +\end_layout + +\begin_layout Description +$automatedMail\InsetSpace ~ +: adresse e-mail de réponse des courriels envoyés automatiquement + par l'application. +\end_layout + +\begin_layout Description +AUTH\InsetSpace ~ +: Paramètres d'authentification +\end_layout + +\begin_deeper +\begin_layout Description +POP\InsetSpace ~ +: Paramètres pour les serveurs mail POP +\end_layout + +\begin_deeper +\begin_layout Description +SERVERS\InsetSpace ~ +: Chaque élément de ce tableau à pour clef le nom de domaine du fournisse +ur de service de courriel ( partie suivant le @ dans une adresse e-mail) + à pour valeur un tableau associatif de la forme suivante +\end_layout + +\begin_deeper +\begin_layout Description +subdomain\InsetSpace ~ +: adresse complete du serveur offrant le service POP +\end_layout + +\begin_layout Description +port\InsetSpace ~ +: numéro de port TCP utilisé pour se connecter au service POP +\end_layout + +\begin_layout Description +username_is_full_mail\InsetSpace ~ +: Booléen (true ou false) indicant si le nom d'utilisateur + à utiliser pour l'authentification est l'adresse e-mail complète. + C'est utile pour les serveurs POP gérant des adresses email sur plusieurs + domaines (comme wanadoo / orange au moment où j'écris ce document) +\end_layout + +\end_deeper +\end_deeper +\begin_layout Description +bypass_if_local\InsetSpace ~ +: Booléen indiquant si l'authentification doit être outrepassée + si la connexion s'effectue depuis le serveur lui-même. +\end_layout + +\end_deeper +\begin_layout Description +CSS\InsetSpace ~ +: Paramètres des styles de pages +\end_layout + +\begin_deeper +\begin_layout Description +CHOOSER_LIST\InsetSpace ~ +: Ce tableau associatif contient la liste des styles CSS à utiliser. + Les clefs sont les libellés des thèmes à afficher et les valeurs sont les + noms des fichiers CSS correspondants, sans chemin, ni extension. +\end_layout + +\end_deeper +\begin_layout Description +MAIL\InsetSpace ~ +: +\end_layout + +\begin_deeper +\begin_layout Description +TEMPLATES\InsetSpace ~ +: Ce tableau contient des tableaux associatifs dont les clefs seront + utilisées dans les passages de paramètres HTML, et contiennent des sous-tableau +x de la forme suivante : +\end_layout + +\begin_deeper +\begin_layout Description +caption\InsetSpace ~ +: Intitulé qui sera affiché à l'utilisateur +\end_layout + +\begin_layout Description +tpl_file\InsetSpace ~ +: Nom du fichier (avec l'extension PHP) contenant le modèle. +\end_layout + +\end_deeper +\end_deeper +\begin_layout Description +SUPERUSERS\InsetSpace ~ +: Ce tableau contient la liste des login des super-utilisateurs + (ceux qui ont le droit de supprimer des réunions) +\end_layout + +\begin_layout Description +UPLOAD\InsetSpace ~ +: Paramètres concernant l'attachement de fichiers aux réunions +\end_layout + +\begin_deeper +\begin_layout Description +accepted_files\InsetSpace ~ +: Tableau des extensions qui sont autorisées. +\end_layout + +\end_deeper +\end_deeper +\begin_layout Subsection +\begin_inset LatexCommand \label{sub:Initialisation-de-la-bd} + +\end_inset + +Initialisation de la base +\end_layout + +\begin_layout Standard +Tout les fichiers nécessaires sont rangés dans le dossier +\begin_inset Quotes fld +\end_inset + +install +\begin_inset Quotes frd +\end_inset + +. + Vous utiliserez principalement le fichier +\begin_inset Quotes fld +\end_inset + +RAZBase.php +\begin_inset Quotes frd +\end_inset + +. + Appelé au travers du serveur web, il vous permettra automatiquement de + mettre en place la structure de la base de données, et optionnellement, + d'insérer un jeu d'essai pour tester l'application sur votre serveur. + Si vous ne souhaitez pas utiliser de compte SQL ayant le droit d'altérer + la structure des tables de votre base avec ce script php, vous pouvez exécuter + le script +\begin_inset Quotes fld +\end_inset + +base.sql +\begin_inset Quotes frd +\end_inset + + avec votre client SQL favori. + Le jeu d'essai se trouve dans le fichier +\begin_inset Quotes fld +\end_inset + +jeu_essai.sql +\begin_inset Quotes frd +\end_inset + +. +\end_layout + +\begin_layout Subsection +Configuration par défaut des comptes +\end_layout + +\begin_layout Standard +Dans le fichier de configuration modèle, un super-utilisateur est configuré + : inglebert@iut-blagnac.fr et le jeu d'essai proposé au paragraphe précédent + permet de créer des utilisateurs, et en particulier inglebert@iut-blagnac.fr. +\end_layout + +\begin_layout Standard +Par défaut, vous pourrez donc vous connecter en tant qu'administrateur avec + ce compte. + Le jeu d'essai met ce compte avec comme mode d'authentification +\begin_inset Quotes fld +\end_inset + +bypass +\begin_inset Quotes frd +\end_inset + +, ce qui signifie qu'aucun mot de passe est nécessaire. + Pour utiliser un vrai système d'authentification, connectez-vous avec ce + compte et allez dans la page +\begin_inset Quotes fld +\end_inset + +Mon Profil +\begin_inset Quotes frd +\end_inset + + pour choisir une autre système. +\end_layout + +\begin_layout Section +Maintenance +\end_layout + +\begin_layout Subsection +Visualisation des objets et des fichiers +\end_layout + +\begin_layout Standard +Une page d'administration est prévue à cet effet, et elle n'est accessible + que par un +\begin_inset Quotes fld +\end_inset + +super-utilisateur +\begin_inset Quotes frd +\end_inset + +, c'est à dire un utilisateur consigné dans le fichier de configuration + principal en tant que tel, confère +\begin_inset LatexCommand \ref{sub:Configuration} + +\end_inset + +. +\end_layout + +\begin_layout Subsection +Nettoyage de la base +\end_layout + +\begin_layout Standard +À partir de la page d'administration décrite dans le paragraphe précédent, + vous pouvez aussi purger les fichiers attachés et les objets de la base + de données devenus obsolètes. + L'aide contextuelle de cette page vous expliquera comment faire. + Il est vivement conseillé de faire une sauvegarde de la base de données + et des fichiers joints aux réunions avant d'utiliser cet outil car l'erreur + de manipulation ou de programmation est toujours possible\SpecialChar \ldots{} + +\end_layout + +\begin_layout Section +Authentification dédiée - Personnalisation +\end_layout + +\begin_layout Standard +AWOR utilise un système d'authentification dédiée de sorte qu'aucun mot + de passe ne soit stocké, et que l'utilisateur n'ait pas besoin d'en retenir + un nouveau. + Le code d'authentification à été écrit de manière à être maléable et est + extensible. + Le coeur du système d'authentification se trouve dans le fichier +\begin_inset Quotes fld +\end_inset + +auth_dialog.php +\begin_inset Quotes frd +\end_inset + +. + Vous y trouverez une section commençant par le commentaire ci-dessous. +\end_layout + +\begin_layout LyX-Code + +\lang english +/*************************************************** +\end_layout + +\begin_layout LyX-Code + +\lang english +** Ajouter d'autres mode d'authentification ici ! ** +\end_layout + +\begin_layout LyX-Code + +\lang english +***************************************************/ +\end_layout + +\begin_layout Standard +Comme l'indique ce commentaire, vous pourrez ajouter à cet endroit une portion + de code pour utiliser un autre service d'authentification. + La syntaxe est la suivante : +\end_layout + +\begin_layout LyX-Code +case '<nom_auth>': +\end_layout + +\begin_layout LyX-Code +/* Eventuellement du code préléminaire */ +\end_layout + +\begin_layout LyX-Code + +\lang english +$auth_is_ok=<fonction_ou_variable_authentification>; +\end_layout + +\begin_layout LyX-Code + +\lang english +if ( ! $auth_is_ok ) +\end_layout + +\begin_layout LyX-Code + +\lang english +{ // On exécute la ligne ci-dessous que si l'authentificaiton à échouée +\end_layout + +\begin_layout LyX-Code + +\lang english +$errmsg=<fonction_ou_chaine_explicant_l_erreur_d_authentification>; +\end_layout + +\begin_layout LyX-Code + +\lang english +} +\end_layout + +\begin_layout LyX-Code + +\lang english +break; +\end_layout + +\begin_layout Standard + +\lang english +Il vous suffit de remplacer les éléments entre chevrons dans le code ci-dessus + et de le coller dans +\begin_inset Quotes fld +\end_inset + +auth_dialog.inc.php +\begin_inset Quotes frd +\end_inset + + pour pouvoir utiliser un nouveau mode d'authentification. + Reste à donner à l'utilisateur la capacité de l'utiliser. + Vous devrez encore, d'une part, ajouter dans la base de données le <nom_auth> + à l'énumération du champ +\begin_inset Quotes fld +\end_inset + +methodeAuth +\begin_inset Quotes frd +\end_inset + + de la table +\begin_inset Quotes fld +\end_inset + +Personne +\begin_inset Quotes frd +\end_inset + +, et d'autre part proposer à l'utilisateur d'utiliser ce mode d'authentification + en modifiant la page +\begin_inset Quotes fld +\end_inset + +profil.php +\begin_inset Quotes frd +\end_inset + +. +\end_layout + +\end_body +\end_document diff --git a/beta_accents/doc/READ_ME.pdf b/beta_accents/doc/READ_ME.pdf Binary files differnew file mode 100644 index 0000000..7948fe2 --- /dev/null +++ b/beta_accents/doc/READ_ME.pdf diff --git a/beta_accents/doc/READ_ME.ps b/beta_accents/doc/READ_ME.ps new file mode 100644 index 0000000..9c293fc --- /dev/null +++ b/beta_accents/doc/READ_ME.ps @@ -0,0 +1,2436 @@ +%!PS-Adobe-2.0 +%%Creator: dvips(k) 5.95a Copyright 2005 Radical Eye Software +%%Title: READ_ME.dvi +%%Pages: 5 +%%PageOrder: Ascend +%%BoundingBox: 0 0 612 792 +%%DocumentFonts: CMR17 CMR12 CMBX12 CMBX10 CMR10 CMMI10 LASY10 CMTT10 +%%+ CMSY10 +%%DocumentPaperSizes: Letter +%%EndComments +%DVIPSWebPage: (www.radicaleye.com) +%DVIPSCommandLine: dvips -t letter -o READ_ME.ps READ_ME.dvi +%DVIPSParameters: dpi=600 +%DVIPSSource: TeX output 2007.03.13:1229 +%%BeginProcSet: tex.pro 0 0 +%! +/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S +N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 +mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 +0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ +landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize +mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ +matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round +exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ +statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] +N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin +/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array +/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 +array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N +df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A +definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get +}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} +B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr +1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S +/BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy +setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask +restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn +/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put +}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ +bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A +mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ +SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ +userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X +1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 +index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N +/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ +/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) +(LaserWriter 16/600)]{A length product length le{A length product exch 0 +exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse +end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask +grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} +imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round +exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto +fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p +delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} +B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ +p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S +rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end + +%%EndProcSet +%%BeginProcSet: texps.pro 0 0 +%! +TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 +index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll +exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 +ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ +pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get +div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type +/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end +definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup +sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll +mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ +exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} +forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def +end + +%%EndProcSet +%%BeginFont: CMSY10 +%!PS-AdobeFont-1.1: CMSY10 1.0 +%%CreationDate: 1991 Aug 15 07:20:57 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMSY10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.035 def +/isFixedPitch false def +end readonly def +/FontName /CMSY10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 102 /braceleft put +dup 103 /braceright put +readonly def +/FontBBox{-29 -960 1116 775}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 +7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 +A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 +E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A +221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A +27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF +5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09 +0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730 +DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A +71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09 +4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C +515DB70A8D4F6146FE068DC1E5DE8BC57036431151EC603C8BCFE359BBD953AD +5F3D998C69E42AA96AA212AD55B676FA2B4F6B519575404233C09AF99014AB95 +767523D9E1F8806E766AC0DD6D81028C3AA9C7536D88D3C2DB6D9949F844935E +420963F40430452DEAAC1F500BFB1C2473C54B9987BE449F042633C7038D5AEB +7E1E11C50911EBCF0979F8192E056A2B2EE9785EB73B1AB874116AD5AA74F32C +BF57FC28FFED335DFD9261AC7A624EAA93BEBC2C0F8B3F898DDA1490D59C6C4B +A651746C8EAD41BDAA1AF4056AFE98D2D3AE3CCEB9C67FE3A63385470EA42968 +34268684A674675AB9EDBB5BFCA81224B22D4ECF40D1F31A39481AC68A87F252 +F4E7C1C340A26E0D514BACCAA51898758A7E7B63D2E7F34E91554151433F0FD2 +4901D3DE9A5FB9306552DC57EAB729AA07780927E1ECCB5D1F59A09A1E3FFF2D +922B6C9B58CB20D687A72B9C22D4EC926771541EDA3B75559510DB21BA4461EA +960B8E5AF4D31D08E8F235D677A9F6EFDB01926967743942C23955678E438F51 +E5E22E2FA2AA7894755053C32B39277B82C00B3D9BE9957CF3ED626852FFFC31 +6E5F0F7489198136A3284B31CC94299EED05B8FA66B8D33F7C47367790D23CD5 +303B0C8E58B0E51BEA9325282F19A3D361A3BEA6BB0CCD09BE735D810E7E0A79 +D1A9C580CFC8CF9FF685D63ECDCCC024C235448BA632F00C3C5BC0E86F44B90A +293817CC93035E5E18548A7E157C2887309BF84C167D8DBED024BB +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMTT10 +%!PS-AdobeFont-1.1: CMTT10 1.00B +%%CreationDate: 1992 Apr 26 10:42:42 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00B) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMTT10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +end readonly def +/FontName /CMTT10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 18 /grave put +dup 19 /acute put +dup 33 /exclam put +dup 36 /dollar put +dup 39 /quoteright put +dup 40 /parenleft put +dup 41 /parenright put +dup 42 /asterisk put +dup 45 /hyphen put +dup 47 /slash put +dup 58 /colon put +dup 59 /semicolon put +dup 60 /less put +dup 61 /equal put +dup 62 /greater put +dup 65 /A put +dup 69 /E put +dup 79 /O put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 120 /x put +readonly def +/FontBBox{-4 -235 731 800}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D19 +38DD5C4467F9DD8C5D1A2000B3A6BF2F25629BAEC199AE8BD4BA6ED9BBF7DABF +D0E153BAB1C17900D4FCE209622ACD19E7C74C2807D0397357ED07AB460D5204 +EB3A45B7AC4D106B7303AD8348853032A745F417943F9B4FED652B835AA49727 +A8B4117AFF1D4BCE831EB510B6851796D0BE6982B76620CB3CE0C22CACDD4593 +F244C14EEC0E5A7C4AC42392F81C01BC4257FE12AF33F4BFEA9108FF11CF9714 +4DD6EC70A2C4C1E4F328A1EB25E43525FB1E16C07E28CC359DF61F426B7D41EA +6A0C84DD63275395A503AAE908E1C82D389FD12A21E86999799E7F24A994472E +A10EAE77096709BE0D11AAD24A30D96E15A51D720AFB3B10D2E0AC8DC1A1204B +E8725E00D7E3A96F9978BC19377034D93D080C4391E579C34FF9FC2379CB119F +1E5BBEA91AE20F343C6420BE1E2BD0636B04FCCC0BEE0DC2D56D66F06DB22438 +452822CBEAF03EE9EAA8398F276EC0D92A7FB978C17805DB2F4A7DFBA56FD6AF +8670EB364F01DE8FCAFBAF657D68C3A03112915736CEABAA8BA5C0AC25288369 +5D49BD891FABEFE8699A0AE3ED85B48ACB22229E15623399C93DE7D935734ADA +DA7A1462C111D44AD53EA35B57E5D0B5FC0B481820E43222DB8EFCD5D30E15F9 +BA304FA879392EE0BCC0E1A61E74B3A1FC3A3D170218D7244580C7AA0DC65D19 +741FA5FE6F8CBF60250ACC27454BBF0897CA4B909C83A56672958752ED4B5E79 +E18660764F155E86F09EFA9F7685F2F5027EC85A775287B30E2069DE4E4D5712 +E7D033481A53A2702BA7542C71062173039030CF28D8B9C63B5596A9B42B33E7 +D922944A38713383D3648A4AF160A3B0C8F3379BA4372BE2E7EA49AABA75AEEE +C5DDE1D8BF68483C3D21271280ABB91D54CC819680322EAB72E1250A760BC8DA +726405EFE420635B5B7F0B48752C06083E92BDE06401C42A2C528C8A60381227 +CEBEF0C9440DC034DAD9C19FB27A350233112B0A339366B7373CE058456E0E1F +139E2DCAA12133B5B6017B0E08E776403F967AF719E0161CDFBF8BBE8490F57E +53C78E97517EF7FB7C00035D601CAC8F4EB2F16F8765614227C71C390C32E960 +FC7E9B9BF26D89F808B05C2E483B9171450E4CF3A86E62886E826B1E34FEC34A +90D3FAC2AF1FB275E094E8D7193F90BC0CB304DF4D689A954C9449169527C39D +9CB9096FC455C5D6142157E548E04DDDE0638C24641FF3EE31B1E35E1A76EA79 +F0DBFAC9967E6C649559B6CA9944962E09541FBB7A00956D1ACA7D8C2355A2C6 +12CA44A7392D8E791DDE1DE818BBF26CE3BCC2568666FCF40BD9C588E28745D4 +49186EDEF6D270E5D8C9BF95B4C1213841128AF3361EE4B989D3A784F916A2D7 +D31A9F2F0C3E4F367427BF3F0C4F36E9276D082BF8C250E469D647AB51DD7701 +4C29231FEB055C147F0A782389800E3ED38D7AE8C6555228CD148541D763D325 +21016A8A5234A8AC19BFD6E3346A94D8A7479DBC59B5796D3063FCC2CE8DBCC9 +1E4139036B4E883A4CBFC0DA2F3BCAAF8BF4DA641882E8CF028D9F9271257FD3 +0872AA684B19CF706474B4F86EE510BEF0164F8504578A9FAE4339270B8C5D81 +496424BE58438D5ECE95BD18973CC66F471E7CA58039ADB2FDEE9329CC788A19 +E852B137500A6F32DEF2742E6C2B182FE2777150BABCF8A2C21FC1FEEC3765EA +8E337F9BDEC3FBD5D4D7857FA703F282EDA0DC7A22E2E44E131DB5D9954B7603 +E2934111D6B57CFA826DB114947DFA87EDCC6CCB33146C2742E7DF664A3BCDA5 +3335EDF6A6C7290939BA0D9937F1D6FA47522D0DCA42AFC7E0EEFDE9B914D5B4 +8039D2C3F063EAAAE10516DDF3DBF97B5F87EE9EA959AC738AB6CDEA63DA8862 +7F7EA32222690E7EDC6F4B3391E834977D476B19D9C14D92420122A733E735A5 +EDED2F02D5A7F3347CB289CA2A440945544A7677C4BD7DA3000FDEA64A4A6E85 +4C1C6C4D16A91AFAB0B84A485CDFC5EDEB03E8E93218694C5426650444AC9972 +98634CB73BF34252A72F838CFABD9F667EB050C113EB222A745B878098AD2C48 +7C6F0817AD96EDA15FB9061832CD91B4270098246BA8D5ADDA339A49DF0292AB +6F7FE225D100F67F3DB412F4D95D464E27AEDB8B76FC8A0930E649E3EE380FC7 +6ECC654D9E901DD295F0A23A3CE88018A2ABA18977775D14695AC02F91E46549 +036939DCE6CFC8BB47CB297D9FF205F900A06DC9F65D2851C66443BE520954B9 +1C98471D8D7746AAFEB2A662A79DB89AC3B2DB327183ED0D4D52CEC819A49BB4 +7E7D4D8B871F85AD43A0441CA8EE86C209F3256BCBF4C4DDF209EFD7E70245FA +E072B99F1F20D4D504AEAB512F477C9B998C466E01238F9E87B3FCC90CE1A90D +4B1A422BA0C0293FD9F58DD4F18ACEA7029B88EB55A2FED83DEAE9F573E9FFCF +05102DC9BD02E9F6D150F3E9D1DFBB8962048508B859CD190DA15732F8D210B1 +7665EED21506DBABBD0E2745D84542555C9FF9ECC3A8043E7EABD1ED5AC7B499 +CEFEDC3164C2C92F5D88C67C6545E9482E70E1DC2C32117ABF99FA7726A43956 +6414DA5B78F70D7A26A8937CB80A705C8048DB26F0CEBD5CCCEA416F19699DF4 +6443C056290A555F50D9BA984B4DA2A19B2BA12E39CAA1EB432E4DD6D2AB907B +3F20B8A3D0FFDFF3258A7AF82A927CD4D54C2F56C1A2DE4C38F1ED186B7F0578 +33B918CB01EE5A839042AB0F740455F1E4DB53A21822CA65333855109335204B +32B6C05D5BE9D260F4AC010996C7CD7C0FD3E5EEA9A66493ABC66E74CD096FED +0175311C18C6F3B577E3C58BFB9A09FEF317B94AC7A1226DD67E2A3A3552CAFC +4314CC03CF0B48320EDF3906F21621B2D7BEE3698299B70EE202F944CE2A903F +6410E7C05A79809B5C875AAEC9A4205DDFC737B3241CD6FBA5327CBF30007B57 +4BFC1497DA3FDD05D8101438ED5BD186D5D8DABEFEA21EB2F25DCB60E2DA4BD3 +6E782FEECF9B0EBCB42E50FF504E8A40C0BE7C6A43DD5BFF2305518944270A32 +34C2D562F9B1A2ACF8C05E3FE0418FDDB10776C8F96B6DA2B554A966C76847D7 +194CF2085C9D9B729CF9DB043259B64A98F96ACDD926E7A27BD6C0A851B0FC76 +26B7C8BAB18706BBBBEEEEAD8B1475B1011A402EFACFA98B097B26A733529730 +FC03A63DB45273DF559D98450186FC0DE013CCAB58E0BF9B23858BC144AF4AAF +584657853F1893F49595536AE79FE8576BFE7320100B1B84E4448B0399C4726F +2783F9DAD23DFD164C8161702A2935C2588CF573F340DFD3DBE1E9B0D813AB8A +C3B13323271662029F9CCD1FB0C45EF425FD4D993A79874B70E579EC97967FC3 +702A9C2F35B4429B48209F97693806A4D959E7831950E43972E39B38FF86AC27 +10822BAC05F1AE05177DB365E1AB065E26FA661FD8207A8FFA1813532E7EC30B +D4E53E9A9ABD40680B88AFAF53FC0571E6AE27BC40A0F76388E5D0229E2E1595 +B503B126B7EEDCC999ECD51714D62F551A0B96EDAF1E79CC134782DB35684CAF +6B740C64F3BD1C89C5AAB48948F52B2FFBC9B1DA9CF690795AB1A3BD7833E4C6 +C0D4086BCD203525410C86C67092B374C9C470E7945A283A16C13CEE9082F647 +3E2DFFFBAB9838FAAAAF0587D48409EB39FC15E666249FFE4A7F800FAE1F4283 +BFB8D88E617E66DB9EB13EA2D41D0BF78158FEB44337804CCB239322ADC61B91 +9419AEC7F3F21374969D91EF2B1A4B13E8588B4987D5C7969C53D292E11C2570 +7B0F5B31E54EA40288EEB3DCA236D122C5D18E8805091C8B443E7DA62C87BD16 +CB4701563393DD13E0C0E7D18B1B37A39837FE150D1A7EDFD2143C33B0EC4428 +2B80952D456CE5183432181468099E9C0B3445AFB24DE79A664BDA3F16B1EE4D +D1DA546437D8569BD9EA0B561A0E7742A4055B8F921F02CE9A8DBB5442A9997D +85626AC2847CBCC69FEE0FE0C50CD0063856A60581C78A9C06347A0F2DC39496 +81AD75A6B5E26D74EE09EE581063774F1831C26DDAF910BCAEC550975C0A7AEA +F9954F1881DB9C496D2197ACAE6A8069ABC257C846BDEEB1D15943FC436B2DEB +11A1D0982DBE0CFCBAB99F52FE5089AAF2D8E16D43D6D1023D4ED077B8C95BCD +09C050584B5F1E65473083CD46C10294187FC277D8F655CE5586D6CBD8C2C145 +1F8DC42A4FBF99379C8FB8D8B5BF501BA6C77C4F7983C3F7F7AD4BB5CEB681D7 +A66EF51E3D222DD88437C16EA4CFD8B31C0644E36F0C968C76A7F2FF3C0462E9 +9497A8D6000A16BCD597E3000E9F85E10F0032708DA7B50FCC53D89BEDFDC56B +7923D6130CF9DB95EF5CB83D01C07EE9B4A5EC5FEC0174DCAA262951747B6669 +D56F651E980237B5C7C558DC0807C3946DC1AA63F0630D5EFB998EDBEAED3900 +5FE4DE1A2AF923B42114D546F936387326B04626B0CD44A0DBFB8B083ED63200 +63AAA6B24E828A62F0E8CC307D1EFB42E738357138AFB63E60752E1ABE891828 +B55B19DC32FFFDA3C41DF9F05DF9239AAAB9F196BA68A763082440804C7B3AB8 +FABCD82C9F552F1AF2CFBFFA1585389CE5A2A5E984CE02F92A91869A5ED0E039 +5B3F9D7E1FC7A070FCC41F92031F5107470AA90D7B535221A748597CC188DFA7 +DA68616806D95752FB176FA137E23517467EAFCAD8FDE4E3733D64E6D9758DAD +6217A2A3C08DA70DC64383B56260575183A08772A7B5657501ACDE1118C5BF44 +9CEEA3D86F0FD2B43EFA5B8F1F58F99168683B393A3F9E84EDAF1D4E92398812 +1A0D12AE549B3557D0150CD0ADC04DA4C5B2D40E7C64C36A26896D6B8401B48F +779C3FB593C2A9A983B533A7C99C9E43BAFA1FC9AF5E65516D2DA32924D352E3 +8371D19559A6FF8C311332C473BE41E55113C711C6AEEFAC9AE3A7CF0011F531 +61C693860994A44793336AA158634D9D756B0F98FC5D3E6826C71F2A1C4E1175 +EFD1047D682263F253E64B0E6119C09CD02016FFE5D7D950C26829B6F41B8798 +37A467DBC484991D9B523BA441E405C395E5187B6264D74FE2E3E82910BE26E1 +5EAC9874C77B5EE2D354270ED47A774CA5674E18F25F4BE6755B7430DD7F39DA +F96CB74DE9C91B00DCAB75876D4586721AAB696EE3290D9F05F39A01695B07E1 +7DBDBD379B9225C291549E5D3C4A3D95B1ED277AF176890E32B2DA66A4DEB9E3 +1DA246BC679C12E6E2ACA3404A185C10F21721E71D84601302776E36F444ECBD +BDE861941397E6ECCAC4EBE71CC0005266E40AF949FC001CE132B71789E0F037 +FF3B56690BA309F623DEA80351B1E5800D809790EE7C96DE82F264BBE9AEA406 +577009EB689F8F9EC15641629C107D8986323703567B547110A99DAF7F16C623 +4F3029BC7E504B4C37B646F9C49CDDCF2DAAADB748686BD9F6D0B2EDAB2051F4 +DA20EB487266D9C55F9F5767EA899C0BCED7720BAE6362A7AD81F5D45F6A709D +3A27E50491A46CE17E585FBF9EFC2A27FFB50F00E4B05138C7D4F45A40B39E7C +2ABB5DC0DDEE77E4BDA3901A67BB93C52241384FCE35EC11F67D6C8677C9F889 +F0FC365893A10E11CEE5CA0155064D8D2E98699961D9B26BE86D4B9A5E2786C1 +3CF260A03857687EA6FBC83DEEF840ABCE7ADBDC897CE6B06F6DE55BF3B8AB6D +777293FEFC61C6DAD78894C873E162A5510A036FFFD9A10977CD627AC3EA4715 +F25A263E6331EEB9BE68DF97C946840841EF83204D9D313202C4ACA7BAF94050 +3B420EBBE797566277CFD3A7FA1AC6CF81FC24E6F336913F4A183B93BEB308A8 +4AE0CEE98B45B2C2683CC06374113AC12F79F98BD19D67F78E2EA586B518FCC1 +4C8B5ED575DD4631BCEAADABE1E9742A364C0D149AF83FD9AEB49EE0E12B08E2 +C4FC73A08F572AA40B58B5B44151974DAFB1FAA29B4D74038519590ABC83B0A8 +A22BD5BD843FB4310EB1E6552B45A5C64F2046DC330559996E77FEF47B4F2062 +3DA41A9E030757F4957BE97725F1DB6FBD15F144F5EFE357FB74BF758AC56A58 +F0F76D03C776F4CB58D7F549F11374DB4E2DF6A8DCF76F0EB394EB110A0477BC +65CEDE077AE2D013A8E46CC2E4F0BBBDE546801E24FD5B9A6A4935F4799DD803 +13FAB011EDBD4431C31C86C4D26C0E729A067C2DEC602A5D884F43BD62EBF59C +F552152162E45D18414D77DB32069C5B3EA64F465D6516335F3D243235FA3524 +E88FA64170BAE32117A35A9C7629DB90066A13160727FCC45C0BC95145AD8913 +075D28ACA02AFBD18B1A659C1DC229D0A6196A308DF639A002EC3A2962B4DCF1 +E9766188B7FA2448F7E3851F896CCE35E5D8644BB33D6F7AA17B3D2E03E2BAC7 +98B122F7370B1322D0A0CA0213CD918EC84EA6FA5BD45EA3B0E1C8EC168D6AA9 +6F6D664531CC8960DB40327B224F12C487FDC6A1E7211D90612B36E02FB7BE85 +36480D2293549DCFD64BEA4DAF4E1281E4FBD4C006C5200BB489246A7EE375B2 +A10826BF9CB311EE708421044375DB5F2165E4E07601BF25A1BD569C31A44CE6 +7E92A0E99939283BD2205B28808FE42C97DDD2C5B6ECD0ABFC114A3244B06213 +21399570C91AD742C71818F58AEF56EC10F0ACC62A20B1F4B9EB01571548218A +CA7D6F9AD9B97D5D03883B8E1194C5BCAA032BBDA9E71572C157D65AEFE2EAF6 +492E40826F692D743DDC26120F0AA543E72E5BB697EE138CABC3295CB819C08B +91F4CC16F5D3FEB1E839682CE56588BFFD94869EF54E061340B5E72257C4901D +BF10C71313A1B9CBC7F7B01C746E9E26E670CC7EC077ECE404425EADC54BCC2A +5854CEDD7563502EC2FE222F66BA55070448D829E3ABBCD360036C0B615E36DA +25911D22FEB2BF2C7D948AD56BF70822D30E4A4B1DEDCD6B531D195D6C7BBE0B +201EC0D8B0D68CA66A79C6968BE0879183BC145413A31466957A467B898778AE +DB9D8A1DE94A5D3FD3DCDA47E121F82F84BEA873A053AA9FAC7D9433C14BBDAB +FDDF6B0A4C73259C8CD62527511025A0B09F14B9CBC0F61A2231A002F8A6B63F +4BB27CC0E6B9CEBDB49561C8BFC5CFEABD91C3BFBA8BF3C0850668A6C55414FD +E3C4D537DE8DEB01A71592FC464ED5C8F43161AFA5020345C1624580F54DFED8 +00F8BD0C0BD0D33D3EAAD0896415FB3F11B6B79FA68DAA3A7C4CED48F322292C +F56F1D21FB55A1ED75AC0CE49334CC8476E08E2A7C3A44F09CB8F78ECA27C5FC +8DE7AFDA8EA8CD255CB0A72130797AC2EF0F0EF4BB9EA369CD72C068EDD01480 +8D8D0B6292FEA04E936758B4852F58FCADD8F9577D77CDCC7DCD3C9F0FF70EAE +E676F83CFC7E5124D4A3DC3A081A5AA9AE33A2B13B416E5E032719A388955CFC +2A9BF6F6D8CAF1D17A86E0041ECF792C4AA3D7CC7A962632D7B4C922BD792BE8 +14C684F6ED9948D2E4291036E2C8A413968B23287A0420D9E141952401E4D1D4 +1CDFFBEB8A5FAEDF20F77FC0BCBFBC94AE4CE330E93EF85E70449F662A4C9C93 +415406EA2619735DDFD879E27F9F90A0950B5508F333C7137DB094F9C3E2A648 +AC37B7849B07DCA55D5FF6FB36481FC33D7568469542DECE246F3D48C812BD27 +4910E2B22CADC88C4137A9EE44CAC9ABE9BAD8C73B3C6FCE1D91C6D4AAC76057 +076A88787D0025778E825B17D74D11C8FFEDFFDABB17E2825EC0FB52BDC32F05 +78E1C412CAB1C4D808C5B49D121E5B63914EE3766C2DDB8093EF9DD5269642CD +E5EE962EE1636E905E62D4D538B595849D14E9EDC126029E2130FC68F1A9EBF2 +F48AC67C7125770DB92090A1E41BC52F6EE7AABD4750767E392C6BA0D751FE90 +AD495954AC54FC1FF8A10F1554DC479404264922F0364071118A9FD48B261653 +65B441634D4CACBC1BCCBD456F9C581EE3437C57039DD63E073E0D2167501081 +485856B43837F64A06A9FB01716D2A175F87E084957416CA9AF22F5B203BFC99 +AAE8C49988502160C91B026E2CD029A8F4B22328FAE0D7D31B11523FC275E7D6 +7DD48755D43734110A4EFFC4423545022E59FE75186D4A7164377C6454F8AA41 +23D5B97851E6FC0921AB5DA9B5F8B2C5835C2B6BCD8A0D02A020D7CCA97FE4C2 +E6DD5823BB7E113D31A8DD39E0BD931C56FB6DD818404B7B65B6056FF4D9754B +5F70C9A2C6FF8AF493C037DCFEF55E8952E50E2617D9A49C9E7AC63F944C9517 +62A46F6BB0964E04C361A567B8ACBF9CFC369A7080A009EE679C25613953BEDB +F96973E3A1DD1497C6E376E1029F3FE570E42F977C36C94F5FD338F243C66D22 +F2AF9FAFBB04047A789EC6043C2EB96C21450B11D25A59EDE8825F10AFB2ED99 +55FB7FC704D7B19B43329EE34919221EBB323A3F7AA7EFA10AB170F84BA486A5 +B14A49211F5D83510E318CA55344C80749364D0C523C8B65DE96C6CD673C3D79 +47F428C0C783810BB54CDDC6A4409CC57C9B627E4AF6B44EE83E516AF8FC51DA +370D4FB0A41B35E868862A183B20114A8D8B577A4E1C274E4CD44875403AB236 +9AA6BBAAC8165DE9EF789151A96E8EADF67AC76E073F9E6BFECCA0BF75A4EDD6 +17D553C3AABCB5C5764405AD3C94D8A54517313C35624CAF96E813947DD0B1E3 +6B76D7F2D089940304D378255DACF0F0CEE0446C7158BCBA554B3B105B3A80E4 +DFDD9A41DA6D6BC69A6BAE21C37C4B25FD255DAB45BA1D5512FAB359C6459E1C +665A7BF9E073977A0918339C1F8AC3C30D4D74EC97C66DADC47C9012C3781609 +F850CD086B04A1DDD9AA28AED8122A02C24823234FD31F396A192D221E3D378C +E44B2200B24CEBD1682E9C26D45A9323A37E48EFF65424B85846D64D563A2AD9 +E63292B1485F5ABAE4ADBF54EA065C5048441FF0A0CBB10D480936D364CC5654 +BFFECF0C2A38489557A84C5667C5DCAD5A4E3B85F3AC770D81103ABC1965F3F5 +C9C887FB3D7FEBECF64315D2EC133B7469263ED10BFB9B4950E3AED113DC74EB +9F381FAD3560B5BFA876AFB34E9BFEE12949063943EEA5F65A4AF4749B0E15E7 +010CAA9C7C6CA9EC2E33D2569D7F62B1FB528C5B5BE1CC6BCF217FA4E1006A0C +ABE037E82F10FA4734FCF14FB4E03FC40CB23CB5F0A0E9654B10A54A131ABD54 +F610C986E1D94AB28BED44BB9ECCE0AE22EE9380B07B01E785A5292EAF8FFD39 +622A7A8EAB9236422239A0BA57ED81D4E2072A299A8D7CB76848606C90B9C06C +4E5E54E967A77E2EC1E3694370311320FBBA2B2B9379F3021D5A99EF9A7C419C +2AADE194C437EDB906B2205F0A412103DC40FBF93579E699A67BDA18858C35A3 +72F73E90D030C6456B59C339069F144783EFCFAB14E7159A8ECB9B0C80999B5B +32E6F3D330DA167BA5DC3558012C0A32521904EA86E0503773D1DC35D512E77F +E96C604769A529E4F66CF17B3612A687BEFA09347A37A4B595FCBD63187138C5 +FAE7BA4EFD0F605652D6658D699049DD525D682721775FEE095C45F52E0193B2 +F5DFF39F9F1CED442CE7D351FE3DBEF0019F65343EEBCFC149CC82030D45DB3E +9FB5F426A5DCCCAF9AB592D7A5A793F99E259E3220A58F9C901E103D7CD721C7 +8333F4519F3926D9056ECDB3E84C6870447ABC0A2BF1A32A5CEEEB042C7553B7 +90A130CE5EE0289EDBBAC28B8F11D3481815AC6EAC746F45F7D72A262448DDFC +F1F4B5206D5C331AD195E7BA74036C74C5B84576603E380AEC07062FE1063C59 +3942E6D9F19C93F90B1DFA3EE57E4D5D527995EFA611D32EE1E483B81056D3B9 +30F1D2DF8AD13A88431539774BA5B148E4EFBB9F2113C54E2831ABD036663D0B +6B75B19BB681CEA9C64DF48805EB4AE8D8CF7D102BFABD9D99BA8574FB1000A2 +586F547090315593FC6F3B2775770DBB7882425AC88A106B9B04832A215FD0F8 +874F46559EE9834EEE8CF349C7A2720E27E52C56DFAA696EB697B5C0D105DCF2 +CCA41D62200CEAA609E9412A57E84C43AD67D30CC5AE207552B3A5173A90E50D +9C7B16886BF6C07B49451530665C8684A9684D17FC0D6434DB503BD770FCFBC8 +06B8AF060E05C9111375699E6D898C00BFC9AE0DE977F13A23763CC5814A1ECB +9CA65D863E26885FE22EBFC256918090E0D8EB3267B8DDD9F03F1469E97A0DE6 +9A6A296137DBE9E3BA094A4372AA30EE525BA638DB2DE2BC600175CD87B3421C +2B60FF41FB2D3CCBEB7C1D12D7A618C2781155DE1407F5F5 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMBX12 +%!PS-AdobeFont-1.1: CMBX12 1.0 +%%CreationDate: 1991 Aug 20 16:34:54 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMBX12) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMBX12 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 12 /fi put +dup 18 /grave put +dup 19 /acute put +dup 45 /hyphen put +dup 46 /period put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 65 /A put +dup 67 /C put +dup 68 /D put +dup 72 /H put +dup 73 /I put +dup 77 /M put +dup 78 /N put +dup 80 /P put +dup 83 /S put +dup 84 /T put +dup 86 /V put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 121 /y put +readonly def +/FontBBox{-53 -251 1139 750}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712 +B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99 +AEBE70DAAED49EA45AF94F081934AA47894A370D698ABABDA4215500B190AF26 +7FCFB7DDA2BC68605A4EF61ECCA3D61C684B47FFB5887A3BEDE0B4D30E8EBABF +20980C23312618EB0EAF289B2924FF4A334B85D98FD68545FDADB47F991E7390 +B10EE86A46A5AF8866C010225024D5E5862D49DEB5D8ECCB95D94283C50A363D +68A49071445610F03CE3600945118A6BC0B3AA4593104E727261C68C4A47F809 +D77E4CF27B3681F6B6F3AC498E45361BF9E01FAF5527F5E3CC790D3084674B3E +26296F3E03321B5C555D2458578A89E72D3166A3C5D740B3ABB127CF420C316D +F957873DA04CF0DB25A73574A4DE2E4F2D5D4E8E0B430654CF7F341A1BDB3E26 +77C194764EAD58C585F49EF10843FE020F9FDFD9008D660DE50B9BD7A2A87299 +BC319E66D781101BB956E30643A19B93C8967E1AE4719F300BFE5866F0D6DA5E +C55E171A24D3B707EFA325D47F473764E99BC8B1108D815CF2ACADFA6C4663E8 +30855D673CE98AB78F5F829F7FA226AB57F07B3E7D4E7CE30ED3B7EB0D3035C5 +148DA8D9FA34483414FDA8E3DC9E6C479E3EEE9A11A0547FC9085FA4631AD19C +E936E0598E3197207FA7BB6E55CFD5EF72AEC12D9A9675241C7B00AD58FAF645 +1297991B5D01701E82228D0313FC7C66B263BC79ACDDF9AAC48A3CBF42B96E38 +583E1D059953076D68148DC8B6C9527B3A74CE7DEF788A11531F44120BDF0F61 +0B2F3ED94EEBCDE4ACD23834C242AA4314B9EF98E4BE72DB76EBDD0A028CEA9D +B4C38C1F2D24B8FDE686832FE96204552C820E45B6BAF0C3308742AE2E064C03 +13C2E5064E4FB036548B136509EAD0CE1430E8DEB4A519BA4D453CF1A9D08C0A +1370543107E6ACFD6B0EA546D6AE20957BBBD632AEA43F0D35195DD85E1FE38D +9232D3F01B25A601E60C7C08210899521C600251D5A7DE2EC34DEB235CF6D122 +C41907F1D0A9B6E6AA98A95BA8A978B7D3F0275FA21137935B1BA53E81AF302E +909F22939F91C57C2348E8E085DF39BFC1EA7921A5EFCE7C6ED845006548ABAC +3B1C34CEFF31F0CA695352CF3B5E0972F82341178F42A34B85D8F66DFE822759 +EC1CA1BF94BEC645BC4D21B32EB2ED15D19EE2856D554D227313294DB0B2D9A8 +C76A7C0D9591F95741D80B45E803788990332DC2353166D899AB085729208770 +74483B0FA3C2C60B3423B162044839B6FAB217AC35C6387DAECDFBF8A8A737FE +185F2FB4C1541B89B9FF8B93E6CEF5BB0F9B9952AACE0ED10928DE45435C4B4E +E447F1AD61592F900C77FB7C72E64A28403AAE2F4520310EEC70C446537DFDEA +DF4359CA2CE513D87589CC631973179DD6E1AE23E53921FD1A841A90D38F47DC +30F66556F7BF1E05CE14DED5C7089DA72C40B4C44FAB4605F96FD152371B93BB +49C5AC1285CECD661945459A5EB53015D07E10BA67911019F8C84A8823A7F4DC +A995D8B1E661483BF883F7463BD941D5FD7C350291CF305C9B2CC35131C324D8 +CAA9C155DFBC1150D23EA3AFFACA3FAC5D71CC3F076836DF36FA334FD94D06F5 +4AABC54D16F3AA97F6A164A3CEE5F8028F740300097018E3462AB81577E2497F +3BDDD1A974FE984B721DE8C6FB5D2831876A1C8E1AD143451765E99EAEE82DD9 +67B5489546BA5CEB4CEE8171F3964A746699FA3054F85511B71AFCFB8A6A143A +A9F126C167EB2C93D0CA1A648DAE70979CFF590AE1417400B66E1FEAF388613F +9451F520BBBFEEC6E50BBBA0177FD5430AB47BE66761F490537C03FF333C7821 +61AD6FCC384F6A5F4F07B2B1DA50B3EF8FEB9A0C73FBA743BE8695F0331F361F +F43A511C8FEB2274FF1AB3713A60DED4EB43A25435F5519000D68C78FB844EDF +952ED6152D650A91A64F870374834119B28233715E228D2E9EFDD1571DEEC597 +8795250D17E2796A3013E9E1BBB5ECFE2CE29F387C860B87DD499BCD15666004 +FD6008BC8D1A8D3F84B2D5F1AF0A1EA4D05385F36AF908DD66227BEF7BFF6BE3 +FAC8FC06C52CC3DDD060A4CEE689E2CB3E47D6C0575B6F3C73EBE28E98191F73 +8C8ADF27453B58DC94CD68437FF99F02A78B6A277304AC26AA9DC21511F7CBC1 +6A6DB6759FA5CFF28F7B1C3569C8284FF42C63C5CF0155AE7F42199E5A3715EA +BF65A939F173618C61AAEE1C35C4EC4BC15B29EB6A3799A2EC26E4B9D4A24C99 +0531D99928636146EEC0475A746D7079EEF6EA939ADC9AAC19C28116D2BC80ED +7E2F58792DA34AC8E65083ADA7D70F4D019C1769ED665A42305FD10CD718A27E +6679D78234729B44D86FBAAABB4F4E5A13189962B37D602AB9DBAC45621B3F6C +E6CFB15861F3BCA2F089D635C3040B582C0D5D25C361F7841DF3904B5BDFB23D +E0FEC3D7B55C5FF5CF4E90EE20744CA89D5A8B837F61DC175585F452BCC96A0D +FAD5B210F6C783C6F986B1B8273DCA5AA059251C37E68A3450DCE010B9348CCE +916F08B2FF702B996A7B965756A23EEBB57BF02F6D8784186A1009C6FAF71E59 +64F282E70158CD4C9AF483FAC971B3981B3C7CB27F6DD5444D7D451CF8617FC5 +2C3770567A2913E7362BC1B09B1CD05D47D31173195D01BCDB6D2FE2322F8A66 +E54B6C93DE29D1EE67341F40C0EBF6DAC95E0B626A0708B31FF688B35EAFCE3C +6FDF759FDEEC357DDF44028217547D0271C587B373462AD9069BF54117A17405 +A6B495B9C406B64F6652B7E0E40EB9526DFD4CF86DF6C294439A0F1F7EEFE9DF +352ED2FC1DBD2280A18BA536AE3091E02192801AF43EB47C1941C4B0609DE405 +163A8840C553CCBD5198EFC7843119AF94C14B24946DC1C0132B33A02D24CB61 +07FC4F69BB1EC6A1EF2C95FAF2BC3FFE6328F7DD5001257181D5692B7A342B60 +733C6AD92B7176EF777EDFBB0116DDB11D6314D92DF13611E2904DE148F8A1B2 +D85D274A7B0100BA1A2F1D18CA404F0268DED666AB2BBA006560209C1593E563 +1EBF2A9A26B2810804806AEDF9CA1C16E468DEA1AADC36BD103B004EB1BA1F8E +95DCACFAC47162CF34219106CC03D4D36ED72C85AD91971AA16B55F60CE62A37 +320CC49BE3D563BD479994EE19D79EEC05678D93181F4BCA9D5FAD21DDE1F9DB +AF0329CEED9E6C52DB5B43BBF32D54A8D517CBE7C531C3B7193D5C002B14E8D1 +9663E6ECD455F8F1F3A6EDD072ACA0B3AFD9EB7AD8BBBBDCB92BBBC9FA180941 +0C09795F34B71A0851B3063B5F1520D89EF0C4C8B19DD6B4C84D13AB03D65633 +28B6F1129D38D2F0751591ED06311D473B859DB02A515F431979E2FF958861E3 +22C40B1C707761E6C0DE45311C0EB08C39FD68D07F8D484FF6EEA6FCF937B713 +927AB4DF31A781184F1A05672452CAF150D26D6267369A4F704AA369D6ED09AA +B0D816A6B8DD82DF713EC1018029873D980DDD4908A943C8BFF6317E05B21DF1 +1967F084B0E38B58B03FF81FBB9918BEBC8BBD6090123216D9EC57FCC13D0848 +08F6F13155012058161FBE407900624CA6A52E4DABD28D10DA950A9F7BF9D3E1 +8DC09F3C2809B037154AAB286036D3496F3A0E09804ABDB0ECC63EB1E8C6CC47 +AB0750EAB7DD4FDB835C13754C5FE781FE2E80A0E59D439A0EB124AF87E12A60 +C761BE135F2AA7700EEC3ACA40CD473EF2C29CFD4FAC16BB8C33AD44821BE014 +0B3DAC12B8D652177DA038C0807D2FB91F7C200FCEAD90C54A6BAF411A3F0D03 +FDDE2CE9CF3FA21B738C217C159DFA68DA642FEE62F81BF4BD6669CD19C64E1C +A9762DBC3CE34CB63F927B1B97487D91A4734FE956A25FF52E890649681094EA +33B65342017CA48001BCFB6553E76BF33D486C2F1AC58385E34F5F9CD17CBBA9 +18DCF8A07CE105E3C8E2F68CAD80973CEB6DD6A3FF621A0C497DD4DF5196088E +733440AC2225592C85419F50B8D9EFBF003CAA40B351ABCC8FDA09C672EBC90D +5454021DE4E83F88117E12B84F944EE30AF7188428621B9271731346928DD626 +A270543570ECC7381DDB6F141272A319024773908C7ADD9A6A150A419EC46907 +6B9A698E94EC5FBFC60AF0C05F680C9B31A148136496DAE7E06A8D41AE456D48 +2C9A892F0A84D6F5181F097ACE07A931C95003A88774CF0C75E57F3CC7A734E3 +D1D8E68218BB49ECB1228F36C54240F77F68BE47651D92FB90854F7C2B0BC424 +301DCBDABB1C1FF1087A123C085291CFDBE744BB6B9E4F8A820777639487502F +CE9777BE51B8744B00BDD43C323848D0EDADFE493FA998B9C64B9A386FA56361 +D29C95CF34F98A7B5C5D5EE6677147E2A6065636D4614582EBE08B549C3E7011 +8302A5C55F198F793FEB51260A86FCAEBB4A6F12053A64E91FB8FE2127335043 +F56BC57BD9B7A218ECBC579694F22E154CB708806AC19D8A352F2032F924327C +E6E85466E9DDE0BA73A253F08CA279D247BE984CAD4F99AC5115E803A5F9A65D +C978FA3746431F7DE3E7603489A44A582AD05A715AABB7E2F510B7554E487E2F +039F4757BB77AD428C8541D11AE29287344C04B9382C41CE0E848BEE3557AC54 +05150D36FD87986612C5C7C563124004EA1AD708708FDE5DCAF3E196D6CF668B +6E97DD480EE5516C7537760D8D63DF777276E73F2703040CE8FCF7AC2946E929 +2F1F8FE8C6423C49CA41B0476ECA2FA84C7CE4B7CD68B4E232FE98DCC13A9749 +5CE172E850958BBEC4B9571950C359EA9BFF6D45E6158F8AC04829E87D485319 +02A6E7F7A25BE0A9C9FE1AD207AD692269B85343AE3A4356B5A3489683573FB2 +C3A09BE61A6922A8525C30B098F5C1A6A6828B7DF472A651DDC28F2CE8418BF5 +FC6EA6EEE84D345ABB8299A1621B19A457847BEE09FC71D9BE3013D8651F4CD7 +39486C39D7B050BAF21A3F7079190885EBF54CC0C60069458115BDF081E18C25 +D9B7267530E5F6D6EB77C81140B5A824BF1B5DFE96521106F3219205A6A446BE +D03B70C432FF3F25D6C8958989AD94F14FC06880D039EE0BFAB7EF746C48D448 +C7FDC91826DBA6A3756F12B9F7BE5AFAF2541CCC069402766D6D331014119053 +73E4FF09272389AAA61E9E99E2694B09BABB59E0D5A4F8F71B870A1AC9D8BA3B +170EB81339F3B3EC3C5133AB34B13695F42065E55DF4EDD8312F78A44D088342 +E31A30C6E4719931EBA51F917F60ED594F0F590D4BF6C99A74B0CDD3947C7176 +326FF92DE1351CBB50B88FE3194DB20ABC366AD79480259FB7F6AB11CDA44C5A +3FBD301396CE1A2C030843D69A9D32A1A008B3B66AE82941E620A9E7B962C7EF +59E5B3CEA2618E69D265CA5716C0770C081590CFFC044FCF02D37B592FB7F0CF +3A70884DA16D0DFA619908C729184959F84522BA144543350C44E5673CDC23DF +3D2704CE4ED07C1E5D810E0B18861A7ABA52634597EBB9492C9C9889F642B835 +9D4789E637CD54B9F91811CF3496B3457368EEE9A9A6DE2008576A1F935F63DC +2AF34F2859BA1239814B4687E454F4134833EA638EA5A20996991541EDEF8753 +A7EDA763C56C4FD440F3D54B9F57E2CDA2999646BCF2CE002E9DB075F5B45081 +E698CF67A55690310A70F49DDD8A0F0944A48F16AB60C990C346EF863C84441A +347DC73FBF7F46EB6D6C047B222033E2C47A5105203D702EBC91A344D0FC67A3 +E33EED60E68E8ACE6700F33167F971473B5302C529248F4F9A9AD263AAF1DF32 +38C21AAED0DF94B087128237BD41AB40F3662B541932A2E9E851B2262A6CF354 +4DB8993F250FE4533FC2C8D52CD66CEE480D2136F2F1D6E98E0A85597F84418A +3748365A6AF37CBC624166F801379AC1C8543E3E741239EA92D4539BC5B31F03 +0BA0887FE98E8116D143C6C17A83B834FBB55E881AAAE75EB3C3C2DDB2D5DB7E +7AB1C00F8FF392EB7E676B64B9EEFA774F6AF239FF876BE158906764A5AF6480 +B0DF4C5553F8FF1AE094E8C5CB48476EE34B1D3CD20D7F502BC49E03C4FAD6C2 +D4F79A61DA5340F401707AD0005CA2A0022D2AA21F651E9B9EABC388D553A23B +D7CC2E8F192668C93A134D3EB8686F297290C51C56F192AEB20CBA4B6A05E51B +74FE6DEF2E6308F2E8CFD0C38B01D362362205824535E826E154DC0D7B6F4ED5 +7FE86772AC3A8B6C69E2D7155F972EE2FD49580EB15337301E04694E34C2A63B +1C3E3F108B90C7728978E159D5B215E5C0F48EFF93A57BCCFA02737085CA2467 +849195BEC7831A4813EA85E69E6FE5B2D6955876560182899AB2131BBA579D0F +5A82372E80CADCB4760CA9806A6502DE1726EA06E8D2637499215BCA41A4CBE2 +6957947C43991A4F96026B3D3AC9D7DA0F62E8E7CFB78F3755CD7251E45FD8C2 +DC940C5567A0BBAA40720933E02096CFF49A78096EC19EC8A871C119039B5690 +8028E8DA9683BF7DE0CE57DD65DCDA5AA5F4CEEC77A41EB5E58B44A23B54035B +FD9CBCB225A01FA468FAC2BC73211D8BA007D4B503C4F9162656E8302396D3D0 +E4A8102DA684FB5987A8D757539ADC071989A25FB66401FA47034C44581DFF55 +4D3DB44CC54B1284491DBD523520ED0E9D0F6D21FAD634A588BDAB15E8B62C34 +36010545D8732BB30511CEA387ABD636516732CAD9B8F5AB971F489FA9501A04 +482E9A241E1F1922093C7001DDB2EFD42A5AA2826DFCE05830EDD3E7BD069885 +53E46E4F9F6EC01AB0A20BBFE033CC8105E6558D4996F13894E3999C25AEBF26 +0A47BCE971583673197E22F249BF7B3EADE4EDDECB5A8ECB86F50D47F78A8592 +9F2C43682A03170D47B91584D0800AADBE346C3D08CCE6FF70ABCE7D646FC56C +28B95711560A3F4B3803C18C315CBDA5BD44D69F8973F6D6A4F27C174DACAAC7 +BEFE1E513B08116AA34D0C167F2DBC897066A2113241DE5FE997548CE28B7216 +2C6B9896642EAE972A72829FBFF750B6DAF34547BA8A54412C7C53E50EFA2E78 +1C072AAF6B7FDFC2FD19BF07959962C8D09A463B762554843A34EACC39B6E021 +9F5B586B9395074DF8572FEFE494AF7933E125011B9D4265F521D0AA2D37F7A6 +AB040E4C00B86DAD62FA6929320A07D4ABA5691E094680A22E2156337C62E15E +121BFCAF14427AF48D8CB538436C833CCF2635393E5D2C8CD666D2F188231D93 +F75682D8FF364381AF8CEB55476FAD7D14A1B3A86921A5A850012BBA93218464 +B44A46E74D32EC3ED17B1BE5F41D74E614B41D50E6A8F08D4926823B0C889363 +2BE97270358E195A3E1AE699C7A797B850DACB10AC57BFB41D882298AAAAD47B +BC676BBF662C072E08C34A9A0344ACD6C36EF6367091DB6E4134201A0D0A7C0A +7117C901573DD3B4BC619D81CF149FDD408E98E5FA17AC582CE6495EFB58E929 +6B38BA324A22ADD8F039901126DA7C567DCE65530F29379FDE5DAB90B7AF8EAA +93D2CD1D6B93D8036305FA2A27B34EE19694190FB26C4F0466B705BB6CFDC04A +58649C536AA431B4D3BE8708C632362B41F8328F465C79EB988C2487FB850B23 +B6CB90FA4AC671378123F1310A3CB8A744F0C52ABB552C29C5EBC855147D6648 +11F7E33DD8D16A0297DD44AA096CB4AF525C159799FA63A6DFCA438217F4AF62 +4C0FAA45A57E4B64186419F0CE002BA8AC5C92920B78213B159BFC9E884D6C8F +C86A77F1E8041E90D196EA521B6BEAF9F5B24B407E08FAC327EC2BF29C6D553A +1909847CE6F3B5CE06CEE18D8D5C067DECE9539BB0F4E31429F2E022505DFB8A +54443690523A0D3501F699529EFC9C7E24BF7A4438D11CF94174EC0973BAC945 +32E3E36F6EE62078A54CD1D170BD414900BB960ABC4AEDD0F7F59F7BFB1685FE +A8ECCC7C37E078B8BC539B7E936325A14A0EFABFAA5EEF0D45C7FF71B05DC281 +09089CE64CC30754345B006924CA02A837BA1CDBFA960009787D42D1E41BCFB3 +CCEBA95672396D78EC51042E0C4625F6598633F600F261A80235BEB56C58A3EB +ED205E020B4EA27E94D2A9F8B285858640437FD59ECA9702356554B4AE732682 +5CC791971D3022D6603F1B74130D445B5F3E5506E4A43F32F53AD8CB8B804443 +87417A6AC7BB699DDE7A7A1DFA2718C9E15846F0B2F93E0167E6FAD982A27B7A +321775ECAC4F754CA1B31B301BC04B9B6ADBC8BEE1B6E9A6E9E8A757409D383B +16DE94701AA9FB5ABA8F4AAF2E837264C03C404A82C7325EBD039F84BC1D26B1 +B8CE48355D8CB477C3258967584B6F96874145650C67A02CDC9B8E6A650CF202 +BFEA60F42AB20CD4D5186E538496CB286A5B1214C6091D9F3578793B2E92C70E +5A8AEE69B0E231B4DB103B55A09E9EB23CDB972FC4523CC2E308D5414A41D7AA +D474204A26058BA8EE73EB67BC853B9054F281E6502C0C7974D2B2B62FCE2783 +AC2333F9F368978F6A176226B8DFC549E39408BCDA00546B8C722A872A055485 +B15A54C4B85DD07CB35B73A2C0E737B5B2A1FF3552E6343155EDBC8A99BE7E68 +F7F1D6D7C6ABAD3362058555D65C4297B5C3A413E2E0CBF52C7AD06D2D09F7EB +3F168C29D302A80C12733DE283EEC15C1627EDC01E27919E5AE0DD8F3B1BE62A +6F5D87B84E9FDD5E9FB8CBB4F11EEF7AF43D9FC2BAC32E036692586E597B27D4 +D185FBD9FEA7D046B74AFB4196CF5076780651A505A0B919104CDAE6A1EC9C85 +92BA6F1446FFABC3D296A9DB02827E29B4C92F334DB756EE76360EB21AF99FCB +A20A4BBDA16D64E16C5169936ADDB2FBADE60B77A2CAF1BEC80B1AABC9955128 +EA4BB285DD06F40ED0D0AA7E78C4939556395ACB463057BFCAEE217F45BEA317 +09568F6AB7745F4843FF77667960C9FB70C93ED996E32863C21AD727953749A8 +CFE1E148260E000C4BD9CFFC417C564DBFFFF052842D55FCA7D7583F26154F68 +608FE787F89AD663E9BC56B2D99F822DA2D7159D9D2EAEB104AD3632EB9372D5 +7B5B52EE3456C394D713CE8576CF00CBFD5CD6E36FCC2D4CAEF4FFA2327786EA +A52DEFF2282F0910D3DCB80564B33BE82A9CDCF7830F3FCD26DA16434E875B2D +EBBA68588F1FB3051DF91E2A472B22435F9485E47970F530C09D6F80834EC05F +919B2BC0AC81354A9714D4E0D86B98C788673E66CF8FDE6E71DB02E84992BBF0 +015B844D82089A445BE246CBC4F594DCCCD9A061F06DF82D6032B6766C3CA618 +737A4B2B77E02B6676EC1FAE5B581EC6041B203EB29E5C283714FAB41CAB5FB2 +F7EE493F5C340E3F9DD75D55206C380E29AEA710700220570409411E26AFEE04 +5AEAF8C66DE51744E4F0E68756813B1D83C784D8C75B66EDA5496C344DBD8458 +CE4C3A4BF330C67D3E07A40610917D7033A9D4A95EE0CBF09D9A7BF34B766886 +2A8AFEC912FB362355DCCC05FE08EB6C777C52714B5E762CAED332D44CBD2398 +CE9501E630E08692B0F80E10A7B9C6210C94DA7D37244823C08D954DEB16922A +076AB888FBBE54D762AF975A1ADC5BA78AB6403621C368A37E1C3607978BFD0B +C758ED01EBCB6B64CDC7044981DC7868C9B784A94A6CC8B046A79712773CCE41 +361785FCD1834E16D4FDBC7B2107C298C988C8540398740631EC15CDFA8BFB07 +1013096885A529 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: LASY10 +%!PS-AdobeFont-1.1: LASY10 1.001 +%%CreationDate: 1992 Oct 23 20:19:17 +%%RevisionDate: 2001 Jun 05 20:19:17 +% Copyright (C) 1997, 2001 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.001) readonly def +/Notice (Copyright (C) 1997, 2001 American Mathematical Society. All Rights Reserved) readonly def +/FullName (LASY10) readonly def +/FamilyName (LaTeX) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.035 def +/isFixedPitch false def +end readonly def +/FontName /LASY10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 40 /a40 put +dup 41 /a41 put +readonly def +/FontBBox{-19 -192 944 683}readonly def +currentdict end +currentfile eexec +D9D66F637A9E5292A4933615152D29EEC26E1BED2E48CAB7AC058698EA30B07E +F8BDB66981B14445E1107420FDAF32EDBD5C26E35B334E3AF24373B2A13984D9 +1D56801ACCF98612DE2C19685E0F4D52369AD642D169AB57DAB10665C6C01538 +4E7DF30628B47D6551F93A50553E592B5E1540B411A313F39E4149341C981D3C +705F8AD7782F59531404B3C001D8B882E0C5468D00B26040A352ED823D7C8DF4 +B632A37A034C6304A39F28739AC3D634CDC707B53474E63135975E7F0FFF2458 +99878B3A6D8D7AC6F2A2728768B8C2226075299B8CB08B76AED9A00BF448A646 +87014E8B1C1723204BCBB97BF0F735E436F1805B4026CA792A2464E1FDFC4385 +B407DAC19BC7769BBEA6BDD0EE65133044D18530C5A3915AC9272AA4A7FC35A4 +93A7A0CA8BD1CFA4382085D949EE819A51062591606ECEB5B37419223CC0400E +158F1A0849868CFAE0F71DA6B4FA47A636EDE756530425A6BFE45B8080808B59 +6B886D033437677B151285B047C84C2E2FCB71CCDF34E20E925269E5F1A210F0 +391066823D8F21E03746BF79AAC6FF91517631686722226462D6A9EC5FFCC806 +B959AED95F492481324749E00CA117821C347F9B924BEC8C64C954570252E909 +5C33AC8B1320BB1992A88C619DEA7A8FDDE42390EC82A07BD8BB7F0014A41EC8 +04225B5063D3F04723F51128DE8ADB79F62903E1955A7D49220223CA34FDC3EB +8FB71700EB9CC40DF747C4CC60AD11D3FC038CB2051F7E97CF7C7F7D0F49CA1F +E0FEFCE664544CD1F7C23B05BA649D373539E7BCC761611C17489084912F77C3 +5FB3BC1E91E2B4A47C27BF4989C7703E83C5A505108037DE5006D4F510B8FE1A +570E42E4569FAEBF66058F9D9608A771BEACA2A8AB629DBE939CCBBC116E8BCD +BEC3A33CBF185A68DB60CAC5B21AF4D9B46B3FF4FDFBD6BC3C8101BE15E79245 +F0CF8F670CFA19ABC08C34D85B10C17190497EACEF6E401F322B1E281C1755F0 +BBF9838AF83A0A1601D78E78FD599819762347A77C71374AB428093048E3F1C9 +40CFD63B86C7F70BCD2AC3092DDD3BC91CA714BA28263EB863D5E6E2DBD4FA08 +6B22C1D18B16D7042219B9F0BDF5BF10AADB658CBED51C8B272E4DFA11C5A603 +8B4A437EABAA699B86819EAA072F7D90A9CE1B52287DD3D26C470BE0A8D8ACB0 +5CEF12390D0EDE45B1F5B2FE4ABCA8844F713CB5901221BBEF0144FB694EC8A5 +A5E80F582257A84E0FDB4150D9EA8A82A434C5FC1CB93C7F457B95A68E52F916 +2B90E294A0C787EDA95A4EB1F978ABC0A8E1FC9128E7605D591F601BE0B37F6E +E1786F2302F2783D5CDC07AA5F3A20101D527E22B8D689A3A60B5993894A7038 +E068BE74CA3F9CD7A33223131E6149FC75A1FFE4E1A12553A8B8DA3AA19DF672 +D355FC0E824840735280F6D4BE31FE762B5027E292F82AF13EF5CBB0633E66A0 +950CE5EA51EF5C6C7FD1599353416342E89607998DAD7D6A8FC650ED12369274 +4E9BF9AFEA1822896412672B1F9EFA94BB86BEB37F2926B7BC7E032C71572F05 +C203EB5E44E55504D98264D3CF7A77F62C183F65364525AE9E84511F4BB67ABC +164068BA9321842E23882000D27069B07181EADBDAF4374F7FE019BD6D9C88E2 +793462102092A647D903EDE28729B02369DF181C898DEDEBCACB047E79B284F8 +CABFDC5B460D9CD7C3D0A7422E6268DC3CB573DFF7304841C3557355B620DEA6 +74A36D5AA575719613 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMMI10 +%!PS-AdobeFont-1.1: CMMI10 1.100 +%%CreationDate: 1996 Jul 23 07:53:57 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.100) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMMI10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle -14.04 def +/isFixedPitch false def +end readonly def +/FontName /CMMI10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 60 /less put +dup 62 /greater put +readonly def +/FontBBox{-32 -250 1048 750}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE +3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B +532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 +B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B +986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE +D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958 +9E394A533A081C36D456A09920001A3D2199583EB9B84B4DEE08E3D12939E321 +990CD249827D9648574955F61BAAA11263A91B6C3D47A5190165B0C25ABF6D3E +6EC187E4B05182126BB0D0323D943170B795255260F9FD25F2248D04F45DFBFB +DEF7FF8B19BFEF637B210018AE02572B389B3F76282BEB29CC301905D388C721 +59616893E774413F48DE0B408BC66DCE3FE17CB9F84D205839D58014D6A88823 +D9320AE93AF96D97A02C4D5A2BB2B8C7925C4578003959C46E3CE1A2F0EAC4BF +8B9B325E46435BDE60BC54D72BC8ACB5C0A34413AC87045DC7B84646A324B808 +6FD8E34217213E131C3B1510415CE45420688ED9C1D27890EC68BD7C1235FAF9 +1DAB3A369DD2FC3BE5CF9655C7B7EDA7361D7E05E5831B6B8E2EEC542A7B38EE +03BE4BAC6079D038ACB3C7C916279764547C2D51976BABA94BA9866D79F13909 +95AA39B0F03103A07CBDF441B8C5669F729020AF284B7FF52A29C6255FCAACF1 +74109050FBA2602E72593FBCBFC26E726EE4AEF97B7632BC4F5F353B5C67FED2 +3EA752A4A57B8F7FEFF1D7341D895F0A3A0BE1D8E3391970457A967EFF84F6D8 +47750B1145B8CC5BD96EE7AA99DDC9E06939E383BDA41175233D58AD263EBF19 +AFC0E2F840512D321166547B306C592B8A01E1FA2564B9A26DAC14256414E4C8 +42616728D918C74D13C349F4186EC7B9708B86467425A6FDB3A396562F7EE4D8 +40B43621744CF8A23A6E532649B66C2A0002DD04F8F39618E4F572819DD34837 +B5A08E643FDCA1505AF6A1FA3DDFD1FA758013CAED8ACDDBBB334D664DFF5B53 +95601766777978D01677B8D19E1B10A078432D2884BB4F7B8C3293B68BB78100 +16724E495064BA0168CC86D413CB48560D6D318357397832F7A858CD82030C7D +8A4A1919716E8B26AFF8789AAF489EE4E0A88DC477551A87C7DF2856189E4596 +FE015956AFE5CC019F5CA6323A12B763B7B08B92C1A2940D3C566C43729E5482 +63C6DC5E834AEB4DAFB5AE8F0B8931A4687C94D11587B9071C8D81DA14F12776 +53A1985A3EBE37827656BD4635E03F09C3231F906874645E7DB3E59045A59D67 +E745D8487CF73FC50F64060544F624F357BC998A87FBE468DEBB38A09449EBCA +D041D7C29225ACD16CB8A59E87924D15A9125F064710A6CCCA3AD3103D8FCC94 +CC3571C6F9192774FCFE5BB42A14B27960903144D28BF047BF4C77646EA7BF6F +440D4EDEB712C63F2E8080419E42D1D58EED685EB5CDD49F80DB6E5553B519FA +C6A39A093155802F3EC607721F390307E91ECB597ABA60A537E3F8C045BF5DD3 +D88CF6518D37FCD95D2F295D902D617440D23516D962F47750A682A319ACE1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMR10 +%!PS-AdobeFont-1.1: CMR10 1.00B +%%CreationDate: 1992 Feb 19 19:54:52 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00B) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMR10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 11 /ff put +dup 12 /fi put +dup 14 /ffi put +dup 18 /grave put +dup 19 /acute put +dup 24 /cedilla put +dup 33 /exclam put +dup 39 /quoteright put +dup 40 /parenleft put +dup 41 /parenright put +dup 44 /comma put +dup 45 /hyphen put +dup 46 /period put +dup 47 /slash put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 58 /colon put +dup 61 /equal put +dup 64 /at put +dup 65 /A put +dup 66 /B put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 72 /H put +dup 73 /I put +dup 76 /L put +dup 77 /M put +dup 78 /N put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 87 /W put +dup 90 /Z put +dup 94 /circumflex put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 106 /j put +dup 107 /k put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 113 /q put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 118 /v put +dup 119 /w put +dup 120 /x put +dup 121 /y put +dup 122 /z put +readonly def +/FontBBox{-251 -250 1009 969}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 +87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F +D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 +92A36FAC8D27F9087AFEEA2096F839A2BC4B937F24E080EF7C0F9374A18D565C +295A05210DB96A23175AC59A9BD0147A310EF49C551A417E0A22703F94FF7B75 +409A5D417DA6730A69E310FA6A4229FC7E4F620B0FC4C63C50E99E179EB51E4C +4BC45217722F1E8E40F1E1428E792EAFE05C5A50D38C52114DFCD24D54027CBF +2512DD116F0463DE4052A7AD53B641A27E81E481947884CE35661B49153FA19E +0A2A860C7B61558671303DE6AE06A80E4E450E17067676E6BBB42A9A24ACBC3E +B0CA7B7A3BFEA84FED39CCFB6D545BB2BCC49E5E16976407AB9D94556CD4F008 +24EF579B6800B6DC3AAF840B3FC6822872368E3B4274DD06CA36AF8F6346C11B +43C772CC242F3B212C4BD7018D71A1A74C9A94ED0093A5FB6557F4E0751047AF +D72098ECA301B8AE68110F983796E581F106144951DF5B750432A230FDA3B575 +5A38B5E7972AABC12306A01A99FCF8189D71B8DBF49550BAEA9CF1B97CBFC7CC +96498ECC938B1A1710B670657DE923A659DB8757147B140A48067328E7E3F9C3 +7D1888B284904301450CE0BC15EEEA00E48CCD6388F3FC3BEFD8D9C400015B65 +0F2F536D035626B1FF0A69D732C7A1836D635C30C06BED4327737029E5BA5830 +B9E88A4024C3326AD2F34F47B54739B48825AD6699F7D117EA4C4AEC4440BF6D +AA0099DEFD326235965C63647921828BF269ECC87A2B1C8CAD6C78B6E561B007 +97BE2BC7CA32B4534075F6491BE959D1F635463E71679E527F4F456F774B2AF8 +FEF3D8C63B2F8B99FE0F73BA44B3CF15A613471EA3C7A1CD783D3EB41F4ACEE5 +20759B6A4C4466E2D80EF7C7866BAD06E2A1040FAF2DE1FD6AFD5FD97EAAB614 +956897A7BA8B194E613047BF469C7B4261CACC1DF1648E8A86E926F8702B5ACA +6CEB4E3E85EF23EF5C9C53097F3BF17243B8D4BF0E6B0C5982FD14E4E916D363 +E265322DF0823E9990F966A842ED69BADFAC2CD1754FC84C0FF6750D2373F997 +362DDA16A0D73B178FB7B67307204AF174AB871C254B8E7CD77058113B702B2C +13F341A972B67756D65C6A9F553C365E20F0BA59F8537C88E0C13F87CEC69C9E +0775F760C4EE10819388782A2CC2E9C000DCBA76E4EFC7B390E50611F3D4F6A9 +CE60FC3B742F046E84B4A302F5DB51092CD59F103DEE2910757696C3F131517C +416687E6DF671911BFEFE08D1C5D0B16F9302960E29760EE101C5BDFBA4176A0 +260ED46500F88BD388506DA361B0E9FD796196E66B332C82CFFEB7974F9E4428 +B82C64ACBDF865B4356C4E2C8E6ED840AD52C326F7D4869F5BFCDA189FE81641 +832D1FDAA78EEEA4F41976945501F32BB383455467D217777DB74219F49EE8C7 +89A9BC7F63500C8A735DF316A6823E6ABD3D815E7369EBCB3C06B404819E48BF +00F1A4AC2AA9ED69D6A974D6BA21C4923B7B93F52AEB5D7015E7FC8611A4E0F2 +A5242C167F9F3A9DE6EB0786EB41F72EC2051BE8C69BC1B1B47F21FA1BEBF913 +0D7EC2A3169AC17909A5BBAC615E64359C00C372BEFA892491D23712AF8C81CC +E4FA41958C4AC483487725FEFD17514840A8DAED5656D30F6676EE5B168F047E +593111CCAD76A790BE700F40845719C742C604416C9BEF74E50B7FB02CE92C8F +5E0304486FF092FDEBC48FE92F1F52FAE037C4B1732069467138960FC946CEC9 +B00FD964782929B9AD606B2AAEDF7500359B651D48580BD33330FCB2407ABE56 +D006C8BD1BDE90C70ABCC7D3B6186DA6BBED163DF48D7A8B32CA1902B754E7D9 +FC214E64D31D5AD5AE0B3173DF92DCAE433F2CDE165599A1C215236AC9534751 +86BB44083AEADAEA87780CADC3AEBF28597D3577B2DFCC3322B4A0C8FB994DDD +A42FC7D1E078FC6226E7E00E79197F001EEFE43DACE61835F9F2B68009B65D20 +582467F445293736BE2E3E2C0CF247224ECF9FFD37BCC76EDFD31368D2F26B8B +5EB0322B44FF635A73A6936F73859582F33AC1160F6616E30499ED3896F2C687 +4D6C2CC91C1BB8DB13F27E1CB8F68A2E38A842C7467137A3435F71A463998130 +CD5836CA448E139EF8FFD2E4F5F8D7C0250D45A42B2419EC7A7B3B0BC09305F7 +CF0967E85B2F51339FAD5776CBFAC932048FDB039C9EF6E90A79019FA9622A92 +3A5E8EF2336DD18F1B504E989A98F4F9501DCF69FCD920AE53740A9F9D70195E +C25A9858529B445A93E3A2E9C542485F86983F69F2D314B33AAFF216180EADEA +AADB62FDC1625F363D784CB1E372FE3BBACA8E9942D43400E1CD716E472C288E +DF4AB8FF861F2635E835B3EB01BA56E16A9A50BFBB44CA544C1F8E8B4937809E +EFC33FCDBF9B0380605BB91032980A58E8451B04C9C5771E2A2E80F0F0980DD9 +505F6C8B216B39CBA66474ACDA857B80BD701F6AA093E2330D2F7D6CA6A129AD +911EAD4E5FC1818F6A4EEDAAB5FCB6CFD6582C82A5328A129014399BE8217004 +EF372A4976AB13089DDC03C0061932C2954E3B3365E4FC98747CE4E05779D38D +BC544D15C2C0ABBAF5D0374F4751EC5A6CD6D7B0A67E51EC762805E5587BF103 +3F9B3443959F5A9C1CD11891DC55FA47FE954C1FEA592BEFC735A2318BEC285D +14F4C4EBACB91CA7C4C3E0F076C5E0310C357657628032E94584B384B19FE322 +5EDAC73733EC192187F028F3F6D9AB27140D799D45924A38683D5F92C8C6285C +9DE66A0A9ECBC9F59054D9D03CB913E899CDD5DDD755566EECD5180DB6BA4510 +FC244A395EDB3DC1AA44F88E7AD74983B06C93F19ACA5D48572EE12B23BBB1AD +6A6FEA136FB1294B0E12F6DF56A9A0276990E3E4E7027D41DE471FFAF8117FE5 +3DD9941E02B6750797BA878A153265967EB0B29244729949C39522311BA05F38 +A0AACC9E8978BAA786C7F85D3C869707364D7FEDC5737126406895456839A067 +CEF34760D0ADB87D95FD034D026683B786E131486360D8FA0E9573C21990A666 +CEA3085429F1D569FEBA7F02CA32B3A8A65885FC25ADFFA3165CB97DF5E00730 +8F32E045C7B2A5F96DC270F846FF246662864F0EC43AAABD94006F5355AB2C1F +68A8284D6CB8974514BE0DCB823A943D67D4ECA2C3DB223341C9CB09AD81DF89 +1D8158CD2563121708A43560AFA3396D61285D2BD9043CBFABDF2A75B91DAC3B +FA2276677EE444C08EF8F25EB68F625252C73B6E57B1823F0B7E3B0539DFDE67 +92D7A8B391B01B53497D4A5ADC5DC56D6CE71E37D93D1F246A7544A19B266593 +43898136491179CF62265CEE84A98984C40FE94BADC196EEE5C2988321E8AEB5 +5E6D5AF54AFD6B1147E4950F9D6BF4D732DDFA4EC5867EDE061E3CAF13DF2021 +96D14A9BB98A6EE506D001069DAE8F592CD7B85564B435F0B1084C1CE10D88EC +88A74BA11029B60A80FF7A0C3D56C1C17707DFC270837C6C6D85DE9D83994D17 +3976A7E98C34A11CEF234FE9EEF6DAD47997596841AC39AE5E18BAB55972A5B7 +0DDB5BCB504035380E2296270A47D69D7A31911CC590F71C776DD313684831F7 +7221CBC90AC921247C320A48A90B387924D9FD599049C421032EC95E9482B010 +944BDE291FE248231FAF0B13E5139646142216E116C57F5F3496D7718651E19C +57EB0BF3C8F0CE8B4E10D5EE6BF9B36B9DC87420973E17B3A05B82CABD297239 +80D7C6EC0C13AB1B1FA48BC6F119C99C90C725677AE4015900AF6B1F634E461D +C00C07AA2B22CDA45C159A79DA4168112FAC556353A31259F413649F77B45ED6 +4189237119A17374C20CA37F477EEA80922E6E22E2A575C481A8129AC41F4654 +0AAF818B4CAAE9DA11DCCF531C7C9ED757C33FB40363BDDD80057795E259DC14 +5FA1BB9A5090B21C92782C688D6628BAB06C516EFF0DC3FE6347146667868672 +415B8A6A89172FFF885E5C9A2F01D8BFFD5F057945D2C3D9A6AAD62735739AB6 +A340BBADD7C15833B367957AF8F44DDFD6FB691F0F1E4D85F84D80BF2EB42066 +0B67031382586543D505599808B1D46132BFA5B77FBFE9BC7B689ABB6E899B1A +00D56C8AA184A7C734911F19DB34E935E2087BBC0D15BB529036BD73C24AF691 +BD3242631C7541421DDF84AC7E9B7349DFFB2DD5AA11C917520DA78470C46542 +1E9E0011C970C7DC4E65861747B9C12B1631B157A0704B91A02DB671EBB5E386 +940A6F5939F20CBF99163DE8BA963BEB22161F612B314CDBB6334213489B96AA +621444217A5D1435C143479B47FC5FCE3AB0788D729A4A1F029DBC94AF166731 +B20673550A5C9489DE639CDFF1AFEC92CD5BCB00A0406230263BFF12FF2E0157 +C27B3C331D859E29EC39BFBE3076D9B159B269C71C110901CEAFE0B3BD833029 +2A4692ECC37ABC5F3805E7CA3653C677C95E59456724F6562A24624DAB7C57D5 +7A34BE46181B52DE1D01E2A2DA8222E2D31BB40AFB3924D79354973F7A67BF38 +BC4391960D23D0F317FCA92F0191E51ABE703BDF07DCD28E2FB77494F6EA15ED +38032FAF4E90CB4F75F7BD02E2A8E79530F76B4F0F02CA602F31D7E5031A8953 +C6F3C38D25AD19EE77A0F4D3CDC17BBA141E72DB6EB331A3B0B50A4FFF737D8B +455F934A56F51A5A4D19ABA0C3CEB3B574AB1A9ED80F40BEA61B2AEFF7EB98CD +4B6A7F2E414E89EFBA4CF541C1BD3C0697C39C7338B6873D4146013AD76D03B0 +6586C68D4FB8E60B7A4C3A40AA6FC93C39CD37577B72DC97A150674BD92349E3 +30EB87559E38082463B3ED0203AC8873F113BB08F681DEB4870075F46B620343 +6A1953AC9EC496BE435CE6DC593152EEEA6331CB9945AA4FE008937E16A9F570 +3E2A309C5171F683CFE26DF6836EE5FE3A4DD04C4BDB109D56832915B9B32F97 +F3B44A5D327125246A5BEB3FD21BE265ED7B5B1674922F26DE19C9F7F6495444 +9DC6F6D13F371C756A2B862AA499032BDD961BE5B4527B45C3C4D74E23260CC2 +944798F5AD2DA5DF397047D040940B8C916E7F272B21734BE30CB5E59FF211E3 +7EC389FFF7D3EA7358DECFC374280D67495C695C6EACD289C9E7B735D5DCCFF0 +36A614F61465ACD63DA0D2FFDFD4FC801E1C93EE257A04DC26AB406B149815F6 +21870221DF60CA8ADF2311C293B41CCD15E75A0433F057070C25F0D2EF94E4F4 +ECDF23A7D617EF72B213A03730ADBE66A54B1BF76049CBC3A3F035D31BAC2898 +63F269297D946552549A259B9C9601FA72E45AD8F5D0A7FD4DE2D32211C92A41 +7E764DB6EFF62D7CAC71DC4E92BAB291585199A4CD51431DA91429CE4127E30E +EE8FCF90605AEF343296596357A978DFC772DEC9439BABD866E794CBA07FD9B4 +F64283A6EE91E42266FDFF7CD69847A940FE7C0181F77D55A07A16ECD9AE83ED +91435DC75F6D7C5AFF4DD7A3C20EE0DA4BA99FE2036A7B7456AF936659D9FED4 +FD1939EE0AD25B550E8A655AFDA23EF4DA39777AC2A04890F29C0BC97DDBAE9D +D6347B5469A0EA8721773CC685F7066FBC2E8A1574559E8F2955397CE23839A5 +7E99457317916D57AA5B35FECB0706FCE9914535A0F487831925E4AC4335EF33 +66890184550188AE57854F3ADD15A0991E45EDA27974C06E74FE12FA49A5C2A3 +F276B5C2489FB288F49D072C468FCD9037E4D99E1C40F18D80D1E63FDFDC427B +660E4E36851A5D4A90F0E5F2D5FCBD2EC830242703F36BFFE66D61E50067A882 +A10E0CB20C81B0792A5B8EFE9302969644803E04D7DE8A7C24DDACB4563B604F +2FAE7D6F5112DF03C1F462E4154EF4BF0D8C09416E3805B036ACA990D432DC7C +7C8261DC2118E6E9921AADB908048076A12EA72E4A09C1C0916C88BB39677A04 +4563356556730E59164F949D62257E34B3036B22D454A3A61409F21CAC5544B6 +D3A94ED495AF043EED3EA880BFE5382B6C6D0B2A84B07F4DDBFF7B9A9F06A305 +A5227333C1A529E5C968E0E82E02622EED266332A6E033839A194FFB188B1947 +67AF109D37A85041C61A185E5A1023CCCF3D15BED794D8EA7666D35169031B0A +83A96D05B5E7D059BFB292452EAEE5EA78201B3A698086B3DFDDC56D59C0895C +7414F9CB0FFF74536B9E2EDDBD8D56357CC66EB7BF793C2CDFCD84B573378D4B +7D2F6E7E9E4890714FCC9FE519D33171DDC13689CCB9C6E08D6D4ED46EB6794B +D77251233A6FC717E811D800480690DAA62C8ACC2B5AD4958DDA02408288147C +19D919C3496BE7B150C321791081AB9EBEFF8FF49D2F51728FB366309CDFD835 +D0EE508C80D162DD9D64028FFBC05E8F98CE0253A8BB2A4C5D3EF860372B08C9 +10D9C2976E41B0DF1BE7A40B82078414AB72F44BE8D34347E10CC21A9A960FDE +9F8BA277A737A8B18F92D066911803886463A96BECABC509FBED1F053F58DF79 +27CF6A1BB379DF14784B2EC04A4E7D8DF6C3036697CD6285F02F23F61B3EB6C9 +2AEAAE6ECD0DC3FB6BF56ECA9678770446858BE8533EDAFE2D4CCB5FA1DD1B8A +7C4957E1FDC355445D79897FF7CC04DF352E6D87B8C72AE9635507B10B626EAE +FE63366EC0F60767E0FC4DD0C209C37E82D0FC40C3B36A2F5FF778176884A376 +5B8EC65A935F3326A9B2C27D8F27EF544D823E864AFE7CC3E399FA2F2E563097 +3D9BBF566FD818EA4305647A74A874712471D15108027C8881D9795177530DB8 +94D463FEAF96809727837C8CD9696E0D2BF53DE8D57A07F6D85A9E750B157CA4 +F4AA6426346ED5B82001E647B58614E1E76D57EAF6455617C43942D4B05DEBE7 +B6C682F9F567ED835EE288D289751F359AF7BE222268A6A3992699DF1C91C0DC +A04CB2840C4DA5AE2CD0A12EB0CE03735640EAF0AD9228EDD2215831550B6D33 +C4CDE9DC1A15CCFEDBFEF5CDF6114D99E3C558C01FF803B4C21805A4525E18CF +238164756D0F1BCCE87DD8077C8FA13C6AD8C761B5D76A8295806E530E5BB17C +8786E0C335371447342AAA37FF1B887958B720AECEF39D3DFB0FBADB7C9131F7 +A960B7BAAC9E37B76A85ADAE8B9261355A27DBAD91E00C301064C9883FD76985 +F58AE44E71A981FF35256D93B68260DCC27BED91A7C28C804784A04EFCC8A934 +A4B30BECBD9AE562F6EB682BE9F98BF17FE8BD62A64053EF0A0F211D4E7C9F8D +F31E5DF5FED9C2ED9F3B975C8B8026CC85B94EC649D76538B2757E08277600FA +0EB1607EDCEC8CA2634C58D4DB7F1A1233D3321E19097C8E93295876C0D5EE44 +5EC69BF603205FC7A32EC71382D6BB7D119D593EA158DF5BAD228CDB66C6F6B8 +2FB03F1DDC1B3FE3FC644E7C6072993BF25FD5DE26A114A1E9145D638C8A95C6 +AF48BBEF411D550085F04BAD83701B754C8B7FA377A00A59611D042732997CE2 +913727947DE68DA049D61363519AAE1F608EF8B06DD1E4E5EB9DF23219A98D56 +8D5C93AF071CE20E738255E965D39CC1821CF05928A21D66E662BDB1E6089A8E +D4F32DAB2AABCAF118C85FF17E8AB3B735E91E90FC07F84842C1467501B623C6 +4297CDC14D3D6F311C1B03C3E89CF6C02126BDEA141075AE10C7A6FE9164837B +ECDB43216E61AFE41F28D9A2FFF96412AA7DD7D621BB96A834676EE18BD6D6CC +1279613EDDF8191641AD1E5D65C77530A1C553C54C272FB12D34C6767FB8981F +C39A3588D4A3BB12CE53AA32B141493F49D23105F94365BEE1F5AE81B91504CE +5324CD2081E72CCB8FF5D9A0EE95A4A44EB358437D2CFFEDAA7E2022BE555810 +BCB2F1F321D87BF06F840C73FC6FAC2C8116ED530556C0CF5DA5595E10229A58 +C89DC8ED385A0A64FFDB5AECEB502354D9FF152C047371A96C4800CEEBEFF331 +BD0E4F7BFA507C6676B0FC809283DC4F2CD14C6490916D07FB2BD35C784C0AAB +A786064E65B87DF2F71FEB03ADC4750633F8493E16152BE1A3127F16AFACBA96 +32B71CE871E3C7AC466EE601B4119AF454B7819E06D400A017EBD36DDB4CFE93 +9CFA6D66C95F88AC649D468FF4528652949C049CC93C681D5F4D79501C664FED +4FF3CCF1033BFD65F94222F45235A0606524CCC728EF38906DDBF57FFAC469E4 +DD554A5407C8169C47E954FBA8EC7CCF65278F833AF690F191608E507417CBC0 +7E938578EAD15C2745526608B71829E327C9A841B9AF6CFC373E070BB6D45E6A +9CF939CA5B6704D3581DA8D0125B07CFCB1D3C3420242D77B98DD728A263F898 +C89FE77D8D6A60DD6A56486721EFB4C19A44829DF70DAB6EACE3CBE46EE6DA76 +2D6C5C6A8978AB1EDBE79B3654A1F45D1F5D28E7E28D631F1A1ACE0B065C1B6A +906F3335A11759333FBFB454DC2D4ED0E1E2DC6CD4F2400DC384A059FC3C9E05 +279154B5456FFE9AF248C5B9B3FF3B051DE80C0EF51F70D48A7518D5954F90A7 +18E633478D4AB1758BA882F9027A3AE05A61BFA2FCB1EC5108E416033E78166B +F5CEB7FA00B24FB99D6A8F4D1554F9B36D2E65B1C13FEDA184C21962C81C9AB8 +53312F75AC7DA7BCDA2749B5C4CC6BB13F259A8148E3DB5F54821C3FC7D201E7 +3C9FDC0D4D174B7BA121E3FA4FCD2F7BF0572C9C02CEC4567F13FC51E191EA2C +DCEA62F78EBAF4A6253ABE48B0FFACECD1EBD686556D37482A5264E10FC183D4 +318C62D02F83B6365968350625FE1AF810BEFD57A19CCFBFB98BEB52FF1D937C +821A47DEB8E32047A92D9B687E147BCF7574CA5C6986450213E09152818F5311 +451EFB7C35AE79B8796BB8044839FCB5CFBA818C685DFB969EC60CFEA7D89045 +78FBCB9FB388FCE88F6DDF752DED634A4695B7CFAE70BA244373E63F6BC966A2 +6CFE08A09400E99E5ADAC8E6E11AA2DC438A37CF2D6A76C264B0744734D9A333 +BC478007283D9E995C163066C9AB0AF0DF2E87E44D71FFFF528817E48D75B615 +DAF8B8077A2B89192FE3FE3562D2DB1BC90BF21817153D68F47FF99FC59E888D +E96F639852110E20E51AA0D38E6B6EF7E52709073A1543EF3F90DB8A3BCAFD25 +94253612B08220345B015060AEDDFA5C04723F2F404D2BC4FC05CB5B050CC48A +E0103205372BB9C2340EA48EE063E19F3FEDB608A88000CE31BAFE3B46C70E9F +D12E73A31F2F2C619791EA73EA25416E21832E3013B0D2E41EDB25BECDFD59F1 +C2B25AF3442F6A5932EDEC77444C98802C0CAEF592452EB8AE26CBC4287C4920 +2F2301F3325DC2436C820D00C3AC29A1D7C0E7C8AD36EF205E3E01A61E2EBA56 +9BD79E674AA28AEBE93512EC76BFC9050524FD0170EF7AD9AE841F23054D7D4E +C201CD6C410DE13B7E6FE62385D647EBF0E725C098215DB60E8B01C8A5199CEA +BC6BBD05B3438EEF8F078E49758AC7F89C56509ED0873F89A811BEAF4FD29391 +0CC11DE414B07372559A27496C5F6DC4E9C36BF610E62FA696015FA98E8FF19C +C9CDB89CAFADC73493EE09CA6C1A632D8FA74CCBE0665655592F74B3472A7FA7 +2F577472D31923EF5B522C0CD76B81FCDA5F29659381EB7CB7631643298D2DF2 +F0B4B52E16551CDB0A0C1568ACFD00AAA39AAF18A2ECCE85CD763A5A7D792ABC +96C3DC5E42103389D88A50B54B300AAC071CEF2D354BC2E0CC6311EAFB22D0A2 +B71D16408EE497CB67C78796D1E9C294B88632957ABADB2B0B2BFCDED25819A5 +93FCB13ACF15BBF42234B27AE9ABC68573CA90DFCBC40F6463BA4C68AEAC13F7 +76093C87BE8778E48C7226B1DAF7412972FA7B5DE9A4312EF26B6453850BD2C3 +F0323DC1C655CEDACCB4E87213F82BEDF619BA12AB5A40129BC9E179579937DB +DC0C8FAFE50906850AE32D086DCADE33248C3381345A6474EDADFDDE24E0DA67 +05F03E822CDAD8A958ADFA7FC1EFC7D03BD31582FE4EED7A768EF13550937C1C +3478C937ADB7FD2776D75797B8748C5DA78C097A114ACF556037F86C5382B33E +8307CFC43B5571B5CD5EA192263B287397EEB9C277B0FCC88E140F58569B3255 +60DE9D1916480549168EE6E23E2DC616602E8F0E14FE938408EAFF0C8DAC948A +666477512E5375B85B3AB5B5254B948CA04CD71562E5AD6493534C0A47C060D7 +4FC6632A43E59050751751B5FB9EFB71D259A7D4FE08CAB2DE97DF71FBB24156 +4CFF70E87AA9AAB3C5A00198E6B9D12E7BE079B1CBABBD4FBF5A297EE121A18F +7F154782F76055C3F9742F4C193E0F958D04D1CCC929DE24F56FF2AB17D05DF7 +418F0E0000E5521A9F3E03D6C1E8A1C6BA04AFC719C418C8BF41F2F489EBC2DF +7AC5C115938B085F94C4A5AAFEC2694F360BC2E509E8967426D8BB92C3B46E81 +5D23FBB6F8654BB103565967C9671B0D0CCC30406E729EAF5447AC65B9BD0AEC +E68BC9CCC4F58051A993BBBEF40145FC3E85D3AD817AE74C95C2F777F5DA2814 +6CEB79BFD601EBD0A1C72FBB67B73266D6A0ED656F93ED61C44EC7DE891D28A8 +4B25729F58DD478932367018AE6C63FA5C5FC7EB2EA175CDE388750897A798A8 +03A92331596419241961FE5DC38DCEA02AE7962D68C5D6667DA0BFAEF3E816EA +D3DC17F8B1708D1ED52C3F4A0244C63A3B639C393C735F0FB332AB0B7848D0A0 +C94FF616B38BE032BBD0A450E101E8592C804219F62A5A675365A56265B93881 +D66BFC01FA08FF58C502A7D3CA28BF0DAD846E836A1E520E60C2C1ABABDD2DF0 +6FB012B947E376BB0064CD07691A26CC0F5D1AC3F48FEF04BADC4DA29B4412F5 +5FAD7FE00E477B22FDDE54F922BFC45029EF69BACEE71A9DF13C0508095FE617 +9CCBD486080DD2650490CAD32D201A05E71F43FAC32C97C07A74DE38CC390040 +141F33F809E3407FE2880F0F6763247A3E245527113676B8DA900777A79B21C0 +C891D196420C52833150FC6EFC62387AFB1E402DA2E556AA19359D0BE0A75593 +7C66F47D6DAC7CA25957CDAFD550AD5E2A33F5021F4D81988A2A4D90FA11C9A9 +45E2B57705A81D89F0160705E0FB4CB4EF5793704A3EE8C6491CF3C6F44242EC +42836E7125E349053B034C181E9AD0C71C56E316133E58EBC1751862B9302994 +351FA8A4FBBD3E681A6D9BD40C0B415B1E6E17917D229ABCA18BB2B0825D8BDF +C69AB3D2CDF0C9E3FB6500C9D58A6ECD17E882DA0A0B150482D1EB95FD491D59 +7F82C6051BCEE0AC84C2A85AFE67B83D71D2769E8FE0C5ADACB7DB9AE25926E4 +8D80B9A1B949C4443F271983D0DD52EFD327AC4283B7FDB6957BC7EC2D335619 +9A78A6CCD89454970CE1DA66B35AE8573100B338DF0C8C5476A6B78418BF9E20 +8A33D3D7D725BA7A23C1273ED7F731BD7392D8AC0194D67C61B8C334CCFC38B7 +FF9F3118B5C2751EAFF59A191C2E0A8AE8364CC560BE42D88C6F4DDE4B61D02F +6C10C010B55F27AD5DBFEA393202663EAD9D3DF5825E5CC91C43DA4CF1AEC0C6 +DF07F1642005687C63BAEAB5EE6744CCD0E6FC73C1FC22E0B5888063E3120618 +F788F234AE16821CF04E5791335C82225921712DBE75C540AFC913A501F72E0E +7BE4ED1B412C91329B707D61F2650EBC2FDD72B3930ED5F1C886737C0D6956C8 +F1C2765A9533919FEBB984527C7821CB5B1297C5963EF29F19F8DDAB7BE15B76 +9FCA6313E60D34D8369880F9526242FC937FE3425324AA3A9714809B142CC61F +39831558321DE167C4DABD38F10E880FBB15623E8296350C84510473A6008DA4 +24CC989D0ABB7A8DD597ED36A171812D48849BAF64F6F441BAF818933D3F9986 +E8C4EB771A96921349DBE1E92CE009CC5C67D7BF9132D569F645D0ECD44BAEB1 +590FCBCD3706FA20D1872A1ED643503A3966676DD0A816056CFBAF9151B7D841 +335F94557872EC441BA4505C65A7F1477431805C7DFED9CEBDBEC7EE49E87D2E +1084BD0DA9B891BC23F3840FB44CDAE8E7DFE6C06A92A11FD13FA19C78F38B6D +605D03A4A6C62EED344B590BBF935F4D51BF641FE8D2D10529D7A7EFEFC2F0B7 +B8D42B6A17A6D3A87AC8AB15BADFD2BF2839AB869D3EA978DEA0044AD7BC0E9B +B6CC856AD362AEE4673D9C1DA8AEE8F084EBE1857A22EFFCFD8EA111D073C6E6 +CA63E3A78EFA85F24FE4BC1F382A48B8922D09D6231CC3AEB3412E8040ABBE80 +0BC85CEB792A99115DF49286848704B00BB1A8D25148FFDA511FDA7D9B3C527C +2277FBBB031CEC10E41E416875FCB893C94588B0FC2C2F2C734068F500C5BC78 +485A960F3C7ACF3DB22810D5257CD74EAC2AA6A30E870A38241084DA09FAA76D +2F00C09474A4B5070ACD2B027A0718F0B8E8BA85089C2D63EF04B6CBA6F22D3C +BD0701F7E05EDDC1C54220CB8AEECB99581B77062FD897731CD4481FF512C4C1 +23C2F7442A2A6E21EC05B2C9874627A1B4C552286F91D172BC5B47ACDAEDBAE8 +F001525DBD896E2C07E98DE32057A257590868DF95715577B69169DF9637B00E +A708AD09933515D26944A373FE442F64D488A91AED5C8F8EDD54A554EAD49218 +CB22C6196D32FF0EE679CD0259036452AA245BFF051359A8A2F3A9D06BE188E0 +7421CA5E3D070C565AE3A70AFF0ADC3A517330CFECD29FF5B3940FA54F187639 +D37091DF4BEE09D29F2E52A32AB5AB9AAC098E0BFAB4B7B706726038E1CFE2CD +D83B1FAEFE1F4234182DBD5BE8E9AC7B2B887E01CD374A825C3D764C3157CD92 +64DA53FB9A596AF2E9C3F3D86A5D73850EBFF025A4D2D1A4BC97407AE88ACEA7 +DE8ABA009D7359F2620B4DFEADA09CB8EB68104E65B22F054EE6FE649F72FAD1 +B2F00BC4435D55EBF44035F5934A35A2A0621A5FB4F93C9615C2421A5AFB510D +D1260BD366D5CED0073ABA8B7E3D0C59C63F5C48C2E3C77553B91AAFADE691D8 +D8ACE45C20166C35503CF73B48434A90A516B24C9F38700652A96F41E4AE95A0 +2E5D31470F2ECEBC3D75C6AD794F66494ABE216CC25A1E385D5B9398CF4ACF5F +3705DB2A8FAA799803538AB3F81E1F798EE3EC152DE1CEAE132555D3F55F7F90 +B94FBD0889CA3B0BA1AAC8DD6C3B0CDAD21B799F5478A789F9A74EC7127E4259 +FD98E4EBBE489F471E799ADEEB0613E92EBAE7E0F9E09AC03B342ED5141D5774 +5AC364916D8116EB103E6C9E1819E19832ABD66F6452753F7F6795F274D82D83 +7FE689CF8A181CB425833B97F2DA9764732AA0717F0CE55DE70F938A37689301 +6F1A1586AF803C0AE64645D97B1A9AA141A24A9B997040714330351792616442 +70C8BA50FA4DD5238E2D7D6A16C9B5DE3F8A7FAB2F4E5655DA00481EC4B15B48 +E047AC737F5C380DA17F57A835FFA2D01B8EB20C0F3CCE270E208514915B8058 +CE3C9C8888F53CD8952492A00674F53D94C4B8A68EA98E34D37CE574C3F312D5 +D302E1F5218CC62C9C8D75092D00AE3F603E568E95CE6DD81931B352C8D8BB15 +AC9F11BE312D2729F0BDDBA215A8A0CDFFAE68BDB49F696DA0C3EBBF349B5273 +3D4A7A36CCA0446F7D16A668D51B5165D70625E3E96758387E40A330BF5787DF +73C781B1F15EF16055DAB842029CE24A9677CC6E981A57A0209DE6EB62328DA5 +A05486E785AB73C5302172A5730586EEA3706801D39C02AF42B3C37F918AF5A1 +EDE8CBB0ACE44EC34B1BACFCFBE962549D05B30B572658B677C4B7D56E5FB7EB +D2F632888454FDDD3B8A4DD6C226284B56FBFDEEAF915D6BC129939729AA95F1 +B0AAEE02C119EEA3756BB7AB638DC15185D7D1BC5442E4E2037786DFC19E06F9 +5758344DCACFF12EA0D465A4F1AFCBCCA6B22B07A96E5433CC81475570A793E3 +6899A1F9BC3750C9EDA5A5010D7CBA24970D19555A6613E1C0A20B2CA1A2305C +6C59C11DE0E8DC0F51FE5F58EFF84F2DE7F18ED0EE7EC3C508951BAA11816F45 +53ECCE80B0D09AB23E189B890F3C9A4CEDCB7F0AC07E1B52B2CF8B6ECD6174BF +D5E66D5EF94326CA6BEBEB2D04A2F5C87A0DF0CDB072318F0329C49E799458DE +A2B772A5CE622C262F6294A8F691D83A188A377A8D78BAF59F08790BFAE3053B +85DC75CD7AD0E641F0C41202EA3CB49848C5269DFDDBE3EB5C9764FDCADF7E6A +2762909FA8C166070F69E0AEBCB03C8F97AE8DE40C7802FBD751A030425BD053 +161DEEB4A6FB85FFB9CE609F06D425C05EBAB2D4820FEBC450A3144341C0F597 +88B4917D4F9FE6D4CAF30D06E1129488AE8EE622325F21789B1CD274094CC311 +19819EAA3DE9703A5002BE9DE1BCA7D769A3069EACAB8261900A2A9E8A9444DA +D7A922A26CD7BB9CC9942DB574AFF1411F44208538967F4249A3BF4BBFE81B81 +92840607C3F4C8E804FD630403D6C6DE60A3F0D0BEB9635A28BF4BB3A789D090 +E754F4367E29F13DF28304F2178275A71938185F6E680782AFC6BC35C9FD842D +73EB566DEAF118649070090E43FA7E572036A606FD3FF47578B9594FBFE2C56D +35AC38CBE303AC04F36D889113D9CD423FDCAE23D8A63AA3C6CC2F6CEAC37032 +B1AA79C500AE5DF39CBC57BB4C8492B1EF276BC4D2864F67CB09C14E6E811F33 +46DD35E4899A072C788BD80D5476648416FE383B9FFA64BD69D5948A5E10C8DB +6774A701585216700E825306A23996B549A865255DE7A565840CF8F86EA30177 +E1CE3B1866D2F94AC553A0D4DB307A7D633D8CFB67D621294C32E8D4D5F48459 +994EC4BD53794F2FAB1B95431B0F40690CE80ACFBF249249FE6A070914080BB4 +8D56F73210F053B4DFA0403A2A30E4CB0DCD0E721E4143FC1EB918E6B7C2D977 +26D86B1B7F1D652166F169A3B058551A8BBA687A391FCBAEF337B3964CEFA7F1 +0A030C097F440A1D16FC14D9AC1243ABF8FE0C4572C14296FEF8B8EC6E859392 +96EB8291718357C6EC7422D8ADA872CB672AF4637086BBE35951C61789A335FF +5B904F17DFFE9F4E60523D427DF645C22377E1DE1407A41DA9748FABB258B3A0 +14E168C2A2373900246A6BD88F25D3FDCFD2A91A5197B63C1CF59AC4F26C42CA +B1958989A1B36641B51A0E91FE03E90BDAF96A7504EE3193728FA8F86B1F0665 +39A56B4283E9C789309ACD9445483EC16BCB5331571D67F2E6135234A855C65D +2702310B488CA8FDBEE958C382E40B96C543F58E2065D5385558D2DC2AF550A6 +DBC437EBC53BB1B3B8563195B5D1198FD906DAC9D906CBF59B7BBEB92BD29131 +B42F42B6B0B4656E0FD8D18BFE640FB479447BF606F361108FF3C9A9499038EB +87A370E44E8AA019689A900F20992619915ECE3FB679F5834F1B0EFE293595CA +0D37BDC0ECFC4D8528D52A14E40F8D3B0FB3AE69ED29FC7EF377F6C48A5E8ED5 +9EAD17923AA47F3A6FD58A19889C31DF0B8FEDEE49EBBE4749746C54362547BD +678CF0153BBE1A8BABAE7046182A542A9E91572F980E33B2D8AEAF2945E0693B +870787BF000663167C0084EDF0C35E055F3208A331F34CE8112D63EC8A71D129 +2EA41C7079AA2CE261F2C3E47E051635E5177AEA3626D7A4D7B5E42F66986E4A +BFB5FCF022A6DAB4DE877AC2DE05D1BAAE32B6D5CE1F24E570D1A123F8D27C53 +7E166783BC7A9437F9C3B6968C5386E9240DCF5EDA0BD2B2D91BCE2DADBE00B7 +20C262DDED733040979E62454C5303F01DF1CA7EDDF9E158E62251914918CD4C +88CB370FB1F68866CA2370CD9926A54BE41E1363236189AEF679E6560EA9765D +E5B44C035CF0378A4D684516387CDE0FADC607F86962DB50E2C82126391A8E87 +DB03285E829D39FAC94FFAF70123C3AD7F083D93A066B6E73186EFFF1CB951B7 +E746E52F54B0EB268EF21109CECBDBDCC99C59F5B545A8E93C6CEE6EA416D3D5 +5073DEEC1C4501BA4CCE7AF100C9F0ABFA5563B61F0DF4A1FDD5484B49D13032 +BBA269116BEEF5EC05650610408544C375DB8C4DA370941BF2AAA1ECA9BD4AF9 +783F2B651A22B51DE953BE94FB5A296E6EA54E9FDADC818BE4743EB53913172B +2C2411BF4D60D5ECFB84906F4ABFDBD4B70327EF53F465BDEC2506FC278CCEC6 +8A89151EE4616DBFAD66CF4422DC9F0E15D9639E54E1B47BE6648059084D58CA +110F38D77EF76775570E085F2F9496A4F2646EEEC6C269EE35DE9F756117850A +8E722DA4B8C26B836B428520A904EB109F4EA09F47FF99CA22F86C951D24B873 +83B9403DDB0720DC3FC4BA6C33478C13370509EF5C7CD49C10CD5FFD25043AD8 +1DD09529FF9C91157E9006A017B2DAEE542B39AB665EA760F6D24A9460FC0A6B +5C3964882F4471BF38E858EBA3BCE70230CEA3B511DADE4E892451711E4C41A9 +679CD4D9067575783774FCD8BF7F20B53D8B19AEFD81F44ACB4704352BF0D25F +F8B14D5D0477925D6792B93E3395089540C5BD082D7A718304B12AC0B99EF0D4 +4588EDE56AD2CDC1A23AF9D2B50FA87319D0A0610D04B69D9CE7DEEEAB2B7B88 +45097DDC86E8F91875F259B8D033C44D1C966262A5E9A2DF0C9C16858E97D4D9 +3DBC278F765AE2DFF9191DFAD87577F7AE031045AB54BC67FB0C54199738DC50 +D761374A1F6CD36067A595D5D052EE1048CD4F6C3C1A093B04FBA24FBA7144E5 +BCB6438235EFC35F222EDCEFF7940C1F91FBD93525F8B9D3CBC3BA58DCB29043 +E720B4C7300FD78BA24C70BFBDE3398AA91F00BAE8A4C04A04C9ADB9EDAE27EF +6C6CB5DB6FF0E4FB3127901F0CC575A8D8A492EE03AE4E8ECEA6E55D60563015 +4A157433C362D46B61908BE9445CBC25E50EB1F664072ACC5FD11B24449E6C29 +296E9AE446A63956BEE6A25607E2EBBE7F4F4D4FD4C98FA3A22AC043441F3140 +5ED2C4F32A54F05F1C3CC03B638FE8744F2C053FDDF6F0F87861298971C972D0 +EF6429BD3C44D3606D6A10AEE77E32B88B0648519D6F2FB2380290F7C873451A +C378B78290346C03047129A7F529018AF6B56057FB08B40B13AF74C7257C15CE +38810F7D912FBC3AB457B7018C985F31EEB76FDA63B95BBEB1F8950E5BA5926E +876F0FE954AC8D5A7E5778B3598D4661783645DEE64AD6CE7B7D027D2DC61298 +27C56100FCDBF2ABA512AFA2DB1EAEEC0DC39551C5EF23334FA516B9C10A6FBB +34A23712A73876EF7C71AF2A581B68F618C32DFF596CE1069B3EC5DA24451225 +A8522AC59A84EDB613A4B00D2AE058FDC9E1AF8DDA2F29C9D4954DD815FB4372 +D7C07781E7AAAEB3DA9FA9CC3721C870076F01787F31B455E68082BCD1F1C3E3 +84126C4B5668492DFCA2531A2DE135C588F328470497CE27EEE7FCC2B74C1BA0 +30EF399E8BA5C616A4D45BEBF2DA0BE55E96936CA2B9BDFA632A9725B3147B59 +C74FDB36D91C92B60DF2F7111CD4C7F59A47E43C0DB5A440C727BFCD133EA099 +7B8A5B801ECD69A1201134DE7C6B6EB80FAE9C8DABFC970F6DC03AED9A383C73 +A463FD3CF42EF5873F9639D55050FEB92D5C74BCB69536D645D763BA62BA4771 +9830AABE85B84CD6ECC2B2CFB4501480B5DF833C836804A0B463F57CE5AC08E2 +15480D47EC254D02391279E72A146A0834988FB0F8EF95573A359A4FD262E44E +79FA3F29C27CF9934B03881A8561C3943B2928967097613921B68E014BC60C93 +012446D334D3C539383A01371CF0CB6D3FE6E15955ACDA7F74C8E0F1DF3A2FB8 +D741248FCFD64378DF4DC90DE0256840826A6E0892A17E7E90AB1851A26D3D05 +F4C4DDCCC2A0B758B90C236C0BA05FDA098BA199228AFE1DBBCAFA7DA390E07D +61250CDE484356AF8B6A29E4595A98D0FEC0770B2A4ED9E5566C7FEE4E9409CA +99DB69F7353F599AA573A251F8BAE3D6A6ECFACF07CADBE1B63A5E55568C903D +0EF6B59B3484B13321C3ADD862A135F4305F3F2F21D188D7F1CFEDAE964AC4D2 +0250A68B5F36419E41AC852BC8E3FEE7259BDFFE250AA71009240C138C546574 +340F7C6395E904AAB07C05032FCA7BB333A9F95ED35B115E8449C26E8C6D8CA2 +99C1C38D652A5E14BD7E8F4B4F89D0EDEB082BBF8A0058E95934FBFEAF63A99E +076DF6A6259389002B0F4D44BC0D54FCAF8874606138F4DB1C39DE366938F12B +0018E1586F0284619962950D8A17343E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMBX10 +%!PS-AdobeFont-1.1: CMBX10 1.00B +%%CreationDate: 1992 Feb 19 19:54:06 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.00B) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMBX10) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Bold) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMBX10 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 12 /fi put +dup 19 /acute put +dup 36 /dollar put +dup 45 /hyphen put +dup 46 /period put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 52 /four put +dup 53 /five put +dup 58 /colon put +dup 65 /A put +dup 67 /C put +dup 68 /D put +dup 69 /E put +dup 72 /H put +dup 73 /I put +dup 76 /L put +dup 77 /M put +dup 79 /O put +dup 80 /P put +dup 81 /Q put +dup 82 /R put +dup 83 /S put +dup 84 /T put +dup 85 /U put +dup 86 /V put +dup 97 /a put +dup 98 /b put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 102 /f put +dup 103 /g put +dup 104 /h put +dup 105 /i put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 112 /p put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 121 /y put +readonly def +/FontBBox{-301 -250 1164 946}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5F00F963068B8B731A88D7740B0DDAED1B3F82 +7DB9DFB4372D3935C286E39EE7AC9FB6A9B5CE4D2FAE1BC0E55AE02BFC464378 +77B9F65C23E3BAB41EFAE344DDC9AB1B3CCBC0618290D83DC756F9D5BEFECB18 +2DB0E39997F264D408BD076F65A50E7E94C9C88D849AB2E92005CFA316ACCD91 +FF524AAD7262B10351C50EBAD08FB4CD55D2E369F6E836C82C591606E1E5C73F +DE3FA3CAD272C67C6CBF43B66FE4B8677DAFEEA19288428D07FEB1F4001BAA68 +7AAD6DDBE432714E799CFA49D8A1A128F32E8B280524BC8041F1E64ECE4053C4 +9F0AEC699A75B827002E9F95826DB3F643338F858011008E338A899020962176 +CF66A62E3AEF046D91C88C87DEB03CE6CCDF4FB651990F0E86D17409F121773D +6877DF0085DFB269A3C07AA6660419BD0F0EF3C53DA2318BA1860AB34E28BAC6 +E82DDB1C43E5203AC9DF9277098F2E42C0F7BD03C6D90B629DE97730245B8E8E +8903B9225098079C55A37E4E59AE2A9E36B6349FA2C09BB1F5F4433E4EEFC75E +3F9830EB085E7E6FBE2666AC5A398C2DF228062ACF9FCA5656390A15837C4A99 +EC3740D873CFEF2E248B44CA134693A782594DD0692B4DBF1F16C4CDECA692C4 +0E44FDBEF704101118BC53575BF22731E7F7717934AD715AC33B5D3679B784C9 +4046E6CD3C0AD80ED1F65626B14E33CFDA6EB2825DC444FA6209615BC08173FF +1805BDFCCA4B11F50D6BD483FD8639F9E8D0245B463D65A0F12C26C8A8EE2910 +757696C3F13144D8EA5649816AAD61A949C3A723ABB585990593F20A35CD6B7E +0FA0AD8551CEE41F61924DC36A464A10A1B14C33FAFB04862E30C66C1BC55665 +6D07D93B8C0D596E109EE2B1AAB479F7FAA35279ADB468A624BE26D527BFF5ED +E067598E1B8B78188FA4BCFB0B51692D07B0BEBB930C6F0997B437E2C51B876B +61A563A2673932C2045833FAA35DB22ADE12102335D5DC734AE3AC5EEE6658D7 +92EB62131E1DFBA441F53EFF9021D9D4C491F26BE8F54C61165CAD778CE8695C +EEAF70E3B20C64D4C2B34A084B5770BAB2A8B7069E84EE1039A2E43E0DECBBEF +93189055A49EE66B5906996FBA7A2F052D44A9EAAB6DED6ACACBD4742887E4A8 +FA3D14EC60A2413277027F80FC9B4384EE6F9A1528F7E58A9CB23E3EDE43B06F +E978B03C604B50A5F91C47346DE482B3A922A5D0236FBC7C8B46BB2355A1E805 +C6E30E5B2156F4C26F2C5BEE2DB03051D5824E81313B77E67A9C745F9F696E81 +3BE9158CE6330EFB07FC15E8618153D1E4D5E46141140D9ED2D64A1706E81687 +7BFF07DA3877D7DAEFFD70643D1A32AEE36CC2C0B376F888AF34291450DCA410 +6A49A4D5E8C2D1CF884B6A975FCC00E143C634C2CAAD10F354EA13055C6C7F35 +65B4A26C6C28C08567BF5860D0930D7CCE02B8A16F7DB74AF6D8B7A401DF26D9 +B605F7DA453F60E8E89DF07C2A11C0E1F89B02D061B7C9EE6274B3669D367C6F +F13C336537B67F235795800CA8EF1EA8591DB59BDAECC087BD360B3B50F5CAEA +8BD4F3EE074773D8C969DDB7B64C6A7BE3956ADBECF9836714BC6E754FC09E57 +DFDD95F1A01A3106AC80DB85CE663658EE74C714E6297496EC70890CD6EA37F6 +148CE94413F1D6CE5A3592EF3F99297874E13A7829B3C18BA66F9D093C3DAAEA +AFEB3F714A5449DEB7DE2F19851B4E65DE0679B74D83F1ECA1FEE76D0AA42B5F +5DF085720F44508D5782551D7A7978F3681929E6EC093D73DDE8DE8A938C149E +7E436F574115EB02F9CBA61AB32B9F27625CBFF17E3AEDB5195B493A149B1449 +5EEE848F16BB2EA1457FB44A45453D9990FA4F9FB258AB55FBAA37CE0AF7AB18 +8C46E921805055944A406128C21CC380EDD623BC1FC5523E9FE0F860F4D5E543 +1E9615777533FF7F92D1F1233151D7EACC678C1448D79712A58F2ED9C68137DF +777A3403B563AA12F66BFFC69A9213D8E0990F3D44409A0F041E1F33662D0E2A +7ED134E654ACEF0B5F8C6FB271BBC84A300794A6EA89E6058A07F4A84C33DAE7 +967153F4C4E65357C34143980E9EF1C04FFDB7A683287B101AC4D7EF91B7D648 +141E4DB0E49806215706B1F4A5174C9EC19AE3C55E3191A9D7EAD3294E77818C +EC06549E92C90D62BF85EAEAE51E4D7B7D66B4481823B60F897D0DF74FA1B72C +6FC4C10EEEE3A3B686AEAF763059525C69BDE039B398A8115F5C53217FFA8280 +DD9A35A85E0DF9D40780E0E6D62E9AC1BF6BA810B780AD3D79CFE274CEFE48B0 +40F7B2369A722FFC2D5292C5B5CC8D29CB56B98AB182463EE08956A36219A079 +7E92BC33856ED2F4DD53ED0809CA4F368E41C1210E655BDB2E58BC91D520289A +07B72F3DA93330C41876A4F13ABD480EDCD34370F71F9BFE330C32D011AD62C7 +16DC3E93BF9AE378B09A0C3AA2A43A1C61B02ACBC9061C116C0AB42EB60BE12F +F80FC95C5C51CE79794C620B420C9DD83667150F6EAA923D0CB79A60CEC8B9F8 +3E7C0F58421A0C349525E14A369FC591BA86A3748B4618EA8BE788D5227FDA5F +AB37F8302DFCE43E3800BC945E9A96108301AA65DB2DFE6E371F1D24AA406458 +C3838FBFCF37E7F1B589D820F6D54818D2A0224D8A76A420DA12C56C7856BBC8 +3A3AE827418D1F3561CE924B03E75EC9E1318767385C09EEDD5152CD0932818E +5B5D087D070E53435F5A3A63FC5C25CF064F69AD37837C7808597FF974708DC1 +7ED44F6CED31A17EE951B7D86A1728BDD8B0D862601489A7140F932EFB90BD98 +4FC42505AE9F6CE40DCD06ACEC02DF178935876CB42DA115A08F9BD7DA700CCE +3B11AA257116B2E1FCCDCD7D6D692D3912D23DD521AA0CAD0A040ADDF0E27259 +40F6A9FB2F302732594F8ACF5369209B553ED9DDEA20CA52E42FF30569D80212 +01A544C966EF2F1EA5559CF516784B964A5C4668FBDD158DE9FC0E8C8F5A66EA +1CD364F124CE3569AD8CB4BAC0A9B9758AC7A9ADE015CCF6BEF9ACEF00F0DB2F +A9A7C2E5FD498FC0033CE4B5764D0B2B6BBA47D9927FB015152AE37802E598F3 +5CA408DBDBEAD7A02FB943460B80F02AF30FE483134DE7A89A70569E590BC20D +493B2EDDADE1CB532D51C268CAA0F98CAD9DCF4CD3F5FBBBDB16A2D65B415CC0 +59EDF3602478BCC8F7D2313203FBE416AFFB93D61871F5A9F10A6549DCAC851A +4FFDD7F922D1EE32F6F67E53967D7C12178F5AD3B8B483AF98E6A8959607562F +22CB9FB8EA545F007C34F3A1C7D3D560545E145A8E57FF58BFB486B844037C09 +1C219D212F4C13A1736AD7D55100BEB709D110C4B95D589B1471CF7E074CB3A4 +72C0E75E5CB831D092D7D872A34E373415A1D7DF6C0B52D9F1535A852874B282 +9BB014AFA74EA7A091E2FB1F3B3EF01D6F86C3F46AA79FA519489CEBB95AB5D8 +BDE011394DDAD57A318199FFF087A8C495D3D93025285FD85947D5297DB85333 +575E25F03FD37F8F85AC0A082B8E62CD160D93840EF8AA09F90D0BAE848C08D6 +DE2FB5F5DE2D6C4462B82C19868CE9E969EA4DFB9EDD2AE3F83EC0F238FBC1F8 +89192A00EA10936B77EC8A9E64109FA7EE534C395D415A106F65E09F512D7A56 +F4FBF94178527775519FC4B96E8EFE5F4F3AF95502B02DE37A065B438653FD0D +E4EA28180CF2C3C166070F69FFFAE746DD8E57B302DA740B4340222F597ADD7A +E49E33AD526598C818E5886EE0EA7263871585DCE480770E3D8B4B8B13EEDD0F +962C92E58088CAAC81A6A9BF7912485EF079D2DAED54A01635A4C16EAFC60FD2 +DE6F2EEB2DA95829A7028DB2F58983F4AFE39B58BE62A2A73B300B6732A981B1 +DEF8B09C43F22767946F11BCF1FCD38E32320B412D0BAF7E679ADAA54B28DE94 +9D78C58B0D4BC1CE211E395CD560A49D0F9A7A4329C9FCAAC6B6B84C46510657 +1ACB0238DFC93E208D389647E379A2636A640C00DD91CF5B4751817DE2958735 +F9E0EE7EF7115008A55EB83DC993CBA141888F4A2C9C51E888EE2F9D605DE520 +0CC0CAC86ED519F766C6A74EBA418A22647CD8D933F3BF23B75C96D445E57402 +BBF9E0302C546C094DD18372E64D85C42E6AC4D4AD13290BE6161314A56144AE +02DE38A0019173F1AAD039B9B3E7F1E7D123A10677A7B3E38465CC6EC3D64BBC +145275796055097F7176178F8872C20BB4CA7FF78D90090DBEC1FA708FAB9C8A +94376FAEEE7FAD0CC8B47D82AC78BFE2C2E2CAAF47D7CBF1912708D4FFBCD602 +09779152E0A031921640B5E13A02857653E84718155DF220E0B92385FEC5B006 +D22F936A6B604B241769E52A7028089163507B81D5B6AF5E55B991789F2FCD0E +60AA72063105ADCA6746EE997E9417A457EC9C9AFF9D1F82AF16F26051289374 +29340F530E3FEE1A93663D60BE0F64E58A669ADFD3259BC9C4CCE5825EA5C335 +133CC9CB740B6980FE711F77FEAF776CF5ABAFBAE54853F94E8F2356574555F0 +AB8DE9FB57768BB67C13D58DD33E2F176161164A48F628427EFC3B5F0A8F2427 +D58A7E8BFE8C7031EA69317676012924C3AFA986C3062BA67BE5A71359851EC1 +23D529291F51D4B9616C906D9E5EB72406D037B35AB82F5FA32068CE1B0DDB5E +FA5DED13B4AC002FCAFEBA0DE4F6B9CDD9CA7BDED2B894DF5F381CCDEF003B16 +55B99D680DC6C885B2B33FC8F3BA106B0902EEBBD3237D18FABDE44FF2EB163B +131578EBC15CE149894C5EE6578DF9D6708839A032490BCECD052E20A7C94367 +DB0F920AE0DD15372FD44423C4600A289060B39BB34FB0EA116788F9EE088D46 +172424C79482F2DD7F66FA5B01C9F5D0BE92456BFB89156BD93AED6EF1D7D891 +949962B3CB8D7D6273BE685CA811CC28B230782EAD939009D7DFC00E9285B108 +CCC7D9D6A43DCE13FF2059CBD423FBF87A40E694AED1CF6E0D9A12972C904EEC +C425AE9234F026393CF082E3BA95FB9FCEB37C35DA6FE24EF295CCE723C55FC7 +F6F9EC01A8D464A390E891C572293A15D6DCDDB56EE751524F7F19975E9FEC92 +43313C65E41D8561551EDAAC6D5AE5EBFB7DF225A6646B9A185DD7955B87F880 +F919BEC708EE9B5D386D8BD82745AA3F03DACBA1F58A70E4C30096FA18ACB48D +557FBD3763536FD5C19E75E150DAFBA4BBC3690D677FF20886F8836D53EC801E +AAE0AABFE8903DFA95AE1E27962CD337BB39A91CC69BCA07C1B0C0A7F93244A0 +63C454846DE0FCD53DF32ECACAAA5589B06D218597CF2076D59B7CA9EB78A67D +28B42DF3C1E286700D4AFD82A63D9BCEB2CAB1F1602DABAF1684328249F7B787 +1DB3A707CAA7C9EC158CA3574DA91F049A888053D64D393F20C52C30C15B3EFE +6E87A1351D0839826E0195AD8A334607649AA0A9847EF013757971E9461EB47B +289F74DFD982DF89019E0265FDD4A10AD14CD3EDD5D6555A9A6338C1CC83EA08 +CE3FDF7393CF854A9788CC31C30FF76918B9D694D00E746276EDA71AA2AF30CB +82CC3931F250AEE451E196ABA1FAD6F21D2628F7B1D80CC88FAAD65B515C3FEC +7C55048257F947F1D0F1FAE362D23BC9FA2FEEF3722744FABB62FC4AFBEEAD5A +CB2E2CE2A38529E30CE60A3A5872C24CCE96A5D55E5094ABA181B7A0F847D72A +BA111318B5DEF40B30BE6195CE55EF9DA4EF2823A58540951EF7F707DEE0E6C2 +993E63470DC417F365EA6BE16611E03CD04BDFFADEF0BD7F91BE48AD0E0E8B7A +2A0A6EF99328287344684F5AFC534E01730826B6B80C511ED31F3D3B8D17841B +468452FBB53F059624C5746659552EA69A4EDAFA627AC8EF574D996A421E4D39 +C62690AEEDF4775F150447EBC3FF6FBFFD853CA384864F2B73302B3CB72F3E2E +7B7855C7A9B106238946B75C3A5807A597C4FAB43E624093C6AD508D3F105C77 +25D7C76F35DDCB1C01E4212D90A7AEDC5F1F2DE963113967B512D4DF995312F4 +9981987A4CC089BE75D34EE2DEE750C346D8D8ECAB28CC25D871B62AF82D2C1F +0040F9D102F166E25C649E69F9D7CD31F2FD018956E6038692C57D849887F52A +F06D991D0A889A07D3793A055A887E8E12C61AC168C80591F6789D8D1D68B395 +27219CC88670B013DCAD7EF948A7C1F7085621A397D35C3AED7C8C3B0D3AE829 +253310A9DDF1ED9F0A724091BA58E7B287BCBBB0542896EE6984BD224F413057 +1CDFF59B22C30E04E8C2F1521C01E3922819AB0D2812545688EFA078F31DD367 +C1F4E7730B4D1B6DD06E13AA4EF98FCC3FE27B38151DFAAB1D0246A90F19A551 +D098EBDBA701C465052C13AAF120CD03A3207383EF6CBF2475FB4DEBB47CE59E +68E915611C92CB85904EDA1E5B9F221025C6C5156FEABC2D361DDAE74424C730 +9E5BD34D77784928BFB53D163BD1C7DDE31F5A1E391DA1218D99287B95A1732B +316BF5FD63B237A3B1B7AC39522C41BCC109020DE6A8F683D856EF2E6D2F3158 +8A978267A0DCCDB9E6C4E4A793FBF2FC49647DBD6601FB7F59D77FF18DCEEBC9 +456A9F46AF2C3B5A4FE0ADFE49BD1CC6434B59415E6B783B079C94DB69005148 +1BC9897FE8E1196F41DA53F2261ED3CAB21D0EA3B3E85EE4BDB280F8740D2AC9 +85B0799AB4586E3B8B8D693B5975943D9D217B8B331E9DDEDB482BAA1121174E +C0F93158A672DA9AFC520CFB4BBF7A8ACA2FAAB5714C7D182D09367304A6E0D7 +BEA0D00E7204FA4AD608B12E0A2C3708DA6E3BE762BF189FDD8781B6E647F8CA +2E745B58CD65B2DEA153A707697216B6C1E3E44AC6FD29E71901D8E45E92AED3 +259A0434957ADAF00C28C3F1F7E31B25C5E248BE9659F0DC71FBB71057871848 +8872954943AECD35C954CD5C45A3E8AADCD16F28CCC7F06EBE7C54348A2D57A0 +1FEF1F7C6FF89001BFD7E90C17695BFD89EF9E1E4EF27DDCAA3DB1405CAD5D3F +D93E8C76596EA4B5F3AE567D9EFA1F8A166D0EB66010FE8298DF313D55786E77 +7E249978C56096C200D53A255B0EC5C4BF9B9C1BBF40D114E8742BC16041A5F1 +CAEA142873E106E3972E6DB3044A5A0BD5C5F729991EB7F0CD2615F7526144A0 +CAF82F826610D30824A5A20A9020ECF95742E79F4EAB6DC0DA8B8C0CB0823A46 +14C71EFA8722F7E1B8983DA273F676080C3B37E9EBDCCF0FCCC552C0BC7DAB1C +CACED3ED8A6E4F579B0CC2D6E83CF63BDF068E3750DCB74EB1B1D09A2D0AC2CE +E5DE1E51A328687B1D40B7C011A0DF846C330CE4F038727C3BF4DE1CD061B5A7 +E5DE34583149FA8AE50EF5D016F5EF062B32CA4DDB1A33CAA9E8DF666E2475F1 +512A72EE0DF61AD226368A33F85E419E50A8E032293EB3925BAF909A2AE0E647 +81C9A413D670CFFF4F93E3F6F4775CE58E982B945329C30481ADB922C6E17274 +F7636E1789B101662F5689519334046F48BBC27479522BDE80BD9C5EE6D1BE08 +1995B10936BD8AC9D7EA990F51D9A96A1A5D7718B2A64117C88CAEFF73F60112 +993CB70B0FEE7DAAE9F6CFBA9F991DA740C041DCCCC4AE132DED46A45A4552C1 +808CC0FFB9A3AC893EF4EA85DDDA4E7651B617BC79088376B1D15F3F1B9154D2 +3AB2AE51D7E654F95E87070909087AE6B716D37A4ED3D8D359EA9BC211736C08 +6EE76436477578E23BC81CBE87D326D57EE33A172BCA70856877970E80114F30 +8E5F85A908352425B2CCDB5697CFE2EF90465642FF498CCF0FD7A6A77068172D +9AEFBF70F58A3FB26C0CDB83C83255B6506F3012EA903F8E89B75CBE99BC3713 +E1FD46ABF2850ACA11561F9BBEFD0B851F953DBE273D2736D1F370768C89825B +2994D3DE37E086813FC462F696902455A1A1A947DFB91629FB1C62531F01A4CC +2A74FCD447F3EA20EF0418941C251190EBECBC87DDEB852EE693CEEE2B89E2DC +237416451ECB9291D7F2C0E68F3447B72392438B7C42A1B921A742BCF5DA0B58 +836BED4BF5B234325AA1EB97ED9A8E6CD13ADD33DE2C9283CF46DACEDE73A35A +1675EEAAC0D8F8FC0CF023581ACB1D0241B477390395DBADAC3C3815CC55B6D1 +DB62D7AD5AE09BA334CCAC1323802CA544A75CE8E324CDA9787255CB60566D6B +6DC410F02C1357DDF54910FA24E6B8B53E4DDEC2028D357B0A51C0CE6A073EE4 +638C2C756E43D59269E67879CC7848C63ADD63412AB0EB9246DF01C8F85ADB37 +FEF0C7D637D6F40FCD92C4CE62B6F0D62292F84CDE1A70F596142B16F7E76407 +7A6ECA2F8A49CC56ED141963EFC7EFB72C02D04DD52CB6E865E94AA41238C971 +3F76D94EE30ACEED4321E70110E7F3A1595244FE7A9669C948A048D598AC0E65 +F6C7B52A5D7742C1B105F9C86C68E592F65D541CFAD7FA0085DA65F7F9B566B7 +9298CADC6B3921FC9029C5213F8834866A752E938D2DB8FFBB071A3F24CBB7CC +99F5E3CD857A74D8974A443071B4E4C86CD7E700B6219C2ECF568CEA17A9DF39 +3B4FF618889CD94B59239C3F4F7C7658DE5421DF18CDA1F5854B73782651023A +5F474AA8D6181E37C60C95F19A6990C4E4432D2336CB8EB361F9E5AAD3B7E2D5 +350959A1F309BF66A1A1569247407D9979F99BC85AFD41D44D8B8982F7071B27 +B31A8FDFA4D4484F6E3EDC218904D7B11D4EF38204AE27DC669F35F7CBCCB01E +4B79845D084998E34B830F5600AF514E58D154557F13737AF20D5432BDDF5936 +D07F72C83FB5AE846BD8B083E0AAA5FDC73F4EF305ADD1C03CCA924CBB35C252 +352A845DF3D2159EED08E9EAB16647515E5930DAEBEDE91EF946787ACBA4BFA2 +BA898C60FFC0696A9764A51D01E31B6B39F22D289B4DD78D02D85D7FFFB3C3C4 +52CA50C8874F3C5557C22D7EC19236B0C25D89A6A9C64B2ED30932DF1D7D16FB +278EE0F2F86B4F0130B5FA464C8257465F18F72FF723F67A438014D1823EB70F +008077C1E6BC7D4E64D257E57A9891E052A5C2E0E8F03AEAE1FDCEE4D340F104 +583391A709680C96EA751B85951C99CBDD2D7CDEEFF6E4D747CE5D0D18599327 +AC37FE3AB145C19B76A511C0B440C98323B4F5941CE43979523DCC9640B346C2 +9C17C7C0D83D8ECE3D08E45267D3B4E2AFD78535ECD8CD65931D8E402A024C76 +6B5FADC434AD3D70E3538008BB3088EA45D7973E559581740258CC81E56F96E4 +E396A070BCD36CCF68623F05A817634D7C20BBD4313E36ADAFA35B412DD114A3 +87D0D92B6FA2EEB56779CF5A8038BBAF6C22A516C5D4CD09BBE9CD6F292C4F30 +0D078EE1EBD47EC7AF11EAEF72555F940B59942CE640BB461D529B3DD7DC59DE +83B869FD97A69A92D01166B47DAEC3BA68DC8E314D8988F0A313FB0E971E20D1 +5C30A9225E2F537B23FFF0D9CE204B87A96E5B4E502BFBC67DBCA89E8C938F4C +0F1712B956A6CE28D508359914E634DF70994A9430D90E9358BDE2800A05AD21 +3DA296BEA7E9C501908BD0DEA98436FE603B787FCB265AF2F69D0AF42A3F8D98 +AF22321E0CEEDDFAC5223B86E5E7E04FD4EED7ECE93255C2D546F8B423FF8DE6 +C7A6915AC6357A5FCD42D4262C9B06FAC29BC958CB7000F61B03C3C373295DE1 +92DB914B0FCC9D774E357A8B3AA97594D86484E056BCCE7C875ABDC6E04BFA6C +F23CD3C39F7A5E652F9E7B1825258B791E840911685C5DB9EE0317229CAB1FAC +BD966C2C1C947E84B9721A9C098AFE5C67EC3C0CD18E249D172E8F353896D153 +ECC2085BF67478C1A62C186283ECDD8F8ED860D88C72B3D84F116DB67AA63274 +302BBEAF09C4F5D04F2407BF9A43403B97FFB4672569B5E4A018CA9F412A7456 +728F70A0CC6A14E0EF7DA545D530BDB37CE47E65D836E211DFD18A0099356A35 +B68245F0ABB1D3653FCEB198083485B91F33C5C3D2AA2C5B3F07DBE2901FF1B3 +CEB2BEF981FE56D8554758720B4B984A509F8AEF743949ECB64310F87DA5B522 +A5BA72E3A5E1DB9EE74F912F1E70398D7D6699F670B0E1DC4C2F76D7B9D5CFFE +E70B75564D3E930077DD78FCC47C55FB783B1E48901324CB5CF178B8583CB540 +BF03FC20E649F1C4BE64F1EE83B9722EF6E1447AD95F821378DEBBC0D846BDFB +4D6F42800C967E6CBF3ACFE43A0A634F2F74DF741419344E838721FE98FF6C04 +79C8D8B5929D6D3F73E856F2085AE5C5CB4B028B091B211BFE3E9629B1C37772 +749960BFC86C941A4B3FFC4552D15B4CF9F2C9D44767CD34D134469FD2BADCC6 +77E651AD7C0E31DBAAA712A08080FE248AC5E592F8049A07FA1114A75C481DE4 +CD775562068C95B2B1D4B3242E5C43C5E5B7D6F5F57E1FF4134F8DB69F825F47 +0548185608CFE84477ABA83256F6B8BBBE668E8C525387D8D2448976E28BA5B1 +342148FFAF5903756F07F8F71DC9F323CB7448ED6C1FBF7CB916BACE2BCF1C71 +2C5DCDF9E344BF509AFAC07A0A48E819708927B36AB4EDA1D85782DF76D20280 +ECFCFC7003E60DE083654CB094F0216D7D8028DEB3C1F622EF341272FAFD9449 +3424D8428F4C8A51353F494C1E14534174F3F901C36E7743FBB03A665732D738 +4F78FB4AEB235F68CFD835818268C099317D49B8F794399CF8265ADF1120CD66 +75B2F9A5BAF86F4087CD1D18B168F3C555FC5C2FF0DC84CC14E6E4D92A366B66 +83C4E672E166ED8CEC9754EFC094AFDD263355A5FC1A81AD06ACA951CFF941C1 +93B4B036933CA8CE859C8073AD96CA9D2B706A0B17368F350F0BB90303766D59 +1D7551ADB6C952F499864B2B48790665243350A1294CA9FAE96DE3B4E160DDFF +86E47810B8F00E46BA2008532C238525273C1EE87D706901EE95B73A6EF33DAF +1DB033BAEC49324F2F4A26F510FDDF44F3F1884CD4D56751C144A2106EF7C63A +C6D5CB11307FAB4C66D83D3E347DB503E3C98A49763B748B8EC5DA1C42167F5F +D215865D84D7E2B01F94F62400F1FD81EB194CB80A4B33C1A5C5808164D8AAAE +D261DDBFE916BE95BCE0D1B9936A36CC6E75DB412D4291EEFEB509053453FF14 +8D5F081E5FE7225C94D9627878D66BA4B4965DB12C1EB17ABB0A2D87A948292D +D051934F33CCC97CC09548282BD24F04E37B724719138C0269DE4EC3E056FA2F +CBCE254B977F1EA5B6CF56D590F5066911300AE3632E97B4807BD7947530D2D5 +1DE251686C5FEF4A851FE9AEA61BE752E37E5F5501B878BDBE054CA1516D0DB7 +54CEF32EAD3D936315C8702E5048B9109A6036FF5159FA3A0675A469CAA1959B +A33B6322D0CC76A5B30546D41C3CF17B67B8E7FAD383D16F14620698749EC178 +80048C97D029E229BDF6227E4FC6666606FBF3673FB8205D5DCF3F5A83313227 +D1295134EE8C71E00DEC1487994483E9B81A642C53A8198EF57DDA9274FBCE4C +6628EEC75C302F7ED41D10CB5F1B2AA4B12A5415E4510D25B1F576CC16C8F9A6 +5ADEE2248A1B46DDB499D779F8A63E09F674E27F74D53AB4642FBE6615094FF7 +B8040EBA84D850675C55AED0C9E1C4153428E1FC7AA8D9335B42BBB41C1C779B +8717A00E96D2B9B4138DA60D818A8A303367CEEFB73A9DC01E24A7F160CD9AD9 +D375A71CAE6115FF29A61796418CC67255735BA3471D6542ACE20572B5E2C9A7 +494AB3EF0C728D7EFB42FE593A7F39821061B599A0772181D74438C5C7766CBB +18D035AAA6A54F9922972E44D7AEF4AEC40CB0301FCEE83E1FE18196114EA8A0 +F7C91BC4339F87CD35A68ACDA8FC9F10E1386A040D910BAD5767C8DB06F5CC53 +35FA824C791B0870312C89048EA85093F0BE8FB4FD778BA03C048209D29BB315 +D601635271F36B8D38F83E8069482FDAE6C74249BF1CA70058C2BC8CDFB7C7D0 +9D19E903961561A4DE07D412030BB1748DD16F9DF7EE1CD8673B5DDC9CBB4DDA +81716505A58E2C6E7EAEB44F7BC67FFA1A8C0583A92AB1710B618FE04312C778 +878DE8282AF5EE543222716741000EFD5267AD23DBB8D17B354AD4255D1625D8 +FE10341752CA2896F2E8A045B179A083595332706A62C34035AAF0D54F529A87 +AC9D67975E894EB72C5F15CAF1EA10B500CA39AFB32E3CF8A3332DBE41B41EBE +3E0C9D2D68EADEC7F175885AFAF975DF62225114CCC3030D6D93F0C7FBBB2D43 +B4137595D7337DB70A5C763B9CBF597668A5BF3181473785A20D959750642B32 +04709F214C67F2E84943B39CBE069E84EE7514EEA255F5919750DB4A2D497AD5 +BCE3E4836DBF351BCC9AE7B05F8562B3411D3B29B807882AFDD951AB1987C040 +B21B661F8F9F37B724648CCE293CEBC503E812D03B366E18BD8E20F91AD432CC +3A569F63867572311E492AD3A72B67B9DCE970CC21DF69492F2B60BF59AE176B +24118C7A1350A243143600FF6E83C7762581746ED1D1FD64BA1A1E8DDB4888AC +F2A2A33A81730F2E26DFE89631EE000C0D99EE8E8BB0E3A37614A4F8631ED982 +002CCC4DB0A2AAC85688A56D48D701C99321CFC5CE97BD3193A8925F3A4E19E9 +A34E7F53D9535359FCC9599BD30466D5EF6A64DD80F981BE451A3E34EDC1C278 +BB9305EFB756371853152D313CBE01808F60CAF2D894BF5D5905A54DA745D2D4 +29E3876D1E7A187BAE9D6207AA1F70222B7272A863F05EC0D29EA4562B7DEDCF +66B369DA7FE7C7CF8D433A75D45486F864CC7BD0FBE940FEE9068C9F7B41ABF5 +97BE7ED06EBBE935C5135967A89EB2182457374C83C0D795D50A6ADC0384DB46 +BBADE8D2CE0A37FEB55F28425C25F26049590EECE560D135C8C7F5A4BFFA0AC2 +3ED2FF71A36867C426D8B9C9 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMR12 +%!PS-AdobeFont-1.1: CMR12 1.0 +%%CreationDate: 1991 Aug 20 16:38:05 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR12) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMR12 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 48 /zero put +dup 49 /one put +dup 50 /two put +dup 51 /three put +dup 55 /seven put +dup 97 /a put +dup 109 /m put +dup 114 /r put +dup 115 /s put +readonly def +/FontBBox{-34 -251 988 750}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C +68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 +3645B82392D5CAE11A7CB49D7E2E82DCD485CBA04C77322EB2E6A79D73DC194E +59C120A2DABB9BF72E2CF256DD6EB54EECBA588101ABD933B57CE8A3A0D16B28 +51D7494F73096DF53BDC66BBF896B587DF9643317D5F610CD9088F9849126F23 +DDE030F7B277DD99055C8B119CAE9C99158AC4E150CDFC2C66ED92EBB4CC092A +AA078CE16247A1335AD332DAA950D20395A7384C33FF72EAA31A5B89766E635F +45C4C068AD7EE867398F0381B07CB94D29FF097D59FF9961D195A948E3D87C31 +821E9295A56D21875B41988F7A16A1587050C3C71B4E4355BB37F255D6B237CE +96F25467F70FA19E0F85785FF49068949CCC79F2F8AE57D5F79BB9C5CF5EED5D +9857B9967D9B96CDCF73D5D65FF75AFABB66734018BAE264597220C89FD17379 +26764A9302D078B4EB0E29178C878FD61007EEA2DDB119AE88C57ECFEF4B71E4 +140A34951DDC3568A84CC92371A789021A103A1A347050FDA6ECF7903F67D213 +1D0C7C474A9053866E9C88E65E6932BA87A73686EAB0019389F84D159809C498 +1E7A30ED942EB211B00DBFF5BCC720F4E276C3339B31B6EABBB078430E6A09BB +377D3061A20B1EB98796B8607EECBC699445EAA866C38E02DF59F5EDD378303A +0733B90E7835C0AAF32BA04F1566D8161EA89CD4D14DDB953F8B910BFC8A7F03 +5020F55EF8FC2640ADADA156F6CF8F2EB6610F7EE8874A26CBE7CD154469B9F4 +ED76886B3FB679FFDEB59BB6C55AF7087BA48B75EE2FB374B19BCC421A963E15 +FE05ECAAF9EECDF4B2715010A320102E6F8CCAA342FA11532671CEB939AD2EEB +4370BA2C96960CE9E6882316268ABAF1023ED9D2D13969EF9E53F52BC143383C +AFC14F27A7530C1EF399707711B3AD971D9F57DE244315EED5A16F9CB6AC1524 +65C8C8458FB03FB8619B8A925DCA3AB2518F044DA696A4D6F8DAD182E1C15D7B +C108C9538896A23A043EE66E18808902D215E82AEBA183D813D46B89A3FC847B +A7F6E0082DE9AD8C0A83F521219955FE964A660826FE921E1EA12D7B34D65EAB +B5E40E74A9666CBEBBFCB9A26A0526B72AF9F31F6A04305FA0284816DDEA6D1A +5786756F613EF9040290DD2D2B27B88ECC0A1FE0DCC2035211919CBCD2DD7A8F +35EF236D4E0749256874CDF5BA703F0C7B49EC0C9EB5C65AE1E7F7288452C619 +E013FCD5D5D5F8A517DA7305F04B4EE61B12A1A2A26C08A46982A7D1EEA07D01 +809552DB4B07FB6EE5A798324C57FC6C2A7D31D102E1BD5F296E9051464CA3CD +F37695EB0EB77BB83F258039FCA21B8252F70CE5D3D9D74E452617B055E19B5B +600B421C921B026BC7356AF63F2690C62B1CD9E479D62EF8F964D9BC29AE1447 +F096FA9ECF5E52F1F7E2FB34B02BDDE6C210D3A43AAADC40636AE8271DF2174A +A63236C4BEA8FD7A6E841B4AEC2CADAA7FC481A16322BEBF01A31E4CD5A577C7 +EEA43211AC7C2C40A6EEEEE7BEEFA146BC3322E6A9E157641A67823CB2661C97 +07C1DE919CF5D1EB4550B08A8452972330B08C87A6AC91BB519667CF32F2885E +71D69B398E7C59F815FA730BAFDD7F54260EEE5BBF6219A7A39D65B0624C9555 +CD34EAE5E7E9AA681B06C1EA575A6C41DD490E0FA258A93766707B6C8A35638A +653E9244B25045CC2381F4998278F9844FF704AC420696AA6E18C8EA78D98163 +52ED5CDADE35979C4CEFDCA0B7C1A26211F04907D036016EE8A1F40BC4143093 +19D3F937DD6D6328882E40141CA000D42EDCD4D47A5516E5FD5205CB31F88D21 +8E855C79000D919BBFDBB843C29FE353B33833A36A6C76581DA65B8037DB5DD5 +1BA21BF81BFABEE02759C35002E9A0DDC78D460989B8948527120ECBCF5881F9 +F035B80F9269B0A846780272A15B14204B8C03A1A135092E31F162EE4BAF20BE +D3C1EDC193FFDA52128313E51CD76189A911E82207A822DDF92F6E821A75BC5F +762E99FD94B1148E71E873C01B46C0158170047A0E6BF5962863113893C71AF0 +FA1BB71520E364053B404B3D912E011D226A95C7ACFB4A1E7166F4B9BA67B4F7 +908FFA34D2C2199F7E5309E6DC0C76FC502D88752F6BEA537262DEC294E3CB05 +E511CA14CDF663D8745BF6703AC16FD61B43F7C3C6A903AE586FA783EA4515FD +B3CC71B68757A66338CD91E4A09DAFEF053737D76A1A9B32BAC308021E7720A7 +8E0A341A4BA2DCAD4E0112DE60DE99539FA7B0EE73CE05BB245A1F5CFE242333 +8BFA62C67C95F0843B7369BD117C489DE934BB69D927069C072920398CC2DAB8 +62101720901D3DA6465303ABB9C19525DBBA151D0F1D8BAF70121CD368934EFB +A68A210B8FD29391D25ACF6D77969768CF3C008DDDE81E2869083F86463FBE15 +E43370010EF7B374F3CBE74E86E80985B498014ABB6D28188DC087973B2AF56B +71C3D7A500949D5950E745C3718317BD7E22F54D169EE7C702EA4C37AAFC853B +2B6575BF17C3B0A910E47AB0F85C0F296B161F77E2D7E7967BE4951510732D40 +96F8C2B6D322DC5709576DC8F2E270822AE3A0C38DC54AE36A1D612D356C1347 +6E4A9C592787048C21E2D833263B65C8E4427B64AADD32C311361B018994ACC2 +ED31DE81A87D2944190F1EC792E28663DBDA732BBB7C1B39E0C9B652BC2519A9 +78AE3F205990732DB91653B03D317CEBACAB797FDFF3F01BB33C5B78B86D8783 +7AFF1ED5B3163983678D361A2B3CBD4CA1EEFDFC587E6FE91F62506F235109B6 +8E51CB8295F64F6C7E69CAE94466DE4B186B50D5551D51316DF9AB44EE853071 +B6FB652DB8B5C09EC2F4FFF2E231955CB58224DD864AB8D71468EEB44D967276 +7F048872912A3B92B0F54D5ABD5AD013B4BF2706D53FE5ADE3882F71C296F3E1 +35F4AF44A0B84D7840BFD29D466FC2D2F4E8C81B2B69C8EE5C2DAD4C1678F026 +144B7FE3A72CFAB5E1950EE2F8EAD198EED539DDCAB4840FB8ADB9ECCF6B31B7 +39B70FEE5F3BA9E758DFD9ECE3A627FB99495BCCEF3475FB360F235ED73DC910 +A787A5C59AE1AB0777ED3D08E5202A63E090D88B13C4752DC4D95113A259787E +4C42D6C564AC849D5F9780D8EF59CE68268D052563C19581B06F7789AB1DEC3F +EAC624CF6DDD2A821ED46B01F14A668F7ABE74A5529C94F086DB03C71EF817CA +AD815C4D3588F99AB3A90B53EC855DDA69D299CA7C6EFCD2 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +%%BeginFont: CMR17 +%!PS-AdobeFont-1.1: CMR17 1.0 +%%CreationDate: 1991 Aug 20 16:38:24 +% Copyright (C) 1997 American Mathematical Society. All Rights Reserved. +11 dict begin +/FontInfo 7 dict dup begin +/version (1.0) readonly def +/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def +/FullName (CMR17) readonly def +/FamilyName (Computer Modern) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +end readonly def +/FontName /CMR17 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 39 /quoteright put +dup 45 /hyphen put +dup 65 /A put +dup 70 /F put +dup 76 /L put +dup 79 /O put +dup 82 /R put +dup 87 /W put +dup 97 /a put +dup 99 /c put +dup 100 /d put +dup 101 /e put +dup 104 /h put +dup 105 /i put +dup 108 /l put +dup 109 /m put +dup 110 /n put +dup 111 /o put +dup 114 /r put +dup 115 /s put +dup 116 /t put +dup 117 /u put +dup 122 /z put +readonly def +/FontBBox{-33 -250 945 749}readonly def +currentdict end +currentfile eexec +D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 +016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 +9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F +D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 +469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 +2BDBF16FBC7512FAA308A093FE5F075EA0A10A15B0ED05D5039DA41B32B16E95 +A3CE9725A429B35BAD796912FC328E3A28F96FCADA20A598E247755E7E7FF801 +BDB00E9B9B086BDBE6EDCF841A3EAFC6F5284FED3C634085BA4EE0FC6A026E96 +96D55575481B007BF93CA452EE3F71D83FAAB3D9DEDD2A8F96C5840EAE5BE5DC +9322E81DFF5E250DEB386E12A49FC9FBF9B4C25C3283F3CEA74B8278A1B09DA7 +E9AE4FBAAF23EDF5A3E07D39385D521547C3AAAB8EB70549756EBA8EF445AF4A +497CA924ACCC3DD5456F8E2C7E36946A5BF14E2E959895F7C94F49137256BE46 +4A238684D52792234869EAE1A6D8ADF4E138B79472D2A90A6CA99E2394CC20CD +3841733046175B20CEBE372327BF13428EED6A3E2FDF84C2DBA4B0AD584EE9DF +B51828D3B8F385846158C29C9AC3496CB9692DD10219697B2ED4D425C3957FD8 +C4600D76E045C561216EF05D38177243C314877A69A1C22E3BEC611A2EE5A216 +9B7C264CF6D1839DBBD78A40610F2C0D7C2FE09FFA9822FF55035AD52546970F +83EED2D30EABB1F303091EBC11A5379B12BB3F405E371519A53EA9D66174ED25 +A2E55463EC71A97BE4C04B39E68112956117C8252DB6FB14AB64534B4BCD568B +246DB833982B38CDE7268BBF74B6B0C18091E1B1F87D32D66F4DD023D1F10D2A +7736A960F72AC01F733A11023832CD68FB6288A5977743F6F3F23E0C1657CF5D +E8374835BDBD2DED3690C84A1EBB8E2383A5E49E610B6F5F0F5F5EC43CFD16FF +24FEEFB92425CCB577E17FDE4EA6C50E1448DC5726A21888E25B6D6B52DA3D3C +E4C4C6A73C176DFEB60B6B6191B336AC4F5BAA123E1B3B6FAE4B3FA9DC8F7E39 +335277EF2294315BE95F64EBDB1F393B293FD0FDB9DEE6C89082232013130D28 +9234FF12DF47D454558A1EE8603B2832772E5CA07D18B34A4763D5B890F7173F +B8FD38B08F847FE570367C2500AA592E8561878A86491A611865254BA6BE10DD +700C01A3F0D254A5AA0ADBC4DA708CC9909EE3B1692657B5A07BF14258EEE82A +137F69C604328C9E5B0F08F0C2F9A9E805CB3B78BD67578F2468DA55B04C5602 +47A6191304EA7CD9C8E48C02D0DBD1FE8CAF94EB5A41EE79C5989E3DCF332E0C +C15A728C039FE5FB62F6E38B496E9EB7FC4DC700408E90DDB5585FF577079F94 +B4E90C8CE6DC50C1AA95F6122C334614199AD3C4E665C978E487DD75504449BC +51586C840BC8896F38A17B41614817AF7855558578F7C3E185C523E10156BE88 +85BF39E5762F3485EB514EA2ECC3636EC62B4B6A8264F2833247FF346CB2F9E7 +A60B614898EFBCF22DC8ABFBE9124AC221ADC674209C3E008F48CFF08950DB97 +A467AAFF342F299F24EE591282FE7A0683CAC644AD052C6AE6FEE2093286820A +1B300A7B807CE97A8AE52914D5B59529AF3549D5D7E66A82D7D3FF2447922C1D +CD5686E54BADBDBA8A6C7BB3CF398616A993058E89F4C1BE85696A780B0B9BF8 +4A4D713CCD7DE2B305407FF0B453507B3358443FA4218550A893CAB19E69B85F +AA7E14C6CCAE0BAC75A8848420F36B2A81903CB97527CAB8958D5B168CFBB1E3 +3FFCE29907DE48683ED44B0682FD00C9C4E9160B324596E092DE8DA82D985B84 +7EBEC02E90C23EB9DDBC078E37ED09A882ED52EDF3DE1778D9DC0C6E23202F54 +FF45BB75860360C4A4A191014DF0D8F72DE57B79A7EDB8C52306217C11545A50 +28C9CFA7694C8523544E15E364E3909089872528B191CE387B3EBD9E5C92609A +71C221C41EB2E4DEE5AB10D44746C8E8D57D5710F5E51D4C5ADADE0462CA1C6E +798812EC34CD814C0792DEAC9822367468020311E7791FE7DAB1732EDE77F295 +72BB1C054A8997E3756C6DC7A2BFB7B0A703EA991872FFABD8F03DBD72017FF5 +6216FD51066BE58C345D713218D73A9D32E54931FC794F5F464F17D0F76769DE +0A9BEF54CD93899972807164A286B6DDCF966646B26E93483B504C57B5106300 +DDB17C126CBF0C324F7B9B2F7E296AE4FEACFC248A55C607B075E5C265F00DAC +BE7D3FE89941F270BC33DC1462A42A97FD5201A4AD94EC4C93B283E374C238A0 +D0832624C868FB36749A117030A6BA50F0F201D0F0C46FCFC1808B9B8D0E84B8 +20377A74E1AD9DE13FD281D9450467C5FC28EEBD9DC47F5180FDD007DC16ACEB +42A2B2B8520ABFE8F89D2C54EB9AC77284FA19B6812999E14C4512A43A3166E2 +F6B46E8D9E021691B0C02969558B00714B0DB60BFA58D64D86707E7BECA25A89 +2BFD8ECDC6F009D2DB760E57CDF17579EAB32D86CC5657CEDE8D8753F2D5055A +26C4F19519023FE8AA01BF84D0829D9C316F2061487CC5F4309FB8707D8F8FCA +7340D30EAACEFFC78E7FC94E6D3BC634294B3DE805DA5C44BAA53056754ADA43 +1737E9EA0FE90D2AD000A6BCCFAAF21266AF7D81D878AB96C1367FF462022559 +6266E00EDCE370F06FC755C4D4F0B5EE3C2779D922EE3750EA75199BAB8D50F6 +F6D0AECD37440413249E41C339290C346EC53E530428592BFF99A43EFC69C784 +3F0B877A34BB0690DEB5104413E1B59C89070235212216DBF040FD1205486C69 +C673AAA2376AA7047124AA3508BB89784DE93A2E934533D5153235A6C5D23173 +B6B385566DCF0B313B59ABCD3428BAA592165389CE18E40E959DFDC17F88F998 +FA4D9AA18E98FAB3F92448B4A5D28B4102A4359770DC554BA58DE980F60D2305 +15C612737EAC879401BA470508AEC08397019C14E1C34244B0FE994843FCE823 +719EC52F6E00B75675FC3D3FC0B1F2EDB0B37BAAA2A0EC1389F395D3F4AD6EB2 +7CD220661BAC0E5438E80D8D64CD68230B07085DC27306B956F542D479EE7CF3 +FDFB6FC9DFA01C25792ADA79575324AF12F4447DA2947957FBE640092DDEB879 +5BE484280D01DD910B6D69282E772C9140F49B2742651DCA95B7EAAC55CE08B5 +13FD71F51B11F7FF7021AF93FEE2A6FF5A6223B155A4D1F92E99C576088EB402 +519C9189B7D5D345CFA9347845D916F2ECA2C6B4142EE4B33C13F86D18ACE6E1 +9CE6DAB6B6F336197E4EC25ED0B38D7DC087A45C32B520454E42E248D18A4F11 +DEDF9778A9BB1FDC30768B3DC7E5A39FD51434223B46716387F7A379182B21C7 +CAB5A86AC0AD2900E20EB2566190931E7E86C548F88DC1B55C8B80879E84E7E3 +0B5739D30B7FE204E59D281670EC90E986AC08BD38230E9A341A460149702565 +214704BDDC9176033F68721B3D0C6118484BC8D06B15CB3D8531E19AAC3B3A3E +4F44BF226AA4770612D4B3537988141D895CBD36718996ECA4138F10EFBA52A4 +1F89FDB0450D353E0B5F2BA4BC42372B12DD4ACA8521EF5E9C1DF0A575C4AD65 +379F55A3725DFB5C6D8C14B7B8BC22AEDF86886F95E2CB00134C55DB9CB49981 +CF944A6F2B744806FEED501FFCCBEE919F6B1E2973881A0941D9AF8E6781491A +0C32555340FD74545C59D6886619F873207E9961516E26AD9241C2BAFED73CF4 +9DB9995BBEFC11174B83DB92E3E329A7817DB69DF9DF73CC18B369F0C060EFEA +B8D36C848A571210EE2A2AEC9B341F0E8AD42D99702FE7442E2DA2111DB02444 +E0C0C2BD78E6E6268EE7922FBE5202F186C0FF0FF59071ED4BD5E8E3606EEF7C +302A5B8A4686CC8EE8D5D6EC6716103D156FFC7B8DA9D7180918EA1464543DFA +96B98E10C561E05C6BC273B5C3B55D4A58357E1C6DF714F5345B8225F582D978 +793B743C53485EDDBFEAB2E2E8827FF86F1891AE4683EABBFEF7265B23254B57 +98FDEAD48C78800991815269E9F029A7A095DDCAA3BBF39D8186CE1A4F83463B +A176DA3E3CB4AEA081BE712543BBD541A73671E44D7A6141AB3E629DE47EA084 +BB7D9EE21C8A895960FAA8B4EAA51BEAB75E8E08D4BACD3C0BD48956BE5DD244 +94E1C304AEDB176FF7D74D0E42F3475C9E500D4F6D2C49AEF88C3969A08DFA04 +C985CAFED0983FF889341CFFA5BAB503A33F21252B56D3AC1E688871A645BA49 +76DAA7AA27E605D1B6B3D7E3908A55D1579E700512C5E85FD4FF22F977063AF9 +B4906B791A6C5052B70B4CABAB353C68F6273D47708C871FB6D9B7AE2EFE1867 +830FE235F724072DA524A2B3CB4B64B40DE23C7700EE771F0E603E7C2321BE21 +F86601E481AA131BE8ED78F0099B56587F301B59DAD2AC84175B806E3B2FF14D +6D3F7545B656173C68D813B22D6C07F9457FACEEB2B4524C034F9663E8DBFADF +556CBF171715929F315E271F1E8F0828523D8CE00E875260FE7BF156EA661B37 +1C1ACB041A7145A2E7C9085477D60BBA7176892BA16A65F5C769586281F93629 +269BBA849FD795648D8A78E6F0B49758B70C52DE747071076D994972B2B4AA0D +8308D55B2B70E64CBA7576D90C07D4D026255E70E7C1ED3F1D4B5E1FA63B1270 +136D2FA2AFED86EC1A2B33126B2650077DF2545AB0E93A578E846E9BE957350B +AB6B4545EDAE7114C2043DA611FDC14EE57341E0A186E89A87BEB9AC325B68D4 +12C366E1F55F865C4DC08D6F495324505F54EF25FE095878929A1A12D1E9D65B +B4FCE8F49CDE56B57DB3DB98239C05E4E3212F0E49DE66C60690021C4FD89E0F +76936ABC611CE8BCD007093F0FD9BB44D3A96CEE2FF315F61757FD230D70FA59 +6E97772DCD8C97CA2A41B7EC8155089CA0ABE2BBE4FE34E23A817198FA9B9950 +E7FF865182FFAD297584F5B124674B7245B11F0262A605B7B113C4E64B5C90FA +1FCFB30FE868A71B558DFE3C39BCB53FC058EABA5F257A467521096772B103DA +320FC5C1F8C68A85537DE55B26BDE4B0AEFFB406EDACE2FFA3F47D47968BF947 +4B369F88DF79C6317AF228E8CA78E9372CBB935C7469C25B59B67653B188A06C +49FAFE69BD5D933E2C4DE9B1207A7314931FD59C06C3A0EFF498140FF5E5A761 +F2E2ABB6CB4A9F8F25737551D2F5828649C64BD8C138528263793C663B9F550D +CB4F7AF7E007F677A50E29891452D56F654F30AD5FB93C46A86E03CDB4CB379A +4378C69E1C48CD65BC06918D149E529EE07A9DB2B9D6C5E951CD90CAF69C2744 +85064E6D9565F9F4C337E492C28AAB023D78B2A72AEC70392F89F15D69616FEC +E74774C9E8995EB344A88B6B86ECB9ABABFCFAC17041554C30F1612B072E261A +12326F2768BA7301FDF714039B7FCAE28D8D826573B48B9FD1A2F48A570C3443 +05D1AD4D1290773FDA57D3348D8D2EE3B13D587E7F2A5EDEC4D089F88633BF15 +1DE1907A9104FB30E8A06DB14FF31C6211D14AE824A8AC9D46ABEFA42CACD26C +D9F4BE702C46FF3F3B916EA275E6B4BA5C868ECBE76728C3EEDCE84CB9BBFB63 +1CE927FE28AAE0925BE97C450FB410E63B0A76350559DDBFA5E61216B289750C +DCBCEBCEEBAE0B9788760F581B4DE35184968D85F716BF65EEE3896DE814713D +B0958CA9D120ABF2776830D3535DCB1866428EC9D01702F8372E27E5A2E57446 +0572381313C196FD1E86AEBB69E917D331E63C9DBB30E2D5F28360B2D3C002F4 +08F945B48D5F5B740071C39779ED7FF1AEFB8D2DE646EE0A5BADC9634CBD3812 +64615760C5BCEAC7F714A14682358B116855E098B007925A3E52D59DB0D18CC2 +FABFA3B8824E65C765A858EFA69AB3EA2AF6116937256D131D565CAE163E832C +CC3C91102FF3487087EFCE11B21778F7CBF8F71D04C66B6314A6857D1FB7F127 +C83A5C9C2CAF3BC8A3663F7EEEFF0432AEDB16C77034088071026D5AD497D517 +40297AC8E77B69FD44FB1E2ECC96B5ACE9504C7C92633535E8AC8E186EEE1183 +A2ACC6E3F8ED98C0BF04E227F1E5EB273C28DAB32246F163BFCA0E1455831E25 +39D7AEAB974C4E1218973954E1A6E46551A9FE1334FA483E9DD671C2445EBDA2 +B9503AD86BFE89B4FF5B6F49618C835B82C0380F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndFont +TeXDict begin 40258431 52099146 1000 600 600 (READ_ME.dvi) +@start /Fa 152[42 42 102[{}2 83.022 /CMSY10 rf /Fb 135[44 +1[44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 +44 44 44 44 44 17[44 9[44 3[44 2[44 44 44 44 44 10[44 +1[44 2[44 44 44 44 2[44 2[44 13[44 44 18[{}41 83.022 +/CMTT10 rf /Fc 134[59 3[62 44 44 46 59 62 56 62 93 31 +1[34 31 62 56 34 51 62 50 62 54 10[85 5[77 1[88 4[42 +88 3[86 81 14[56 56 56 56 2[31 26[56 56 5[62 12[{}36 +99.6264 /CMBX12 rf /Fd 214[28 28 40[{}2 83.022 /LASY10 +rf /Fe 193[65 1[65 60[{}2 83.022 /CMMI10 rf /Ff 133[37 +44 44 60 44 46 32 33 33 44 46 42 46 69 23 44 25 23 46 +42 25 37 46 37 46 42 2[42 3[51 2[85 62 62 60 46 61 65 +57 65 62 76 52 2[30 62 2[57 63 60 59 62 65 2[65 2[23 +4[42 42 42 42 42 1[42 23 28 23 2[32 32 23 5[23 8[37 4[42 +42 3[69 1[46 48 11[{}69 83.022 /CMR10 rf /Fg 134[50 3[53 +37 38 39 1[53 48 53 80 27 2[27 53 48 29 44 53 42 53 46 +10[72 73 66 53 72 72 65 72 1[91 57 2[36 75 2[63 73 69 +1[72 6[27 4[48 48 48 48 48 2[27 32 8[48 16[48 6[53 12[{}46 +83.022 /CMBX10 rf /Fh 138[75 52 53 55 1[75 67 75 112 +37 2[37 75 2[61 75 60 75 65 12[94 75 2[92 2[128 3[50 +5[97 1[102 11[67 67 67 67 67 3[45 25[67 67 5[75 12[{}32 +119.552 /CMBX12 rf /Fi 140[38 38 4[81 11[49 41[49 3[49 +49 49 49 48[{}9 99.6264 /CMR12 rf /Fj 133[58 4[73 51 +52 51 2[66 73 111 36 2[36 73 2[58 73 58 1[66 9[137 4[98 +2[103 2[83 5[86 4[99 19[43 5[36 39[{}23 143.462 /CMR17 +rf end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 600dpi +TeXDict begin +%%BeginPaperSize: Letter +letter +%%EndPaperSize + end +%%EndSetup +%%Page: 1 1 +TeXDict begin 1 0 bop 614 872 a Fj(A)-15 b(W)l(OR)44 +b(-)f(Fic)l(hier)i(Lisez-moi)d(de)i(l'administrateur)1665 +1295 y Fi(13)32 b(mars)h(2007)515 1653 y Fh(T)-11 b(able)45 +b(des)g(mati)m(\022)-64 b(eres)515 1835 y Fg(1)76 b(Compatibilit)n +(\023)-46 b(e)2117 b(2)515 2018 y(2)76 b(S)n(\023)-46 +b(ecurit)n(\023)g(e)2353 b(2)515 2201 y(3)76 b(Installation)2217 +b(2)639 2300 y Ff(3.1)84 b(D)n(\023)-39 b(epaquetage)26 +b(des)h(pages)g(PHP)20 b(.)42 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h +(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)131 b(2)639 2400 +y(3.2)84 b(P)n(aram)n(\022)-39 b(etres)24 b(de)k(con\014guration)35 +b(.)42 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) +f(.)h(.)f(.)h(.)131 b(3)639 2500 y(3.3)84 b(Initialisation)27 +b(de)h(la)f(base)84 b(.)42 b(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.) +f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)131 b(4)639 +2599 y(3.4)84 b(Con\014guration)26 b(par)h(d)n(\023)-39 +b(efaut)27 b(des)h(comptes)79 b(.)41 b(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f +(.)h(.)f(.)h(.)f(.)h(.)131 b(4)515 2782 y Fg(4)76 b(Main)m(tenance)2159 +b(4)639 2881 y Ff(4.1)84 b(Visualisation)27 b(des)g(ob)5 +b(jets)28 b(et)f(des)h(\014c)n(hiers)68 b(.)41 b(.)h(.)g(.)f(.)h(.)f(.) +h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)131 b(4)639 2981 y(4.2)84 +b(Netto)n(y)n(age)26 b(de)i(la)f(base)50 b(.)42 b(.)f(.)h(.)f(.)h(.)g +(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.) +h(.)131 b(5)515 3164 y Fg(5)76 b(Authen)m(ti\014cation)33 +b(d)n(\023)-46 b(edi)n(\023)g(ee)30 b(-)i(P)m(ersonnalisation)935 +b(5)1926 5255 y Ff(1)p eop end +%%Page: 2 2 +TeXDict begin 2 1 bop 515 523 a Fh(1)134 b(Compatibilit)m(\023)-64 +b(e)639 705 y Ff(Cette)22 b(application)e(p)r(eut-)n(^)-39 +b(etre)21 b(utilis)n(\023)-39 b(ee)20 b(sur)h(un)g(serv)n(eur)f +(fonctionnan)n(t)h(a)n(v)n(ec)e(Apac)n(he,)515 805 y(MySQL\()p +Fe(>)p Ff(=4\))26 b(et)i(PHP)f(\()p Fe(>)p Ff(=4\).)515 +1020 y Fg(PHP)83 b Ff(L'application)21 b(ne)g(n)n(\023)-39 +b(ecessite)20 b(pas)g(de)i(con\014guration)d(de)j(PHP)e(particuli)n +(\022)-39 b(ere.)19 b(Elle)515 1120 y(fonctionne)k(quelque)f(soit)h(la) +g(v)-5 b(aleur)22 b(du)h(param)n(\022)-39 b(etre)21 b(de)i +(con\014guration)e(register)p 3083 1120 25 4 v 28 w(globals,)515 +1220 y(utilise)38 b(les)g(sessions)e(via)h(les)h(fonctions)g(in)n(tro)r +(duites)f(en)h(PHP4.)f(L'application)g(fonc-)515 1319 +y(tionne)29 b(quelque)g(soit)g(la)g(v)n(erb)r(osit)n(\023)-39 +b(e)27 b(des)i(a\016c)n(hages)f(d'erreur)g(et)h(de)h(w)n(arning)d(PHP) +-7 b(,)29 b(car)515 1419 y(nous)h(a)n(v)n(ons)e(tra)n(v)-5 +b(aill)n(\023)-39 b(e)28 b(\022)-42 b(a)28 b(\023)-39 +b(eliminer)29 b(tous)h(les)g(messages)f Fd(\()-17 b(\()22 +b Ff(E)p 2441 1419 V 30 w(NOTICE)g Fd(\))-17 b(\))30 +b Ff(PHP)g(qui)g(sur-)515 1518 y(viennen)n(t)d(par)g(exemple)h(lors)e +(d'une)i(comparaison)e(a)n(v)n(ec)g(une)i(v)-5 b(ariable)26 +b(non-initialis)n(\023)-39 b(ee.)639 1618 y(Les)28 b(scripts)f(PHP)g +(n'acc)n(\022)-39 b(eden)n(t)26 b(pas)h(en)f(\023)-39 +b(ecriture)26 b(au)i(syst)n(\022)-39 b(eme)26 b(de)i(\014c)n(hier,)f +(sauf)g(p)r(our)515 1718 y(l'upload)e(de)h(\014c)n(hiers.)f(Le)g +(dossier)g Fd(\()-17 b(\()20 b Ff(\014c)n(hiers)g Fd(\))-17 +b(\))25 b Ff(doit)e(^)-39 b(etre)25 b(accessible)g(en)e(\023)-39 +b(ecriture)24 b(par)h(les)515 1817 y(scripts)i(PHP)g(sans)g(quoi)g(la)g +(fonctionnalit)n(\023)-39 b(e)26 b(d')n(\023)-39 b(ec)n(hange)26 +b(de)i(\014c)n(hier)f(serait)f(in)n(utilisable.)515 2033 +y Fg(MySQL)83 b Ff(Les)22 b(scripts)g(PHP)h(ne)f(mo)r(di\014en)n(t)h +(pas)g(structurellemen)n(t)f(la)g(base)g(de)h(donn)n(\023)-39 +b(ee)515 2133 y(MySQL,)33 b(il)h(su\016t)g(donc)g(d'un)g(compte)g(p)r +(ermettan)n(t)g(les)g(instructions)f(SELECT,)g(IN-)515 +2232 y(SER)-7 b(T,)23 b(UPD)n(A)-7 b(TE,)24 b(DELETE)e(sur)h(les)g +(tables)g(de)h(l'application.)f(P)n(our)f(indiquer)h(\022)-42 +b(a)24 b(l'ap-)515 2332 y(plication)j(quel)h(compte)f(MySQL)g +(utiliser,)h(v)n(euillez)f(v)n(ous)g(rep)r(orter)f(\022)-42 +b(a)27 b(la)g(section)h(3.3.)515 2607 y Fh(2)134 b(S)m(\023)-64 +b(ecurit)m(\023)g(e)639 2788 y Ff(Cette)19 b(application)f(a)d(\023)-39 +b(et)n(\023)g(e)17 b(d)n(\023)-39 b(ev)n(elopp)n(\023)g(ee)16 +b(en)i(gardan)n(t)f(toujours)h(\022)-42 b(a)18 b(l'esprit)g(les)g +(probl)n(\022)-39 b(emes)515 2888 y(de)28 b(s)n(\023)-39 +b(ecurit)n(\023)g(es.)26 b(Nous)i(ne)h(p)r(ouv)n(ons)c(\023)-39 +b(evidemmen)n(t)28 b(pas)f(la)h(garan)n(tir)f(failles)h(ni)g(bugs,)g +(mais)515 2988 y(nous)34 b(sommes)g(\014x)n(\023)-39 +b(e)33 b(des)h(r)n(\022)-39 b(egles)32 b(de)j(programmation)d(p)r(our)g +(\023)-39 b(eviter)33 b(les)h(failles)h(les)f(plus)515 +3087 y(couran)n(tes.)19 b(T)-7 b(outes)21 b(les)f(donn)n(\023)-39 +b(ees)20 b(issue)g(de)h(l'utilisateur)g(lors)f(des)h(traitemen)n(ts)f +(des)h(pages)515 3187 y(w)n(eb)g(son)n(t)h(trait)n(\023)-39 +b(ees)20 b(p)r(our)f(\023)-39 b(eviter)20 b(des)i(probl)n(\022)-39 +b(emes)20 b(d'insertion)h(de)h(co)r(de)g(dans)f(les)h(requetes)515 +3287 y(SQL.)g(L'authen)n(ti\014cation)h(des)g(utilisateurs)f(est)h +(syst)n(\023)-39 b(ematique,)21 b(v)n(\023)-39 b(eri\014)n(\023)g(ee)20 +b(\022)-42 b(a)23 b(c)n(haque)f(page)515 3386 y(et)k(rep)r(ose)f(sur)g +(le)h(syst)n(\022)-39 b(eme)25 b(des)h(sessions)e(PHP)-7 +b(.)26 b(En)f(rev)-5 b(anc)n(he,)25 b(il)h(faut)h(noter)e(que)h(le)g +(for-)515 3486 y(m)n(ulaire)19 b(d'authen)n(ti\014cation)i(n'est)g(pas) +f(prot)n(\023)-39 b(eg)n(\023)g(e)17 b(con)n(tre)i(l'usurpation)h(de)h +(mots)f(de)h(passe)515 3585 y(car)27 b(les)i(con)n(train)n(tes)d(donn)n +(\023)-39 b(ees)27 b(dans)i(le)f(cahier)g(des)g(c)n(harges)f(ne)h(le)h +(p)r(ermetten)n(t)g(pas,)f(d)r(^)-44 b(u)515 3685 y(moins,)33 +b(il)h(n'est)f(pas)g(p)r(ossible)h(d'utiliser)f(un)h(cryptage)e +(e\016cace)h(\(assym)n(\023)-39 b(etrique\))32 b(sans)515 +3785 y(mo)r(di\014er)22 b(le)g(syst)n(\022)-39 b(eme)21 +b(d'authen)n(ti\014cation)i(d)n(\023)-39 b(el)n(\023)g(egu)n(\023)g(ee) +19 b(et)j(sans)g(utiliser)g(une)h(con\014guration)515 +3884 y(de)k(serv)n(eur)e(W)-7 b(eb)28 b(sp)n(\023)-39 +b(eci\014que.)26 b(Consid)n(\023)-39 b(erez,)25 b(p)r(our)i(r)n(\023) +-39 b(esoudre)25 b(ce)i(probl)n(\022)-39 b(eme,)25 b(l'emploi)j(sur)515 +3984 y(serv)n(eur)c(w)n(eb)h(s)n(\023)-39 b(ecuris)n(\023)g(e)23 +b(\(HTTPS\))k(et)f(l'utilisation)g(d'une)g(liaison)f(en)n(tre)g(le)h +(serv)n(eur)e(w)n(eb)515 4084 y(et)k(le)f(serv)n(eur)f(d'authen)n +(ti\014cation)i(au)f(tra)n(v)n(ers)e(d'un)j(r)n(\023)-39 +b(eseau)26 b(de)h(con\014ance.)515 4358 y Fh(3)134 b(Installation)515 +4557 y Fc(3.1)112 b(D)n(\023)-54 b(epaquetage)39 b(des)f(pages)g(PHP) +639 4710 y Ff(L'application)j(est)h(livr)n(\023)-39 b(ee)39 +b(dans)j(une)f(arc)n(hiv)n(e)f(de)i(t)n(yp)r(e)f(tarball)g(compress)n +(\023)-39 b(ee)39 b(qui)515 4809 y(con)n(tien)n(t)18 +b(toute)g(l'arb)r(orescence)f(et)h(les)h(\014c)n(hiers)e(PHP)h(n)n +(\023)-39 b(ecessaires.)15 b(Il)k(su\016t)g(de)f(d)n(\023)-39 +b(ecompresser)1926 5255 y(2)p eop end +%%Page: 3 3 +TeXDict begin 3 2 bop 515 523 a Ff(cette)27 b(arc)n(hiv)n(e)f(en)h +(conserv)-5 b(an)n(t)26 b(l'arb)r(orescence)f(dans)i(un)g(dossier)f +(publi)n(\023)-39 b(e)27 b(par)f(v)n(otre)g(ser-)515 +623 y(v)n(eur)f(W)-7 b(eb.)27 b(Les)f(\014c)n(hiers)f(de)i +(con\014gurations)d(son)n(t)i(pr)n(\023)-39 b(esen)n(t)24 +b(et)j(con)n(tiennen)n(t)f(des)g(v)-5 b(aleurs)515 722 +y(d'exemple)27 b(que)h(v)n(ous)f(p)r(ourrez)f(adapter)h(\022)-42 +b(a)27 b(v)n(otre)f(situation.)515 951 y Fc(3.2)112 b(P)m(aram)n(\022) +-54 b(etres)38 b(de)g(con\014guration)639 1104 y Ff(Cette)33 +b(application)f(comp)r(orte)g(deux)h(\014c)n(hiers)f(de)h +(con\014guration)e(qui)i(son)n(t)f(dans)g(le)515 1203 +y(dossier)f Fd(\()-17 b(\()24 b Ff(include)f Fd(\))-17 +b(\))p Ff(.)33 b(Les)f(\014c)n(hiers)g(existen)n(t)h(dans)f(la)g(v)n +(ersion)f(distribu)n(\023)-39 b(ee)32 b(et)h(on)n(t)f(p)r(our)515 +1303 y(but)c(de)g(servir)e(de)i(mo)r(d)n(\022)-39 b(ele.)515 +1433 y Fg(connect.inc.php)31 b(:)41 b Ff(ce)32 b(\014c)n(hier)f(con)n +(tien)n(t)g(les)g(co)r(ordonn)n(\023)-39 b(ees)29 b(du)j(serv)n(eur)e +(MySQL,)h(de)722 1533 y(l'utilisateur)d(SQL)f(et)h(de)g(la)f(base)g +(que)g(l'application)g(utilisera.)515 1653 y Fg(con\014g.inc.php)k(:)41 +b Ff(ce)35 b(\014c)n(hier)f(con)n(tien)n(t)h(tout)g(le)g(reste)g(de)g +(la)g(con\014guration)e(de)j(l'ap-)722 1752 y(plication.)k(Le)g(\014c)n +(hier)g(est)g(un)g(script)g(PHP)g(qui)g(initialise)g(un)g(tableau)g(m)n +(ulti-)722 1852 y(dimen)n(tionnel.)f(Ce)f(c)n(hoix)f(\022)-42 +b(a)36 b(\023)-39 b(et)n(\023)g(e)37 b(fait)h(par)g(commo)r(dit)n(\023) +-39 b(e,)37 b(et)h(p)r(our)g(p)r(ermette)h(de)722 1951 +y(bien)h(hi)n(\023)-39 b(erarc)n(hiser)37 b(les)i(information,)h(en)f +(rev)-5 b(anc)n(he,)39 b(la)h(syn)n(taxe)e(est)i(fourb)r(e.)14 +b(.)g(.)722 2051 y(N'oubliez)28 b(pas)f(de)h(virgule)13 +b(!)27 b(T)-7 b(outes)28 b(les)f(constan)n(tes)f(son)n(t)h(d)n(\023)-39 +b(ecrites)27 b(ci-dessous.)722 2191 y Fg($adminMail)k(:)41 +b Ff(adresse)23 b(e-mail)h(de)g(l'administrateur.)g(A\016c)n(h)n(\023) +-39 b(ee)24 b(\022)-42 b(a)24 b(l'utilisateur)905 2291 +y(lorsque)i(qu'une)i(erreur)e(in)n(terne)i(\022)-42 b(a)27 +b(l'application)g(s'est)g(pro)r(duite.)722 2411 y Fg($automatedMail)k +(:)41 b Ff(adresse)31 b(e-mail)g(de)h(r)n(\023)-39 b(ep)r(onse)30 +b(des)i(courriels)f(en)n(v)n(o)n(y)n(\023)-39 b(es)29 +b(au-)905 2510 y(tomatiquemen)n(t)e(par)g(l'application.)722 +2630 y Fg(A)m(UTH)33 b(:)41 b Ff(P)n(aram)n(\022)-39 +b(etres)24 b(d'authen)n(ti\014cation)905 2770 y Fg(POP)32 +b(:)41 b Ff(P)n(aram)n(\022)-39 b(etres)24 b(p)r(our)j(les)h(serv)n +(eurs)d(mail)j(POP)1060 2911 y Fg(SER)-11 b(VERS)31 b(:)41 +b Ff(Chaque)26 b(\023)-39 b(el)n(\023)g(emen)n(t)27 b(de)h(ce)g +(tableau)g(\022)-42 b(a)28 b(p)r(our)g(clef)h(le)f(nom)1201 +3010 y(de)d(domaine)f(du)h(fournisseur)e(de)i(service)f(de)g(courriel)f +(\()i(partie)f(sui-)1201 3110 y(v)-5 b(an)n(t)27 b(le)g(@)g(dans)g(une) +g(adresse)f(e-mail\))g(\022)-42 b(a)27 b(p)r(our)g(v)-5 +b(aleur)26 b(un)h(tableau)1201 3210 y(asso)r(ciatif)g(de)h(la)f(forme)g +(suiv)-5 b(an)n(te)1201 3350 y Fg(sub)s(domain)31 b(:)41 +b Ff(adresse)23 b(complete)i(du)g(serv)n(eur)e(o\013ran)n(t)g(le)i +(service)1284 3449 y(POP)1201 3569 y Fg(p)s(ort)32 b(:)41 +b Ff(n)n(um)n(\023)-39 b(ero)39 b(de)h(p)r(ort)h(TCP)f(utilis)n(\023) +-39 b(e)39 b(p)r(our)h(se)h(connecter)e(au)1284 3669 +y(service)27 b(POP)1201 3789 y Fg(username)p 1604 3789 +29 4 v 34 w(is)p 1703 3789 V 34 w(full)p 1873 3789 V +33 w(mail)k(:)41 b Ff(Bo)r(ol)n(\023)-39 b(een)38 b(\(true)j(ou)e +(false\))h(indican)n(t)1284 3888 y(si)k(le)g(nom)g(d'utilisateur)g +(\022)-42 b(a)43 b(utiliser)h(p)r(our)f(l'authen)n(ti\014cation)1284 +3988 y(est)28 b(l'adresse)e(e-mail)h(compl)n(\022)-39 +b(ete.)26 b(C'est)i(utile)g(p)r(our)f(les)g(serv)n(eurs)1284 +4088 y(POP)17 b(g)n(\023)-39 b(eran)n(t)16 b(des)j(adresses)d(email)i +(sur)g(plusieurs)g(domaines)g(\(comme)1284 4187 y(w)n(anado)r(o)26 +b(/)h(orange)f(au)i(momen)n(t)f(o)r(\022)-44 b(u)27 b(j')n(\023)-39 +b(ecris)27 b(ce)g(do)r(cumen)n(t\))905 4327 y Fg(b)m(ypass)p +1186 4327 V 35 w(if)p 1277 4327 V 34 w(lo)s(cal)k(:)41 +b Ff(Bo)r(ol)n(\023)-39 b(een)37 b(indiquan)n(t)i(si)g(l'authen)n +(ti\014cation)g(doit)e(^)-39 b(etre)1060 4427 y(outrepass)n(\023)g(ee) +21 b(si)h(la)h(connexion)f(s'e\013ectue)h(depuis)h(le)f(serv)n(eur)e +(lui-m)n(^)-39 b(eme.)722 4567 y Fg(CSS)32 b(:)41 b Ff(P)n(aram)n(\022) +-39 b(etres)24 b(des)k(st)n(yles)e(de)i(pages)905 4707 +y Fg(CHOOSER)p 1387 4707 V 33 w(LIST)33 b(:)41 b Ff(Ce)19 +b(tableau)g(asso)r(ciatif)g(con)n(tien)n(t)g(la)g(liste)g(des)h(st)n +(yles)1060 4807 y(CSS)29 b(\022)-42 b(a)28 b(utiliser.)h(Les)f(clefs)h +(son)n(t)f(les)g(lib)r(ell)n(\023)-39 b(es)28 b(des)g(th)n(\022)-39 +b(emes)28 b(\022)-42 b(a)28 b(a\016c)n(her)g(et)1060 +4907 y(les)33 b(v)-5 b(aleurs)33 b(son)n(t)f(les)h(noms)g(des)g(\014c)n +(hiers)f(CSS)i(corresp)r(ondan)n(ts,)d(sans)1060 5006 +y(c)n(hemin,)d(ni)g(extension.)1926 5255 y(3)p eop end +%%Page: 4 4 +TeXDict begin 4 3 bop 722 523 a Fg(MAIL)33 b(:)905 680 +y(TEMPLA)-8 b(TES)33 b(:)41 b Ff(Ce)28 b(tableau)h(con)n(tien)n(t)g +(des)f(tableaux)h(asso)r(ciatifs)e(don)n(t)1060 779 y(les)g(clefs)f +(seron)n(t)g(utilis)n(\023)-39 b(ees)26 b(dans)g(les)g(passages)f(de)i +(param)n(\022)-39 b(etres)24 b(HTML,)1060 879 y(et)k(con)n(tiennen)n(t) +f(des)h(sous-tableaux)e(de)h(la)h(forme)f(suiv)-5 b(an)n(te)27 +b(:)1060 1036 y Fg(caption)32 b(:)41 b Ff(In)n(titul)n(\023)-39 +b(e)28 b(qui)f(sera)g(a\016c)n(h)n(\023)-39 b(e)26 b(\022)-42 +b(a)27 b(l'utilisateur)1060 1164 y Fg(tpl)p 1183 1164 +29 4 v 34 w(\014le)k(:)41 b Ff(Nom)d(du)g(\014c)n(hier)g(\(a)n(v)n(ec)e +(l'extension)i(PHP\))f(con)n(tenan)n(t)g(le)1201 1264 +y(mo)r(d)n(\022)-39 b(ele.)722 1421 y Fg(SUPER)m(USERS)32 +b(:)41 b Ff(Ce)19 b(tableau)f(con)n(tien)n(t)g(la)g(liste)g(des)h +(login)e(des)h(sup)r(er-utilisateurs)905 1520 y(\(ceux)28 +b(qui)f(on)n(t)h(le)f(droit)g(de)h(supprimer)f(des)h(r)n(\023)-39 +b(eunions\))722 1648 y Fg(UPLO)m(AD)34 b(:)41 b Ff(P)n(aram)n(\022)-39 +b(etres)14 b(concernan)n(t)k(l'attac)n(hemen)n(t)f(de)i(\014c)n(hiers)e +(aux)h(r)n(\023)-39 b(eunions)905 1805 y Fg(accepted)p +1272 1805 V 35 w(\014les)31 b(:)41 b Ff(T)-7 b(ableau)27 +b(des)h(extensions)e(qui)i(son)n(t)f(autoris)n(\023)-39 +b(ees.)515 2038 y Fc(3.3)112 b(Initialisation)39 b(de)e(la)h(base)639 +2191 y Ff(T)-7 b(out)28 b(les)g(\014c)n(hiers)f(n)n(\023)-39 +b(ecessaires)25 b(son)n(t)i(rang)n(\023)-39 b(es)25 b(dans)j(le)g +(dossier)e Fd(\()-17 b(\()22 b Ff(install)g Fd(\))-17 +b(\))p Ff(.)28 b(V)-7 b(ous)28 b(uti-)515 2291 y(liserez)d +(principalemen)n(t)h(le)g(\014c)n(hier)g Fd(\()-17 b(\()21 +b Ff(RAZBase.php)f Fd(\))-17 b(\))p Ff(.)26 b(App)r(el)n(\023)-39 +b(e)26 b(au)g(tra)n(v)n(ers)e(du)j(serv)n(eur)515 2390 +y(w)n(eb,)j(il)g(v)n(ous)f(p)r(ermettra)h(automatiquemen)n(t)f(de)i +(mettre)f(en)g(place)g(la)g(structure)f(de)h(la)515 2490 +y(base)24 b(de)g(donn)n(\023)-39 b(ees,)23 b(et)i(optionnellemen)n(t,)g +(d'ins)n(\023)-39 b(erer)22 b(un)j(jeu)g(d'essai)f(p)r(our)g(tester)g +(l'appli-)515 2589 y(cation)h(sur)g(v)n(otre)g(serv)n(eur.)f(Si)i(v)n +(ous)f(ne)h(souhaitez)f(pas)g(utiliser)h(de)f(compte)h(SQL)g(a)n(y)n +(an)n(t)515 2689 y(le)k(droit)g(d'alt)n(\023)-39 b(erer)28 +b(la)h(structure)h(des)g(tables)g(de)g(v)n(otre)f(base)g(a)n(v)n(ec)g +(ce)h(script)g(php,)g(v)n(ous)515 2789 y(p)r(ouv)n(ez)24 +b(ex)n(\023)-39 b(ecuter)22 b(le)j(script)f Fd(\()-17 +b(\()19 b Ff(base.sql)f Fd(\))-17 b(\))25 b Ff(a)n(v)n(ec)e(v)n(otre)g +(clien)n(t)h(SQL)g(fa)n(v)n(ori.)f(Le)h(jeu)h(d'essai)515 +2888 y(se)i(trouv)n(e)g(dans)g(le)g(\014c)n(hier)g Fd(\()-17 +b(\()22 b Ff(jeu)p 1573 2888 25 4 v 31 w(essai.sql)e +Fd(\))-17 b(\))p Ff(.)515 3121 y Fc(3.4)112 b(Con\014guration)39 +b(par)e(d)n(\023)-54 b(efaut)39 b(des)f(comptes)639 3274 +y Ff(Dans)30 b(le)g(\014c)n(hier)f(de)h(con\014guration)f(mo)r(d)n +(\022)-39 b(ele,)29 b(un)h(sup)r(er-utilisateur)f(est)h(con\014gur)n +(\023)-39 b(e)28 b(:)515 3374 y(ingleb)r(ert@iut-blagnac.fr)e(et)i(le)g +(jeu)g(d'essai)f(prop)r(os)n(\023)-39 b(e)25 b(au)j(paragraphe)d(pr)n +(\023)-39 b(ec)n(\023)g(eden)n(t)25 b(p)r(er-)515 3473 +y(met)j(de)f(cr)n(\023)-39 b(eer)26 b(des)h(utilisateurs,)g(et)h(en)g +(particulier)f(ingleb)r(ert@iut-blagnac.fr.)639 3573 +y(P)n(ar)19 b(d)n(\023)-39 b(efaut,)21 b(v)n(ous)e(p)r(ourrez)h(donc)g +(v)n(ous)g(connecter)g(en)h(tan)n(t)g(qu'administrateur)e(a)n(v)n(ec) +515 3672 y(ce)32 b(compte.)g(Le)g(jeu)g(d'essai)f(met)i(ce)f(compte)g +(a)n(v)n(ec)e(comme)i(mo)r(de)g(d'authen)n(ti\014cation)515 +3772 y Fd(\()-17 b(\()20 b Ff(b)n(ypass)f Fd(\))-17 b(\))o +Ff(,)26 b(ce)f(qui)g(signi\014e)g(qu'aucun)g(mot)g(de)g(passe)f(est)i +(n)n(\023)-39 b(ecessaire.)22 b(P)n(our)i(utiliser)h(un)515 +3872 y(vrai)i(syst)n(\022)-39 b(eme)27 b(d'authen)n(ti\014cation,)h +(connectez-v)n(ous)f(a)n(v)n(ec)g(ce)h(compte)g(et)h(allez)f(dans)f(la) +515 3971 y(page)f Fd(\()-17 b(\()22 b Ff(Mon)28 b(Pro\014l)21 +b Fd(\))-17 b(\))27 b Ff(p)r(our)g(c)n(hoisir)g(une)g(autre)g(mo)r(de)h +(d'authen)n(ti\014cation.)515 4246 y Fh(4)134 b(Main)l(tenance)515 +4444 y Fc(4.1)112 b(Visualisation)39 b(des)f(ob)6 b(jets)38 +b(et)f(des)h(\014c)m(hiers)639 4598 y Ff(Une)28 b(page)e +(d'administration)g(est)h(pr)n(\023)-39 b(evue)26 b(\022)-42 +b(a)26 b(cet)h(e\013et,)h(et)f(elle)g(n'est)g(accessible)f(que)515 +4697 y(par)31 b(un)i Fd(\()-17 b(\()23 b Ff(sup)r(er-utilisateur)g +Fd(\))-17 b(\))o Ff(,)33 b(c'est)f(\022)-42 b(a)32 b(dire)g(un)g +(utilisateur)g(consign)n(\023)-39 b(e)31 b(dans)g(le)i(\014c)n(hier)515 +4797 y(de)27 b(con\014guration)f(principal)i(en)f(tan)n(t)h(que)f(tel,) +h(conf)n(\022)-39 b(ere)26 b(3.2.)1926 5255 y(4)p eop +end +%%Page: 5 5 +TeXDict begin 5 4 bop 515 523 a Fc(4.2)112 b(Netto)m(y)m(age)37 +b(de)h(la)g(base)650 655 y Ff(\022)639 676 y(A)31 b(partir)f(de)h(la)f +(page)f(d'administration)h(d)n(\023)-39 b(ecrite)30 b(dans)g(le)g +(paragraphe)e(pr)n(\023)-39 b(ec)n(\023)g(eden)n(t,)515 +776 y(v)n(ous)23 b(p)r(ouv)n(ez)h(aussi)f(purger)g(les)h(\014c)n(hiers) +g(attac)n(h)n(\023)-39 b(es)22 b(et)i(les)g(ob)5 b(jets)24 +b(de)h(la)f(base)f(de)i(donn)n(\023)-39 b(ees)515 876 +y(dev)n(en)n(us)31 b(obsol)n(\022)-39 b(etes.)30 b(L'aide)h(con)n +(textuelle)h(de)f(cette)i(page)e(v)n(ous)f(expliquera)h(commen)n(t)515 +975 y(faire.)c(Il)g(est)h(viv)n(emen)n(t)f(conseill)n(\023)-39 +b(e)26 b(de)i(faire)f(une)g(sauv)n(egarde)e(de)j(la)f(base)g(de)h(donn) +n(\023)-39 b(ees)26 b(et)515 1075 y(des)g(\014c)n(hiers)f(join)n(ts)i +(aux)e(r)n(\023)-39 b(eunions)25 b(a)n(v)-5 b(an)n(t)25 +b(d'utiliser)i(cet)f(outil)g(car)g(l'erreur)f(de)h(manipu-)515 +1174 y(lation)h(ou)g(de)h(programmation)d(est)j(toujours)f(p)r +(ossible.)13 b(.)h(.)515 1449 y Fh(5)134 b(Authen)l(ti\014cation)46 +b(d)m(\023)-64 b(edi)m(\023)g(ee)46 b(-)f(P)l(ersonnalisation)639 +1631 y Ff(A)-9 b(W)n(OR)32 b(utilise)g(un)g(syst)n(\022)-39 +b(eme)31 b(d'authen)n(ti\014cation)h(d)n(\023)-39 b(edi)n(\023)g(ee)29 +b(de)j(sorte)f(qu'aucun)h(mot)515 1730 y(de)40 b(passe)f(ne)h(soit)f +(sto)r(c)n(k)n(\023)-39 b(e,)38 b(et)j(que)e(l'utilisateur)h(n'ait)g +(pas)g(b)r(esoin)f(d'en)h(retenir)g(un)515 1830 y(nouv)n(eau.)32 +b(Le)i(co)r(de)f(d'authen)n(ti\014cation)h(\022)-42 b(a)30 +b(\023)-39 b(et)n(\023)g(e)30 b(\023)-39 b(ecrit)33 b(de)h(mani)n(\022) +-39 b(ere)31 b(\022)-42 b(a)31 b(^)-39 b(etre)33 b(mal)n(\023)-39 +b(eable)32 b(et)515 1930 y(est)e(extensible.)g(Le)h(co)r(eur)e(du)i +(syst)n(\022)-39 b(eme)29 b(d'authen)n(ti\014cation)h(se)g(trouv)n(e)f +(dans)h(le)h(\014c)n(hier)515 2029 y Fd(\()-17 b(\()22 +b Ff(auth)p 747 2029 25 4 v 29 w(dialog.php)g Fd(\))-17 +b(\))o Ff(.)28 b(V)-7 b(ous)27 b(y)h(trouv)n(erez)e(une)h(section)g +(commen\030)-37 b(can)n(t)27 b(par)g(le)h(commen-)515 +2129 y(taire)f(ci-dessous.)722 2312 y Fb(/****************)o(**)o(***)o +(**)o(***)o(**)o(**)o(***)o(**)o(***)o(**)o(**)o(***)o(**)o(***)o(*)722 +2411 y(**)43 b(Ajouter)e(d'autres)f(mode)i(d'authentificati)o(on)37 +b(ici)42 b(!)i(**)722 2511 y(*****************)o(**)o(***)o(**)o(***)o +(**)o(**)o(***)o(**)o(***)o(**)o(**)o(***)o(**)o(***)o(/)515 +2693 y Ff(Comme)30 b(l'indique)g(ce)g(commen)n(taire,)f(v)n(ous)g(p)r +(ourrez)h(a)5 b(jouter)29 b(\022)-42 b(a)29 b(cet)i(endroit)e(une)i(p)r +(or-)515 2793 y(tion)d(de)g(co)r(de)f(p)r(our)h(utiliser)f(un)i(autre)e +(service)g(d'authen)n(ti\014cation.)g(La)h(syn)n(taxe)f(est)g(la)515 +2893 y(suiv)-5 b(an)n(te)27 b(:)722 3035 y Fb(case)42 +b('<nom)p 1165 3035 27 4 v 30 w(auth>')f(:)722 3135 y(/*)i +(Eventuellement)38 b(du)43 b(code)f(pr\023)-44 b(el\023)g(eminaire)38 +b(*/)722 3235 y($auth)p 947 3235 V 30 w(is)p 1065 3235 +V 30 w(ok=<fonction)p 1623 3235 V 27 w(ou)p 1738 3235 +V 30 w(variable)p 2120 3235 V 28 w(authentification>)o(;)722 +3334 y(if)43 b(\()g(!)g($auth)p 1252 3334 V 30 w(is)p +1370 3334 V 30 w(ok)g(\))722 3434 y Fa(f)g Fb(//)g(On)g(ex\023)-44 +b(ecute)41 b(la)h(ligne)g(ci-dessous)d(que)k(si)f(l'authentificaito)o +(n)c(\022)-44 b(a)43 b(\023)-44 b(echou\023)g(ee)722 +3533 y($errmsg=<fonction)p 1474 3533 V 25 w(ou)p 1588 +3533 V 30 w(chaine)p 1882 3533 V 29 w(explicant)p 2307 +3533 V 28 w(l)p 2379 3533 V 31 w(erreur)p 2674 3533 V +29 w(d)p 2747 3533 V 31 w(authentificatio)o(n>;)722 3633 +y Fa(g)722 3733 y Fb(break;)515 3875 y Ff(Il)27 b(v)n(ous)f(su\016t)i +(de)f(remplacer)f(les)f(\023)-39 b(el)n(\023)g(emen)n(ts)25 +b(en)n(tre)i(c)n(hevrons)e(dans)i(le)g(co)r(de)h(ci-dessus)e(et)515 +3975 y(de)k(le)g(coller)e(dans)i Fd(\()-17 b(\()p Ff(auth)p +1348 3975 25 4 v 29 w(dialog.inc.php)p Fd(\))g(\))29 +b Ff(p)r(our)h(p)r(ouv)n(oir)e(utiliser)i(un)g(nouv)n(eau)f(mo)r(de)515 +4074 y(d'authen)n(ti\014cation.)i(Reste)h(\022)-42 b(a)31 +b(donner)g(\022)-42 b(a)31 b(l'utilisateur)h(la)f(capacit)n(\023)-39 +b(e)30 b(de)i(l'utiliser.)f(V)-7 b(ous)515 4174 y(devrez)32 +b(encore,)h(d'une)g(part,)g(a)5 b(jouter)33 b(dans)g(la)g(base)f(de)i +(donn)n(\023)-39 b(ees)32 b(le)h Fe(<)p Ff(nom)p 3049 +4174 V 29 w(auth)p Fe(>)g Ff(\022)-42 b(a)515 4274 y(l')n(\023)j(en)n +(um)n(\023)g(eration)20 b(du)j(c)n(hamp)f Fd(\()-17 b(\()p +Ff(metho)r(deAuth)p Fd(\))g(\))23 b Ff(de)g(la)f(table)h +Fd(\()-17 b(\()p Ff(P)n(ersonne)p Fd(\))g(\))n Ff(,)22 +b(et)h(d'autre)g(part)515 4373 y(prop)r(oser)c(\022)-42 +b(a)20 b(l'utilisateur)h(d'utiliser)f(ce)h(mo)r(de)g(d'authen)n +(ti\014cation)f(en)h(mo)r(di\014an)n(t)g(la)f(page)515 +4473 y Fd(\()-17 b(\()o Ff(pro\014l.php)p Fd(\))g(\))p +Ff(.)1926 5255 y(5)p eop end +%%Trailer + +userdict /end-hook known{end-hook}if +%%EOF diff --git a/beta_accents/doc/READ_ME.txt b/beta_accents/doc/READ_ME.txt new file mode 100644 index 0000000..ce42282 --- /dev/null +++ b/beta_accents/doc/READ_ME.txt @@ -0,0 +1,277 @@ + + +AWOR - Fichier Lisez-moi de l'administrateur + +Table des Matières + + 1 Compatibilité + 2 Sécurité + 3 Installation + 3.1 Dépaquetage des pages PHP + 3.2 Paramètres de configuration + 3.3 Initialisation de la base + 3.4 Configuration par défaut des comptes + 4 Maintenance + 4.1 Visualisation des objets et des fichiers + 4.2 Nettoyage de la base + 5 Authentification dédiée - Personnalisation + + + + + + +1 Compatibilité + +Cette application peut-être utilisée sur un serveur +fonctionnant avec Apache, MySQL(>=4) et PHP (>=4). + + PHP + +L'application ne nécessite pas de configuration de PHP +particulière. Elle fonctionne quelque soit la valeur du +paramètre de configuration register_globals, utilise +les sessions via les fonctions introduites en PHP4. +L'application fonctionne quelque soit la verbosité des +affichages d'erreur et de warning PHP, car nous avons +travaillé à éliminer tous les messages "E_NOTICE" PHP qui +surviennent par exemple lors d'une comparaison avec une +variable non-initialisée. + +Les scripts PHP n'accèdent pas en écriture au système +de fichier, sauf pour l'upload de fichiers. Le dossier "fichiers" + doit être accessible en écriture par les scripts PHP +sans quoi la fonctionnalité d'échange de fichier serait +inutilisable. + + MySQL + +Les scripts PHP ne modifient pas structurellement la +base de donnée MySQL, il suffit donc d'un compte +permettant les instructions SELECT, INSERT, UPDATE, +DELETE sur les tables de l'application. Pour indiquer à +l'application quel compte MySQL utiliser, veuillez vous +reporter à la section [sub:Initialisation-de-la-bd]. + +2 Sécurité + +Cette application a été développée en gardant toujours +à l'esprit les problèmes de sécurités. Nous ne pouvons +évidemment pas la garantir failles ni bugs, mais nous +sommes fixé des règles de programmation pour éviter les +failles les plus courantes. Toutes les données issue de +l'utilisateur lors des traitements des pages web sont +traitées pour éviter des problèmes d'insertion de code +dans les requetes SQL. L'authentification des +utilisateurs est systématique, vérifiée à chaque page +et repose sur le système des sessions PHP. En revanche, +il faut noter que le formulaire d'authentification +n'est pas protégé contre l'usurpation de mots de passe +car les contraintes données dans le cahier des charges +ne le permettent pas, dû moins, il n'est pas possible +d'utiliser un cryptage efficace (assymétrique) sans +modifier le système d'authentification déléguée et sans +utiliser une configuration de serveur Web spécifique. +Considérez, pour résoudre ce problème, l'emploi sur +serveur web sécurisé (HTTPS) et l'utilisation d'une +liaison entre le serveur web et le serveur +d'authentification au travers d'un réseau de confiance. + +3 Installation + +3.1 Dépaquetage des pages PHP + +L'application est livrée dans une archive de type +tarball compressée qui contient toute l'arborescence et +les fichiers PHP nécessaires. Il suffit de décompresser +cette archive en conservant l'arborescence dans un +dossier publié par votre serveur Web. Les fichiers de +configurations sont présent et contiennent des valeurs +d'exemple que vous pourrez adapter à votre situation. + + + +3.2 <sub:Configuration>Paramètres de configuration + +Cette application comporte deux fichiers de +configuration qui sont dans le dossier "include". Les +fichiers existent dans la version distribuée et ont +pour but de servir de modèle. + + connect.inc.php : ce fichier contient les coordonnées + du serveur MySQL, de l'utilisateur SQL et de la base + que l'application utilisera. + + config.inc.php : ce fichier contient tout le reste de + la configuration de l'application. Le fichier est un + script PHP qui initialise un tableau + multi-dimentionnel. Ce choix à été fait par + commodité, et pour permette de bien hiérarchiser les + information, en revanche, la syntaxe est fourbe... + N'oubliez pas de virgule ! Toutes les constantes sont + décrites ci-dessous. + + $adminMail : adresse e-mail de l'administrateur. + Affichée à l'utilisateur lorsque qu'une erreur + interne à l'application s'est produite. + + $automatedMail : adresse e-mail de réponse des + courriels envoyés automatiquement par l'application. + + AUTH : Paramètres d'authentification + + POP : Paramètres pour les serveurs mail POP + + SERVERS : Chaque élément de ce tableau à pour clef + le nom de domaine du fournisseur de service de + courriel ( partie suivant le @ dans une adresse + e-mail) à pour valeur un tableau associatif de + la forme suivante + + subdomain : adresse complete du serveur offrant + le service POP + + port : numéro de port TCP utilisé pour se + connecter au service POP + + username_is_full_mail : Booléen (true ou false) + indicant si le nom d'utilisateur à utiliser + pour l'authentification est l'adresse e-mail + complète. C'est utile pour les serveurs POP + gérant des adresses email sur plusieurs + domaines (comme wanadoo / orange au moment où + j'écris ce document) + + bypass_if_local : Booléen indiquant si + l'authentification doit être outrepassée si la + connexion s'effectue depuis le serveur lui-même. + + CSS : Paramètres des styles de pages + + CHOOSER_LIST : Ce tableau associatif contient la + liste des styles CSS à utiliser. Les clefs sont + les libellés des thèmes à afficher et les valeurs + sont les noms des fichiers CSS correspondants, + sans chemin, ni extension. + + MAIL : + + TEMPLATES : Ce tableau contient des tableaux + associatifs dont les clefs seront utilisées dans + les passages de paramètres HTML, et contiennent + des sous-tableaux de la forme suivante : + + caption : Intitulé qui sera affiché à l'utilisateur + + tpl_file : Nom du fichier (avec l'extension PHP) + contenant le modèle. + + SUPERUSERS : Ce tableau contient la liste des login + des super-utilisateurs (ceux qui ont le droit de + supprimer des réunions) + + UPLOAD : Paramètres concernant l'attachement de + fichiers aux réunions + + accepted_files : Tableau des extensions qui sont autorisées. + +3.3 <sub:Initialisation-de-la-bd>Initialisation de la base + +Tout les fichiers nécessaires sont rangés dans le +dossier "install". Vous utiliserez principalement le +fichier "RAZBase.php". Appelé au travers du serveur web, +il vous permettra automatiquement de mettre en place la +structure de la base de données, et optionnellement, +d'insérer un jeu d'essai pour tester l'application sur +votre serveur. Si vous ne souhaitez pas utiliser de +compte SQL ayant le droit d'altérer la structure des +tables de votre base avec ce script php, vous pouvez +exécuter le script "base.sql" avec votre client SQL +favori. Le jeu d'essai se trouve dans le fichier "jeu_essai.sql". + +3.4 Configuration par défaut des comptes + +Dans le fichier de configuration modèle, un +super-utilisateur est configuré : +inglebert@iut-blagnac.fr et le jeu d'essai proposé au +paragraphe précédent permet de créer des utilisateurs, +et en particulier inglebert@iut-blagnac.fr. + +Par défaut, vous pourrez donc vous connecter en tant +qu'administrateur avec ce compte. Le jeu d'essai met ce +compte avec comme mode d'authentification "bypass", ce +qui signifie qu'aucun mot de passe est nécessaire. Pour +utiliser un vrai système d'authentification, +connectez-vous avec ce compte et allez dans la page "Mon Profil" + pour choisir une autre mode d'authentification. + +4 Maintenance + +4.1 Visualisation des objets et des fichiers + +Une page d'administration est prévue à cet effet, et +elle n'est accessible que par un "super-utilisateur", +c'est à dire un utilisateur consigné dans le fichier de +configuration principal en tant que tel, confère [sub:Configuration]. + +4.2 Nettoyage de la base + +À partir de la page d'administration décrite dans le +paragraphe précédent, vous pouvez aussi purger les +fichiers attachés et les objets de la base de données +devenus obsolètes. L'aide contextuelle de cette page +vous expliquera comment faire. Il est vivement +conseillé de faire une sauvegarde de la base de données +et des fichiers joints aux réunions avant d'utiliser +cet outil car l'erreur de manipulation ou de +programmation est toujours possible... + +5 Authentification dédiée - Personnalisation + +AWOR utilise un système d'authentification dédiée de +sorte qu'aucun mot de passe ne soit stocké, et que +l'utilisateur n'ait pas besoin d'en retenir un nouveau. +Le code d'authentification à été écrit de manière à +être maléable et est extensible. Le coeur du système +d'authentification se trouve dans le fichier "auth_dialog.php" +. Vous y trouverez une section commençant par le +commentaire ci-dessous. + +/*************************************************** + +** Ajouter d'autres mode d'authentification ici ! ** + +***************************************************/ + +Comme l'indique ce commentaire, vous pourrez ajouter à +cet endroit une portion de code pour utiliser un autre +service d'authentification. La syntaxe est la suivante : + +case '<nom_auth>': + +/* Eventuellement du code préléminaire */ + +$auth_is_ok=<fonction_ou_variable_authentification>; + +if ( ! $auth_is_ok ) + +{ // On exécute la ligne ci-dessous que si +l'authentificaiton à échouée + + + +$errmsg=<fonction_ou_chaine_explicant_l_erreur_d_authentification>; + +} + +break; + +Il vous suffit de remplacer les éléments entre chevrons +dans le code ci-dessus et de le coller dans "auth_dialog.inc.php" + pour pouvoir utiliser un nouveau mode +d'authentification. Reste à donner à l'utilisateur la +capacité de l'utiliser. Vous devrez encore, d'une part, +ajouter dans la base de données le <nom_auth> à +l'énumération du champ "methodeAuth" de la table "Personne" +, et d'autre part proposer à l'utilisateur d'utiliser +ce mode d'authentification en modifiant la page "profil.php". diff --git a/beta_accents/fct_adm.inc.php b/beta_accents/fct_adm.inc.php new file mode 100644 index 0000000..1b68b06 --- /dev/null +++ b/beta_accents/fct_adm.inc.php @@ -0,0 +1,33 @@ +<?php +function html_generate_MySQLTable($table, $columns='*', $where_clause='', $row_begin='', $row_end='') +{ + require_once('app/include/ludo/html_elements.inc.php'); + require_once('app/include/connect.inc.php'); + + if ( $where_clause !== '' ) { $where_clause="WHERE $where_clause"; } + $query = "SELECT $columns FROM $table $where_clause;"; + echo "DEBUG : $query\n"; + if ( ! $result = @mysql_query($query) ) + { + return "Erreur de génération de la table $table\n"; + } + else + { + $row = mysql_fetch_assoc($result); + // Affichage des entêtes du tableau + echo "<table>\n<thead>\n<tr>\n"; + echo "$row_begin<td>" . implode("</td>\n<td>",array_keys($row)) . "</td>$row_end\n"; + echo "</tr>\n</thead>\n<tbody>\n"; + do + { + echo "<tr>\n\t<td>" . implode("</td>\n<td>",$row) . "</td>\n</tr>\n"; + } while ( $row = mysql_fetch_assoc($result) ); + echo "</tbody>\n</table>\n"; + } +} + + + +html_generate_MySQLTableSuppr('AWOR_Reunion','idR'); + +?>
\ No newline at end of file diff --git a/beta_accents/install/RAZbase.php b/beta_accents/install/RAZbase.php new file mode 100644 index 0000000..9b9fa25 --- /dev/null +++ b/beta_accents/install/RAZbase.php @@ -0,0 +1,130 @@ +<?php +function SQLConnect($mysql_host, $mysql_user, $mysql_pass, $mysql_base) +{ + + if ( ! ($link = @mysql_connect($mysql_host,$mysql_user,$mysql_pass)) ) + return('Erreur MySql : Impossible de se connecter : ' . mysql_error()); + if ( ! @mysql_select_db($mysql_base)) + return('Erreur Mysql : Impossible de sélectionner la database'); +} + +function SQLFileExec($filepath) +{ + // Chargement du fichier complet dans la variable $request... + + // C'est une méthode barbare, mais il est compliqué de faire mieux + if ( ! ($fd=fopen($filepath,'r') ) ) + { + echo '<div class="errmsg" style="color:#900">Impossible d\'ouvrir le fichier ' . $filepath . "</div>\n"; + } + else + { + if ( ! feof( $fd ) ) { $script = fgets($fd,4096); } + $request = ''; + while ( ! feof( $fd ) ) + { + $request .= fgets($fd,4096); + } + + // Explosion dans un tableau, requete par requete + $tabReq = explode(";", $request); + + // Pour chaque requete + foreach ( $tabReq as $req ) + { + $req=trim($req); + if ( $req !== "" ) + { + // affichage de verification + echo '<div class="sqlcode" style="color:#009">' . str_replace("\n", '<br />', htmlspecialchars( $req) ) ."</div>\n"; + + // execution de la requete et affichage de l'erreur s'il y a lieu + if ( ! mysql_query($req) ) + { + echo '<div class="sqlerr" style="color:#900">' . 'Erreur No ' . mysql_errno() . ' : ' . htmlspecialchars( mysql_error() ) . "</div>\n"; + } + } + } + } +} +echo '<?xml version="1.0" encoding="ISO-8859-1"?>' +?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> + <head> + <title>AWOR - RAZBase</title> + <style> +body{ + margin : 0 25%; + font:80% sans-serif; +} +h1 { + text-align:center; +} +*.errmsg { + color : red +} +*.sqlerr { + color : orange +} +*.sqlcode { + border: thin solid gray; + color : blue; + margin : 2em 0; +} + </style> + </head> + <body> + <h1>Remise à zéro de la base de données</h1> + <form action='' method="post"> +<?php if ( ! isset($_POST['confirm']) ) { ?> + <p> + Ce script va détruire toutes les tables d'une précédente installation (si elles existent) et va les recréer, dépourvues de données.<br /> + Vous devrez utiliser un compte SQL qui ait les droits nécessaires (DROP, CREATE TABLE...). Notez que ces droits sont superflus pour le fonctionnement normal de l'application.<br /> + Etes-vous sûr de vouloir réinitialiser la base de données ?<br /> + <label>Addresse du serveur SQL : </label><input name="SQLhost" type="text" value="localhost" /><br /> + <label>Utilisateur SQL : </label><input name="SQLuser" type="text" /><br /> + <label>Mot de passe SQL : </label><input name="SQLpwd" type="password" /><br /> + <label>Database SQL : </label><input name="SQLdb" type="text" /><br /> + <input type="hidden" name="confirm" value="1" /> + <input type="submit" value="Confirmer" /> + </p> + </form> +<?php } ?> + +<? +if (isset($_POST['confirm']) ) +{ + echo ' <p>'; + $errmsg = SQLConnect( addslashes($_POST['SQLhost']),addslashes($_POST['SQLuser']),addslashes($_POST['SQLpwd']),addslashes($_POST['SQLdb']) ); + if ( $_POST['confirm'] === '1' ) + { + if ( is_string($errmsg) ) { echo $errmsg; } else + { + SQLFileExec('base.sql'); +?> + </p> + <form action="" method="post"> + <p> + Si vous le souhaitez, vous pouvez insérer un jeu d'essai pour tester l'application.<br /> + Vous pouvez effectuer l'insertion de ce jeu d'essai avec le compte MySQL qui sera utilisé au fonctionnement de l'application, pour tester si les droits sont suffisants. + <label>Addresse du serveur SQL : </label><input name="SQLhost" type="text" value="localhost" /><br /> + <label>Utilisateur SQL : </label><input name="SQLuser" type="text" /><br /> + <label>Mot de passe SQL : </label><input name="SQLpwd" type="password" /><br /> + <label>Database SQL : </label><input name="SQLdb" type="text" /><br /> + <input type="hidden" name="confirm" value="2" /> + <input type="submit" value="Insérer" /> + </p> + </form> +<?php + } + } + elseif ( $_POST['confirm'] === '2' ) + { + SQLFileExec('jeu_essai.sql'); + } +} +?> + <p><a href="../index.php">Retour à l'index</a></p> + </body> +</html> diff --git a/beta_accents/install/base.sql b/beta_accents/install/base.sql new file mode 100644 index 0000000..6d1ba97 --- /dev/null +++ b/beta_accents/install/base.sql @@ -0,0 +1,123 @@ +-- +-- Structure de la table `AWOR_Appartenir` +-- + +DROP TABLE IF EXISTS `AWOR_Appartenir`; +CREATE TABLE IF NOT EXISTS `AWOR_Appartenir` ( + `idL` int(11) NOT NULL, + `idP` int(11) NOT NULL, + PRIMARY KEY (`idL`,`idP`) +); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `Choisir` +-- + +DROP TABLE IF EXISTS `AWOR_Choisir`; +CREATE TABLE IF NOT EXISTS `AWOR_Choisir` ( + `idC` int(11) NOT NULL, + `idP` int(11) NOT NULL, + `estDispo` set('oui','non') NOT NULL, + PRIMARY KEY (`idC`,`idP`) +); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `AWOR_Creneau` +-- + +DROP TABLE IF EXISTS `AWOR_Creneau`; +CREATE TABLE IF NOT EXISTS `AWOR_Creneau` ( + `idC` int(11) NOT NULL auto_increment, + `dateHeure` datetime NOT NULL, + `duree` int(11) NOT NULL, + `idR` int(11) NOT NULL, + PRIMARY KEY (`idC`) +); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `AWOR_Fichier` +-- + +DROP TABLE IF EXISTS `AWOR_Fichier`; +CREATE TABLE IF NOT EXISTS `AWOR_Fichier` ( + `idFic` int(11) NOT NULL auto_increment, + `nomFic` varchar(256) NOT NULL, + `idR` int(11) NOT NULL, + PRIMARY KEY (`idFic`) +); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `AWOR_Liste` +-- + +DROP TABLE IF EXISTS `AWOR_Liste`; +CREATE TABLE IF NOT EXISTS `AWOR_Liste` ( + `idL` int(11) NOT NULL auto_increment, + `libelleL` varchar(50) NOT NULL, + `estPrivee` set('oui','non') NOT NULL default 'oui', + `idP_Createur` int(11) default NULL, + PRIMARY KEY (`idL`) +); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `AWOR_Personne` +-- + +DROP TABLE IF EXISTS `AWOR_Personne`; +CREATE TABLE IF NOT EXISTS `AWOR_Personne` ( + `idP` int(11) NOT NULL auto_increment, + `courrielP` varchar(50) NOT NULL, + `loginP` varchar(50) default NULL, + `nomP` varchar(50) NOT NULL, + `prenomP` varchar(50) NOT NULL, + `estAdmin` set('oui','non') NOT NULL default 'non', + `methodeAuth` set('pop','webetud','bypass') NOT NULL default 'pop', + PRIMARY KEY (`idP`), + UNIQUE KEY `loginP` (`loginP`), + UNIQUE KEY `courrielP` (`courrielP`) +); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `AWOR_Repondre` +-- + +DROP TABLE IF EXISTS `AWOR_Repondre`; +CREATE TABLE IF NOT EXISTS `AWOR_Repondre` ( + `idR` int(11) NOT NULL, + `idP` int(11) NOT NULL, + `commentaireReponse` varchar(500) default NULL, + PRIMARY KEY (`idR`,`idP`) +); + +-- -------------------------------------------------------- + +-- +-- Structure de la table `Reunion` +-- + +DROP TABLE IF EXISTS `AWOR_Reunion`; +CREATE TABLE IF NOT EXISTS `AWOR_Reunion` ( + `idR` int(11) NOT NULL auto_increment, + `objetR` varchar(80) NOT NULL, + `ordreJourR` varchar(250), + `lieuR` varchar(50), + `remarquesR` varchar(500), + `montrerDispoR` set('oui','non') NOT NULL default 'non', + `estAnnulee` set('oui','non') NOT NULL default 'non', + `idP_Orga` int(11) NOT NULL, + `idC_Fixe` int(11) default NULL, + `idL` int(11) default NULL, + PRIMARY KEY (`idR`) +); diff --git a/beta_accents/install/jeu_essai.sql b/beta_accents/install/jeu_essai.sql new file mode 100644 index 0000000..7723733 --- /dev/null +++ b/beta_accents/install/jeu_essai.sql @@ -0,0 +1,114 @@ +-- +-- Base de données: `awor` +-- + +-- -------------------------------------------------------- +-- +-- Contenu de la table `AWOR_Appartenir` +-- +DELETE FROM `AWOR_Appartenir`; +INSERT INTO `AWOR_Appartenir` (`idL`, `idP`) VALUES (1, 2), +(1, 3), +(1, 4), +(1, 5), +(2, 1), +(2, 2), +(2, 4), +(2, 5), +(3, 1), +(3, 2), +(3, 3), +(4, 1), +(4, 4), +(4, 5), +(5, 1), +(5, 4), +(5, 5), +(6, 1), +(6, 2), +(6, 3), +(8, 1), +(8, 2), +(8, 3), +(8, 4); + +-- -------------------------------------------------------- +-- +-- Contenu de la table `AWOR_Choisir` +-- +DELETE FROM `AWOR_Choisir`; +INSERT INTO `AWOR_Choisir` (`idC`, `idP`, `estDispo`) VALUES (1, 3, 'oui'), +(6, 1, 'oui'), +(7, 1, 'non'), +(1, 2, 'oui'), +(2, 2, 'non'), +(3, 2, 'oui'), +(4, 2, 'non'), +(5, 2, 'oui'); + +-- -------------------------------------------------------- +-- +-- Contenu de la table `AWOR_Creneau` +-- +DELETE FROM `AWOR_Creneau`; +INSERT INTO `AWOR_Creneau` (`idC`, `dateHeure`, `duree`, `idR`) VALUES (1, '2007-04-01 07:45:00', 645, 1), +(2, '2007-04-03 09:15:00', 75, 1), +(3, '2007-04-10 09:15:00', 75, 1), +(4, '2007-04-17 09:15:00', 75, 1), +(5, '2007-04-24 09:15:00', 75, 1), +(6, '2007-06-20 10:10:00', 80, 2), +(7, '2007-06-25 12:00:00', 30, 2), +(8, '2007-04-25 00:00:00', 0, 4); + +-- -------------------------------------------------------- +-- +-- Contenu de la table `AWOR_Fichier` +-- +DELETE FROM `AWOR_Fichier`; +INSERT INTO `AWOR_Fichier` (`idFic`, `nomFic`, `idR`) VALUES (1, 'r1_READ_ME.pdf', 1), +(2, 'r2_IUP MER.txt', 2); + +-- -------------------------------------------------------- +-- +-- Contenu de la table `AWOR_Liste` +-- +DELETE FROM `AWOR_Liste`; +INSERT INTO `AWOR_Liste` (`idL`, `libelleL`, `estPrivee`, `idP_Createur`) VALUES (1, 'interne_idR_1', 'oui', NULL), +(2, 'interne_idR_2', 'oui', NULL), +(3, 'Amis', 'oui', 3), +(4, 'interne_idR_3', 'oui', NULL), +(5, 'interne_idR_4', 'oui', NULL), +(6, 'Créateurs d''AWOR', 'oui', 1), +(7, 'interne_idR_5', 'oui', NULL), +(8, 'MaListePerso', 'oui', 2); + +-- -------------------------------------------------------- +-- +-- Contenu de la table `AWOR_Personne` +-- +DELETE FROM `AWOR_Personne`; +INSERT INTO `AWOR_Personne` (`idP`, `courrielP`, `loginP`, `nomP`, `prenomP`, `estAdmin`, `methodeAuth`) VALUES (1, 'lpouzenc@wanadoo.fr', 'lpouzenc', 'Pouzenc', 'Ludovic', 'oui', 'pop'), +(2, 'jeremie.denoyer@etu.iut-blagnac.fr', 'jeremie.denoyer', 'jeremie', 'denoyer', 'non', 'pop'), +(3, 'julien.sere@free.fr', 'julien.sere', 'Julien', 'Sere', 'non', 'pop'), +(4, 'soule@iut-blagnac.fr', 'soule@iut-blagnac.fr', 'Soulé', 'Geneviève', 'non', 'pop'), +(5, 'inglebert@iut-blagnac.fr', 'inglebert@iut-blagnac.fr', 'Inglebert', 'Jean-Michel', 'non', 'bypass'); + +-- -------------------------------------------------------- +-- +-- Contenu de la table `AWOR_Repondre` +-- +DELETE FROM `AWOR_Repondre`; +INSERT INTO `AWOR_Repondre` (`idR`, `idP`, `commentaireReponse`) VALUES (1, 1, 'Test de commentaire un peu long...Test de commentaire un peu long...Test de commentaire un peu long...Test de commentaire un peu long...Test de commentaire un peu long...Test de commentaire un peu long...Test de commentaire un peu long...Test de commentaire un peu long...'), +(1, 3, 'Un commentaire à [ | ) @ {[| @#~{[#`|['), +(3, 1, 'Réunion juste pour le test...'); + +-- -------------------------------------------------------- +-- +-- Contenu de la table `AWOR_Reunion` +-- +DELETE FROM `AWOR_Reunion`; +INSERT INTO `AWOR_Reunion` (`idR`, `objetR`, `ordreJourR`, `lieuR`, `remarquesR`, `montrerDispoR`, `estAnnulee`, `idP_Orga`, `idC_Fixe`, `idL`) VALUES (1, 'Recette du projet tuteuré', 'Recette de cette magnifique application :-)', 'Salle 219', 'Aucune', 'non', 'non', 1, NULL, 1), +(2, 'Renseignez', NULL, NULL, NULL, 'non', 'non', 3, NULL, 2), +(3, 'Réunion annulée - essais', '', 'Nullepart', '', 'oui', 'oui', 1, NULL, 4), +(4, 'Réunion fixée pour tester', '', '', '', 'non', 'non', 1, 8, 5), +(5, 'Renseignez', NULL, NULL, NULL, 'non', 'non', 2, NULL, 7); diff --git a/beta_accents/install/jeu_essai.sql~ b/beta_accents/install/jeu_essai.sql~ new file mode 100644 index 0000000..f2d25b3 --- /dev/null +++ b/beta_accents/install/jeu_essai.sql~ @@ -0,0 +1,114 @@ +-- +-- Base de données: `awor` +-- + +-- -------------------------------------------------------- +-- +-- Contenu de la table `AWOR_Appartenir` +-- +DELETE FROM `AWOR_Appartenir`; +INSERT INTO `AWOR_Appartenir` (`idL`, `idP`) VALUES (1, 2), +(1, 3), +(1, 4), +(1, 5), +(2, 1), +(2, 2), +(2, 4), +(2, 5), +(3, 1), +(3, 2), +(3, 3), +(4, 1), +(4, 4), +(4, 5), +(5, 1), +(5, 4), +(5, 5), +(6, 1), +(6, 2), +(6, 3), +(8, 1), +(8, 2), +(8, 3), +(8, 4); + +-- -------------------------------------------------------- +-- +-- Contenu de la table `AWOR_Choisir` +-- +DELETE FROM `AWOR_Choisir`; +INSERT INTO `AWOR_Choisir` (`idC`, `idP`, `estDispo`) VALUES (1, 3, 'oui'), +(6, 1, 'oui'), +(7, 1, 'non'), +(1, 2, 'oui'), +(2, 2, 'non'), +(3, 2, 'oui'), +(4, 2, 'non'), +(5, 2, 'oui'); + +-- -------------------------------------------------------- +-- +-- Contenu de la table `AWOR_Creneau` +-- +DELETE FROM `AWOR_Creneau`; +INSERT INTO `AWOR_Creneau` (`idC`, `dateHeure`, `duree`, `idR`) VALUES (1, '2007-04-01 07:45:00', 645, 1), +(2, '2007-04-03 09:15:00', 75, 1), +(3, '2007-04-10 09:15:00', 75, 1), +(4, '2007-04-17 09:15:00', 75, 1), +(5, '2007-04-24 09:15:00', 75, 1), +(6, '2007-06-20 10:10:00', 80, 2), +(7, '2007-06-25 12:00:00', 30, 2), +(8, '2007-04-25 00:00:00', 0, 4); + +-- -------------------------------------------------------- +-- +-- Contenu de la table `AWOR_Fichier` +-- +DELETE FROM `AWOR_Fichier`; +INSERT INTO `AWOR_Fichier` (`idFic`, `nomFic`, `idR`) VALUES (1, 'r1_READ_ME.pdf', 1), +(2, 'r2_IUP MER.txt', 2); + +-- -------------------------------------------------------- +-- +-- Contenu de la table `AWOR_Liste` +-- +DELETE FROM `AWOR_Liste`; +INSERT INTO `AWOR_Liste` (`idL`, `libelleL`, `estPrivee`, `idP_Createur`) VALUES (1, 'interne_idR_1', 'oui', NULL), +(2, 'interne_idR_2', 'oui', NULL), +(3, 'Amis', 'oui', 3), +(4, 'interne_idR_3', 'oui', NULL), +(5, 'interne_idR_4', 'oui', NULL), +(6, 'Créateurs d''AWOR', 'oui', 1), +(7, 'interne_idR_5', 'oui', NULL), +(8, 'MaListePerso', 'oui', 2); + +-- -------------------------------------------------------- +-- +-- Contenu de la table `AWOR_Personne` +-- +DELETE FROM `AWOR_Personne`; +INSERT INTO `AWOR_Personne` (`idP`, `courrielP`, `loginP`, `nomP`, `prenomP`, `estAdmin`, `methodeAuth`) VALUES (1, 'lpouzenc@wanadoo.fr', 'lpouzenc', 'Pouzenc', 'Ludovic', 'oui', 'bypass'), +(2, 'jeremie.denoyer@etu.iut-blagnac.fr', 'jeremie.denoyer', 'jeremie', 'denoyer', 'non', 'bypass'), +(3, 'julien.sere@free.fr', 'julien.sere', 'Julien', 'Sere', 'non', 'bypass'), +(4, 'soule@iut-blagnac.fr', 'soule@iut-blagnac.fr', 'Soulé', 'Geneviève', 'non', 'bypass'), +(5, 'inglebert@iut-blagnac.fr', 'inglebert@iut-blagnac.fr', 'Inglebert', 'Jean-Michel', 'non', 'bypass'); + +-- -------------------------------------------------------- +-- +-- Contenu de la table `AWOR_Repondre` +-- +DELETE FROM `AWOR_Repondre`; +INSERT INTO `AWOR_Repondre` (`idR`, `idP`, `commentaireReponse`) VALUES (1, 1, 'Test de commentaire un peu long...Test de commentaire un peu long...Test de commentaire un peu long...Test de commentaire un peu long...Test de commentaire un peu long...Test de commentaire un peu long...Test de commentaire un peu long...Test de commentaire un peu long...'), +(1, 3, 'Un commentaire à [ | ) @ {[| @#~{[#`|['), +(3, 1, 'Réunion juste pour le test...'); + +-- -------------------------------------------------------- +-- +-- Contenu de la table `AWOR_Reunion` +-- +DELETE FROM `AWOR_Reunion`; +INSERT INTO `AWOR_Reunion` (`idR`, `objetR`, `ordreJourR`, `lieuR`, `remarquesR`, `montrerDispoR`, `estAnnulee`, `idP_Orga`, `idC_Fixe`, `idL`) VALUES (1, 'Recette du projet tuteuré', 'Recette de cette magnifique application :-)', 'Salle 219', 'Aucune', 'non', 'non', 1, NULL, 1), +(2, 'Renseignez', NULL, NULL, NULL, 'non', 'non', 3, NULL, 2), +(3, 'Réunion annulée - essais', '', 'Nullepart', '', 'oui', 'oui', 1, NULL, 4), +(4, 'Réunion fixée pour tester', '', '', '', 'non', 'non', 1, 8, 5), +(5, 'Renseignez', NULL, NULL, NULL, 'non', 'non', 2, NULL, 7); |