diff --git a/admin/presets/classes/manager.php b/admin/presets/classes/manager.php
index 9d22ef0f5f4..4b478af3cda 100644
--- a/admin/presets/classes/manager.php
+++ b/admin/presets/classes/manager.php
@@ -309,11 +309,17 @@ class manager {
$classname = null;
- // Getting the appropiate class to get the correct setting value.
+ // Getting the appropriate class to get the correct setting value.
$settingtype = get_class($settingdata);
-
// Check if it is a setting from a plugin.
- $plugindata = explode('_', $settingtype);
+ $namespacedata = explode('\\', $settingtype);
+ if (count($namespacedata) > 1) {
+ $plugindata = explode('_', $namespacedata[0]);
+ $settingtype = end($namespacedata);
+ } else {
+ $plugindata = explode('_', $settingtype, 2);
+ }
+
$types = \core_component::get_plugin_types();
if (array_key_exists($plugindata[0], $types)) {
$plugins = \core_component::get_plugin_list($plugindata[0]);
diff --git a/admin/presets/tests/manager_test.php b/admin/presets/tests/manager_test.php
index a87da91f4fb..456320a1e5e 100644
--- a/admin/presets/tests/manager_test.php
+++ b/admin/presets/tests/manager_test.php
@@ -133,8 +133,8 @@ class manager_test extends \advanced_testcase {
$settingpage = $adminroot->locate('modsettingquiz');
$settingdata = $settingpage->settings->quizbrowsersecurity;;
$result = $manager->get_setting($settingdata, '');
- $this->assertInstanceOf('\mod_quiz\adminpresets\adminpresets_mod_quiz_admin_setting_browsersecurity', $result);
- $this->assertNotEquals('core_adminpresets\local\setting\adminpresets_setting', get_class($result));
+ $this->assertInstanceOf(\mod_quiz\adminpresets\adminpresets_browser_security_setting::class, $result);
+ $this->assertNotEquals(\core_adminpresets\local\setting\adminpresets_setting::class, get_class($result));
// Check the adminpresets_setting class is returned when no specific class exists.
$settingpage = $adminroot->locate('managecustomfields');
diff --git a/mod/quiz/classes/admin_setting_browsersecurity.php b/mod/quiz/classes/admin/browser_security_setting.php
similarity index 75%
rename from mod/quiz/classes/admin_setting_browsersecurity.php
rename to mod/quiz/classes/admin/browser_security_setting.php
index 6d83ac29a70..e7be3f35c72 100644
--- a/mod/quiz/classes/admin_setting_browsersecurity.php
+++ b/mod/quiz/classes/admin/browser_security_setting.php
@@ -14,27 +14,19 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see .
-/**
- * Admin settings class for the quiz browser security option.
- *
- * @package mod_quiz
- * @copyright 2008 Tim Hunt
- * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-
-defined('MOODLE_INTERNAL') || die();
-
+namespace mod_quiz\admin;
/**
* Admin settings class for the quiz browser security option.
*
* Just so we can lazy-load the choices.
*
+ * @package mod_quiz
+ * @category admin
* @copyright 2011 The Open University
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
-class mod_quiz_admin_setting_browsersecurity extends admin_setting_configselect_with_advanced {
+class browser_security_setting extends \admin_setting_configselect_with_advanced {
public function load_choices() {
global $CFG;
@@ -43,7 +35,7 @@ class mod_quiz_admin_setting_browsersecurity extends admin_setting_configselect_
}
require_once($CFG->dirroot . '/mod/quiz/locallib.php');
- $this->choices = quiz_access_manager::get_browser_security_choices();
+ $this->choices = \quiz_access_manager::get_browser_security_choices();
return true;
}
diff --git a/mod/quiz/classes/admin_setting_grademethod.php b/mod/quiz/classes/admin/grade_method_setting.php
similarity index 77%
rename from mod/quiz/classes/admin_setting_grademethod.php
rename to mod/quiz/classes/admin/grade_method_setting.php
index 45e31ce9b87..edee39433b8 100644
--- a/mod/quiz/classes/admin_setting_grademethod.php
+++ b/mod/quiz/classes/admin/grade_method_setting.php
@@ -14,27 +14,19 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see .
-/**
- * Admin settings class for the quiz grading method.
- *
- * @package mod_quiz
- * @copyright 2008 Tim Hunt
- * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-
-defined('MOODLE_INTERNAL') || die();
-
+namespace mod_quiz\admin;
/**
* Admin settings class for the quiz grading method.
*
* Just so we can lazy-load the choices.
*
- * @copyright 2011 The Open University
- * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @package mod_quiz
+ * @category admin
+ * @copyright 2011 The Open University
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
-class mod_quiz_admin_setting_grademethod extends admin_setting_configselect_with_advanced {
+class grade_method_setting extends \admin_setting_configselect_with_advanced {
public function load_choices() {
global $CFG;
diff --git a/mod/quiz/classes/admin_setting_overduehandling.php b/mod/quiz/classes/admin/overdue_handling_setting.php
similarity index 77%
rename from mod/quiz/classes/admin_setting_overduehandling.php
rename to mod/quiz/classes/admin/overdue_handling_setting.php
index 71b1245521e..9cc2cfcf014 100644
--- a/mod/quiz/classes/admin_setting_overduehandling.php
+++ b/mod/quiz/classes/admin/overdue_handling_setting.php
@@ -14,27 +14,19 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see .
-/**
- * Admin settings class for the quiz overdue attempt handling method.
- *
- * @package mod_quiz
- * @copyright 2008 Tim Hunt
- * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-
-defined('MOODLE_INTERNAL') || die();
-
+namespace mod_quiz\admin;
/**
* Admin settings class for the quiz overdue attempt handling method.
*
* Just so we can lazy-load the choices.
*
- * @copyright 2011 The Open University
- * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @package mod_quiz
+ * @category admin
+ * @copyright 2011 The Open University
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
-class mod_quiz_admin_setting_overduehandling extends admin_setting_configselect_with_advanced {
+class overdue_handling_setting extends \admin_setting_configselect_with_advanced {
public function load_choices() {
global $CFG;
diff --git a/mod/quiz/classes/admin_review_setting.php b/mod/quiz/classes/admin/review_setting.php
similarity index 95%
rename from mod/quiz/classes/admin_review_setting.php
rename to mod/quiz/classes/admin/review_setting.php
index 74fb458843b..1dbe1ffcd0d 100644
--- a/mod/quiz/classes/admin_review_setting.php
+++ b/mod/quiz/classes/admin/review_setting.php
@@ -14,25 +14,17 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see .
+namespace mod_quiz\admin;
+
/**
* Admin settings class for the quiz review options.
*
* @package mod_quiz
- * @copyright 2008 Tim Hunt
- * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-
-defined('MOODLE_INTERNAL') || die();
-
-
-/**
- * Admin settings class for the quiz review options.
- *
+ * @category admin
* @copyright 2008 Tim Hunt
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
-class mod_quiz_admin_review_setting extends admin_setting {
+class review_setting extends \admin_setting {
/**
* @var integer should match the constants defined in
* {@see display_options}. Copied for performance reasons.
diff --git a/mod/quiz/classes/admin_setting_user_image.php b/mod/quiz/classes/admin/user_image_setting.php
similarity index 79%
rename from mod/quiz/classes/admin_setting_user_image.php
rename to mod/quiz/classes/admin/user_image_setting.php
index ba265019193..3f3ba70d31f 100644
--- a/mod/quiz/classes/admin_setting_user_image.php
+++ b/mod/quiz/classes/admin/user_image_setting.php
@@ -14,27 +14,19 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see .
-/**
- * Admin settings class for the choices for how to display the user's image
- *
- * @package mod_quiz
- * @copyright 2008 Tim Hunt
- * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-
-defined('MOODLE_INTERNAL') || die();
-
+namespace mod_quiz\admin;
/**
* Admin settings class for the choices for how to display the user's image.
*
* Just so we can lazy-load the choices.
*
+ * @package mod_quiz
+ * @category admin
* @copyright 2011 The Open University
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
-class mod_quiz_admin_setting_user_image extends admin_setting_configselect_with_advanced {
+class user_image_setting extends \admin_setting_configselect_with_advanced {
public function load_choices() {
global $CFG;
diff --git a/mod/quiz/classes/adminpresets/adminpresets_mod_quiz_admin_setting_browsersecurity.php b/mod/quiz/classes/adminpresets/adminpresets_browser_security_setting.php
similarity index 91%
rename from mod/quiz/classes/adminpresets/adminpresets_mod_quiz_admin_setting_browsersecurity.php
rename to mod/quiz/classes/adminpresets/adminpresets_browser_security_setting.php
index d73e0a63e63..04834c52861 100644
--- a/mod/quiz/classes/adminpresets/adminpresets_mod_quiz_admin_setting_browsersecurity.php
+++ b/mod/quiz/classes/adminpresets/adminpresets_browser_security_setting.php
@@ -26,7 +26,7 @@ use core_adminpresets\local\setting\adminpresets_admin_setting_configselect_with
* @author Jordan Kesraoui | Sylvain Revenu | Pimenko based on David Monllaó code
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
-class adminpresets_mod_quiz_admin_setting_browsersecurity extends adminpresets_admin_setting_configselect_with_advanced {
+class adminpresets_browser_security_setting extends adminpresets_admin_setting_configselect_with_advanced {
public function set_behaviors() {
$this->behaviors['loadchoices'] = &$this->settingdata;
diff --git a/mod/quiz/classes/adminpresets/adminpresets_mod_quiz_admin_setting_grademethod.php b/mod/quiz/classes/adminpresets/adminpresets_grade_method_setting.php
similarity index 91%
rename from mod/quiz/classes/adminpresets/adminpresets_mod_quiz_admin_setting_grademethod.php
rename to mod/quiz/classes/adminpresets/adminpresets_grade_method_setting.php
index 1393d5a30e5..39f63d87de1 100644
--- a/mod/quiz/classes/adminpresets/adminpresets_mod_quiz_admin_setting_grademethod.php
+++ b/mod/quiz/classes/adminpresets/adminpresets_grade_method_setting.php
@@ -26,7 +26,7 @@ use core_adminpresets\local\setting\adminpresets_admin_setting_configselect_with
* @author Jordan Kesraoui | Sylvain Revenu | Pimenko based on David Monllaó code
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
-class adminpresets_mod_quiz_admin_setting_grademethod extends adminpresets_admin_setting_configselect_with_advanced {
+class adminpresets_grade_method_setting extends adminpresets_admin_setting_configselect_with_advanced {
public function set_behaviors() {
$this->behaviors['loadchoices'] = &$this->settingdata;
diff --git a/mod/quiz/classes/adminpresets/adminpresets_mod_quiz_admin_setting_overduehandling.php b/mod/quiz/classes/adminpresets/adminpresets_overdue_handling_setting.php
similarity index 91%
rename from mod/quiz/classes/adminpresets/adminpresets_mod_quiz_admin_setting_overduehandling.php
rename to mod/quiz/classes/adminpresets/adminpresets_overdue_handling_setting.php
index 4e5745921da..9d5393eaed7 100644
--- a/mod/quiz/classes/adminpresets/adminpresets_mod_quiz_admin_setting_overduehandling.php
+++ b/mod/quiz/classes/adminpresets/adminpresets_overdue_handling_setting.php
@@ -26,7 +26,7 @@ use core_adminpresets\local\setting\adminpresets_admin_setting_configselect_with
* @author Jordan Kesraoui | Sylvain Revenu | Pimenko based on David Monllaó code
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
-class adminpresets_mod_quiz_admin_setting_overduehandling extends adminpresets_admin_setting_configselect_with_advanced {
+class adminpresets_overdue_handling_setting extends adminpresets_admin_setting_configselect_with_advanced {
public function set_behaviors() {
$this->behaviors['loadchoices'] = &$this->settingdata;
diff --git a/mod/quiz/classes/adminpresets/adminpresets_mod_quiz_admin_review_setting.php b/mod/quiz/classes/adminpresets/adminpresets_review_setting.php
similarity index 84%
rename from mod/quiz/classes/adminpresets/adminpresets_mod_quiz_admin_review_setting.php
rename to mod/quiz/classes/adminpresets/adminpresets_review_setting.php
index 102dafb12e8..e365bc22c56 100644
--- a/mod/quiz/classes/adminpresets/adminpresets_mod_quiz_admin_review_setting.php
+++ b/mod/quiz/classes/adminpresets/adminpresets_review_setting.php
@@ -27,15 +27,15 @@ use core_adminpresets\local\setting\adminpresets_setting;
* @author Jordan Kesraoui | Sylvain Revenu | Pimenko based on David Monllaó code
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
-class adminpresets_mod_quiz_admin_review_setting extends adminpresets_setting {
+class adminpresets_review_setting extends adminpresets_setting {
/**
- * The setting value is a sum of 'mod_quiz_admin_review_setting::times'
+ * The setting value is a sum of 'review_setting::times'
*/
protected function set_visiblevalue() {
- // Getting the masks descriptions (mod_quiz_admin_review_setting protected method).
- $reflectiontimes = new ReflectionMethod('mod_quiz_admin_review_setting', 'times');
+ // Getting the masks descriptions (review_setting protected method).
+ $reflectiontimes = new ReflectionMethod('mod_quiz\admin\review_setting', 'times');
$reflectiontimes->setAccessible(true);
$times = $reflectiontimes->invoke(null);
diff --git a/mod/quiz/classes/adminpresets/adminpresets_mod_quiz_admin_setting_user_image.php b/mod/quiz/classes/adminpresets/adminpresets_user_image_setting.php
similarity index 91%
rename from mod/quiz/classes/adminpresets/adminpresets_mod_quiz_admin_setting_user_image.php
rename to mod/quiz/classes/adminpresets/adminpresets_user_image_setting.php
index 2ed15506fb8..0607ee30e7b 100644
--- a/mod/quiz/classes/adminpresets/adminpresets_mod_quiz_admin_setting_user_image.php
+++ b/mod/quiz/classes/adminpresets/adminpresets_user_image_setting.php
@@ -26,7 +26,7 @@ use core_adminpresets\local\setting\adminpresets_admin_setting_configselect_with
* @author Jordan Kesraoui | Sylvain Revenu | Pimenko based on David Monllaó code
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
-class adminpresets_mod_quiz_admin_setting_user_image extends adminpresets_admin_setting_configselect_with_advanced {
+class adminpresets_user_image_setting extends adminpresets_admin_setting_configselect_with_advanced {
public function set_behaviors() {
$this->behaviors['loadchoices'] = &$this->settingdata;
diff --git a/mod/quiz/db/renamedclasses.php b/mod/quiz/db/renamedclasses.php
index 6f39b09f139..ea77f6b5de7 100644
--- a/mod/quiz/db/renamedclasses.php
+++ b/mod/quiz/db/renamedclasses.php
@@ -31,4 +31,19 @@ $renamedclasses = [
'mod_quiz_display_options' => 'mod_quiz\question\display_options',
'qubaids_for_quiz' => 'mod_quiz\question\qubaids_for_quiz',
'qubaids_for_quiz_user' => 'mod_quiz\question\qubaids_for_quiz_user',
+ 'mod_quiz_admin_setting_browsersecurity' => 'mod_quiz\admin\browser_security_setting',
+ 'mod_quiz_admin_setting_grademethod' => 'mod_quiz\admin\grade_method_setting',
+ 'mod_quiz_admin_setting_overduehandling' => 'mod_quiz\admin\overdue_handling_setting',
+ 'mod_quiz_admin_review_setting' => 'mod_quiz\admin\review_setting',
+ 'mod_quiz_admin_setting_user_image' => 'mod_quiz\admin\user_image_setting',
+ 'mod_quiz\adminpresets\adminpresets_mod_quiz_admin_setting_browsersecurity' =>
+ 'mod_quiz\adminpresets\adminpresets_browser_security_setting',
+ 'mod_quiz\adminpresets/adminpresets_mod_quiz_admin_setting_grademethod' =>
+ 'mod_quiz\adminpresets\adminpresets_grade_method_setting',
+ 'mod_quiz\adminpresets\adminpresets_mod_quiz_admin_setting_overduehandling' =>
+ 'mod_quiz\adminpresets\adminpresets_overdue_handling_setting',
+ 'mod_quiz\adminpresets\adminpresets_mod_quiz_admin_review_setting' =>
+ 'mod_quiz\adminpresets\adminpresets_review_setting',
+ 'mod_quiz\adminpresets\adminpresets_mod_quiz_admin_setting_user_image' =>
+ 'mod_quiz\adminpresets\adminpresets_user_image_setting',
];
diff --git a/mod/quiz/report.php b/mod/quiz/report.php
index 7b38f6f0ef9..bb0eb8a5aee 100644
--- a/mod/quiz/report.php
+++ b/mod/quiz/report.php
@@ -27,7 +27,6 @@ define('NO_OUTPUT_BUFFERING', true);
require_once(__DIR__ . '/../../config.php');
require_once($CFG->dirroot . '/mod/quiz/locallib.php');
require_once($CFG->dirroot . '/mod/quiz/report/reportlib.php');
-require_once($CFG->dirroot . '/mod/quiz/report/default.php');
$id = optional_param('id', 0, PARAM_INT);
$q = optional_param('q', 0, PARAM_INT);
diff --git a/mod/quiz/settings.php b/mod/quiz/settings.php
index 678235d4181..8c166053ff4 100644
--- a/mod/quiz/settings.php
+++ b/mod/quiz/settings.php
@@ -22,6 +22,7 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
+use mod_quiz\admin\review_setting;
defined('MOODLE_INTERNAL') || die();
@@ -72,7 +73,7 @@ if ($ADMIN->fulltree) {
get_string('attemptgradeddelay', 'quiz'), get_string('attemptgradeddelay_desc', 'quiz'), 5 * HOURSECS, HOURSECS));
// What to do with overdue attempts.
- $setting = new mod_quiz_admin_setting_overduehandling('quiz/overduehandling',
+ $setting = new \mod_quiz\admin\overdue_handling_setting('quiz/overduehandling',
get_string('overduehandling', 'quiz'), get_string('overduehandling_desc', 'quiz'),
array('value' => 'autosubmit', 'adv' => false), null);
$setting->set_locked_flag_options(admin_setting_flag::ENABLED, false);
@@ -104,7 +105,7 @@ if ($ADMIN->fulltree) {
$quizsettings->add($setting);
// Grading method.
- $setting = new mod_quiz_admin_setting_grademethod('quiz/grademethod',
+ $setting = new \mod_quiz\admin\grade_method_setting('quiz/grademethod',
get_string('grademethod', 'quiz'), get_string('configgrademethod', 'quiz'),
array('value' => QUIZ_GRADEHIGHEST, 'adv' => false), null);
$setting->set_locked_flag_options(admin_setting_flag::ENABLED, false);
@@ -174,21 +175,21 @@ if ($ADMIN->fulltree) {
// Review options.
$quizsettings->add(new admin_setting_heading('reviewheading',
get_string('reviewoptionsheading', 'quiz'), ''));
- foreach (mod_quiz_admin_review_setting::fields() as $field => $name) {
- $default = mod_quiz_admin_review_setting::all_on();
+ foreach (review_setting::fields() as $field => $name) {
+ $default = review_setting::all_on();
$forceduring = null;
if ($field == 'attempt') {
$forceduring = true;
} else if ($field == 'overallfeedback') {
- $default = $default ^ mod_quiz_admin_review_setting::DURING;
+ $default = $default ^ review_setting::DURING;
$forceduring = false;
}
- $quizsettings->add(new mod_quiz_admin_review_setting('quiz/review' . $field,
+ $quizsettings->add(new review_setting('quiz/review' . $field,
$name, '', $default, $forceduring));
}
// Show the user's picture.
- $setting = new mod_quiz_admin_setting_user_image('quiz/showuserpicture',
+ $setting = new \mod_quiz\admin\user_image_setting('quiz/showuserpicture',
get_string('showuserpicture', 'quiz'), get_string('configshowuserpicture', 'quiz'),
array('value' => 0, 'adv' => false), null);
$setting->set_locked_flag_options(admin_setting_flag::ENABLED, false);
@@ -259,7 +260,7 @@ if ($ADMIN->fulltree) {
$quizsettings->add($setting);
// Browser security.
- $setting = new mod_quiz_admin_setting_browsersecurity('quiz/browsersecurity',
+ $setting = new \mod_quiz\admin\browser_security_setting('quiz/browsersecurity',
get_string('showinsecurepopup', 'quiz'), get_string('configpopup', 'quiz'),
array('value' => '-', 'adv' => true), null);
$setting->set_locked_flag_options(admin_setting_flag::ENABLED, false);
diff --git a/mod/quiz/upgrade.txt b/mod/quiz/upgrade.txt
index 2c136eed71a..2bb7be9f5bd 100644
--- a/mod/quiz/upgrade.txt
+++ b/mod/quiz/upgrade.txt
@@ -10,6 +10,26 @@ This files describes API changes in the quiz code.
- qubaids_for_quiz => mod_quiz\question\qubaids_for_quiz
- qubaids_for_quiz_user => mod_quiz\question\qubaids_for_quiz_user - which is deprecated, because
it is almost the same as mod_quiz\question\qubaids_for_users_attempts.
+ - mod_quiz_admin_setting_browsersecurity => mod_quiz\admin\browser_security_setting
+ - mod_quiz_admin_setting_grademethod => mod_quiz\admin\grade_method_setting
+ - mod_quiz_admin_setting_overduehandling => mod_quiz\admin\overdue_handling_setting
+ - mod_quiz_admin_review_setting => mod_quiz\admin\review_setting
+ - mod_quiz_admin_setting_user_image => mod_quiz\admin\user_image_setting
+ - mod_quiz_admin_setting_browsersecurity => mod_quiz\admin\browser_security_setting
+ - mod_quiz_admin_setting_grademethod => mod_quiz\admin\grade_method_setting
+ - mod_quiz_admin_setting_overduehandling => mod_quiz\admin\overdue_handling_setting
+ - mod_quiz_admin_review_setting => mod_quiz\admin\review_setting
+ - mod_quiz_admin_setting_user_image => mod_quiz\admin\user_image_setting
+ - mod_quiz\adminpresets\adminpresets_mod_quiz_admin_setting_browsersecurity =>
+ mod_quiz\adminpresets\adminpresets_browser_security_setting
+ - mod_quiz\adminpresets/adminpresets_mod_quiz_admin_setting_grademethod =>
+ mod_quiz\adminpresets\adminpresets_grade_method_setting
+ - mod_quiz\adminpresets\adminpresets_mod_quiz_admin_setting_overduehandling =>
+ mod_quiz\adminpresets\adminpresets_overdue_handling_setting
+ - mod_quiz\adminpresets\adminpresets_mod_quiz_admin_review_setting =>
+ mod_quiz\adminpresets\adminpresets_review_setting
+ - mod_quiz\adminpresets\adminpresets_mod_quiz_admin_setting_user_image =>
+ mod_quiz\adminpresets\adminpresets_user_image_setting
=== 4.1 ===