From 5621e1b5cff51fbd50da8d0e1cc2283ec5cf41a8 Mon Sep 17 00:00:00 2001 From: Roland Gruber Date: Wed, 29 Aug 2007 16:33:58 +0000 Subject: [PATCH] *** empty log message *** --- lam-web/tmp/scalixGroupClass.inc | 264 +++++++++++++++++++++++ lam-web/tmp/scalixUserClass.inc | 352 +++++++++++++++++++++++++++++++ 2 files changed, 616 insertions(+) create mode 100644 lam-web/tmp/scalixGroupClass.inc create mode 100644 lam-web/tmp/scalixUserClass.inc diff --git a/lam-web/tmp/scalixGroupClass.inc b/lam-web/tmp/scalixGroupClass.inc new file mode 100644 index 00000000..091c95c2 --- /dev/null +++ b/lam-web/tmp/scalixGroupClass.inc @@ -0,0 +1,264 @@ +scalixScalixObject = false; + } + + + /** used for account pages, true if input data is correct */ + var $inputCorrect = true; + var $scalixScalixObject; + var $scalixMailnode; + var $scalixEmailAddress; + + + /** + * Returns meta data that is interpreted by parent class + * + */ + function get_metaData() { + $return = array(); + // manages user accounts + $return["account_types"] = array("group"); + // alias name + $return["alias"] = _("Scalix"); + // module dependencies + $return['dependencies'] = array('depends' => array(), 'conflicts' => array()); + // help Entries + $return['help'] = array ( + "scalixuser" => array( + "ext" => "FALSE", "Headline" => _("scalixScalixObject"), + "Text" => _("boolean TRUE or FALSE for creating scalix object")), + "mailnode" => array( + "ext" => "FALSE", "Headline" => _("scalixMailnode"), + "Text" => _("comma separated org units for object mailnode")), + "mboxaddr" => array( + "ext" => "FALSE", "Headline" => _("scalixEmailAddress"), + "Text" => _("E-Mail Adress of Scalix Group")) + ); + $return['attributes'] = array('scalixScalixObject','scalixMailnode','scalixEmailAddress'); + $return['objectClasses'] = array('scalixUserClass'); + return $return; + } + + /** + * This function loads all needed attributes into the object. + * + * @param array $attr an array as it is retured from ldap_get_attributes + */ + function load_attributes($attr) { + parent::load_attributes($attr); + //scalixScalixObject + if (is_string($this->attributes['scalixScalixObject'][0])) { + if ($this->attributes['scalixScalixObject'][0] == "TRUE") $this->scalixScalixObject = true; + else $this->scalixScalixObject = false; + } + //scalixMailnode + $this->attributes['objectClass'] = array(); + $this->attributes['scalixMailnode'] = array(); + $this->orig['objectClass'] = array(); + $this->orig['scalixMailnode'] = array(); + if (isset($attr['objectClass'])) { + $this->attributes['objectClass'] = $attr['objectClass']; + $this->orig['objectClass'] = $attr['objectClass']; + } + if (isset($attr['scalixMailnode'])) { + $this->attributes['scalixMailnode'] = $attr['scalixMailnode']; + $this->orig['scalixMailnode'] = $attr['scalixMailnode']; + } + + //scalixEmailAddress + $this->attributes['objectClass'] = array(); + $this->attributes['scalixEmailAddressx'] = array(); + $this->orig['objectClass'] = array(); + $this->orig['scalixEmailAddress'] = array(); + if (isset($attr['objectClass'])) { + $this->attributes['objectClass'] = $attr['objectClass']; + $this->orig['objectClass'] = $attr['objectClass']; + } + if (isset($attr['scalixEmailAddress'])) { + $this->attributes['scalixEmailAddress'] = $attr['scalixEmailAddress']; + $this->orig['scalixEmailAddress'] = $attr['scalixEmailAddress']; + } + + // add object class if needed +// if (! in_array('scalixUserClass', $this->orig['objectClass'])) { +// $this->attributes['objectClass'][] = 'scalixUserClass'; +// } + if (! in_array('scalixUserClass', $this->orig['objectClass'])) { + $this->attributes['objectClass'][] = 'scalixUserClass'; + } + return 0; + } + + /** + * Returns a list of modifications which have to be made to the LDAP account. + * + * @return array list of modifications + *
This function returns an array with 3 entries: + *
array( DN1 ('add' => array($attr), 'remove' => array($attr), 'modify' => array($attr)), DN2 .... ) + *
DN is the DN to change. It may be possible to change several DNs (e.g. create a new user and add him to some groups via attribute memberUid) + *
"add" are attributes which have to be added to LDAP entry + *
"remove" are attributes which have to be removed from LDAP entry + *
"modify" are attributes which have to been modified in LDAP entry + */ + function save_attributes() { + return $_SESSION[$this->base]->save_module_attributes($this->attributes, $this->orig); + } + + /** + * This function will create the meta HTML code to show a page with all attributes. + * + * @param array $post HTTP-POST values + */ + function display_html_attributes() { + $return = array(); + $return[] = array ( 0 => array ( 'kind' => 'text', 'text' => _('Scalix User') ), + 1 => array ( 'kind' => 'input', 'name' => 'scalixScalixObject', 'type' => 'checkbox', 'checked' => $this->scalixScalixObject, 'value' => 'true'), + 2 => array ('kind' => 'help', 'value' => 'scalixuser')); + $return[] = array ( 0 => array ( 'kind' => 'text', 'text' => _('Mailnode') ), + 1 => array ( 'kind' => 'input', 'type' => 'text', 'name' => 'scalixMailnode', 'size' => '20', 'maxlength' => '255', 'value' => $this->attributes['scalixMailnode'][0]), + 2 => array ( 'kind' => 'help', 'value' => 'mailnode' )); + $return[] = array ( 0 => array ( 'kind' => 'text', 'text' => _('Mboxaddr') ), + 1 => array ( 'kind' => 'input', 'type' => 'text', 'name' => 'scalixEmailAddress', 'size' => '20', 'maxlength' => '255', 'value' => $this->attributes['scalixEmailAddress'][0]), + 2 => array ( 'kind' => 'help', 'value' => 'mboxaddr' )); + + return $return; + } + + function get_pdfEntries() { + return array( + 'scalixUserClass_scalixScalixObject' => array('' . _('Scalix User') . '' . $this->attributes['scalixScalixObject'][0] . ''), + 'scalixUserClass_scalixMailnode' => array('' . _('Mailnode') . '' . $this->attributes['scalixMailnode'][0] . ''), + 'scalixUserClass_scalixMboxaddr' => array('' . _('Mboxaddr') . '' . $this->attributes['scalixEmailAddress'][0] . '')); + } + + /** + * Processes user input of the primary module page. + * It checks if all input values are correct and updates the associated LDAP attributes. + * + * @param array $post HTTP-POST values + * @return array list of info/error messages + */ + function process_attributes() { + $this->triggered_messages = array(); + if (isset($_POST['scalixScalixObject'])) { + $this->scalixScalixObject = true; + $this->attributes['scalixScalixObject'][0] = "TRUE"; + } else { + $this->scalixScalixObject = false; + $this->attributes['scalixScalixObject'][0] = "FALSE"; + } + $this->attributes['scalixMailnode'][0] = $_POST['scalixMailnode']; + $this->attributes['scalixEmailAddress'][0] = $_POST['scalixEmailAddress']; + + + if (sizeof($this->triggered_messages) > 0) { + $this->inputCorrect = false; + return $this->triggered_messages; + } + else { + $this->inputCorrect = true; + return 0; + } + } + + /** + * This function returns true if all needed settings are done. + */ + function module_complete() { + return $this->inputCorrect; + } + + /** + * Returns true if all settings on module page are correct. + */ + function module_ready() { + return $this->inputCorrect; + } + + function get_profileOptions() { + $return = array(); + // use Unix password as Samba password + $return[] = array( + 0 => array('kind' => 'text', 'text' => _('Scalix User') . ': '), + 1 => array('kind' => 'input', 'name' => 'scalixUserClass_scalixScalixObject', 'type' => 'checkbox', 'checked' => true), + 2 => array('kind' => 'help', 'value' => 'scalixuser') + ); + $mboxes = array(0 => 'LIMITED', 1 => 'FULL'); + $return[] = array( + 0 => array('kind' => 'text', 'text' => _('Mailnode') . ': '), + 1 => array('kind' => 'input', 'type' => 'text', 'name' => 'scalixUserClass_scalixMailnode', 'size' => '30', 'maxlength' => '255', 'value' => ''), + 2 => array('kind' => 'help', 'value' => 'mailnode') + ); + $return[] = array( + 0 => array('kind' => 'text', 'text' => _('Mboxaddr') . ': '), + 1 => array('kind' => 'select', 'type' => 'text', 'name' => 'scalixUserClass_scalixEmailAddress', 'size' => '30', 'maxlength' => '255', 'value' => ''), + 2 => array('kind' => 'help', 'value' => 'mboxaddr') + ); + return $return; + } + + /** + * Loads the values of an account profile into internal variables. + * + * @param array $profile hash array with profile values (identifier => value) + */ + function load_profile($profile) { + // profile mappings in meta data + parent::load_profile($profile); + // special profile options + if ($profile['scalixUserClass_scalixScalixObject'][0] == "true") { + $this->scalixScalixObject = true; + } + elseif ($profile['scalixUserClass_scalixScalixObject'][0] == "false") { + $this->scalixScalixObject = false; + } + if (isset($profile['scalixUserClass_scalixMailnode'][0])) { + $this->attributes['scalixMailnode'][0] = $profile['scalixUserClass_scalixMailnode'][0]; + } + if (isset($profile['scalixUserClass_scalixEmailAddress'][0])) { + $this->attributes['scalixEmailAddress'][0] = $profile['scalixUserClass_scalixEmailAddress'][0]; + } + } +} + + +?> + diff --git a/lam-web/tmp/scalixUserClass.inc b/lam-web/tmp/scalixUserClass.inc new file mode 100644 index 00000000..3fe88e8e --- /dev/null +++ b/lam-web/tmp/scalixUserClass.inc @@ -0,0 +1,352 @@ +scalixScalixObject = false; + $this->scalixAdministrator = false; + $this->scalixMailboxAdministrator = false; + } + + + /** used for account pages, true if input data is correct */ + var $inputCorrect = true; + var $scalixScalixObject; + var $scalixMailnode; + var $scalixEmailAddress; + var $scalixAdministrator; + var $scalixMailboxAdministrator; + var $scalixMailboxClass; + + /** + * Returns meta data that is interpreted by parent class + * + */ + function get_metaData() { + $return = array(); + // manages user accounts + $return["account_types"] = array("user"); + // alias name + $return["alias"] = _("Scalix"); + // module dependencies + $return['dependencies'] = array('depends' => array(), 'conflicts' => array()); + // help Entries + $return['help'] = array ( + "scalixuser" => array( + "ext" => "FALSE", "Headline" => _("scalixScalixObject"), + "Text" => _("boolean TRUE or FALSE for creating scalix object")), + "mailnode" => array( + "ext" => "FALSE", "Headline" => _("scalixMailnode"), + "Text" => _("comma separated org units for object mail node")), + "mboxaddr" => array( + "ext" => "FALSE", "Headline" => _("scalixEmailAddress"), + "Text" => _("E-Mail Adress of Scalix User")), + "scalixadmin" => array( + "ext" => "FALSE", "Headline" => _("scalixAdministrator"), + "Text" => _("boolean TRUE or FALSE for admin capability")), + "mboxadmin" => array( + "ext" => "FALSE", "Headline" => _("scalixMailboxAdministrator"), + "Text" => _("boolean TRUE or FALSE for mboxadmin capability")), + "mboxclass" => array( + "ext" => "FALSE", "Headline" => _("scalixMailboxClass"), + "Text" => _("FULL or LIMITED for Class. LIMITED is a Scalix Standard User, FULL is a Scalix Premium User")) + ); + $return['attributes'] = array('scalixScalixObject', 'scalixAdministrator', 'scalixMailboxAdministrator', 'scalixMailnode','scalixMailboxClass','scalixEmailAddress'); + $return['objectClasses'] = array('scalixUserClass'); + return $return; + } + + /** + * This function loads all needed attributes into the object. + * + * @param array $attr an array as it is retured from ldap_get_attributes + */ + function load_attributes($attr) { + parent::load_attributes($attr); + //scalixScalixObject + if (is_string($this->attributes['scalixScalixObject'][0])) { + if ($this->attributes['scalixScalixObject'][0] == "TRUE") $this->scalixScalixObject = true; + else $this->scalixScalixObject = false; + } + //scalixAdministrator + if (is_string($this->attributes['scalixAdministrator'][0])) { + if ($this->attributes['scalixAdministrator'][0] == "TRUE") $this->scalixAdministrator = true; + else $this->scalixAdministrator = false; + } + //scalixMailboxAdministrator + if (is_string($this->attributes['scalixMailboxAdministrator'][0])) { + if ($this->attributes['scalixMailboxAdministrator'][0] == "TRUE") $this->scalixMailboxAdministrator = true; + else $this->scalixMailboxAdministrator = false; + } + //scalixMailnode + $this->attributes['objectClass'] = array(); + $this->attributes['scalixMailnode'] = array(); + $this->orig['objectClass'] = array(); + $this->orig['scalixMailnode'] = array(); + if (isset($attr['objectClass'])) { + $this->attributes['objectClass'] = $attr['objectClass']; + $this->orig['objectClass'] = $attr['objectClass']; + } + if (isset($attr['scalixMailnode'])) { + $this->attributes['scalixMailnode'] = $attr['scalixMailnode']; + $this->orig['scalixMailnode'] = $attr['scalixMailnode']; + } + + //scalixEmailAddress + $this->attributes['objectClass'] = array(); + $this->attributes['scalixEmailAddressx'] = array(); + $this->orig['objectClass'] = array(); + $this->orig['scalixEmailAddress'] = array(); + if (isset($attr['objectClass'])) { + $this->attributes['objectClass'] = $attr['objectClass']; + $this->orig['objectClass'] = $attr['objectClass']; + } + if (isset($attr['scalixEmailAddress'])) { + $this->attributes['scalixEmailAddress'] = $attr['scalixEmailAddress']; + $this->orig['scalixEmailAddress'] = $attr['scalixEmailAddress']; + } + //scalixMailboxClass + $this->attributes['objectClass'] = array(); + $this->attributes['scalixMailboxClass'] = array(); + $this->orig['objectClass'] = array(); + $this->orig['scalixMailboxClass'] = array(); + if (isset($attr['objectClass'])) { + $this->attributes['objectClass'] = $attr['objectClass']; + $this->orig['objectClass'] = $attr['objectClass']; + } + if (isset($attr['scalixMailboxClass'])) { + $this->attributes['scalixMailboxClass'] = $attr['scalixMailboxClass']; + $this->orig['scalixMailboxClass'] = $attr['scalixMailboxClass']; + } + // add object class if needed + if (! in_array('scalixUserClass', $this->orig['objectClass'])) { + $this->attributes['objectClass'][] = 'scalixUserClass'; + } + return 0; + } + + /** + * Returns a list of modifications which have to be made to the LDAP account. + * + * @return array list of modifications + *
This function returns an array with 3 entries: + *
array( DN1 ('add' => array($attr), 'remove' => array($attr), 'modify' => array($attr)), DN2 .... ) + *
DN is the DN to change. It may be possible to change several DNs (e.g. create a new user and add him to some groups via attribute memberUid) + *
"add" are attributes which have to be added to LDAP entry + *
"remove" are attributes which have to be removed from LDAP entry + *
"modify" are attributes which have to been modified in LDAP entry + */ + function save_attributes() { + return $_SESSION[$this->base]->save_module_attributes($this->attributes, $this->orig); + } + + /** + * This function will create the meta HTML code to show a page with all attributes. + * + * @param array $post HTTP-POST values + */ + function display_html_attributes() { + $return = array(); + $return[] = array ( 0 => array ( 'kind' => 'text', 'text' => _('Scalix User') ), + 1 => array ( 'kind' => 'input', 'name' => 'scalixScalixObject', 'type' => 'checkbox', 'checked' => $this->scalixScalixObject, 'value' => 'true'), + 2 => array ('kind' => 'help', 'value' => 'scalixuser')); + $return[] = array ( 0 => array ( 'kind' => 'text', 'text' => _('Mailnode') ), + 1 => array ( 'kind' => 'input', 'type' => 'text', 'name' => 'scalixMailnode', 'size' => '20', 'maxlength' => '255', 'value' => $this->attributes['scalixMailnode'][0]), + 2 => array ( 'kind' => 'help', 'value' => 'mailnode' )); + $return[] = array ( 0 => array ( 'kind' => 'text', 'text' => _('Mboxaddr') ), + 1 => array ( 'kind' => 'input', 'type' => 'text', 'name' => 'scalixEmailAddress', 'size' => '20', 'maxlength' => '255', 'value' => $this->attributes['scalixEmailAddress'][0]), + 2 => array ( 'kind' => 'help', 'value' => 'mboxaddr' )); + $return[] = array ( 0 => array ( 'kind' => 'text', 'text' => _('Scalix Admin') ), + 1 => array ( 'kind' => 'input', 'name' => 'scalixAdministrator', 'type' => 'checkbox', 'checked' => $this->scalixAdministrator, 'value' => 'true'), + 2 => array ('kind' => 'help', 'value' => 'scalixadmin')); + $return[] = array ( 0 => array ( 'kind' => 'text', 'text' => _('Scalix Mailbox Admin') ), + 1 => array ( 'kind' => 'input', 'name' => 'scalixMailboxAdministrator', 'type' => 'checkbox', 'checked' => $this->scalixMailboxAdministrator, 'value' => 'true'), + 2 => array ('kind' => 'help', 'value' => 'mboxadmin')); + $mboxes = array(0 => 'LIMITED', 1 => 'FULL'); + $return[] = array ( 0 => array ( 'kind' => 'text', 'text' => _('Scalix Mailbox Class') ), + 1 => array ( 'kind' => 'select', 'type' => 'text', 'name' => 'scalixMailboxClass', 'options' => $mboxes, 'size' => '1', 'maxlength' => '255', 'options_selected' => $this->attributes['scalixMailboxClass'][0]), + 2 => array ( 'kind' => 'help', 'value' => 'mboxclass' )); + return $return; + } + + function get_pdfEntries() { + return array( + 'scalixUserClass_scalixScalixObject' => array('' . _('Scalix User') . '' . $this->attributes['scalixScalixObject'][0] . ''), + 'scalixUserClass_scalixMailnode' => array('' . _('Mailnode') . '' . $this->attributes['scalixMailnode'][0] . ''), + 'scalixUserClass_scalixMboxaddr' => array('' . _('Mboxaddr') . '' . $this->attributes['scalixEmailAddress'][0] . ''), + 'scalixUserClass_scalixMailboxClass' => array('' . _('Scalix Mailbox Class') . '' . $this->attributes['scalixMailboxClass'][0] . ''), + 'scalixUserClass_scalixAdministrator' => array('' . _('Scalix Admin') . '' . $this->attributes['scalixAdministrator'][0] . ''), + 'scalixUserClass_scalixMailboxAdministrator' => array('' . _('Scalix Mailbox Admin') . '' . $this->attributes['scalixMailboxAdministrator'][0] . '')); + } + + /** + * Processes user input of the primary module page. + * It checks if all input values are correct and updates the associated LDAP attributes. + * + * @param array $post HTTP-POST values + * @return array list of info/error messages + */ + function process_attributes() { + $this->triggered_messages = array(); + if (isset($_POST['scalixScalixObject'])) { + $this->scalixScalixObject = true; + $this->attributes['scalixScalixObject'][0] = "TRUE"; + } else { + $this->scalixScalixObject = false; + $this->attributes['scalixScalixObject'][0] = "FALSE"; + } + $this->attributes['scalixMailnode'][0] = $_POST['scalixMailnode']; + $this->attributes['scalixEmailAddress'][0] = $_POST['scalixEmailAddress']; + $this->attributes['scalixMailboxClass'][0] = $_POST['scalixMailboxClass']; + if (isset($_POST['scalixAdministrator'])) { + $this->scalixAdministrator = true; + $this->attributes['scalixAdministrator'][0] = "TRUE"; + } else { + $this->scalixAdministrator = false; + $this->attributes['scalixAdministrator'][0] = "FALSE"; + } + if (isset($_POST['scalixMailboxAdministrator'])) { + $this->scalixMailboxAdministrator = true; + $this->attributes['scalixMailboxAdministrator'][0] = "TRUE"; + } else { + $this->scalixMailboxAdministrator = false; + $this->attributes['scalixMailboxAdministrator'][0] = "FALSE"; + } + + if (sizeof($this->triggered_messages) > 0) { + $this->inputCorrect = false; + return $this->triggered_messages; + } + else { + $this->inputCorrect = true; + return 0; + } + } + + /** + * This function returns true if all needed settings are done. + */ + function module_complete() { + return $this->inputCorrect; + } + + /** + * Returns true if all settings on module page are correct. + */ + function module_ready() { + return $this->inputCorrect; + } + + function get_profileOptions() { + $return = array(); + // use Unix password as Samba password + $return[] = array( + 0 => array('kind' => 'text', 'text' => _('Scalix User') . ': '), + 1 => array('kind' => 'input', 'name' => 'scalixUserClass_scalixScalixObject', 'type' => 'checkbox', 'checked' => true), + 2 => array('kind' => 'help', 'value' => 'scalixuser') + ); + $mboxes = array(0 => 'LIMITED', 1 => 'FULL'); + $return[] = array( + 0 => array('kind' => 'text', 'text' => _('Mailnode') . ': '), + 1 => array('kind' => 'input', 'type' => 'text', 'name' => 'scalixUserClass_scalixMailnode', 'size' => '30', 'maxlength' => '255', 'value' => ''), + 2 => array('kind' => 'help', 'value' => 'mailnode') + ); + $return[] = array( + 0 => array('kind' => 'text', 'text' => _('Mboxaddr') . ': '), + 1 => array('kind' => 'select', 'type' => 'text', 'name' => 'scalixUserClass_scalixEmailAddress', 'size' => '30', 'maxlength' => '255', 'value' => ''), + 2 => array('kind' => 'help', 'value' => 'mboxaddr') + ); + $return[] = array( + 0 => array('kind' => 'text', 'text' => _('Scalix Mailbox Class') . ': '), + 1 => array('kind' => 'select', 'type' => 'text', 'name' => 'scalixUserClass_scalixMailboxClass', 'size' => '1', 'maxlength' => '255', 'options' => $mboxes, 'options_selected' => $this->attributes['scalixMailboxClass'][0]), + 2 => array('kind' => 'help', 'value' => 'mboxclass') + ); + $return[] = array( + 0 => array('kind' => 'text', 'text' => _('Scalix Admin') . ': '), + 1 => array('kind' => 'input', 'name' => 'scalixUserClass_scalixAdministrator', 'type' => 'checkbox', 'checked' => false), + 2 => array('kind' => 'help', 'value' => 'scalixadmin') + ); + $return[] = array( + 0 => array('kind' => 'text', 'text' => _('Scalix Mailbox Admin') . ': '), + 1 => array('kind' => 'input', 'name' => 'scalixUserClass_scalixMailboxAdministrator', 'type' => 'checkbox', 'checked' => false), + 2 => array('kind' => 'help', 'value' => 'mboxadmin') + ); + return $return; + } + + /** + * Loads the values of an account profile into internal variables. + * + * @param array $profile hash array with profile values (identifier => value) + */ + function load_profile($profile) { + // profile mappings in meta data + parent::load_profile($profile); + // special profile options + if ($profile['scalixUserClass_scalixScalixObject'][0] == "true") { + $this->scalixScalixObject = true; + } + elseif ($profile['scalixUserClass_scalixScalixObject'][0] == "false") { + $this->scalixScalixObject = false; + } + if ($profile['scalixUserClass_scalixAdministrator'][0] == "true") { + $this->scalixAdministrator = true; + } + elseif ($profile['scalixUserClass_scalixAdministrator'][0] == "false") { + $this->scalixAdministrator = false; + } + if ($profile['scalixUserClass_scalixMailboxAdministrator'][0] == "true") { + $this->scalixMailboxAdministrator = true; + } + elseif ($profile['scalixUserClass_scalixMailboxAdministrator'][0] == "false") { + $this->scalixMailboxAdministrator = false; + } + if (isset($profile['scalixUserClass_scalixMailnode'][0])) { + $this->attributes['scalixMailnode'][0] = $profile['scalixUserClass_scalixMailnode'][0]; + } + if (isset($profile['scalixUserClass_scalixEmailAddress'][0])) { + $this->attributes['scalixEmailAddress'][0] = $profile['scalixUserClass_scalixEmailAddress'][0]; + } + if (isset($profile['scalixUserClass_scalixMailboxClass'][0])) { + $this->attributes['scalixMailboxClass'][0] = $profile['scalixUserClass_scalixMailboxClass'][0]; + } + } +} + + +?> +