new file mode 100644
--- /dev/null
+++ b/library/smarty/libs/sysplugins/smarty_internal_extension_config.php
@@ -0,0 +1,154 @@
+<?php
+
+/**
+ * @package Smarty
+ * @subpackage PluginsInternal
+ */
+class Smarty_Internal_Extension_Config {
+ /**
+ * @param $obj
+ * @param $config_file
+ * @param null $sections
+ * @param string $scope
+ */
+ static function configLoad($obj, $config_file, $sections = null, $scope = 'local') {
+ $smarty = isset($obj->smarty) ? $obj->smarty : $obj;
+ $confObj = new $smarty->template_class($config_file, $smarty, $obj);
+ $confObj->caching = Smarty::CACHING_OFF;
+ $confObj->source = Smarty_Template_Config::load($confObj);
+ $confObj->source->config_sections = $sections;
+ $confObj->source->scope = $scope;
+ $confObj->compiled = Smarty_Template_Compiled::load($confObj);
+ if ($confObj->smarty->debugging) {
+ Smarty_Internal_Debug::start_render($confObj);
+ }
+ $confObj->compiled->render($confObj);
+ if ($confObj->smarty->debugging) {
+ Smarty_Internal_Debug::end_render($confObj);
+ }
+ if ($obj instanceof Smarty_Internal_Template) {
+ $obj->properties['file_dependency'][$confObj->source->uid] = array($confObj->source->filepath, $confObj->source->timestamp, $confObj->source->type);
+ }
+ }
+
+ /**
+ * load config variables
+ *
+ * @param mixed $sections array of section names, single section or null
+ * @param string $scope global,parent or local
+ *
+ * @throws Exception
+ */
+ static function loadConfigVars($_template, $_config_vars) {
+ $scope = $_template->source->scope;
+ // pointer to scope (local scope is parent of template object
+ $scope_ptr = $_template->parent;
+ if ($scope == 'parent') {
+ if (isset($_template->parent->parent)) {
+ $scope_ptr = $_template->parent->parent;
+ }
+ } elseif ($scope == 'root' || $scope == 'global') {
+ while (isset($scope_ptr->parent)) {
+ $scope_ptr = $scope_ptr->parent;
+ }
+ }
+ // copy global config vars
+ foreach ($_config_vars['vars'] as $variable => $value) {
+ if ($_template->smarty->config_overwrite || !isset($scope_ptr->config_vars[$variable])) {
+ $scope_ptr->config_vars[$variable] = $value;
+ } else {
+ $scope_ptr->config_vars[$variable] = array_merge((array)$scope_ptr->config_vars[$variable], (array)$value);
+ }
+ }
+ // scan sections
+ $sections = $_template->source->config_sections;
+ if (!empty($sections)) {
+ foreach ((array)$sections as $_template_section) {
+ if (isset($_config_vars['sections'][$_template_section])) {
+ foreach ($_config_vars['sections'][$_template_section]['vars'] as $variable => $value) {
+ if ($_template->smarty->config_overwrite || !isset($scope_ptr->config_vars[$variable])) {
+ $scope_ptr->config_vars[$variable] = $value;
+ } else {
+ $scope_ptr->config_vars[$variable] = array_merge((array)$scope_ptr->config_vars[$variable], (array)$value);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns a single or all config variables
+ *
+ * @param string $varname variable name or null
+ * @param bool $search_parents
+ *
+ * @return string variable value or or array of variables
+ */
+ static function getConfigVars($obj, $varname = null, $search_parents = true) {
+ $_ptr = $obj;
+ $var_array = array();
+ while ($_ptr !== null) {
+ if (isset($varname)) {
+ if (isset($_ptr->config_vars[$varname])) {
+ return $_ptr->config_vars[$varname];
+ }
+ } else {
+ $var_array = array_merge($_ptr->config_vars, $var_array);
+ }
+ // not found, try at parent
+ if ($search_parents) {
+ $_ptr = $_ptr->parent;
+ } else {
+ $_ptr = null;
+ }
+ }
+ if (isset($varname)) {
+ return '';
+ } else {
+ return $var_array;
+ }
+ }
+
+ /**
+ * gets a config variable
+ *
+ * @param string $variable the name of the config variable
+ * @param bool $error_enable
+ *
+ * @return mixed the value of the config variable
+ */
+ static function getConfigVariable($obj, $variable, $error_enable = true) {
+ $_ptr = $obj;
+ while ($_ptr !== null) {
+ if (isset($_ptr->config_vars[$variable])) {
+ // found it, return it
+ return $_ptr->config_vars[$variable];
+ }
+ // not found, try at parent
+ $_ptr = $_ptr->parent;
+ }
+ if ($obj->error_unassigned && $error_enable) {
+ // force a notice
+ $x = $$variable;
+ }
+
+ return null;
+ }
+
+ /**
+ * remove a single or all config variables
+ *
+ * @param string $name variable name or null
+ *
+ * @return Smarty_Internal_Data current Smarty_Internal_Data (or Smarty or Smarty_Internal_Template) instance for chaining
+ */
+ static function clearConfig($obj, $name = null) {
+ if (isset($name)) {
+ unset($obj->config_vars[$name]);
+ } else {
+ $obj->config_vars = array();
+ }
+ return $obj;
+ }
+}