diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000000000000000000000000000000000000..dfe0770424b2a19faf507a501ebfc23be8f54e7b
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+# Auto detect text files and perform LF normalization
+* text=auto
diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json
new file mode 100644
index 0000000000000000000000000000000000000000..f8b4888565caadc7510be75682268d6c18edd6de
--- /dev/null
+++ b/.vs/ProjectSettings.json
@@ -0,0 +1,3 @@
+{
+  "CurrentProjectSetting": null
+}
\ No newline at end of file
diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json
new file mode 100644
index 0000000000000000000000000000000000000000..410e200dafd9f323932119aa1419169010183ce2
--- /dev/null
+++ b/.vs/VSWorkspaceState.json
@@ -0,0 +1,7 @@
+{
+  "ExpandedNodes": [
+    "",
+    "\\templates"
+  ],
+  "PreviewInSolutionExplorer": false
+}
\ No newline at end of file
diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite
new file mode 100644
index 0000000000000000000000000000000000000000..27663860fbe00fdc53e54f66fcf3e7cb4c156f1f
Binary files /dev/null and b/.vs/slnx.sqlite differ
diff --git a/.vs/velostat/v16/.suo b/.vs/velostat/v16/.suo
new file mode 100644
index 0000000000000000000000000000000000000000..c3d9725d8ccb04e6b896370449ecf2a2bd5ad0ee
Binary files /dev/null and b/.vs/velostat/v16/.suo differ
diff --git a/Autoloader.php b/Autoloader.php
new file mode 100644
index 0000000000000000000000000000000000000000..c09361b669241a53666efbfa1e672c49787e384b
--- /dev/null
+++ b/Autoloader.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Smarty Autoloader
+ *
+ * @package Smarty
+ */
+
+/**
+ * Smarty Autoloader
+ *
+ * @package Smarty
+ * @author  Uwe Tews
+ *             Usage:
+ *                  require_once '...path/Autoloader.php';
+ *                  Smarty_Autoloader::register();
+ *             or
+ *                  include '...path/bootstrap.php';
+ *
+ *                  $smarty = new Smarty();
+ */
+class Smarty_Autoloader
+{
+    /**
+     * Filepath to Smarty root
+     *
+     * @var string
+     */
+    public static $SMARTY_DIR = null;
+
+    /**
+     * Filepath to Smarty internal plugins
+     *
+     * @var string
+     */
+    public static $SMARTY_SYSPLUGINS_DIR = null;
+
+    /**
+     * Array with Smarty core classes and their filename
+     *
+     * @var array
+     */
+    public static $rootClasses = array('smarty' => 'Smarty.class.php', 'smartybc' => 'SmartyBC.class.php',);
+
+    /**
+     * Registers Smarty_Autoloader backward compatible to older installations.
+     *
+     * @param bool $prepend Whether to prepend the autoloader or not.
+     */
+    public static function registerBC($prepend = false)
+    {
+        /**
+         * register the class autoloader
+         */
+        if (!defined('SMARTY_SPL_AUTOLOAD')) {
+            define('SMARTY_SPL_AUTOLOAD', 0);
+        }
+        if (SMARTY_SPL_AUTOLOAD
+            && set_include_path(get_include_path() . PATH_SEPARATOR . SMARTY_SYSPLUGINS_DIR) !== false
+        ) {
+            $registeredAutoLoadFunctions = spl_autoload_functions();
+            if (!isset($registeredAutoLoadFunctions[ 'spl_autoload' ])) {
+                spl_autoload_register();
+            }
+        } else {
+            self::register($prepend);
+        }
+    }
+
+    /**
+     * Registers Smarty_Autoloader as an SPL autoloader.
+     *
+     * @param bool $prepend Whether to prepend the autoloader or not.
+     */
+    public static function register($prepend = false)
+    {
+        self::$SMARTY_DIR = defined('SMARTY_DIR') ? SMARTY_DIR : dirname(__FILE__) . DIRECTORY_SEPARATOR;
+        self::$SMARTY_SYSPLUGINS_DIR = defined('SMARTY_SYSPLUGINS_DIR') ? SMARTY_SYSPLUGINS_DIR :
+            self::$SMARTY_DIR . 'sysplugins' . DIRECTORY_SEPARATOR;
+        if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
+            spl_autoload_register(array(__CLASS__, 'autoload'), true, $prepend);
+        } else {
+            spl_autoload_register(array(__CLASS__, 'autoload'));
+        }
+    }
+
+    /**
+     * Handles auto loading of classes.
+     *
+     * @param string $class A class name.
+     */
+    public static function autoload($class)
+    {
+        if ($class[ 0 ] !== 'S' || strpos($class, 'Smarty') !== 0) {
+            return;
+        }
+        $_class = strtolower($class);
+        if (isset(self::$rootClasses[ $_class ])) {
+            $file = self::$SMARTY_DIR . self::$rootClasses[ $_class ];
+            if (is_file($file)) {
+                include $file;
+            }
+        } else {
+            $file = self::$SMARTY_SYSPLUGINS_DIR . $_class . '.php';
+            if (is_file($file)) {
+                include $file;
+            }
+        }
+        return;
+    }
+}
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..f6857df4ff8533b1acb5f563a5aea3ccff87d8ac
--- /dev/null
+++ b/README.md
@@ -0,0 +1,2 @@
+# velostat
+ web de velostat
diff --git a/Smarty.class.php b/Smarty.class.php
new file mode 100644
index 0000000000000000000000000000000000000000..6564be6d2d2f2d88313d4201f29a07885474bb6f
--- /dev/null
+++ b/Smarty.class.php
@@ -0,0 +1,1424 @@
+<?php
+/**
+ * Project:     Smarty: the PHP compiling template engine
+ * File:        Smarty.class.php
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3.0 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * For questions, help, comments, discussion, etc., please join the
+ * Smarty mailing list. Send a blank e-mail to
+ * smarty-discussion-subscribe@googlegroups.com
+ *
+ * @link      http://www.smarty.net/
+ * @copyright 2018 New Digital Group, Inc.
+ * @copyright 2018 Uwe Tews
+ * @author    Monte Ohrt <monte at ohrt dot com>
+ * @author    Uwe Tews   <uwe dot tews at gmail dot com>
+ * @author    Rodney Rehm
+ * @package   Smarty
+ */
+/**
+ * set SMARTY_DIR to absolute path to Smarty library files.
+ * Sets SMARTY_DIR only if user application has not already defined it.
+ */
+if (!defined('SMARTY_DIR')) {
+    /**
+     *
+     */
+    define('SMARTY_DIR', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+}
+/**
+ * set SMARTY_SYSPLUGINS_DIR to absolute path to Smarty internal plugins.
+ * Sets SMARTY_SYSPLUGINS_DIR only if user application has not already defined it.
+ */
+if (!defined('SMARTY_SYSPLUGINS_DIR')) {
+    /**
+     *
+     */
+    define('SMARTY_SYSPLUGINS_DIR', SMARTY_DIR . 'sysplugins' . DIRECTORY_SEPARATOR);
+}
+if (!defined('SMARTY_PLUGINS_DIR')) {
+    /**
+     *
+     */
+    define('SMARTY_PLUGINS_DIR', SMARTY_DIR . 'plugins' . DIRECTORY_SEPARATOR);
+}
+if (!defined('SMARTY_MBSTRING')) {
+    /**
+     *
+     */
+    define('SMARTY_MBSTRING', function_exists('mb_get_info'));
+}
+if (!defined('SMARTY_RESOURCE_CHAR_SET')) {
+    // UTF-8 can only be done properly when mbstring is available!
+    /**
+     * @deprecated in favor of Smarty::$_CHARSET
+     */
+    define('SMARTY_RESOURCE_CHAR_SET', SMARTY_MBSTRING ? 'UTF-8' : 'ISO-8859-1');
+}
+if (!defined('SMARTY_RESOURCE_DATE_FORMAT')) {
+    /**
+     * @deprecated in favor of Smarty::$_DATE_FORMAT
+     */
+    define('SMARTY_RESOURCE_DATE_FORMAT', '%b %e, %Y');
+}
+/**
+ * Load Smarty_Autoloader
+ */
+if (!class_exists('Smarty_Autoloader')) {
+    include dirname(__FILE__) . '/bootstrap.php';
+}
+/**
+ * Load always needed external class files
+ */
+require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_data.php';
+require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_extension_handler.php';
+require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_templatebase.php';
+require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_template.php';
+require_once SMARTY_SYSPLUGINS_DIR . 'smarty_resource.php';
+require_once SMARTY_SYSPLUGINS_DIR . 'smarty_variable.php';
+require_once SMARTY_SYSPLUGINS_DIR . 'smarty_template_source.php';
+require_once SMARTY_SYSPLUGINS_DIR . 'smarty_template_resource_base.php';
+require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_resource_file.php';
+
+/**
+ * This is the main Smarty class
+ *
+ * @package Smarty
+ *
+ * The following methods will be dynamically loaded by the extension handler when they are called.
+ * They are located in a corresponding Smarty_Internal_Method_xxxx class
+ *
+ * @method int clearAllCache(int $exp_time = null, string $type = null)
+ * @method int clearCache(string $template_name, string $cache_id = null, string $compile_id = null, int $exp_time = null, string $type = null)
+ * @method int compileAllTemplates(string $extension = '.tpl', bool $force_compile = false, int $time_limit = 0, $max_errors = null)
+ * @method int compileAllConfig(string $extension = '.conf', bool $force_compile = false, int $time_limit = 0, $max_errors = null)
+ * @method int clearCompiledTemplate($resource_name = null, $compile_id = null, $exp_time = null)
+ */
+class Smarty extends Smarty_Internal_TemplateBase
+{
+    /**
+     * smarty version
+     */
+    const SMARTY_VERSION = '3.1.38';
+    /**
+     * define variable scopes
+     */
+    const SCOPE_LOCAL    = 1;
+    const SCOPE_PARENT   = 2;
+    const SCOPE_TPL_ROOT = 4;
+    const SCOPE_ROOT     = 8;
+    const SCOPE_SMARTY   = 16;
+    const SCOPE_GLOBAL   = 32;
+    /**
+     * define caching modes
+     */
+    const CACHING_OFF              = 0;
+    const CACHING_LIFETIME_CURRENT = 1;
+    const CACHING_LIFETIME_SAVED   = 2;
+    /**
+     * define constant for clearing cache files be saved expiration dates
+     */
+    const CLEAR_EXPIRED = -1;
+    /**
+     * define compile check modes
+     */
+    const COMPILECHECK_OFF       = 0;
+    const COMPILECHECK_ON        = 1;
+    const COMPILECHECK_CACHEMISS = 2;
+    /**
+     * define debug modes
+     */
+    const DEBUG_OFF        = 0;
+    const DEBUG_ON         = 1;
+    const DEBUG_INDIVIDUAL = 2;
+    /**
+     * modes for handling of "<?php ... ?>" tags in templates.
+     */
+    const PHP_PASSTHRU = 0; //-> print tags as plain text
+    const PHP_QUOTE    = 1; //-> escape tags as entities
+    const PHP_REMOVE   = 2; //-> escape tags as entities
+    const PHP_ALLOW    = 3; //-> escape tags as entities
+    /**
+     * filter types
+     */
+    const FILTER_POST     = 'post';
+    const FILTER_PRE      = 'pre';
+    const FILTER_OUTPUT   = 'output';
+    const FILTER_VARIABLE = 'variable';
+    /**
+     * plugin types
+     */
+    const PLUGIN_FUNCTION         = 'function';
+    const PLUGIN_BLOCK            = 'block';
+    const PLUGIN_COMPILER         = 'compiler';
+    const PLUGIN_MODIFIER         = 'modifier';
+    const PLUGIN_MODIFIERCOMPILER = 'modifiercompiler';
+
+    /**
+     * assigned global tpl vars
+     */
+    public static $global_tpl_vars = array();
+
+    /**
+     * Flag denoting if Multibyte String functions are available
+     */
+    public static $_MBSTRING = SMARTY_MBSTRING;
+
+    /**
+     * The character set to adhere to (e.g. "UTF-8")
+     */
+    public static $_CHARSET = SMARTY_RESOURCE_CHAR_SET;
+
+    /**
+     * The date format to be used internally
+     * (accepts date() and strftime())
+     */
+    public static $_DATE_FORMAT = SMARTY_RESOURCE_DATE_FORMAT;
+
+    /**
+     * Flag denoting if PCRE should run in UTF-8 mode
+     */
+    public static $_UTF8_MODIFIER = 'u';
+
+    /**
+     * Flag denoting if operating system is windows
+     */
+    public static $_IS_WINDOWS = false;
+
+    /**
+     * auto literal on delimiters with whitespace
+     *
+     * @var boolean
+     */
+    public $auto_literal = true;
+
+    /**
+     * display error on not assigned variables
+     *
+     * @var boolean
+     */
+    public $error_unassigned = false;
+
+    /**
+     * look up relative file path in include_path
+     *
+     * @var boolean
+     */
+    public $use_include_path = false;
+
+    /**
+     * flag if template_dir is normalized
+     *
+     * @var bool
+     */
+    public $_templateDirNormalized = false;
+
+    /**
+     * joined template directory string used in cache keys
+     *
+     * @var string
+     */
+    public $_joined_template_dir = null;
+
+    /**
+     * flag if config_dir is normalized
+     *
+     * @var bool
+     */
+    public $_configDirNormalized = false;
+
+    /**
+     * joined config directory string used in cache keys
+     *
+     * @var string
+     */
+    public $_joined_config_dir = null;
+
+    /**
+     * default template handler
+     *
+     * @var callable
+     */
+    public $default_template_handler_func = null;
+
+    /**
+     * default config handler
+     *
+     * @var callable
+     */
+    public $default_config_handler_func = null;
+
+    /**
+     * default plugin handler
+     *
+     * @var callable
+     */
+    public $default_plugin_handler_func = null;
+
+    /**
+     * flag if template_dir is normalized
+     *
+     * @var bool
+     */
+    public $_compileDirNormalized = false;
+
+    /**
+     * flag if plugins_dir is normalized
+     *
+     * @var bool
+     */
+    public $_pluginsDirNormalized = false;
+
+    /**
+     * flag if template_dir is normalized
+     *
+     * @var bool
+     */
+    public $_cacheDirNormalized = false;
+
+    /**
+     * force template compiling?
+     *
+     * @var boolean
+     */
+    public $force_compile = false;
+
+    /**
+     * use sub dirs for compiled/cached files?
+     *
+     * @var boolean
+     */
+    public $use_sub_dirs = false;
+
+    /**
+     * allow ambiguous resources (that are made unique by the resource handler)
+     *
+     * @var boolean
+     */
+    public $allow_ambiguous_resources = false;
+
+    /**
+     * merge compiled includes
+     *
+     * @var boolean
+     */
+    public $merge_compiled_includes = false;
+
+    /*
+    * flag for behaviour when extends: resource  and {extends} tag are used simultaneous
+    *   if false disable execution of {extends} in templates called by extends resource.
+    *   (behaviour as versions < 3.1.28)
+    *
+    * @var boolean
+    */
+    public $extends_recursion = true;
+
+    /**
+     * force cache file creation
+     *
+     * @var boolean
+     */
+    public $force_cache = false;
+
+    /**
+     * template left-delimiter
+     *
+     * @var string
+     */
+    public $left_delimiter = "{";
+
+    /**
+     * template right-delimiter
+     *
+     * @var string
+     */
+    public $right_delimiter = "}";
+
+    /**
+     * array of strings which shall be treated as literal by compiler
+     *
+     * @var array string
+     */
+    public $literals = array();
+
+    /**
+     * class name
+     * This should be instance of Smarty_Security.
+     *
+     * @var string
+     * @see Smarty_Security
+     */
+    public $security_class = 'Smarty_Security';
+
+    /**
+     * implementation of security class
+     *
+     * @var Smarty_Security
+     */
+    public $security_policy = null;
+
+    /**
+     * controls handling of PHP-blocks
+     *
+     * @var integer
+     */
+    public $php_handling = self::PHP_PASSTHRU;
+
+    /**
+     * controls if the php template file resource is allowed
+     *
+     * @var bool
+     */
+    public $allow_php_templates = false;
+
+    /**
+     * debug mode
+     * Setting this to true enables the debug-console.
+     *
+     * @var boolean
+     */
+    public $debugging = false;
+
+    /**
+     * This determines if debugging is enable-able from the browser.
+     * <ul>
+     *  <li>NONE => no debugging control allowed</li>
+     *  <li>URL => enable debugging when SMARTY_DEBUG is found in the URL.</li>
+     * </ul>
+     *
+     * @var string
+     */
+    public $debugging_ctrl = 'NONE';
+
+    /**
+     * Name of debugging URL-param.
+     * Only used when $debugging_ctrl is set to 'URL'.
+     * The name of the URL-parameter that activates debugging.
+     *
+     * @var string
+     */
+    public $smarty_debug_id = 'SMARTY_DEBUG';
+
+    /**
+     * Path of debug template.
+     *
+     * @var string
+     */
+    public $debug_tpl = null;
+
+    /**
+     * When set, smarty uses this value as error_reporting-level.
+     *
+     * @var int
+     */
+    public $error_reporting = null;
+
+    /**
+     * Controls whether variables with the same name overwrite each other.
+     *
+     * @var boolean
+     */
+    public $config_overwrite = true;
+
+    /**
+     * Controls whether config values of on/true/yes and off/false/no get converted to boolean.
+     *
+     * @var boolean
+     */
+    public $config_booleanize = true;
+
+    /**
+     * Controls whether hidden config sections/vars are read from the file.
+     *
+     * @var boolean
+     */
+    public $config_read_hidden = false;
+
+    /**
+     * locking concurrent compiles
+     *
+     * @var boolean
+     */
+    public $compile_locking = true;
+
+    /**
+     * Controls whether cache resources should use locking mechanism
+     *
+     * @var boolean
+     */
+    public $cache_locking = false;
+
+    /**
+     * seconds to wait for acquiring a lock before ignoring the write lock
+     *
+     * @var float
+     */
+    public $locking_timeout = 10;
+
+    /**
+     * resource type used if none given
+     * Must be an valid key of $registered_resources.
+     *
+     * @var string
+     */
+    public $default_resource_type = 'file';
+
+    /**
+     * caching type
+     * Must be an element of $cache_resource_types.
+     *
+     * @var string
+     */
+    public $caching_type = 'file';
+
+    /**
+     * config type
+     *
+     * @var string
+     */
+    public $default_config_type = 'file';
+
+    /**
+     * check If-Modified-Since headers
+     *
+     * @var boolean
+     */
+    public $cache_modified_check = false;
+
+    /**
+     * registered plugins
+     *
+     * @var array
+     */
+    public $registered_plugins = array();
+
+    /**
+     * registered objects
+     *
+     * @var array
+     */
+    public $registered_objects = array();
+
+    /**
+     * registered classes
+     *
+     * @var array
+     */
+    public $registered_classes = array();
+
+    /**
+     * registered filters
+     *
+     * @var array
+     */
+    public $registered_filters = array();
+
+    /**
+     * registered resources
+     *
+     * @var array
+     */
+    public $registered_resources = array();
+
+    /**
+     * registered cache resources
+     *
+     * @var array
+     */
+    public $registered_cache_resources = array();
+
+    /**
+     * autoload filter
+     *
+     * @var array
+     */
+    public $autoload_filters = array();
+
+    /**
+     * default modifier
+     *
+     * @var array
+     */
+    public $default_modifiers = array();
+
+    /**
+     * autoescape variable output
+     *
+     * @var boolean
+     */
+    public $escape_html = false;
+
+    /**
+     * start time for execution time calculation
+     *
+     * @var int
+     */
+    public $start_time = 0;
+
+    /**
+     * required by the compiler for BC
+     *
+     * @var string
+     */
+    public $_current_file = null;
+
+    /**
+     * internal flag to enable parser debugging
+     *
+     * @var bool
+     */
+    public $_parserdebug = false;
+
+    /**
+     * This object type (Smarty = 1, template = 2, data = 4)
+     *
+     * @var int
+     */
+    public $_objType = 1;
+
+    /**
+     * Debug object
+     *
+     * @var Smarty_Internal_Debug
+     */
+    public $_debug = null;
+
+    /**
+     * template directory
+     *
+     * @var array
+     */
+    protected $template_dir = array('./templates/');
+
+    /**
+     * flags for normalized template directory entries
+     *
+     * @var array
+     */
+    protected $_processedTemplateDir = array();
+
+    /**
+     * config directory
+     *
+     * @var array
+     */
+    protected $config_dir = array('./configs/');
+
+    /**
+     * flags for normalized template directory entries
+     *
+     * @var array
+     */
+    protected $_processedConfigDir = array();
+
+    /**
+     * compile directory
+     *
+     * @var string
+     */
+    protected $compile_dir = './templates_c/';
+
+    /**
+     * plugins directory
+     *
+     * @var array
+     */
+    protected $plugins_dir = array();
+
+    /**
+     * cache directory
+     *
+     * @var string
+     */
+    protected $cache_dir = './cache/';
+
+    /**
+     * removed properties
+     *
+     * @var string[]
+     */
+    protected $obsoleteProperties = array(
+        'resource_caching', 'template_resource_caching', 'direct_access_security',
+        '_dir_perms', '_file_perms', 'plugin_search_order',
+        'inheritance_merge_compiled_includes', 'resource_cache_mode',
+    );
+
+    /**
+     * List of private properties which will call getter/setter on a direct access
+     *
+     * @var string[]
+     */
+    protected $accessMap = array(
+        'template_dir' => 'TemplateDir', 'config_dir' => 'ConfigDir',
+        'plugins_dir'  => 'PluginsDir', 'compile_dir' => 'CompileDir',
+        'cache_dir'    => 'CacheDir',
+    );
+
+    /**
+     * Initialize new Smarty object
+     */
+    public function __construct()
+    {
+        $this->_clearTemplateCache();
+        parent::__construct();
+        if (is_callable('mb_internal_encoding')) {
+            mb_internal_encoding(Smarty::$_CHARSET);
+        }
+        $this->start_time = microtime(true);
+        if (isset($_SERVER[ 'SCRIPT_NAME' ])) {
+            Smarty::$global_tpl_vars[ 'SCRIPT_NAME' ] = new Smarty_Variable($_SERVER[ 'SCRIPT_NAME' ]);
+        }
+        // Check if we're running on windows
+        Smarty::$_IS_WINDOWS = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
+        // let PCRE (preg_*) treat strings as ISO-8859-1 if we're not dealing with UTF-8
+        if (Smarty::$_CHARSET !== 'UTF-8') {
+            Smarty::$_UTF8_MODIFIER = '';
+        }
+    }
+
+    /**
+     * Enable error handler to mute expected messages
+     *
+     * @return     boolean
+     * @deprecated
+     */
+    public static function muteExpectedErrors()
+    {
+        return Smarty_Internal_ErrorHandler::muteExpectedErrors();
+    }
+
+    /**
+     * Disable error handler muting expected messages
+     *
+     * @deprecated
+     */
+    public static function unmuteExpectedErrors()
+    {
+        restore_error_handler();
+    }
+
+    /**
+     * Check if a template resource exists
+     *
+     * @param string $resource_name template name
+     *
+     * @return bool status
+     * @throws \SmartyException
+     */
+    public function templateExists($resource_name)
+    {
+        // create source object
+        $source = Smarty_Template_Source::load(null, $this, $resource_name);
+        return $source->exists;
+    }
+
+    /**
+     * Loads security class and enables security
+     *
+     * @param string|Smarty_Security $security_class if a string is used, it must be class-name
+     *
+     * @return Smarty                 current Smarty instance for chaining
+     * @throws \SmartyException
+     */
+    public function enableSecurity($security_class = null)
+    {
+        Smarty_Security::enableSecurity($this, $security_class);
+        return $this;
+    }
+
+    /**
+     * Disable security
+     *
+     * @return Smarty current Smarty instance for chaining
+     */
+    public function disableSecurity()
+    {
+        $this->security_policy = null;
+        return $this;
+    }
+
+    /**
+     * Add template directory(s)
+     *
+     * @param string|array $template_dir directory(s) of template sources
+     * @param string       $key          of the array element to assign the template dir to
+     * @param bool         $isConfig     true for config_dir
+     *
+     * @return Smarty          current Smarty instance for chaining
+     */
+    public function addTemplateDir($template_dir, $key = null, $isConfig = false)
+    {
+        if ($isConfig) {
+            $processed = &$this->_processedConfigDir;
+            $dir = &$this->config_dir;
+            $this->_configDirNormalized = false;
+        } else {
+            $processed = &$this->_processedTemplateDir;
+            $dir = &$this->template_dir;
+            $this->_templateDirNormalized = false;
+        }
+        if (is_array($template_dir)) {
+            foreach ($template_dir as $k => $v) {
+                if (is_int($k)) {
+                    // indexes are not merged but appended
+                    $dir[] = $v;
+                } else {
+                    // string indexes are overridden
+                    $dir[ $k ] = $v;
+                    unset($processed[ $key ]);
+                }
+            }
+        } else {
+            if ($key !== null) {
+                // override directory at specified index
+                $dir[ $key ] = $template_dir;
+                unset($processed[ $key ]);
+            } else {
+                // append new directory
+                $dir[] = $template_dir;
+            }
+        }
+        return $this;
+    }
+
+    /**
+     * Get template directories
+     *
+     * @param mixed $index    index of directory to get, null to get all
+     * @param bool  $isConfig true for config_dir
+     *
+     * @return array|string list of template directories, or directory of $index
+     */
+    public function getTemplateDir($index = null, $isConfig = false)
+    {
+        if ($isConfig) {
+            $dir = &$this->config_dir;
+        } else {
+            $dir = &$this->template_dir;
+        }
+        if ($isConfig ? !$this->_configDirNormalized : !$this->_templateDirNormalized) {
+            $this->_normalizeTemplateConfig($isConfig);
+        }
+        if ($index !== null) {
+            return isset($dir[ $index ]) ? $dir[ $index ] : null;
+        }
+        return $dir;
+    }
+
+    /**
+     * Set template directory
+     *
+     * @param string|array $template_dir directory(s) of template sources
+     * @param bool         $isConfig     true for config_dir
+     *
+     * @return \Smarty current Smarty instance for chaining
+     */
+    public function setTemplateDir($template_dir, $isConfig = false)
+    {
+        if ($isConfig) {
+            $this->config_dir = array();
+            $this->_processedConfigDir = array();
+        } else {
+            $this->template_dir = array();
+            $this->_processedTemplateDir = array();
+        }
+        $this->addTemplateDir($template_dir, null, $isConfig);
+        return $this;
+    }
+
+    /**
+     * Add config directory(s)
+     *
+     * @param string|array $config_dir directory(s) of config sources
+     * @param mixed        $key        key of the array element to assign the config dir to
+     *
+     * @return Smarty current Smarty instance for chaining
+     */
+    public function addConfigDir($config_dir, $key = null)
+    {
+        return $this->addTemplateDir($config_dir, $key, true);
+    }
+
+    /**
+     * Get config directory
+     *
+     * @param mixed $index index of directory to get, null to get all
+     *
+     * @return array configuration directory
+     */
+    public function getConfigDir($index = null)
+    {
+        return $this->getTemplateDir($index, true);
+    }
+
+    /**
+     * Set config directory
+     *
+     * @param $config_dir
+     *
+     * @return Smarty       current Smarty instance for chaining
+     */
+    public function setConfigDir($config_dir)
+    {
+        return $this->setTemplateDir($config_dir, true);
+    }
+
+    /**
+     * Adds directory of plugin files
+     *
+     * @param null|array|string $plugins_dir
+     *
+     * @return Smarty current Smarty instance for chaining
+     */
+    public function addPluginsDir($plugins_dir)
+    {
+        if (empty($this->plugins_dir)) {
+            $this->plugins_dir[] = SMARTY_PLUGINS_DIR;
+        }
+        $this->plugins_dir = array_merge($this->plugins_dir, (array)$plugins_dir);
+        $this->_pluginsDirNormalized = false;
+        return $this;
+    }
+
+    /**
+     * Get plugin directories
+     *
+     * @return array list of plugin directories
+     */
+    public function getPluginsDir()
+    {
+        if (empty($this->plugins_dir)) {
+            $this->plugins_dir[] = SMARTY_PLUGINS_DIR;
+            $this->_pluginsDirNormalized = false;
+        }
+        if (!$this->_pluginsDirNormalized) {
+            if (!is_array($this->plugins_dir)) {
+                $this->plugins_dir = (array)$this->plugins_dir;
+            }
+            foreach ($this->plugins_dir as $k => $v) {
+                $this->plugins_dir[ $k ] = $this->_realpath(rtrim($v, '/\\') . DIRECTORY_SEPARATOR, true);
+            }
+            $this->_cache[ 'plugin_files' ] = array();
+            $this->_pluginsDirNormalized = true;
+        }
+        return $this->plugins_dir;
+    }
+
+    /**
+     * Set plugins directory
+     *
+     * @param string|array $plugins_dir directory(s) of plugins
+     *
+     * @return Smarty       current Smarty instance for chaining
+     */
+    public function setPluginsDir($plugins_dir)
+    {
+        $this->plugins_dir = (array)$plugins_dir;
+        $this->_pluginsDirNormalized = false;
+        return $this;
+    }
+
+    /**
+     * Get compiled directory
+     *
+     * @return string path to compiled templates
+     */
+    public function getCompileDir()
+    {
+        if (!$this->_compileDirNormalized) {
+            $this->_normalizeDir('compile_dir', $this->compile_dir);
+            $this->_compileDirNormalized = true;
+        }
+        return $this->compile_dir;
+    }
+
+    /**
+     *
+     * @param  string $compile_dir directory to store compiled templates in
+     *
+     * @return Smarty current Smarty instance for chaining
+     */
+    public function setCompileDir($compile_dir)
+    {
+        $this->_normalizeDir('compile_dir', $compile_dir);
+        $this->_compileDirNormalized = true;
+        return $this;
+    }
+
+    /**
+     * Get cache directory
+     *
+     * @return string path of cache directory
+     */
+    public function getCacheDir()
+    {
+        if (!$this->_cacheDirNormalized) {
+            $this->_normalizeDir('cache_dir', $this->cache_dir);
+            $this->_cacheDirNormalized = true;
+        }
+        return $this->cache_dir;
+    }
+
+    /**
+     * Set cache directory
+     *
+     * @param string $cache_dir directory to store cached templates in
+     *
+     * @return Smarty current Smarty instance for chaining
+     */
+    public function setCacheDir($cache_dir)
+    {
+        $this->_normalizeDir('cache_dir', $cache_dir);
+        $this->_cacheDirNormalized = true;
+        return $this;
+    }
+
+    /**
+     * creates a template object
+     *
+     * @param string  $template   the resource handle of the template file
+     * @param mixed   $cache_id   cache id to be used with this template
+     * @param mixed   $compile_id compile id to be used with this template
+     * @param object  $parent     next higher level of Smarty variables
+     * @param boolean $do_clone   flag is Smarty object shall be cloned
+     *
+     * @return \Smarty_Internal_Template template object
+     * @throws \SmartyException
+     */
+    public function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null, $do_clone = true)
+    {
+        if ($cache_id !== null && (is_object($cache_id) || is_array($cache_id))) {
+            $parent = $cache_id;
+            $cache_id = null;
+        }
+        if ($parent !== null && is_array($parent)) {
+            $data = $parent;
+            $parent = null;
+        } else {
+            $data = null;
+        }
+        if (!$this->_templateDirNormalized) {
+            $this->_normalizeTemplateConfig(false);
+        }
+        $_templateId = $this->_getTemplateId($template, $cache_id, $compile_id);
+        $tpl = null;
+        if ($this->caching && isset(Smarty_Internal_Template::$isCacheTplObj[ $_templateId ])) {
+            $tpl = $do_clone ? clone Smarty_Internal_Template::$isCacheTplObj[ $_templateId ] :
+                Smarty_Internal_Template::$isCacheTplObj[ $_templateId ];
+            $tpl->inheritance = null;
+            $tpl->tpl_vars = $tpl->config_vars = array();
+        } elseif (!$do_clone && isset(Smarty_Internal_Template::$tplObjCache[ $_templateId ])) {
+            $tpl = clone Smarty_Internal_Template::$tplObjCache[ $_templateId ];
+            $tpl->inheritance = null;
+            $tpl->tpl_vars = $tpl->config_vars = array();
+        } else {
+            /* @var Smarty_Internal_Template $tpl */
+            $tpl = new $this->template_class($template, $this, null, $cache_id, $compile_id, null, null);
+            $tpl->templateId = $_templateId;
+        }
+        if ($do_clone) {
+            $tpl->smarty = clone $tpl->smarty;
+        }
+        $tpl->parent = $parent ? $parent : $this;
+        // fill data if present
+        if (!empty($data) && is_array($data)) {
+            // set up variable values
+            foreach ($data as $_key => $_val) {
+                $tpl->tpl_vars[ $_key ] = new Smarty_Variable($_val);
+            }
+        }
+        if ($this->debugging || $this->debugging_ctrl === 'URL') {
+            $tpl->smarty->_debug = new Smarty_Internal_Debug();
+            // check URL debugging control
+            if (!$this->debugging && $this->debugging_ctrl === 'URL') {
+                $tpl->smarty->_debug->debugUrl($tpl->smarty);
+            }
+        }
+        return $tpl;
+    }
+
+    /**
+     * Takes unknown classes and loads plugin files for them
+     * class name format: Smarty_PluginType_PluginName
+     * plugin filename format: plugintype.pluginname.php
+     *
+     * @param string $plugin_name class plugin name to load
+     * @param bool   $check       check if already loaded
+     *
+     * @return string |boolean filepath of loaded file or false
+     * @throws \SmartyException
+     */
+    public function loadPlugin($plugin_name, $check = true)
+    {
+        return $this->ext->loadPlugin->loadPlugin($this, $plugin_name, $check);
+    }
+
+    /**
+     * Get unique template id
+     *
+     * @param string                    $template_name
+     * @param null|mixed                $cache_id
+     * @param null|mixed                $compile_id
+     * @param null                      $caching
+     * @param \Smarty_Internal_Template $template
+     *
+     * @return string
+     * @throws \SmartyException
+     */
+    public function _getTemplateId(
+        $template_name,
+        $cache_id = null,
+        $compile_id = null,
+        $caching = null,
+        Smarty_Internal_Template $template = null
+    ) {
+        $template_name = (strpos($template_name, ':') === false) ? "{$this->default_resource_type}:{$template_name}" :
+            $template_name;
+        $cache_id = $cache_id === null ? $this->cache_id : $cache_id;
+        $compile_id = $compile_id === null ? $this->compile_id : $compile_id;
+        $caching = (int)($caching === null ? $this->caching : $caching);
+        if ((isset($template) && strpos($template_name, ':.') !== false) || $this->allow_ambiguous_resources) {
+            $_templateId =
+                Smarty_Resource::getUniqueTemplateName((isset($template) ? $template : $this), $template_name) .
+                "#{$cache_id}#{$compile_id}#{$caching}";
+        } else {
+            $_templateId = $this->_joined_template_dir . "#{$template_name}#{$cache_id}#{$compile_id}#{$caching}";
+        }
+        if (isset($_templateId[ 150 ])) {
+            $_templateId = sha1($_templateId);
+        }
+        return $_templateId;
+    }
+
+    /**
+     * Normalize path
+     *  - remove /./ and /../
+     *  - make it absolute if required
+     *
+     * @param string $path     file path
+     * @param bool   $realpath if true - convert to absolute
+     *                         false - convert to relative
+     *                         null - keep as it is but
+     *                         remove /./ /../
+     *
+     * @return string
+     */
+    public function _realpath($path, $realpath = null)
+    {
+        $nds = array('/' => '\\', '\\' => '/');
+        preg_match(
+            '%^(?<root>(?:[[:alpha:]]:[\\\\/]|/|[\\\\]{2}[[:alpha:]]+|[[:print:]]{2,}:[/]{2}|[\\\\])?)(?<path>(.*))$%u',
+            $path,
+            $parts
+        );
+        $path = $parts[ 'path' ];
+        if ($parts[ 'root' ] === '\\') {
+            $parts[ 'root' ] = substr(getcwd(), 0, 2) . $parts[ 'root' ];
+        } else {
+            if ($realpath !== null && !$parts[ 'root' ]) {
+                $path = getcwd() . DIRECTORY_SEPARATOR . $path;
+            }
+        }
+        // normalize DIRECTORY_SEPARATOR
+        $path = str_replace($nds[ DIRECTORY_SEPARATOR ], DIRECTORY_SEPARATOR, $path);
+        $parts[ 'root' ] = str_replace($nds[ DIRECTORY_SEPARATOR ], DIRECTORY_SEPARATOR, $parts[ 'root' ]);
+        do {
+            $path = preg_replace(
+                array('#[\\\\/]{2}#', '#[\\\\/][.][\\\\/]#', '#[\\\\/]([^\\\\/.]+)[\\\\/][.][.][\\\\/]#'),
+                DIRECTORY_SEPARATOR,
+                $path,
+                -1,
+                $count
+            );
+        } while ($count > 0);
+        return $realpath !== false ? $parts[ 'root' ] . $path : str_ireplace(getcwd(), '.', $parts[ 'root' ] . $path);
+    }
+
+    /**
+     * Empty template objects cache
+     */
+    public function _clearTemplateCache()
+    {
+        Smarty_Internal_Template::$isCacheTplObj = array();
+        Smarty_Internal_Template::$tplObjCache = array();
+    }
+
+    /**
+     * @param boolean $use_sub_dirs
+     */
+    public function setUseSubDirs($use_sub_dirs)
+    {
+        $this->use_sub_dirs = $use_sub_dirs;
+    }
+
+    /**
+     * @param int $error_reporting
+     */
+    public function setErrorReporting($error_reporting)
+    {
+        $this->error_reporting = $error_reporting;
+    }
+
+    /**
+     * @param boolean $escape_html
+     */
+    public function setEscapeHtml($escape_html)
+    {
+        $this->escape_html = $escape_html;
+    }
+
+    /**
+     * Return auto_literal flag
+     *
+     * @return boolean
+     */
+    public function getAutoLiteral()
+    {
+        return $this->auto_literal;
+    }
+
+    /**
+     * Set auto_literal flag
+     *
+     * @param boolean $auto_literal
+     */
+    public function setAutoLiteral($auto_literal = true)
+    {
+        $this->auto_literal = $auto_literal;
+    }
+
+    /**
+     * @param boolean $force_compile
+     */
+    public function setForceCompile($force_compile)
+    {
+        $this->force_compile = $force_compile;
+    }
+
+    /**
+     * @param boolean $merge_compiled_includes
+     */
+    public function setMergeCompiledIncludes($merge_compiled_includes)
+    {
+        $this->merge_compiled_includes = $merge_compiled_includes;
+    }
+
+    /**
+     * Get left delimiter
+     *
+     * @return string
+     */
+    public function getLeftDelimiter()
+    {
+        return $this->left_delimiter;
+    }
+
+    /**
+     * Set left delimiter
+     *
+     * @param string $left_delimiter
+     */
+    public function setLeftDelimiter($left_delimiter)
+    {
+        $this->left_delimiter = $left_delimiter;
+    }
+
+    /**
+     * Get right delimiter
+     *
+     * @return string $right_delimiter
+     */
+    public function getRightDelimiter()
+    {
+        return $this->right_delimiter;
+    }
+
+    /**
+     * Set right delimiter
+     *
+     * @param string
+     */
+    public function setRightDelimiter($right_delimiter)
+    {
+        $this->right_delimiter = $right_delimiter;
+    }
+
+    /**
+     * @param boolean $debugging
+     */
+    public function setDebugging($debugging)
+    {
+        $this->debugging = $debugging;
+    }
+
+    /**
+     * @param boolean $config_overwrite
+     */
+    public function setConfigOverwrite($config_overwrite)
+    {
+        $this->config_overwrite = $config_overwrite;
+    }
+
+    /**
+     * @param boolean $config_booleanize
+     */
+    public function setConfigBooleanize($config_booleanize)
+    {
+        $this->config_booleanize = $config_booleanize;
+    }
+
+    /**
+     * @param boolean $config_read_hidden
+     */
+    public function setConfigReadHidden($config_read_hidden)
+    {
+        $this->config_read_hidden = $config_read_hidden;
+    }
+
+    /**
+     * @param boolean $compile_locking
+     */
+    public function setCompileLocking($compile_locking)
+    {
+        $this->compile_locking = $compile_locking;
+    }
+
+    /**
+     * @param string $default_resource_type
+     */
+    public function setDefaultResourceType($default_resource_type)
+    {
+        $this->default_resource_type = $default_resource_type;
+    }
+
+    /**
+     * @param string $caching_type
+     */
+    public function setCachingType($caching_type)
+    {
+        $this->caching_type = $caching_type;
+    }
+
+    /**
+     * Test install
+     *
+     * @param null $errors
+     */
+    public function testInstall(&$errors = null)
+    {
+        Smarty_Internal_TestInstall::testInstall($this, $errors);
+    }
+
+    /**
+     * Get Smarty object
+     *
+     * @return Smarty
+     */
+    public function _getSmartyObj()
+    {
+        return $this;
+    }
+
+    /**
+     * <<magic>> Generic getter.
+     * Calls the appropriate getter function.
+     * Issues an E_USER_NOTICE if no valid getter is found.
+     *
+     * @param string $name property name
+     *
+     * @return mixed
+     */
+    public function __get($name)
+    {
+        if (isset($this->accessMap[ $name ])) {
+            $method = 'get' . $this->accessMap[ $name ];
+            return $this->{$method}();
+        } elseif (isset($this->_cache[ $name ])) {
+            return $this->_cache[ $name ];
+        } elseif (in_array($name, $this->obsoleteProperties)) {
+            return null;
+        } else {
+            trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE);
+        }
+        return null;
+    }
+
+    /**
+     * <<magic>> Generic setter.
+     * Calls the appropriate setter function.
+     * Issues an E_USER_NOTICE if no valid setter is found.
+     *
+     * @param string $name  property name
+     * @param mixed  $value parameter passed to setter
+     *
+     */
+    public function __set($name, $value)
+    {
+        if (isset($this->accessMap[ $name ])) {
+            $method = 'set' . $this->accessMap[ $name ];
+            $this->{$method}($value);
+        } elseif (in_array($name, $this->obsoleteProperties)) {
+            return;
+        } elseif (is_object($value) && method_exists($value, $name)) {
+            $this->$name = $value;
+        } else {
+            trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE);
+        }
+    }
+
+    /**
+     * Normalize and set directory string
+     *
+     * @param string $dirName cache_dir or compile_dir
+     * @param string $dir     filepath of folder
+     */
+    private function _normalizeDir($dirName, $dir)
+    {
+        $this->{$dirName} = $this->_realpath(rtrim($dir, "/\\") . DIRECTORY_SEPARATOR, true);
+        if (class_exists('Smarty_Internal_ErrorHandler', false)) {
+            if (!isset(Smarty_Internal_ErrorHandler::$mutedDirectories[ $this->{$dirName} ])) {
+                Smarty_Internal_ErrorHandler::$mutedDirectories[ $this->{$dirName} ] = null;
+            }
+        }
+    }
+
+    /**
+     * Normalize template_dir or config_dir
+     *
+     * @param bool $isConfig true for config_dir
+     */
+    private function _normalizeTemplateConfig($isConfig)
+    {
+        if ($isConfig) {
+            $processed = &$this->_processedConfigDir;
+            $dir = &$this->config_dir;
+        } else {
+            $processed = &$this->_processedTemplateDir;
+            $dir = &$this->template_dir;
+        }
+        if (!is_array($dir)) {
+            $dir = (array)$dir;
+        }
+        foreach ($dir as $k => $v) {
+            if (!isset($processed[ $k ])) {
+                $dir[ $k ] = $v = $this->_realpath(rtrim($v, "/\\") . DIRECTORY_SEPARATOR, true);
+                $processed[ $k ] = true;
+            }
+        }
+        $isConfig ? $this->_configDirNormalized = true : $this->_templateDirNormalized = true;
+        $isConfig ? $this->_joined_config_dir = join('#', $this->config_dir) :
+            $this->_joined_template_dir = join('#', $this->template_dir);
+    }
+}
diff --git a/SmartyBC.class.php b/SmartyBC.class.php
new file mode 100644
index 0000000000000000000000000000000000000000..0550e46dc5ea092820e718afa802c4fae7eed3ef
--- /dev/null
+++ b/SmartyBC.class.php
@@ -0,0 +1,477 @@
+<?php
+/**
+ * Project:     Smarty: the PHP compiling template engine
+ * File:        SmartyBC.class.php
+ * SVN:         $Id: $
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3.0 of the License, or (at your option) any later version.
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * For questions, help, comments, discussion, etc., please join the
+ * Smarty mailing list. Send a blank e-mail to
+ * smarty-discussion-subscribe@googlegroups.com
+ *
+ * @link      http://www.smarty.net/
+ * @copyright 2008 New Digital Group, Inc.
+ * @author    Monte Ohrt <monte at ohrt dot com>
+ * @author    Uwe Tews
+ * @author    Rodney Rehm
+ * @package   Smarty
+ */
+/**
+ * @ignore
+ */
+require_once dirname(__FILE__) . '/Smarty.class.php';
+
+/**
+ * Smarty Backward Compatibility Wrapper Class
+ *
+ * @package Smarty
+ */
+class SmartyBC extends Smarty
+{
+    /**
+     * Smarty 2 BC
+     *
+     * @var string
+     */
+    public $_version = self::SMARTY_VERSION;
+
+    /**
+     * This is an array of directories where trusted php scripts reside.
+     *
+     * @var array
+     */
+    public $trusted_dir = array();
+
+    /**
+     * Initialize new SmartyBC object
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * wrapper for assign_by_ref
+     *
+     * @param string $tpl_var the template variable name
+     * @param mixed  &$value  the referenced value to assign
+     */
+    public function assign_by_ref($tpl_var, &$value)
+    {
+        $this->assignByRef($tpl_var, $value);
+    }
+
+    /**
+     * wrapper for append_by_ref
+     *
+     * @param string  $tpl_var the template variable name
+     * @param mixed   &$value  the referenced value to append
+     * @param boolean $merge   flag if array elements shall be merged
+     */
+    public function append_by_ref($tpl_var, &$value, $merge = false)
+    {
+        $this->appendByRef($tpl_var, $value, $merge);
+    }
+
+    /**
+     * clear the given assigned template variable.
+     *
+     * @param string $tpl_var the template variable to clear
+     */
+    public function clear_assign($tpl_var)
+    {
+        $this->clearAssign($tpl_var);
+    }
+
+    /**
+     * Registers custom function to be used in templates
+     *
+     * @param string $function      the name of the template function
+     * @param string $function_impl the name of the PHP function to register
+     * @param bool   $cacheable
+     * @param mixed  $cache_attrs
+     *
+     * @throws \SmartyException
+     */
+    public function register_function($function, $function_impl, $cacheable = true, $cache_attrs = null)
+    {
+        $this->registerPlugin('function', $function, $function_impl, $cacheable, $cache_attrs);
+    }
+
+    /**
+     * Unregister custom function
+     *
+     * @param string $function name of template function
+     */
+    public function unregister_function($function)
+    {
+        $this->unregisterPlugin('function', $function);
+    }
+
+    /**
+     * Registers object to be used in templates
+     *
+     * @param string  $object        name of template object
+     * @param object  $object_impl   the referenced PHP object to register
+     * @param array   $allowed       list of allowed methods (empty = all)
+     * @param boolean $smarty_args   smarty argument format, else traditional
+     * @param array   $block_methods list of methods that are block format
+     *
+     * @throws   SmartyException
+     * @internal param array $block_functs list of methods that are block format
+     */
+    public function register_object(
+        $object,
+        $object_impl,
+        $allowed = array(),
+        $smarty_args = true,
+        $block_methods = array()
+    ) {
+        settype($allowed, 'array');
+        settype($smarty_args, 'boolean');
+        $this->registerObject($object, $object_impl, $allowed, $smarty_args, $block_methods);
+    }
+
+    /**
+     * Unregister object
+     *
+     * @param string $object name of template object
+     */
+    public function unregister_object($object)
+    {
+        $this->unregisterObject($object);
+    }
+
+    /**
+     * Registers block function to be used in templates
+     *
+     * @param string $block      name of template block
+     * @param string $block_impl PHP function to register
+     * @param bool   $cacheable
+     * @param mixed  $cache_attrs
+     *
+     * @throws \SmartyException
+     */
+    public function register_block($block, $block_impl, $cacheable = true, $cache_attrs = null)
+    {
+        $this->registerPlugin('block', $block, $block_impl, $cacheable, $cache_attrs);
+    }
+
+    /**
+     * Unregister block function
+     *
+     * @param string $block name of template function
+     */
+    public function unregister_block($block)
+    {
+        $this->unregisterPlugin('block', $block);
+    }
+
+    /**
+     * Registers compiler function
+     *
+     * @param string $function      name of template function
+     * @param string $function_impl name of PHP function to register
+     * @param bool   $cacheable
+     *
+     * @throws \SmartyException
+     */
+    public function register_compiler_function($function, $function_impl, $cacheable = true)
+    {
+        $this->registerPlugin('compiler', $function, $function_impl, $cacheable);
+    }
+
+    /**
+     * Unregister compiler function
+     *
+     * @param string $function name of template function
+     */
+    public function unregister_compiler_function($function)
+    {
+        $this->unregisterPlugin('compiler', $function);
+    }
+
+    /**
+     * Registers modifier to be used in templates
+     *
+     * @param string $modifier      name of template modifier
+     * @param string $modifier_impl name of PHP function to register
+     *
+     * @throws \SmartyException
+     */
+    public function register_modifier($modifier, $modifier_impl)
+    {
+        $this->registerPlugin('modifier', $modifier, $modifier_impl);
+    }
+
+    /**
+     * Unregister modifier
+     *
+     * @param string $modifier name of template modifier
+     */
+    public function unregister_modifier($modifier)
+    {
+        $this->unregisterPlugin('modifier', $modifier);
+    }
+
+    /**
+     * Registers a resource to fetch a template
+     *
+     * @param string $type      name of resource
+     * @param array  $functions array of functions to handle resource
+     */
+    public function register_resource($type, $functions)
+    {
+        $this->registerResource($type, $functions);
+    }
+
+    /**
+     * Unregister a resource
+     *
+     * @param string $type name of resource
+     */
+    public function unregister_resource($type)
+    {
+        $this->unregisterResource($type);
+    }
+
+    /**
+     * Registers a prefilter function to apply
+     * to a template before compiling
+     *
+     * @param callable $function
+     *
+     * @throws \SmartyException
+     */
+    public function register_prefilter($function)
+    {
+        $this->registerFilter('pre', $function);
+    }
+
+    /**
+     * Unregister a prefilter function
+     *
+     * @param callable $function
+     */
+    public function unregister_prefilter($function)
+    {
+        $this->unregisterFilter('pre', $function);
+    }
+
+    /**
+     * Registers a postfilter function to apply
+     * to a compiled template after compilation
+     *
+     * @param callable $function
+     *
+     * @throws \SmartyException
+     */
+    public function register_postfilter($function)
+    {
+        $this->registerFilter('post', $function);
+    }
+
+    /**
+     * Unregister a postfilter function
+     *
+     * @param callable $function
+     */
+    public function unregister_postfilter($function)
+    {
+        $this->unregisterFilter('post', $function);
+    }
+
+    /**
+     * Registers an output filter function to apply
+     * to a template output
+     *
+     * @param callable $function
+     *
+     * @throws \SmartyException
+     */
+    public function register_outputfilter($function)
+    {
+        $this->registerFilter('output', $function);
+    }
+
+    /**
+     * Unregister an outputfilter function
+     *
+     * @param callable $function
+     */
+    public function unregister_outputfilter($function)
+    {
+        $this->unregisterFilter('output', $function);
+    }
+
+    /**
+     * load a filter of specified type and name
+     *
+     * @param string $type filter type
+     * @param string $name filter name
+     *
+     * @throws \SmartyException
+     */
+    public function load_filter($type, $name)
+    {
+        $this->loadFilter($type, $name);
+    }
+
+    /**
+     * clear cached content for the given template and cache id
+     *
+     * @param string $tpl_file   name of template file
+     * @param string $cache_id   name of cache_id
+     * @param string $compile_id name of compile_id
+     * @param string $exp_time   expiration time
+     *
+     * @return boolean
+     */
+    public function clear_cache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null)
+    {
+        return $this->clearCache($tpl_file, $cache_id, $compile_id, $exp_time);
+    }
+
+    /**
+     * clear the entire contents of cache (all templates)
+     *
+     * @param string $exp_time expire time
+     *
+     * @return boolean
+     */
+    public function clear_all_cache($exp_time = null)
+    {
+        return $this->clearCache(null, null, null, $exp_time);
+    }
+
+    /**
+     * test to see if valid cache exists for this template
+     *
+     * @param string $tpl_file name of template file
+     * @param string $cache_id
+     * @param string $compile_id
+     *
+     * @return bool
+     * @throws \Exception
+     * @throws \SmartyException
+     */
+    public function is_cached($tpl_file, $cache_id = null, $compile_id = null)
+    {
+        return $this->isCached($tpl_file, $cache_id, $compile_id);
+    }
+
+    /**
+     * clear all the assigned template variables.
+     */
+    public function clear_all_assign()
+    {
+        $this->clearAllAssign();
+    }
+
+    /**
+     * clears compiled version of specified template resource,
+     * or all compiled template files if one is not specified.
+     * This function is for advanced use only, not normally needed.
+     *
+     * @param string $tpl_file
+     * @param string $compile_id
+     * @param string $exp_time
+     *
+     * @return boolean results of {@link smarty_core_rm_auto()}
+     */
+    public function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null)
+    {
+        return $this->clearCompiledTemplate($tpl_file, $compile_id, $exp_time);
+    }
+
+    /**
+     * Checks whether requested template exists.
+     *
+     * @param string $tpl_file
+     *
+     * @return bool
+     * @throws \SmartyException
+     */
+    public function template_exists($tpl_file)
+    {
+        return $this->templateExists($tpl_file);
+    }
+
+    /**
+     * Returns an array containing template variables
+     *
+     * @param string $name
+     *
+     * @return array
+     */
+    public function get_template_vars($name = null)
+    {
+        return $this->getTemplateVars($name);
+    }
+
+    /**
+     * Returns an array containing config variables
+     *
+     * @param string $name
+     *
+     * @return array
+     */
+    public function get_config_vars($name = null)
+    {
+        return $this->getConfigVars($name);
+    }
+
+    /**
+     * load configuration values
+     *
+     * @param string $file
+     * @param string $section
+     * @param string $scope
+     */
+    public function config_load($file, $section = null, $scope = 'global')
+    {
+        $this->ConfigLoad($file, $section, $scope);
+    }
+
+    /**
+     * return a reference to a registered object
+     *
+     * @param string $name
+     *
+     * @return object
+     */
+    public function get_registered_object($name)
+    {
+        return $this->getRegisteredObject($name);
+    }
+
+    /**
+     * clear configuration values
+     *
+     * @param string $var
+     */
+    public function clear_config($var = null)
+    {
+        $this->clearConfig($var);
+    }
+
+    /**
+     * trigger Smarty error
+     *
+     * @param string  $error_msg
+     * @param integer $error_type
+     */
+    public function trigger_error($error_msg, $error_type = E_USER_WARNING)
+    {
+        trigger_error("Smarty error: $error_msg", $error_type);
+    }
+}
diff --git a/add_eti.php b/add_eti.php
new file mode 100644
index 0000000000000000000000000000000000000000..2f5c1827d4f1ecf2ede138f8edb5eeb30b739931
--- /dev/null
+++ b/add_eti.php
@@ -0,0 +1,145 @@
+<?php session_start(); 
+require_once("funciones.php");
+require('include.php');
+
+/*
+* Archivo de control. A�adir paciente, etiolog�a y patolog�a asociada
+* Caso de uso: REGISTRAR PACIENTE <<include>> A�ADIR ETIOLOG�A
+*/
+
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+
+	$id_admin=$_GET["variable"];
+	$html=new Smarty;
+	
+	// Barra
+	barra();
+	// Fin de barra
+
+	//Recogemos los datos del formulario
+	$dni_paciente = ($_GET["id"]);
+	$accion = ($_GET["accion"]);
+	$n_etiologia = ($_POST["etiologia"]);
+	$fecha_lesion =($_POST["fecha_lesion"]);
+	$cuadrantes = ($_POST["cuadrantes"]);
+	$comentarios = ($_POST["comentarios"]);
+	$patologia = ($_POST["patologia"]);
+	$mensaje = "";
+
+
+	// Valores para el formulario:
+		// Tipo de ensayos
+		// Nombre
+		// Apellidos
+		// Edad
+		// Sexo
+
+
+	$html->assign("id_admin",$id_admin);
+	//Mostramos una tabla con todos los sujetos para marcar el que queremos
+	if($accion == 1){
+		$result = $conex->query("SELECT `id_patologia` FROM `PATOLOGIAS` WHERE `nombre`='$patologia'");
+		$row = $result->fetch_assoc();
+		$patologia = $row['id_patologia'];
+
+		$mensaje= "Actualizado resgistro de Pacientes para: '$nombre'";
+		//A�adimos la etiolog�a vinculada al paciente
+		if($cuadrantes == "" && $comentarios == ""){
+			$sql="INSERT INTO `ETIOLOGIAS` (`etiologia`, `fecha_lesion`, `cuadrantes`, `comentarios`, `id_patologia`, `dni_paciente` ) 
+			VALUES ('$n_etiologia', '$fecha_lesion', NULL, NULL, '$patologia', '$dni_paciente')";
+		}elseif ($cuadrantes != "" && $comentarios == ""){
+			$sql="INSERT INTO `ETIOLOGIAS` (`etiologia`, `fecha_lesion`, `cuadrantes`, `comentarios`, `id_patologia`, `dni_paciente` ) 
+			VALUES ('$n_etiologia', '$fecha_lesion', '$cuadrantes', NULL, '$patologia', '$dni_paciente')";
+		}elseif($cuadrantes == "" && $comentarios != ""){
+			$sql="INSERT INTO `ETIOLOGIAS` (`etiologia`, `fecha_lesion`, `cuadrantes`, `comentarios`, `id_patologia`, `dni_paciente` ) 
+			VALUES ('$n_etiologia', '$fecha_lesion', NULL, '$comentarios', '$patologia', '$dni_paciente')";
+		}else{
+			$sql="INSERT INTO `ETIOLOGIAS` (`etiologia`, `fecha_lesion`, `cuadrantes`, `comentarios`, `id_patologia`, `dni_paciente` ) 
+			VALUES ('$n_etiologia', '$fecha_lesion', '$cuadrantes', '$comentarios', '$patologia', '$dni_paciente')";
+		}
+
+		if (!$conex->query($sql)){
+			$mensaje.= " Error actualizando base de datos Etiologias $dni_paciente $patologia";
+		}else{
+			//VOLVEMOS A MOSTRAR LA INFORMACI�N DEL PACIENTE
+			$sql="SELECT tipo, fecha, simetria, PRUEBAS_PACIENTES.anotaciones, PRUEBAS_PACIENTES.id_prueba
+				FROM ENSAYOS, PRUEBAS_PACIENTES
+				WHERE `dni_paciente`='$dni_paciente' AND ENSAYOS.id_ensayo=PRUEBAS_PACIENTES.id_ensayo
+				ORDER BY fecha DESC
+				";
+			if($result=$conex->query($sql)){
+				// rellenamos array con tabla obtenida de las pruebas
+				//Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])),
+				$x = 0;
+				while ($row = $result->fetch_assoc()){
+					$entrada[$x]=[
+						$row['id_prueba'],
+						$row['tipo'],
+						$row['fecha'],
+						$row['simetria'],
+						$row['anotaciones']
+								];
+					$x++;
+				}
+				$html->assign("entrada",$entrada);
+			}else{
+				$mensaje.=" Error al obtener las pruebas.";
+			}
+
+			$sql="SELECT dni_paciente,id_etiologia, etiologia, fecha_lesion, cuadrantes, comentarios, PATOLOGIAS.nombre
+				FROM ETIOLOGIAS, PATOLOGIAS
+				WHERE `dni_paciente`='$dni_paciente' AND PATOLOGIAS.id_patologia=ETIOLOGIAS.id_patologia
+				ORDER BY fecha_lesion DESC
+				";
+			if($result=$conex->query($sql)){
+				// rellenamos array con tabla obtenida
+				$x = 0;
+				while ($row = $result->fetch_assoc()){
+					$etiologia[$x]=[
+						$row['id_etiologia'],
+						$row['etiologia'],
+						$row['fecha_lesion'],
+						$row['cuadrantes'],
+						$row['comentarios'],
+						$row['nombre']
+								];
+					$x++;
+				}
+				$html->assign("etiologia",$etiologia);
+			}else{
+				$mensaje.=" Error al obtener las etiolog�as.";
+			}
+		}
+	
+		$sql="SELECT * FROM PACIENTES WHERE `dni_paciente`='$dni_paciente'";
+		$result=$conex->query($sql);
+		$row = $result->fetch_assoc();
+		$sujeto = [ $row['dni_paciente'],$row['nombre'],$row['apellidos'],$row['sexo'],$row['edad'],$row['anotaciones']];
+		
+		$html->assign("id_admin",$id_admin);
+		$html->assign("sujeto",$sujeto);
+		//VOLVEMOS A MOSTRAR LA INFORMACI�N DEL PACIENTE
+		
+		$html->assign("mensaje",$mensaje);
+		$html->display("pac_reg.tpl");
+	
+	}else{
+		$sujeto[0]=$dni_paciente;
+		$html->assign("sujeto",$sujeto);
+
+		//Necesitamos las patologias
+		$x=0;
+		$result = $conex->query("SELECT nombre, descripcion FROM `PATOLOGIAS`"); 
+		while ($row = $result->fetch_assoc()){
+			$patologias[$x]=$row['nombre'];
+			$x++;
+		}
+		$html->assign("patologias",$patologias);
+		$html->display("add_eti.tpl");
+	}
+	
+
+}
+else	@header('location:index.php');
+
+?>		
diff --git a/add_gestor.php b/add_gestor.php
new file mode 100644
index 0000000000000000000000000000000000000000..1c1824db6a20edf25b50ca78a13b59a996445698
--- /dev/null
+++ b/add_gestor.php
@@ -0,0 +1,63 @@
+<?php session_start(); 
+require_once("funciones.php");
+require('include.php');
+/*
+* Archivo de control. Añadir nuevo trabajdor
+* Caso de uso: REGISTRAR TRABAJADOR
+*/
+
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+
+	$id_admin=$_GET["variable"]; 
+	// Comprueba que sigue en la sesión
+	$html=new Smarty;
+	
+	
+	
+	// Barra del menú
+	barra();
+	// Fin de barra
+
+	// Descargamos las variables de los formularios:
+	$dni_trabajador = ($_POST["dni_trabajador"]);
+	$nombre = ($_POST["nombre"]);
+	$apellidos = ($_POST["apellidos"]);
+	$nick = ($_POST["login"]);
+	$titulacion = ($_POST["titulacion"]);
+	$permisos = ($_POST["permisos"]);
+	$pass  = sha1(mysqli_real_escape_string($conex, $_POST["pass"]));
+	$passrw= sha1(mysqli_real_escape_string($conex, $_POST["passrw"]));
+
+	if ($dni_trabajador){ //Si hemos pulsado validar al cambiar un registro
+		if ($permisos!=0 && $permisos!=1 && $permisos!=2 && $permisos!=3 && $permisos > $chmod )
+			$mensaje = 'El campo permisos debe ser "1" para permisos de lectura y escritura, y "0" para permisos de solo lectura.';
+		else if ($pass != $passrw) 
+			$mensaje="Las contraseñas no coinciden";
+		else 
+		{
+			// Comprobamos que no se repita login
+			$result = $conex->query("SELECT * FROM TRABAJADORES");
+			while ($row = $result->fetch_assoc()){
+				if ($row['login'] == $nick)
+					$mensaje = "El nick $nick, ya existe";
+				else if ($row['dni_trabajador'] == $dni_trabajador)
+					$mensaje = "El DNI: '$dni_trabajador', ya existe";
+			}
+		}
+		if (!$mensaje)
+		{
+			// Si todos los campos están bien entonces actualizamos el nuevo trabajador/usuario
+			if ($conex->query("INSERT INTO `TRABAJADORES` (`dni_trabajador`, `login`, `nombre`, `apellidos`, `contraseña`, `titulacion`, `permisos`) VALUES ('$dni_trabajador', '$nick', '$nombre', '$apellidos', '$pass', '$titulacion', '$permisos')"))
+				$mensaje= "Actualizado trabajador $nick";
+			else $mensaje= "Error actualizando base de datos";
+			mysqli_close($conex);
+		}
+	}
+	$html->assign("id_admin",$id_admin);
+	$html->assign("mensaje","$mensaje");
+	$html->display("add_gestor.tpl");
+
+}
+else	@header('location:index.php');
+
+?>		
diff --git a/add_pac.php b/add_pac.php
new file mode 100644
index 0000000000000000000000000000000000000000..652734960f795fc11ba266dbdc96ae9d8993c2c6
--- /dev/null
+++ b/add_pac.php
@@ -0,0 +1,120 @@
+<?php session_start(); 
+require_once("funciones.php");
+require('include.php');
+
+/*
+* Archivo de control. A�adir paciente, etiolog�a y patolog�a asociada
+* Caso de uso: REGISTRAR PACIENTE <<include>> A�ADIR ETIOLOG�A
+*/
+
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+
+	$id_admin=$_GET["variable"];
+	$html=new Smarty;
+	
+	// Barra
+	barra();
+	// Fin de barra
+
+	//Recogemos los datos del formulario
+	$dni_paciente = ($_POST["dni"]);
+	$nombre = ($_POST["nombre"]);
+	$apellidos = ($_POST["apellidos"]);
+	$edad = ($_POST["edad"]);
+	$sexo = ($_POST["sexo"]);
+	$anotaciones = ($_POST["anotaciones"]);
+	$etiologia = ($_POST["etiologia"]);
+	$fecha_lesion =($_POST["fecha_lesion"]);
+	$cuadrantes = ($_POST["cuadrantes"]);
+	$comentarios = ($_POST["comentarios"]);
+	$patologia = ($_POST["patologia"]);
+	$mensaje = "";
+
+
+	// Valores para el formulario:
+		// Tipo de ensayos
+		// Nombre
+		// Apellidos
+		// Edad
+		// Sexo
+
+
+	//Mostramos una tabla con todos los sujetos para marcar el que queremos
+	if($dni_paciente != ""){
+		if ($result = $conex->query("SELECT * FROM `PACIENTES` ORDER BY `nombre` ASC")){
+			while ($row = $result->fetch_assoc()) {
+				if($row['dni_paciente'] == $dni_paciente){
+					$mensaje="El DNI: '$dni_paciente', ya existe.";
+					$dni_paciente = "";
+				}
+			}
+			if (dni_paciente != "") {//Agregacion del paciente
+				if($anotaciones == ""){
+					$sql="INSERT INTO `PACIENTES` (`dni_paciente`, `nombre`, `apellidos`, `edad`, `sexo`, `anotaciones`, `dni_trabajador`) 
+					VALUES ('$dni_paciente', '$nombre', '$apellidos', '$edad', '$sexo', NULL, '$id_admin')";
+				}else{
+					$sql="INSERT INTO `PACIENTES` (`dni_paciente`, `nombre`, `apellidos`, `edad`, `sexo`, `anotaciones`, `dni_trabajador`) 
+					VALUES ('$dni_paciente', '$nombre', '$apellidos', '$edad', '$sexo', '$anotaciones', '$id_admin')";
+				}
+
+				$result = $conex->query("SELECT `id_patologia` FROM `PATOLOGIAS` WHERE `nombre`='$patologia'");
+				$row = $result->fetch_assoc();
+				$patologia = $row['id_patologia'];
+
+				if ($conex->query($sql)){
+					$mensaje= "Actualizado resgistro de Pacientes para: '$nombre'";
+					//A�adimos la etiolog�a vinculada al paciente
+					if($cuadrantes == "" && $comentarios == ""){
+						$sql="INSERT INTO `ETIOLOGIAS` (`etiologia`, `fecha_lesion`, `cuadrantes`, `comentarios`, `id_patologia`, `dni_paciente` ) 
+						VALUES ('$etiologia', '$fecha_lesion', NULL, NULL, '$patologia', '$dni_paciente')";
+					}elseif ($cuadrantes != "" && $comentarios == ""){
+						$sql="INSERT INTO `ETIOLOGIAS` (`etiologia`, `fecha_lesion`, `cuadrantes`, `comentarios`, `id_patologia`, `dni_paciente` ) 
+						VALUES ('$etiologia', '$fecha_lesion', '$cuadrantes', NULL, '$patologia', '$dni_paciente')";
+					}elseif($cuadrantes == "" && $comentarios != ""){
+						$sql="INSERT INTO `ETIOLOGIAS` (`etiologia`, `fecha_lesion`, `cuadrantes`, `comentarios`, `id_patologia`, `dni_paciente` ) 
+						VALUES ('$etiologia', '$fecha_lesion', NULL, '$comentarios', '$patologia', '$dni_paciente')";
+					}else{
+						$sql="INSERT INTO `ETIOLOGIAS` (`etiologia`, `fecha_lesion`, `cuadrantes`, `comentarios`, `id_patologia`, `dni_paciente` ) 
+						VALUES ('$etiologia', '$fecha_lesion', '$cuadrantes', '$comentarios', '$patologia', '$dni_paciente')";
+					}
+					if (!$conex->query($sql)){
+						$mensaje= "Error actualizando base de datos Etiologias";
+					}
+
+
+				}else {
+					$mensaje= "Error actualizando base de datos";
+					$sujeto = array($dni_paciente,$nombre,$apellidos,$sexo,$edad,$anotaciones);
+				}
+				
+			}
+
+		} else {
+		$mensaje= "Ha habido un error inesperado.";
+		}
+	}else{
+		$mensaje="Registro de un nuevo paciente";
+		$sujeto = array("",$nombre,$apellidos,$sexo,$edad,$anotaciones);
+		
+	}
+
+	//Necesitamos las patologias
+		$x=0;
+		$result = $conex->query("SELECT nombre, descripcion FROM `PATOLOGIAS`"); 
+		while ($row = $result->fetch_assoc()){
+			$patologias[$x]=$row['nombre'];
+			$x++;
+		}
+
+		$html->assign("id_admin",$id_admin);
+		$html->assign("patologias",$patologias);
+		$html->assign("mensaje",$mensaje);
+		$html->assign("sujeto",$sujeto);
+		$html->display("add_pac.tpl");
+	
+
+
+}
+else	@header('location:index.php');
+
+?>		
diff --git a/add_reg.php b/add_reg.php
new file mode 100644
index 0000000000000000000000000000000000000000..6e44b66854d9971d8a7412a9ec25ec34d5630983
--- /dev/null
+++ b/add_reg.php
@@ -0,0 +1,78 @@
+<?php session_start(); 
+require_once("funciones.php");
+require('include.php');
+/*
+* Archivo de control. Realizar una prueba
+* Inicio del caso de uso: REALIZAR UNA PRUEBA
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+
+	$id_admin=$_GET["variable"]; 
+	$dni = $_GET['id'];
+	$id_prueba = $_GET['id_prueba'];
+	$accion = $_GET['accion'];
+
+	$html=new Smarty;
+
+	// Barra
+	barra();
+	// Fin de barra
+
+	//Si hemos salido borramos la �ltima prueba creada
+	if ($accion==1 && $id_prueba!=""){
+		$sql="DELETE FROM `PRUEBAS_PACIENTES` WHERE `id_prueba`='$id_prueba'";
+		if ($conex->query($sql)){
+			$mensaje ="Prueba anterior borrada correctamente";
+		}else{
+			$mensaje ="Error al borrar la prueba";
+		}
+	}
+
+	// Valores para el formulario:
+		// Tipo de ensayos
+		// Nombre
+		// Apellidos
+		// Edad
+		// Sexo
+
+	//Necesitamos tipos de ensayos 
+	$x=0;
+	$result = $conex->query("SELECT tipo FROM `ENSAYOS`"); 
+	while ($row = $result->fetch_assoc()){
+		$entrada[$x]=$row['tipo'];
+		$x++;
+	}
+	// asignamos variable a template
+	$html->assign("ensayos",$entrada);
+
+	//Mostramos una tabla con todos los sujetos para marcar el que queremos
+	$x=0;
+	if ($result = $conex->query("SELECT * FROM `PACIENTES` ORDER BY `nombre` ASC")){
+		while ($row = $result->fetch_assoc()) {
+			$date = date_create(date("Y-m-d"))->diff(date_create($row['edad']));
+			if($date->y != 0){
+				$date = $date->y . " a&ntildeos";
+			}elseif($date->m != 0){
+				$date = $date->m . " meses";
+			}else{
+				$date = $date->d . " d&iacuteas";
+			}
+			
+			$campos[$x] = array($row['dni_paciente'],$row['nombre'],$row['apellidos'],$row['sexo'],$date,$row['anotaciones'],$row['edad']);
+			if ($dni == $row['dni_paciente']) {$sujeto = array($row['dni_paciente'],$row['nombre'],$row['apellidos'],$row['sexo'],$row['edad'],$row['anotaciones']);}
+			$x++;
+		}
+	} else $mensaje= "Ha habido un error inesperado.";
+
+	$html->assign("id_admin",$id_admin);
+	$html->assign("mensaje",$mensaje);
+	$html->assign("sujeto",$sujeto);
+	$html->assign("campos",$campos);
+
+
+	$html->display("add_reg.tpl");
+
+}
+else	@header('location:index.php');
+
+?>		
diff --git a/add_reg_val.php b/add_reg_val.php
new file mode 100644
index 0000000000000000000000000000000000000000..fe691e441428380f31921667eabb9e92e8047045
--- /dev/null
+++ b/add_reg_val.php
@@ -0,0 +1,95 @@
+<?php session_start(); 
+require_once("funciones.php");
+require('include.php');
+/*
+* Archivo de control. Realizar una prueba a un paciente
+* Caso de uso: REALIZAR UNA PRUEBA
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+
+	$html=new Smarty;
+
+	// Barra
+	barra();
+	// Fin de barra
+
+	$id_admin=	$_GET["variable"];
+	$ensayo= 	$_POST['ensayo'];
+	$name= 	$_POST['nombre'];
+	$apellidos= $_POST['apellidos'];
+	$edad=		$_POST['edad'];
+	$sexo=		$_POST['sexo'];
+	$simetria=	$_POST['simetria'];
+	$anotaciones=$_POST['anotaciones'];
+	$dni=		$_POST['dni_paciente'];
+
+	if ($result = $conex->query("SELECT count(`dni_paciente`) as num, `dni_paciente` FROM `PACIENTES` WHERE `dni_paciente`= '$dni'")){
+		$row = $result->fetch_assoc();
+		if($row['num'] == 1 && $row['dni_paciente'] == $dni){
+			// recuperamos el id_ensayo con el ensayo
+			$result = $conex->query("SELECT id_ensayo, coloc_sensores, duracion, repeticiones FROM `ENSAYOS` WHERE `tipo` = '$ensayo'"); 
+			$row = $result->fetch_assoc();
+			$id_ensayo=$row['id_ensayo'];
+			$coloc_sensores=nl2br($row['coloc_sensores']);
+			$duracion=$row['duracion'];
+			$repeticiones=$row['repeticiones'];
+			if ($duracion == 10) $getESP = 'A';
+			if ($duracion == 30) $getESP = 'B';
+			if ($duracion == 45) $getESP = 'C';
+			if ($duracion == 60) $getESP = 'D';
+			if ($duracion == 75) $getESP = 'E';
+			if ($duracion == 90) $getESP = 'F';
+	
+
+			//Hacemos el insert en la tabla de las pruebas de un paciente
+			if($simetria == "" && $anotaciones == ""){//Simetria y anotaciones vacias
+				$sql = "INSERT INTO `PRUEBAS_PACIENTES` (`id_ensayo`, `dni_paciente`, `dni_trabajador`, `fecha`, `simetria`, `anotaciones`)
+							VALUES ('$id_ensayo', '$dni' , '$id_admin', NOW(), NULL, NULL)";
+			}elseif ($simetria != "" && $anotaciones == ""){//Anotaciones vacias
+				$sql = "INSERT INTO `PRUEBAS_PACIENTES` (`id_ensayo`, `dni_paciente`, `dni_trabajador`, `fecha`, `simetria`, `anotaciones`)
+							VALUES ('$id_ensayo', '$dni' , '$id_admin', NOW(), '$simetria', NULL)";
+			}elseif ($simetria == "" && $anotaciones != ""){//Simetria vac�a
+				$sql = "INSERT INTO `PRUEBAS_PACIENTES` (`id_ensayo`, `dni_paciente`, `dni_trabajador`, `fecha`, `simetria`, `anotaciones`)
+							VALUES ('$id_ensayo', '$dni' , '$id_admin', NOW(), NULL, '$anotaciones')";
+			}else{//Ning�n campo vac�o
+				$sql = "INSERT INTO `PRUEBAS_PACIENTES` (`id_ensayo`, `dni_paciente`, `dni_trabajador`, `fecha`, `simetria`, `anotaciones`)
+							VALUES ('$id_ensayo', '$dni' , '$id_admin', NOW(), '$simetria', '$anotaciones')";
+			}
+			if (!$conex->query($sql))
+				{
+					$mensaje.="Error: \n". $conex->error. "DNI: $dni";
+				}
+			else {
+				$mensaje.= "Actualizada prueba ";
+				$result = $conex->query("SELECT max(`id_prueba`) as num FROM `PRUEBAS_PACIENTES` WHERE `dni_paciente`= '$dni'");
+				$row = $result->fetch_assoc();
+				$id_prueba = $row["num"];
+			}
+			
+			$imagen = imagen('media/images/ensayo/',$ensayo); // Aqu� ejecutamos la funci�n para obtener la imagen y en caso de no existir poner una alternativa (por definir)
+			
+			$html->assign("imagen",$imagen);
+			$html->assign("segundos",$duracion);
+			$html->assign("coloc_sensores",$coloc_sensores);
+			$html->assign("get",$getESP);
+			$html->assign("repeticiones",$repeticiones);
+			$html->assign("ensayo",$ensayo);
+			$html->assign("id_admin",$id_admin);
+			$html->assign("mensaje",$mensaje);
+			$html->assign("id_prueba",$id_prueba);
+			$html->assign("dni_paciente",$dni);
+			$html->display("add_reg_val.tpl");
+
+		}else{
+			$mensaje = "Error con el paciente DNI: $dni";
+			$html->assign("id_admin",$id_admin);
+			$html->assign("mensaje",$mensaje);
+			$html->display("add_reg.tpl");
+
+		}
+	}
+
+}
+else	@header('location:index.php');
+
+?>		
diff --git a/bootstrap.php b/bootstrap.php
new file mode 100644
index 0000000000000000000000000000000000000000..2c830468eddd46f99db9902c6416897e2aa4973e
--- /dev/null
+++ b/bootstrap.php
@@ -0,0 +1,16 @@
+<?php
+/**
+ * This file is part of the Smarty package.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+/**
+ * Load and register Smarty Autoloader
+ */
+if (!class_exists('Smarty_Autoloader')) {
+    include dirname(__FILE__) . '/Autoloader.php';
+}
+Smarty_Autoloader::register(true);
diff --git a/borrar_prueba.php b/borrar_prueba.php
new file mode 100644
index 0000000000000000000000000000000000000000..376d391a5a25665af7da75d52be5eed31a985a14
--- /dev/null
+++ b/borrar_prueba.php
@@ -0,0 +1,116 @@
+<?php session_start(); 
+require_once("funciones.php");
+require('include.php');
+/*
+* Archivo de control. Gestionar ensayos
+* Caso de uso: CREAR ENSAYO
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+	
+	$id_admin=$_GET["variable"]; 
+	$id_prueba =$_GET["id"];
+
+	$html=new Smarty;
+	
+	
+	// Barra
+	barra();
+	// Fin de barra
+
+	// Valores para el formulario:
+		// Id ensayo
+		// Tipo
+		// Colocación sensores
+		// Duración
+		// Repeticiones
+		// Comentarios
+		// Fecha creación
+	
+	if($id_prueba!=""){//eliminar un ensayo
+		if ($result = $conex->query("SELECT `dni_paciente` FROM `PRUEBAS_PACIENTES` WHERE `id_prueba`='$id_prueba'")){
+				$row = $result->fetch_assoc();
+				$id_paciente = $row['dni_paciente'];
+		}
+		else {
+			$mensaje = "Error inesperado en captura del identificador del paciente";
+		}
+
+		$sql="DELETE FROM `PRUEBAS_PACIENTES` WHERE `id_prueba`='$id_prueba'";
+		$id_ensayo = "";
+		if ($conex->query($sql)){
+			$mensaje ="Prueba borrada con éxito";
+		}else{
+			$mensaje ="Error al borrar la prueba";
+		}
+
+
+		//Obtenemos las pruebas del paciente
+		$sql="SELECT tipo, fecha, simetria, PRUEBAS_PACIENTES.anotaciones, PRUEBAS_PACIENTES.id_prueba
+		FROM ENSAYOS, PRUEBAS_PACIENTES
+		WHERE `dni_paciente`='$id_paciente' AND ENSAYOS.id_ensayo=PRUEBAS_PACIENTES.id_ensayo
+		ORDER BY fecha DESC
+		 ";
+		if($result=$conex->query($sql)){
+			// rellenamos array con tabla obtenida de las pruebas
+			//Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])),
+			$x = 0;
+			while ($row = $result->fetch_assoc()){
+				$entrada[$x]=[
+					$row['id_prueba'],
+					$row['tipo'],
+					$row['fecha'],
+					$row['simetria'],
+					$row['anotaciones']
+							];
+				$x++;
+			}
+			$html->assign("entrada",$entrada);
+		}
+
+		//Obtenemos las etiologias del paciente
+		$sql="SELECT dni_paciente,id_etiologia, etiologia, fecha_lesion, cuadrantes, comentarios, PATOLOGIAS.nombre
+			FROM ETIOLOGIAS, PATOLOGIAS
+			WHERE `dni_paciente`='$id_paciente' AND PATOLOGIAS.id_patologia=ETIOLOGIAS.id_patologia
+			ORDER BY fecha_lesion DESC
+		 ";
+		if($result=$conex->query($sql)){
+			// rellenamos array con tabla obtenida
+			//Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])),
+			$x = 0;
+			while ($row = $result->fetch_assoc()){
+				$etiologia[$x]=[
+					$row['id_etiologia'],
+					$row['etiologia'],
+					$row['fecha_lesion'],
+					$row['cuadrantes'],
+					$row['comentarios'],
+					$row['nombre']
+							];
+				$x++;
+			}
+			$html->assign("etiologia",$etiologia);
+		}
+
+		//Obtenemos los datos del paciente
+		$sql="SELECT * FROM PACIENTES WHERE `dni_paciente`='$id_paciente'";
+		$result=$conex->query($sql);
+		$row = $result->fetch_assoc();
+		$sujeto = [ $row['dni_paciente'],$row['nombre'],$row['apellidos'],$row['sexo'],$row['edad'],$row['anotaciones']];
+		$html->assign("sujeto",$sujeto);
+
+	}else{
+		$mensaje = "Error inesperado en captura del identificador de la prueba";
+	}
+
+	
+
+
+
+	$html->assign("id_admin",$id_admin);
+	$html->assign("mensaje",$mensaje);
+	$html->display("pac_reg.tpl");
+
+}
+else	@header('location:index.php');
+
+?>		
diff --git a/borrar_prueba_sujeto.php b/borrar_prueba_sujeto.php
new file mode 100644
index 0000000000000000000000000000000000000000..0af94bcf6dd5ce41559b92cd0df0ffacc790c64d
--- /dev/null
+++ b/borrar_prueba_sujeto.php
@@ -0,0 +1,89 @@
+<?php session_start(); 
+require_once("funciones.php");
+require('include.php');
+/*
+* Archivo de control. Gestionar ensayos
+* Caso de uso: CREAR ENSAYO
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+	
+	$id_admin=$_GET["variable"]; 
+	$id_prueba_sujeto =$_GET["id"];
+
+	$html=new Smarty;
+	
+	
+	// Barra
+	barra();
+	// Fin de barra
+
+	// Valores para el formulario:
+		// Id ensayo
+		// Tipo
+		// Colocación sensores
+		// Duración
+		// Repeticiones
+		// Comentarios
+		// Fecha creación
+	
+	if($id_prueba_sujeto!=""){//eliminar una prueba
+		if ($result = $conex->query("SELECT `dni_paciente` FROM `PRUEBAS_PACIENTES` WHERE `id_prueba`='$id_prueba_sujeto'")){
+				$row = $result->fetch_assoc();
+				$id_paciente = $row['dni_paciente'];
+		}
+		else {
+			$mensaje = "Error inesperado en captura del identificador del paciente";
+		}
+
+		$sql="DELETE FROM `PRUEBAS_SUJETOS` WHERE `id_prueba_sujeto`='$id_prueba_sujeto'";
+		$id_ensayo = "";
+		if ($conex->query($sql)){
+			$mensaje ="Prueba borrada con éxito";
+		}else{
+			$mensaje ="Error al borrar la prueba";
+		}
+
+		$sql="SELECT SUJETOS.edad, SUJETOS.sexo, tipo, fecha, simetria, PRUEBAS_SUJETOS.anotaciones, PRUEBAS_SUJETOS.id_prueba_sujeto
+			FROM ENSAYOS, PRUEBAS_SUJETOS, SUJETOS
+			WHERE ENSAYOS.id_ensayo=PRUEBAS_SUJETOS.id_ensayo AND SUJETOS.id_sujeto = PRUEBAS_SUJETOS.id_sujeto
+			ORDER BY fecha DESC
+		 ";
+		if($result=$conex->query($sql)){
+			// rellenamos array con tabla obtenida de las pruebas
+			//Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])),
+			$x = 0;
+			while ($row = $result->fetch_assoc()){
+				$entrada[$x]=[
+					$row['id_prueba_sujeto'],
+					$row['tipo'],
+					$row['fecha'],
+					$row['sexo'],
+					$row['edad'],
+					$row['simetria'],
+					$row['anotaciones']
+							];
+				$x++;
+			}
+			$html->assign("entrada",$entrada);
+		}else{
+			$mensaje="Error al capturar las pruebas sobre los sujetos";
+		}
+		$html->assign("id_admin",$id_admin);
+		$html->display("ver_pruebas_sujetos.tpl");
+
+	}else{
+		$mensaje = "Error inesperado en captura del identificador de la prueba";
+		$html->assign("id_admin",$id_admin);
+		$html->assign("mensaje",$mensaje);
+		$html->display("pac_reg.tpl");
+	}
+
+	
+
+
+
+
+}
+else	@header('location:index.php');
+
+?>		
diff --git a/css/font-awesome.css b/css/font-awesome.css
new file mode 100644
index 0000000000000000000000000000000000000000..ee906a8196d0fbd581c27a9d5615db4c250860f2
--- /dev/null
+++ b/css/font-awesome.css
@@ -0,0 +1,2337 @@
+/*!
+ *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+/* FONT PATH
+ * -------------------------- */
+@font-face {
+  font-family: 'FontAwesome';
+  src: url('../fonts/fontawesome-webfont.eot?v=4.7.0');
+  src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');
+  font-weight: normal;
+  font-style: normal;
+}
+.fa {
+  display: inline-block;
+  font: normal normal normal 14px/1 FontAwesome;
+  font-size: inherit;
+  text-rendering: auto;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+/* makes the font 33% larger relative to the icon container */
+.fa-lg {
+  font-size: 1.33333333em;
+  line-height: 0.75em;
+  vertical-align: -15%;
+}
+.fa-2x {
+  font-size: 2em;
+}
+.fa-3x {
+  font-size: 3em;
+}
+.fa-4x {
+  font-size: 4em;
+}
+.fa-5x {
+  font-size: 5em;
+}
+.fa-fw {
+  width: 1.28571429em;
+  text-align: center;
+}
+.fa-ul {
+  padding-left: 0;
+  margin-left: 2.14285714em;
+  list-style-type: none;
+}
+.fa-ul > li {
+  position: relative;
+}
+.fa-li {
+  position: absolute;
+  left: -2.14285714em;
+  width: 2.14285714em;
+  top: 0.14285714em;
+  text-align: center;
+}
+.fa-li.fa-lg {
+  left: -1.85714286em;
+}
+.fa-border {
+  padding: .2em .25em .15em;
+  border: solid 0.08em #eeeeee;
+  border-radius: .1em;
+}
+.fa-pull-left {
+  float: left;
+}
+.fa-pull-right {
+  float: right;
+}
+.fa.fa-pull-left {
+  margin-right: .3em;
+}
+.fa.fa-pull-right {
+  margin-left: .3em;
+}
+/* Deprecated as of 4.4.0 */
+.pull-right {
+  float: right;
+}
+.pull-left {
+  float: left;
+}
+.fa.pull-left {
+  margin-right: .3em;
+}
+.fa.pull-right {
+  margin-left: .3em;
+}
+.fa-spin {
+  -webkit-animation: fa-spin 2s infinite linear;
+  animation: fa-spin 2s infinite linear;
+}
+.fa-pulse {
+  -webkit-animation: fa-spin 1s infinite steps(8);
+  animation: fa-spin 1s infinite steps(8);
+}
+@-webkit-keyframes fa-spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(359deg);
+    transform: rotate(359deg);
+  }
+}
+@keyframes fa-spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(359deg);
+    transform: rotate(359deg);
+  }
+}
+.fa-rotate-90 {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+.fa-rotate-180 {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
+  -webkit-transform: rotate(180deg);
+  -ms-transform: rotate(180deg);
+  transform: rotate(180deg);
+}
+.fa-rotate-270 {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
+  -webkit-transform: rotate(270deg);
+  -ms-transform: rotate(270deg);
+  transform: rotate(270deg);
+}
+.fa-flip-horizontal {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
+  -webkit-transform: scale(-1, 1);
+  -ms-transform: scale(-1, 1);
+  transform: scale(-1, 1);
+}
+.fa-flip-vertical {
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
+  -webkit-transform: scale(1, -1);
+  -ms-transform: scale(1, -1);
+  transform: scale(1, -1);
+}
+:root .fa-rotate-90,
+:root .fa-rotate-180,
+:root .fa-rotate-270,
+:root .fa-flip-horizontal,
+:root .fa-flip-vertical {
+  filter: none;
+}
+.fa-stack {
+  position: relative;
+  display: inline-block;
+  width: 2em;
+  height: 2em;
+  line-height: 2em;
+  vertical-align: middle;
+}
+.fa-stack-1x,
+.fa-stack-2x {
+  position: absolute;
+  left: 0;
+  width: 100%;
+  text-align: center;
+}
+.fa-stack-1x {
+  line-height: inherit;
+}
+.fa-stack-2x {
+  font-size: 2em;
+}
+.fa-inverse {
+  color: #ffffff;
+}
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+   readers do not read off random characters that represent icons */
+.fa-glass:before {
+  content: "\f000";
+}
+.fa-music:before {
+  content: "\f001";
+}
+.fa-search:before {
+  content: "\f002";
+}
+.fa-envelope-o:before {
+  content: "\f003";
+}
+.fa-heart:before {
+  content: "\f004";
+}
+.fa-star:before {
+  content: "\f005";
+}
+.fa-star-o:before {
+  content: "\f006";
+}
+.fa-user:before {
+  content: "\f007";
+}
+.fa-film:before {
+  content: "\f008";
+}
+.fa-th-large:before {
+  content: "\f009";
+}
+.fa-th:before {
+  content: "\f00a";
+}
+.fa-th-list:before {
+  content: "\f00b";
+}
+.fa-check:before {
+  content: "\f00c";
+}
+.fa-remove:before,
+.fa-close:before,
+.fa-times:before {
+  content: "\f00d";
+}
+.fa-search-plus:before {
+  content: "\f00e";
+}
+.fa-search-minus:before {
+  content: "\f010";
+}
+.fa-power-off:before {
+  content: "\f011";
+}
+.fa-signal:before {
+  content: "\f012";
+}
+.fa-gear:before,
+.fa-cog:before {
+  content: "\f013";
+}
+.fa-trash-o:before {
+  content: "\f014";
+}
+.fa-home:before {
+  content: "\f015";
+}
+.fa-file-o:before {
+  content: "\f016";
+}
+.fa-clock-o:before {
+  content: "\f017";
+}
+.fa-road:before {
+  content: "\f018";
+}
+.fa-download:before {
+  content: "\f019";
+}
+.fa-arrow-circle-o-down:before {
+  content: "\f01a";
+}
+.fa-arrow-circle-o-up:before {
+  content: "\f01b";
+}
+.fa-inbox:before {
+  content: "\f01c";
+}
+.fa-play-circle-o:before {
+  content: "\f01d";
+}
+.fa-rotate-right:before,
+.fa-repeat:before {
+  content: "\f01e";
+}
+.fa-refresh:before {
+  content: "\f021";
+}
+.fa-list-alt:before {
+  content: "\f022";
+}
+.fa-lock:before {
+  content: "\f023";
+}
+.fa-flag:before {
+  content: "\f024";
+}
+.fa-headphones:before {
+  content: "\f025";
+}
+.fa-volume-off:before {
+  content: "\f026";
+}
+.fa-volume-down:before {
+  content: "\f027";
+}
+.fa-volume-up:before {
+  content: "\f028";
+}
+.fa-qrcode:before {
+  content: "\f029";
+}
+.fa-barcode:before {
+  content: "\f02a";
+}
+.fa-tag:before {
+  content: "\f02b";
+}
+.fa-tags:before {
+  content: "\f02c";
+}
+.fa-book:before {
+  content: "\f02d";
+}
+.fa-bookmark:before {
+  content: "\f02e";
+}
+.fa-print:before {
+  content: "\f02f";
+}
+.fa-camera:before {
+  content: "\f030";
+}
+.fa-font:before {
+  content: "\f031";
+}
+.fa-bold:before {
+  content: "\f032";
+}
+.fa-italic:before {
+  content: "\f033";
+}
+.fa-text-height:before {
+  content: "\f034";
+}
+.fa-text-width:before {
+  content: "\f035";
+}
+.fa-align-left:before {
+  content: "\f036";
+}
+.fa-align-center:before {
+  content: "\f037";
+}
+.fa-align-right:before {
+  content: "\f038";
+}
+.fa-align-justify:before {
+  content: "\f039";
+}
+.fa-list:before {
+  content: "\f03a";
+}
+.fa-dedent:before,
+.fa-outdent:before {
+  content: "\f03b";
+}
+.fa-indent:before {
+  content: "\f03c";
+}
+.fa-video-camera:before {
+  content: "\f03d";
+}
+.fa-photo:before,
+.fa-image:before,
+.fa-picture-o:before {
+  content: "\f03e";
+}
+.fa-pencil:before {
+  content: "\f040";
+}
+.fa-map-marker:before {
+  content: "\f041";
+}
+.fa-adjust:before {
+  content: "\f042";
+}
+.fa-tint:before {
+  content: "\f043";
+}
+.fa-edit:before,
+.fa-pencil-square-o:before {
+  content: "\f044";
+}
+.fa-share-square-o:before {
+  content: "\f045";
+}
+.fa-check-square-o:before {
+  content: "\f046";
+}
+.fa-arrows:before {
+  content: "\f047";
+}
+.fa-step-backward:before {
+  content: "\f048";
+}
+.fa-fast-backward:before {
+  content: "\f049";
+}
+.fa-backward:before {
+  content: "\f04a";
+}
+.fa-play:before {
+  content: "\f04b";
+}
+.fa-pause:before {
+  content: "\f04c";
+}
+.fa-stop:before {
+  content: "\f04d";
+}
+.fa-forward:before {
+  content: "\f04e";
+}
+.fa-fast-forward:before {
+  content: "\f050";
+}
+.fa-step-forward:before {
+  content: "\f051";
+}
+.fa-eject:before {
+  content: "\f052";
+}
+.fa-chevron-left:before {
+  content: "\f053";
+}
+.fa-chevron-right:before {
+  content: "\f054";
+}
+.fa-plus-circle:before {
+  content: "\f055";
+}
+.fa-minus-circle:before {
+  content: "\f056";
+}
+.fa-times-circle:before {
+  content: "\f057";
+}
+.fa-check-circle:before {
+  content: "\f058";
+}
+.fa-question-circle:before {
+  content: "\f059";
+}
+.fa-info-circle:before {
+  content: "\f05a";
+}
+.fa-crosshairs:before {
+  content: "\f05b";
+}
+.fa-times-circle-o:before {
+  content: "\f05c";
+}
+.fa-check-circle-o:before {
+  content: "\f05d";
+}
+.fa-ban:before {
+  content: "\f05e";
+}
+.fa-arrow-left:before {
+  content: "\f060";
+}
+.fa-arrow-right:before {
+  content: "\f061";
+}
+.fa-arrow-up:before {
+  content: "\f062";
+}
+.fa-arrow-down:before {
+  content: "\f063";
+}
+.fa-mail-forward:before,
+.fa-share:before {
+  content: "\f064";
+}
+.fa-expand:before {
+  content: "\f065";
+}
+.fa-compress:before {
+  content: "\f066";
+}
+.fa-plus:before {
+  content: "\f067";
+}
+.fa-minus:before {
+  content: "\f068";
+}
+.fa-asterisk:before {
+  content: "\f069";
+}
+.fa-exclamation-circle:before {
+  content: "\f06a";
+}
+.fa-gift:before {
+  content: "\f06b";
+}
+.fa-leaf:before {
+  content: "\f06c";
+}
+.fa-fire:before {
+  content: "\f06d";
+}
+.fa-eye:before {
+  content: "\f06e";
+}
+.fa-eye-slash:before {
+  content: "\f070";
+}
+.fa-warning:before,
+.fa-exclamation-triangle:before {
+  content: "\f071";
+}
+.fa-plane:before {
+  content: "\f072";
+}
+.fa-calendar:before {
+  content: "\f073";
+}
+.fa-random:before {
+  content: "\f074";
+}
+.fa-comment:before {
+  content: "\f075";
+}
+.fa-magnet:before {
+  content: "\f076";
+}
+.fa-chevron-up:before {
+  content: "\f077";
+}
+.fa-chevron-down:before {
+  content: "\f078";
+}
+.fa-retweet:before {
+  content: "\f079";
+}
+.fa-shopping-cart:before {
+  content: "\f07a";
+}
+.fa-folder:before {
+  content: "\f07b";
+}
+.fa-folder-open:before {
+  content: "\f07c";
+}
+.fa-arrows-v:before {
+  content: "\f07d";
+}
+.fa-arrows-h:before {
+  content: "\f07e";
+}
+.fa-bar-chart-o:before,
+.fa-bar-chart:before {
+  content: "\f080";
+}
+.fa-twitter-square:before {
+  content: "\f081";
+}
+.fa-facebook-square:before {
+  content: "\f082";
+}
+.fa-camera-retro:before {
+  content: "\f083";
+}
+.fa-key:before {
+  content: "\f084";
+}
+.fa-gears:before,
+.fa-cogs:before {
+  content: "\f085";
+}
+.fa-comments:before {
+  content: "\f086";
+}
+.fa-thumbs-o-up:before {
+  content: "\f087";
+}
+.fa-thumbs-o-down:before {
+  content: "\f088";
+}
+.fa-star-half:before {
+  content: "\f089";
+}
+.fa-heart-o:before {
+  content: "\f08a";
+}
+.fa-sign-out:before {
+  content: "\f08b";
+}
+.fa-linkedin-square:before {
+  content: "\f08c";
+}
+.fa-thumb-tack:before {
+  content: "\f08d";
+}
+.fa-external-link:before {
+  content: "\f08e";
+}
+.fa-sign-in:before {
+  content: "\f090";
+}
+.fa-trophy:before {
+  content: "\f091";
+}
+.fa-github-square:before {
+  content: "\f092";
+}
+.fa-upload:before {
+  content: "\f093";
+}
+.fa-lemon-o:before {
+  content: "\f094";
+}
+.fa-phone:before {
+  content: "\f095";
+}
+.fa-square-o:before {
+  content: "\f096";
+}
+.fa-bookmark-o:before {
+  content: "\f097";
+}
+.fa-phone-square:before {
+  content: "\f098";
+}
+.fa-twitter:before {
+  content: "\f099";
+}
+.fa-facebook-f:before,
+.fa-facebook:before {
+  content: "\f09a";
+}
+.fa-github:before {
+  content: "\f09b";
+}
+.fa-unlock:before {
+  content: "\f09c";
+}
+.fa-credit-card:before {
+  content: "\f09d";
+}
+.fa-feed:before,
+.fa-rss:before {
+  content: "\f09e";
+}
+.fa-hdd-o:before {
+  content: "\f0a0";
+}
+.fa-bullhorn:before {
+  content: "\f0a1";
+}
+.fa-bell:before {
+  content: "\f0f3";
+}
+.fa-certificate:before {
+  content: "\f0a3";
+}
+.fa-hand-o-right:before {
+  content: "\f0a4";
+}
+.fa-hand-o-left:before {
+  content: "\f0a5";
+}
+.fa-hand-o-up:before {
+  content: "\f0a6";
+}
+.fa-hand-o-down:before {
+  content: "\f0a7";
+}
+.fa-arrow-circle-left:before {
+  content: "\f0a8";
+}
+.fa-arrow-circle-right:before {
+  content: "\f0a9";
+}
+.fa-arrow-circle-up:before {
+  content: "\f0aa";
+}
+.fa-arrow-circle-down:before {
+  content: "\f0ab";
+}
+.fa-globe:before {
+  content: "\f0ac";
+}
+.fa-wrench:before {
+  content: "\f0ad";
+}
+.fa-tasks:before {
+  content: "\f0ae";
+}
+.fa-filter:before {
+  content: "\f0b0";
+}
+.fa-briefcase:before {
+  content: "\f0b1";
+}
+.fa-arrows-alt:before {
+  content: "\f0b2";
+}
+.fa-group:before,
+.fa-users:before {
+  content: "\f0c0";
+}
+.fa-chain:before,
+.fa-link:before {
+  content: "\f0c1";
+}
+.fa-cloud:before {
+  content: "\f0c2";
+}
+.fa-flask:before {
+  content: "\f0c3";
+}
+.fa-cut:before,
+.fa-scissors:before {
+  content: "\f0c4";
+}
+.fa-copy:before,
+.fa-files-o:before {
+  content: "\f0c5";
+}
+.fa-paperclip:before {
+  content: "\f0c6";
+}
+.fa-save:before,
+.fa-floppy-o:before {
+  content: "\f0c7";
+}
+.fa-square:before {
+  content: "\f0c8";
+}
+.fa-navicon:before,
+.fa-reorder:before,
+.fa-bars:before {
+  content: "\f0c9";
+}
+.fa-list-ul:before {
+  content: "\f0ca";
+}
+.fa-list-ol:before {
+  content: "\f0cb";
+}
+.fa-strikethrough:before {
+  content: "\f0cc";
+}
+.fa-underline:before {
+  content: "\f0cd";
+}
+.fa-table:before {
+  content: "\f0ce";
+}
+.fa-magic:before {
+  content: "\f0d0";
+}
+.fa-truck:before {
+  content: "\f0d1";
+}
+.fa-pinterest:before {
+  content: "\f0d2";
+}
+.fa-pinterest-square:before {
+  content: "\f0d3";
+}
+.fa-google-plus-square:before {
+  content: "\f0d4";
+}
+.fa-google-plus:before {
+  content: "\f0d5";
+}
+.fa-money:before {
+  content: "\f0d6";
+}
+.fa-caret-down:before {
+  content: "\f0d7";
+}
+.fa-caret-up:before {
+  content: "\f0d8";
+}
+.fa-caret-left:before {
+  content: "\f0d9";
+}
+.fa-caret-right:before {
+  content: "\f0da";
+}
+.fa-columns:before {
+  content: "\f0db";
+}
+.fa-unsorted:before,
+.fa-sort:before {
+  content: "\f0dc";
+}
+.fa-sort-down:before,
+.fa-sort-desc:before {
+  content: "\f0dd";
+}
+.fa-sort-up:before,
+.fa-sort-asc:before {
+  content: "\f0de";
+}
+.fa-envelope:before {
+  content: "\f0e0";
+}
+.fa-linkedin:before {
+  content: "\f0e1";
+}
+.fa-rotate-left:before,
+.fa-undo:before {
+  content: "\f0e2";
+}
+.fa-legal:before,
+.fa-gavel:before {
+  content: "\f0e3";
+}
+.fa-dashboard:before,
+.fa-tachometer:before {
+  content: "\f0e4";
+}
+.fa-comment-o:before {
+  content: "\f0e5";
+}
+.fa-comments-o:before {
+  content: "\f0e6";
+}
+.fa-flash:before,
+.fa-bolt:before {
+  content: "\f0e7";
+}
+.fa-sitemap:before {
+  content: "\f0e8";
+}
+.fa-umbrella:before {
+  content: "\f0e9";
+}
+.fa-paste:before,
+.fa-clipboard:before {
+  content: "\f0ea";
+}
+.fa-lightbulb-o:before {
+  content: "\f0eb";
+}
+.fa-exchange:before {
+  content: "\f0ec";
+}
+.fa-cloud-download:before {
+  content: "\f0ed";
+}
+.fa-cloud-upload:before {
+  content: "\f0ee";
+}
+.fa-user-md:before {
+  content: "\f0f0";
+}
+.fa-stethoscope:before {
+  content: "\f0f1";
+}
+.fa-suitcase:before {
+  content: "\f0f2";
+}
+.fa-bell-o:before {
+  content: "\f0a2";
+}
+.fa-coffee:before {
+  content: "\f0f4";
+}
+.fa-cutlery:before {
+  content: "\f0f5";
+}
+.fa-file-text-o:before {
+  content: "\f0f6";
+}
+.fa-building-o:before {
+  content: "\f0f7";
+}
+.fa-hospital-o:before {
+  content: "\f0f8";
+}
+.fa-ambulance:before {
+  content: "\f0f9";
+}
+.fa-medkit:before {
+  content: "\f0fa";
+}
+.fa-fighter-jet:before {
+  content: "\f0fb";
+}
+.fa-beer:before {
+  content: "\f0fc";
+}
+.fa-h-square:before {
+  content: "\f0fd";
+}
+.fa-plus-square:before {
+  content: "\f0fe";
+}
+.fa-angle-double-left:before {
+  content: "\f100";
+}
+.fa-angle-double-right:before {
+  content: "\f101";
+}
+.fa-angle-double-up:before {
+  content: "\f102";
+}
+.fa-angle-double-down:before {
+  content: "\f103";
+}
+.fa-angle-left:before {
+  content: "\f104";
+}
+.fa-angle-right:before {
+  content: "\f105";
+}
+.fa-angle-up:before {
+  content: "\f106";
+}
+.fa-angle-down:before {
+  content: "\f107";
+}
+.fa-desktop:before {
+  content: "\f108";
+}
+.fa-laptop:before {
+  content: "\f109";
+}
+.fa-tablet:before {
+  content: "\f10a";
+}
+.fa-mobile-phone:before,
+.fa-mobile:before {
+  content: "\f10b";
+}
+.fa-circle-o:before {
+  content: "\f10c";
+}
+.fa-quote-left:before {
+  content: "\f10d";
+}
+.fa-quote-right:before {
+  content: "\f10e";
+}
+.fa-spinner:before {
+  content: "\f110";
+}
+.fa-circle:before {
+  content: "\f111";
+}
+.fa-mail-reply:before,
+.fa-reply:before {
+  content: "\f112";
+}
+.fa-github-alt:before {
+  content: "\f113";
+}
+.fa-folder-o:before {
+  content: "\f114";
+}
+.fa-folder-open-o:before {
+  content: "\f115";
+}
+.fa-smile-o:before {
+  content: "\f118";
+}
+.fa-frown-o:before {
+  content: "\f119";
+}
+.fa-meh-o:before {
+  content: "\f11a";
+}
+.fa-gamepad:before {
+  content: "\f11b";
+}
+.fa-keyboard-o:before {
+  content: "\f11c";
+}
+.fa-flag-o:before {
+  content: "\f11d";
+}
+.fa-flag-checkered:before {
+  content: "\f11e";
+}
+.fa-terminal:before {
+  content: "\f120";
+}
+.fa-code:before {
+  content: "\f121";
+}
+.fa-mail-reply-all:before,
+.fa-reply-all:before {
+  content: "\f122";
+}
+.fa-star-half-empty:before,
+.fa-star-half-full:before,
+.fa-star-half-o:before {
+  content: "\f123";
+}
+.fa-location-arrow:before {
+  content: "\f124";
+}
+.fa-crop:before {
+  content: "\f125";
+}
+.fa-code-fork:before {
+  content: "\f126";
+}
+.fa-unlink:before,
+.fa-chain-broken:before {
+  content: "\f127";
+}
+.fa-question:before {
+  content: "\f128";
+}
+.fa-info:before {
+  content: "\f129";
+}
+.fa-exclamation:before {
+  content: "\f12a";
+}
+.fa-superscript:before {
+  content: "\f12b";
+}
+.fa-subscript:before {
+  content: "\f12c";
+}
+.fa-eraser:before {
+  content: "\f12d";
+}
+.fa-puzzle-piece:before {
+  content: "\f12e";
+}
+.fa-microphone:before {
+  content: "\f130";
+}
+.fa-microphone-slash:before {
+  content: "\f131";
+}
+.fa-shield:before {
+  content: "\f132";
+}
+.fa-calendar-o:before {
+  content: "\f133";
+}
+.fa-fire-extinguisher:before {
+  content: "\f134";
+}
+.fa-rocket:before {
+  content: "\f135";
+}
+.fa-maxcdn:before {
+  content: "\f136";
+}
+.fa-chevron-circle-left:before {
+  content: "\f137";
+}
+.fa-chevron-circle-right:before {
+  content: "\f138";
+}
+.fa-chevron-circle-up:before {
+  content: "\f139";
+}
+.fa-chevron-circle-down:before {
+  content: "\f13a";
+}
+.fa-html5:before {
+  content: "\f13b";
+}
+.fa-css3:before {
+  content: "\f13c";
+}
+.fa-anchor:before {
+  content: "\f13d";
+}
+.fa-unlock-alt:before {
+  content: "\f13e";
+}
+.fa-bullseye:before {
+  content: "\f140";
+}
+.fa-ellipsis-h:before {
+  content: "\f141";
+}
+.fa-ellipsis-v:before {
+  content: "\f142";
+}
+.fa-rss-square:before {
+  content: "\f143";
+}
+.fa-play-circle:before {
+  content: "\f144";
+}
+.fa-ticket:before {
+  content: "\f145";
+}
+.fa-minus-square:before {
+  content: "\f146";
+}
+.fa-minus-square-o:before {
+  content: "\f147";
+}
+.fa-level-up:before {
+  content: "\f148";
+}
+.fa-level-down:before {
+  content: "\f149";
+}
+.fa-check-square:before {
+  content: "\f14a";
+}
+.fa-pencil-square:before {
+  content: "\f14b";
+}
+.fa-external-link-square:before {
+  content: "\f14c";
+}
+.fa-share-square:before {
+  content: "\f14d";
+}
+.fa-compass:before {
+  content: "\f14e";
+}
+.fa-toggle-down:before,
+.fa-caret-square-o-down:before {
+  content: "\f150";
+}
+.fa-toggle-up:before,
+.fa-caret-square-o-up:before {
+  content: "\f151";
+}
+.fa-toggle-right:before,
+.fa-caret-square-o-right:before {
+  content: "\f152";
+}
+.fa-euro:before,
+.fa-eur:before {
+  content: "\f153";
+}
+.fa-gbp:before {
+  content: "\f154";
+}
+.fa-dollar:before,
+.fa-usd:before {
+  content: "\f155";
+}
+.fa-rupee:before,
+.fa-inr:before {
+  content: "\f156";
+}
+.fa-cny:before,
+.fa-rmb:before,
+.fa-yen:before,
+.fa-jpy:before {
+  content: "\f157";
+}
+.fa-ruble:before,
+.fa-rouble:before,
+.fa-rub:before {
+  content: "\f158";
+}
+.fa-won:before,
+.fa-krw:before {
+  content: "\f159";
+}
+.fa-bitcoin:before,
+.fa-btc:before {
+  content: "\f15a";
+}
+.fa-file:before {
+  content: "\f15b";
+}
+.fa-file-text:before {
+  content: "\f15c";
+}
+.fa-sort-alpha-asc:before {
+  content: "\f15d";
+}
+.fa-sort-alpha-desc:before {
+  content: "\f15e";
+}
+.fa-sort-amount-asc:before {
+  content: "\f160";
+}
+.fa-sort-amount-desc:before {
+  content: "\f161";
+}
+.fa-sort-numeric-asc:before {
+  content: "\f162";
+}
+.fa-sort-numeric-desc:before {
+  content: "\f163";
+}
+.fa-thumbs-up:before {
+  content: "\f164";
+}
+.fa-thumbs-down:before {
+  content: "\f165";
+}
+.fa-youtube-square:before {
+  content: "\f166";
+}
+.fa-youtube:before {
+  content: "\f167";
+}
+.fa-xing:before {
+  content: "\f168";
+}
+.fa-xing-square:before {
+  content: "\f169";
+}
+.fa-youtube-play:before {
+  content: "\f16a";
+}
+.fa-dropbox:before {
+  content: "\f16b";
+}
+.fa-stack-overflow:before {
+  content: "\f16c";
+}
+.fa-instagram:before {
+  content: "\f16d";
+}
+.fa-flickr:before {
+  content: "\f16e";
+}
+.fa-adn:before {
+  content: "\f170";
+}
+.fa-bitbucket:before {
+  content: "\f171";
+}
+.fa-bitbucket-square:before {
+  content: "\f172";
+}
+.fa-tumblr:before {
+  content: "\f173";
+}
+.fa-tumblr-square:before {
+  content: "\f174";
+}
+.fa-long-arrow-down:before {
+  content: "\f175";
+}
+.fa-long-arrow-up:before {
+  content: "\f176";
+}
+.fa-long-arrow-left:before {
+  content: "\f177";
+}
+.fa-long-arrow-right:before {
+  content: "\f178";
+}
+.fa-apple:before {
+  content: "\f179";
+}
+.fa-windows:before {
+  content: "\f17a";
+}
+.fa-android:before {
+  content: "\f17b";
+}
+.fa-linux:before {
+  content: "\f17c";
+}
+.fa-dribbble:before {
+  content: "\f17d";
+}
+.fa-skype:before {
+  content: "\f17e";
+}
+.fa-foursquare:before {
+  content: "\f180";
+}
+.fa-trello:before {
+  content: "\f181";
+}
+.fa-female:before {
+  content: "\f182";
+}
+.fa-male:before {
+  content: "\f183";
+}
+.fa-gittip:before,
+.fa-gratipay:before {
+  content: "\f184";
+}
+.fa-sun-o:before {
+  content: "\f185";
+}
+.fa-moon-o:before {
+  content: "\f186";
+}
+.fa-archive:before {
+  content: "\f187";
+}
+.fa-bug:before {
+  content: "\f188";
+}
+.fa-vk:before {
+  content: "\f189";
+}
+.fa-weibo:before {
+  content: "\f18a";
+}
+.fa-renren:before {
+  content: "\f18b";
+}
+.fa-pagelines:before {
+  content: "\f18c";
+}
+.fa-stack-exchange:before {
+  content: "\f18d";
+}
+.fa-arrow-circle-o-right:before {
+  content: "\f18e";
+}
+.fa-arrow-circle-o-left:before {
+  content: "\f190";
+}
+.fa-toggle-left:before,
+.fa-caret-square-o-left:before {
+  content: "\f191";
+}
+.fa-dot-circle-o:before {
+  content: "\f192";
+}
+.fa-wheelchair:before {
+  content: "\f193";
+}
+.fa-vimeo-square:before {
+  content: "\f194";
+}
+.fa-turkish-lira:before,
+.fa-try:before {
+  content: "\f195";
+}
+.fa-plus-square-o:before {
+  content: "\f196";
+}
+.fa-space-shuttle:before {
+  content: "\f197";
+}
+.fa-slack:before {
+  content: "\f198";
+}
+.fa-envelope-square:before {
+  content: "\f199";
+}
+.fa-wordpress:before {
+  content: "\f19a";
+}
+.fa-openid:before {
+  content: "\f19b";
+}
+.fa-institution:before,
+.fa-bank:before,
+.fa-university:before {
+  content: "\f19c";
+}
+.fa-mortar-board:before,
+.fa-graduation-cap:before {
+  content: "\f19d";
+}
+.fa-yahoo:before {
+  content: "\f19e";
+}
+.fa-google:before {
+  content: "\f1a0";
+}
+.fa-reddit:before {
+  content: "\f1a1";
+}
+.fa-reddit-square:before {
+  content: "\f1a2";
+}
+.fa-stumbleupon-circle:before {
+  content: "\f1a3";
+}
+.fa-stumbleupon:before {
+  content: "\f1a4";
+}
+.fa-delicious:before {
+  content: "\f1a5";
+}
+.fa-digg:before {
+  content: "\f1a6";
+}
+.fa-pied-piper-pp:before {
+  content: "\f1a7";
+}
+.fa-pied-piper-alt:before {
+  content: "\f1a8";
+}
+.fa-drupal:before {
+  content: "\f1a9";
+}
+.fa-joomla:before {
+  content: "\f1aa";
+}
+.fa-language:before {
+  content: "\f1ab";
+}
+.fa-fax:before {
+  content: "\f1ac";
+}
+.fa-building:before {
+  content: "\f1ad";
+}
+.fa-child:before {
+  content: "\f1ae";
+}
+.fa-paw:before {
+  content: "\f1b0";
+}
+.fa-spoon:before {
+  content: "\f1b1";
+}
+.fa-cube:before {
+  content: "\f1b2";
+}
+.fa-cubes:before {
+  content: "\f1b3";
+}
+.fa-behance:before {
+  content: "\f1b4";
+}
+.fa-behance-square:before {
+  content: "\f1b5";
+}
+.fa-steam:before {
+  content: "\f1b6";
+}
+.fa-steam-square:before {
+  content: "\f1b7";
+}
+.fa-recycle:before {
+  content: "\f1b8";
+}
+.fa-automobile:before,
+.fa-car:before {
+  content: "\f1b9";
+}
+.fa-cab:before,
+.fa-taxi:before {
+  content: "\f1ba";
+}
+.fa-tree:before {
+  content: "\f1bb";
+}
+.fa-spotify:before {
+  content: "\f1bc";
+}
+.fa-deviantart:before {
+  content: "\f1bd";
+}
+.fa-soundcloud:before {
+  content: "\f1be";
+}
+.fa-database:before {
+  content: "\f1c0";
+}
+.fa-file-pdf-o:before {
+  content: "\f1c1";
+}
+.fa-file-word-o:before {
+  content: "\f1c2";
+}
+.fa-file-excel-o:before {
+  content: "\f1c3";
+}
+.fa-file-powerpoint-o:before {
+  content: "\f1c4";
+}
+.fa-file-photo-o:before,
+.fa-file-picture-o:before,
+.fa-file-image-o:before {
+  content: "\f1c5";
+}
+.fa-file-zip-o:before,
+.fa-file-archive-o:before {
+  content: "\f1c6";
+}
+.fa-file-sound-o:before,
+.fa-file-audio-o:before {
+  content: "\f1c7";
+}
+.fa-file-movie-o:before,
+.fa-file-video-o:before {
+  content: "\f1c8";
+}
+.fa-file-code-o:before {
+  content: "\f1c9";
+}
+.fa-vine:before {
+  content: "\f1ca";
+}
+.fa-codepen:before {
+  content: "\f1cb";
+}
+.fa-jsfiddle:before {
+  content: "\f1cc";
+}
+.fa-life-bouy:before,
+.fa-life-buoy:before,
+.fa-life-saver:before,
+.fa-support:before,
+.fa-life-ring:before {
+  content: "\f1cd";
+}
+.fa-circle-o-notch:before {
+  content: "\f1ce";
+}
+.fa-ra:before,
+.fa-resistance:before,
+.fa-rebel:before {
+  content: "\f1d0";
+}
+.fa-ge:before,
+.fa-empire:before {
+  content: "\f1d1";
+}
+.fa-git-square:before {
+  content: "\f1d2";
+}
+.fa-git:before {
+  content: "\f1d3";
+}
+.fa-y-combinator-square:before,
+.fa-yc-square:before,
+.fa-hacker-news:before {
+  content: "\f1d4";
+}
+.fa-tencent-weibo:before {
+  content: "\f1d5";
+}
+.fa-qq:before {
+  content: "\f1d6";
+}
+.fa-wechat:before,
+.fa-weixin:before {
+  content: "\f1d7";
+}
+.fa-send:before,
+.fa-paper-plane:before {
+  content: "\f1d8";
+}
+.fa-send-o:before,
+.fa-paper-plane-o:before {
+  content: "\f1d9";
+}
+.fa-history:before {
+  content: "\f1da";
+}
+.fa-circle-thin:before {
+  content: "\f1db";
+}
+.fa-header:before {
+  content: "\f1dc";
+}
+.fa-paragraph:before {
+  content: "\f1dd";
+}
+.fa-sliders:before {
+  content: "\f1de";
+}
+.fa-share-alt:before {
+  content: "\f1e0";
+}
+.fa-share-alt-square:before {
+  content: "\f1e1";
+}
+.fa-bomb:before {
+  content: "\f1e2";
+}
+.fa-soccer-ball-o:before,
+.fa-futbol-o:before {
+  content: "\f1e3";
+}
+.fa-tty:before {
+  content: "\f1e4";
+}
+.fa-binoculars:before {
+  content: "\f1e5";
+}
+.fa-plug:before {
+  content: "\f1e6";
+}
+.fa-slideshare:before {
+  content: "\f1e7";
+}
+.fa-twitch:before {
+  content: "\f1e8";
+}
+.fa-yelp:before {
+  content: "\f1e9";
+}
+.fa-newspaper-o:before {
+  content: "\f1ea";
+}
+.fa-wifi:before {
+  content: "\f1eb";
+}
+.fa-calculator:before {
+  content: "\f1ec";
+}
+.fa-paypal:before {
+  content: "\f1ed";
+}
+.fa-google-wallet:before {
+  content: "\f1ee";
+}
+.fa-cc-visa:before {
+  content: "\f1f0";
+}
+.fa-cc-mastercard:before {
+  content: "\f1f1";
+}
+.fa-cc-discover:before {
+  content: "\f1f2";
+}
+.fa-cc-amex:before {
+  content: "\f1f3";
+}
+.fa-cc-paypal:before {
+  content: "\f1f4";
+}
+.fa-cc-stripe:before {
+  content: "\f1f5";
+}
+.fa-bell-slash:before {
+  content: "\f1f6";
+}
+.fa-bell-slash-o:before {
+  content: "\f1f7";
+}
+.fa-trash:before {
+  content: "\f1f8";
+}
+.fa-copyright:before {
+  content: "\f1f9";
+}
+.fa-at:before {
+  content: "\f1fa";
+}
+.fa-eyedropper:before {
+  content: "\f1fb";
+}
+.fa-paint-brush:before {
+  content: "\f1fc";
+}
+.fa-birthday-cake:before {
+  content: "\f1fd";
+}
+.fa-area-chart:before {
+  content: "\f1fe";
+}
+.fa-pie-chart:before {
+  content: "\f200";
+}
+.fa-line-chart:before {
+  content: "\f201";
+}
+.fa-lastfm:before {
+  content: "\f202";
+}
+.fa-lastfm-square:before {
+  content: "\f203";
+}
+.fa-toggle-off:before {
+  content: "\f204";
+}
+.fa-toggle-on:before {
+  content: "\f205";
+}
+.fa-bicycle:before {
+  content: "\f206";
+}
+.fa-bus:before {
+  content: "\f207";
+}
+.fa-ioxhost:before {
+  content: "\f208";
+}
+.fa-angellist:before {
+  content: "\f209";
+}
+.fa-cc:before {
+  content: "\f20a";
+}
+.fa-shekel:before,
+.fa-sheqel:before,
+.fa-ils:before {
+  content: "\f20b";
+}
+.fa-meanpath:before {
+  content: "\f20c";
+}
+.fa-buysellads:before {
+  content: "\f20d";
+}
+.fa-connectdevelop:before {
+  content: "\f20e";
+}
+.fa-dashcube:before {
+  content: "\f210";
+}
+.fa-forumbee:before {
+  content: "\f211";
+}
+.fa-leanpub:before {
+  content: "\f212";
+}
+.fa-sellsy:before {
+  content: "\f213";
+}
+.fa-shirtsinbulk:before {
+  content: "\f214";
+}
+.fa-simplybuilt:before {
+  content: "\f215";
+}
+.fa-skyatlas:before {
+  content: "\f216";
+}
+.fa-cart-plus:before {
+  content: "\f217";
+}
+.fa-cart-arrow-down:before {
+  content: "\f218";
+}
+.fa-diamond:before {
+  content: "\f219";
+}
+.fa-ship:before {
+  content: "\f21a";
+}
+.fa-user-secret:before {
+  content: "\f21b";
+}
+.fa-motorcycle:before {
+  content: "\f21c";
+}
+.fa-street-view:before {
+  content: "\f21d";
+}
+.fa-heartbeat:before {
+  content: "\f21e";
+}
+.fa-venus:before {
+  content: "\f221";
+}
+.fa-mars:before {
+  content: "\f222";
+}
+.fa-mercury:before {
+  content: "\f223";
+}
+.fa-intersex:before,
+.fa-transgender:before {
+  content: "\f224";
+}
+.fa-transgender-alt:before {
+  content: "\f225";
+}
+.fa-venus-double:before {
+  content: "\f226";
+}
+.fa-mars-double:before {
+  content: "\f227";
+}
+.fa-venus-mars:before {
+  content: "\f228";
+}
+.fa-mars-stroke:before {
+  content: "\f229";
+}
+.fa-mars-stroke-v:before {
+  content: "\f22a";
+}
+.fa-mars-stroke-h:before {
+  content: "\f22b";
+}
+.fa-neuter:before {
+  content: "\f22c";
+}
+.fa-genderless:before {
+  content: "\f22d";
+}
+.fa-facebook-official:before {
+  content: "\f230";
+}
+.fa-pinterest-p:before {
+  content: "\f231";
+}
+.fa-whatsapp:before {
+  content: "\f232";
+}
+.fa-server:before {
+  content: "\f233";
+}
+.fa-user-plus:before {
+  content: "\f234";
+}
+.fa-user-times:before {
+  content: "\f235";
+}
+.fa-hotel:before,
+.fa-bed:before {
+  content: "\f236";
+}
+.fa-viacoin:before {
+  content: "\f237";
+}
+.fa-train:before {
+  content: "\f238";
+}
+.fa-subway:before {
+  content: "\f239";
+}
+.fa-medium:before {
+  content: "\f23a";
+}
+.fa-yc:before,
+.fa-y-combinator:before {
+  content: "\f23b";
+}
+.fa-optin-monster:before {
+  content: "\f23c";
+}
+.fa-opencart:before {
+  content: "\f23d";
+}
+.fa-expeditedssl:before {
+  content: "\f23e";
+}
+.fa-battery-4:before,
+.fa-battery:before,
+.fa-battery-full:before {
+  content: "\f240";
+}
+.fa-battery-3:before,
+.fa-battery-three-quarters:before {
+  content: "\f241";
+}
+.fa-battery-2:before,
+.fa-battery-half:before {
+  content: "\f242";
+}
+.fa-battery-1:before,
+.fa-battery-quarter:before {
+  content: "\f243";
+}
+.fa-battery-0:before,
+.fa-battery-empty:before {
+  content: "\f244";
+}
+.fa-mouse-pointer:before {
+  content: "\f245";
+}
+.fa-i-cursor:before {
+  content: "\f246";
+}
+.fa-object-group:before {
+  content: "\f247";
+}
+.fa-object-ungroup:before {
+  content: "\f248";
+}
+.fa-sticky-note:before {
+  content: "\f249";
+}
+.fa-sticky-note-o:before {
+  content: "\f24a";
+}
+.fa-cc-jcb:before {
+  content: "\f24b";
+}
+.fa-cc-diners-club:before {
+  content: "\f24c";
+}
+.fa-clone:before {
+  content: "\f24d";
+}
+.fa-balance-scale:before {
+  content: "\f24e";
+}
+.fa-hourglass-o:before {
+  content: "\f250";
+}
+.fa-hourglass-1:before,
+.fa-hourglass-start:before {
+  content: "\f251";
+}
+.fa-hourglass-2:before,
+.fa-hourglass-half:before {
+  content: "\f252";
+}
+.fa-hourglass-3:before,
+.fa-hourglass-end:before {
+  content: "\f253";
+}
+.fa-hourglass:before {
+  content: "\f254";
+}
+.fa-hand-grab-o:before,
+.fa-hand-rock-o:before {
+  content: "\f255";
+}
+.fa-hand-stop-o:before,
+.fa-hand-paper-o:before {
+  content: "\f256";
+}
+.fa-hand-scissors-o:before {
+  content: "\f257";
+}
+.fa-hand-lizard-o:before {
+  content: "\f258";
+}
+.fa-hand-spock-o:before {
+  content: "\f259";
+}
+.fa-hand-pointer-o:before {
+  content: "\f25a";
+}
+.fa-hand-peace-o:before {
+  content: "\f25b";
+}
+.fa-trademark:before {
+  content: "\f25c";
+}
+.fa-registered:before {
+  content: "\f25d";
+}
+.fa-creative-commons:before {
+  content: "\f25e";
+}
+.fa-gg:before {
+  content: "\f260";
+}
+.fa-gg-circle:before {
+  content: "\f261";
+}
+.fa-tripadvisor:before {
+  content: "\f262";
+}
+.fa-odnoklassniki:before {
+  content: "\f263";
+}
+.fa-odnoklassniki-square:before {
+  content: "\f264";
+}
+.fa-get-pocket:before {
+  content: "\f265";
+}
+.fa-wikipedia-w:before {
+  content: "\f266";
+}
+.fa-safari:before {
+  content: "\f267";
+}
+.fa-chrome:before {
+  content: "\f268";
+}
+.fa-firefox:before {
+  content: "\f269";
+}
+.fa-opera:before {
+  content: "\f26a";
+}
+.fa-internet-explorer:before {
+  content: "\f26b";
+}
+.fa-tv:before,
+.fa-television:before {
+  content: "\f26c";
+}
+.fa-contao:before {
+  content: "\f26d";
+}
+.fa-500px:before {
+  content: "\f26e";
+}
+.fa-amazon:before {
+  content: "\f270";
+}
+.fa-calendar-plus-o:before {
+  content: "\f271";
+}
+.fa-calendar-minus-o:before {
+  content: "\f272";
+}
+.fa-calendar-times-o:before {
+  content: "\f273";
+}
+.fa-calendar-check-o:before {
+  content: "\f274";
+}
+.fa-industry:before {
+  content: "\f275";
+}
+.fa-map-pin:before {
+  content: "\f276";
+}
+.fa-map-signs:before {
+  content: "\f277";
+}
+.fa-map-o:before {
+  content: "\f278";
+}
+.fa-map:before {
+  content: "\f279";
+}
+.fa-commenting:before {
+  content: "\f27a";
+}
+.fa-commenting-o:before {
+  content: "\f27b";
+}
+.fa-houzz:before {
+  content: "\f27c";
+}
+.fa-vimeo:before {
+  content: "\f27d";
+}
+.fa-black-tie:before {
+  content: "\f27e";
+}
+.fa-fonticons:before {
+  content: "\f280";
+}
+.fa-reddit-alien:before {
+  content: "\f281";
+}
+.fa-edge:before {
+  content: "\f282";
+}
+.fa-credit-card-alt:before {
+  content: "\f283";
+}
+.fa-codiepie:before {
+  content: "\f284";
+}
+.fa-modx:before {
+  content: "\f285";
+}
+.fa-fort-awesome:before {
+  content: "\f286";
+}
+.fa-usb:before {
+  content: "\f287";
+}
+.fa-product-hunt:before {
+  content: "\f288";
+}
+.fa-mixcloud:before {
+  content: "\f289";
+}
+.fa-scribd:before {
+  content: "\f28a";
+}
+.fa-pause-circle:before {
+  content: "\f28b";
+}
+.fa-pause-circle-o:before {
+  content: "\f28c";
+}
+.fa-stop-circle:before {
+  content: "\f28d";
+}
+.fa-stop-circle-o:before {
+  content: "\f28e";
+}
+.fa-shopping-bag:before {
+  content: "\f290";
+}
+.fa-shopping-basket:before {
+  content: "\f291";
+}
+.fa-hashtag:before {
+  content: "\f292";
+}
+.fa-bluetooth:before {
+  content: "\f293";
+}
+.fa-bluetooth-b:before {
+  content: "\f294";
+}
+.fa-percent:before {
+  content: "\f295";
+}
+.fa-gitlab:before {
+  content: "\f296";
+}
+.fa-wpbeginner:before {
+  content: "\f297";
+}
+.fa-wpforms:before {
+  content: "\f298";
+}
+.fa-envira:before {
+  content: "\f299";
+}
+.fa-universal-access:before {
+  content: "\f29a";
+}
+.fa-wheelchair-alt:before {
+  content: "\f29b";
+}
+.fa-question-circle-o:before {
+  content: "\f29c";
+}
+.fa-blind:before {
+  content: "\f29d";
+}
+.fa-audio-description:before {
+  content: "\f29e";
+}
+.fa-volume-control-phone:before {
+  content: "\f2a0";
+}
+.fa-braille:before {
+  content: "\f2a1";
+}
+.fa-assistive-listening-systems:before {
+  content: "\f2a2";
+}
+.fa-asl-interpreting:before,
+.fa-american-sign-language-interpreting:before {
+  content: "\f2a3";
+}
+.fa-deafness:before,
+.fa-hard-of-hearing:before,
+.fa-deaf:before {
+  content: "\f2a4";
+}
+.fa-glide:before {
+  content: "\f2a5";
+}
+.fa-glide-g:before {
+  content: "\f2a6";
+}
+.fa-signing:before,
+.fa-sign-language:before {
+  content: "\f2a7";
+}
+.fa-low-vision:before {
+  content: "\f2a8";
+}
+.fa-viadeo:before {
+  content: "\f2a9";
+}
+.fa-viadeo-square:before {
+  content: "\f2aa";
+}
+.fa-snapchat:before {
+  content: "\f2ab";
+}
+.fa-snapchat-ghost:before {
+  content: "\f2ac";
+}
+.fa-snapchat-square:before {
+  content: "\f2ad";
+}
+.fa-pied-piper:before {
+  content: "\f2ae";
+}
+.fa-first-order:before {
+  content: "\f2b0";
+}
+.fa-yoast:before {
+  content: "\f2b1";
+}
+.fa-themeisle:before {
+  content: "\f2b2";
+}
+.fa-google-plus-circle:before,
+.fa-google-plus-official:before {
+  content: "\f2b3";
+}
+.fa-fa:before,
+.fa-font-awesome:before {
+  content: "\f2b4";
+}
+.fa-handshake-o:before {
+  content: "\f2b5";
+}
+.fa-envelope-open:before {
+  content: "\f2b6";
+}
+.fa-envelope-open-o:before {
+  content: "\f2b7";
+}
+.fa-linode:before {
+  content: "\f2b8";
+}
+.fa-address-book:before {
+  content: "\f2b9";
+}
+.fa-address-book-o:before {
+  content: "\f2ba";
+}
+.fa-vcard:before,
+.fa-address-card:before {
+  content: "\f2bb";
+}
+.fa-vcard-o:before,
+.fa-address-card-o:before {
+  content: "\f2bc";
+}
+.fa-user-circle:before {
+  content: "\f2bd";
+}
+.fa-user-circle-o:before {
+  content: "\f2be";
+}
+.fa-user-o:before {
+  content: "\f2c0";
+}
+.fa-id-badge:before {
+  content: "\f2c1";
+}
+.fa-drivers-license:before,
+.fa-id-card:before {
+  content: "\f2c2";
+}
+.fa-drivers-license-o:before,
+.fa-id-card-o:before {
+  content: "\f2c3";
+}
+.fa-quora:before {
+  content: "\f2c4";
+}
+.fa-free-code-camp:before {
+  content: "\f2c5";
+}
+.fa-telegram:before {
+  content: "\f2c6";
+}
+.fa-thermometer-4:before,
+.fa-thermometer:before,
+.fa-thermometer-full:before {
+  content: "\f2c7";
+}
+.fa-thermometer-3:before,
+.fa-thermometer-three-quarters:before {
+  content: "\f2c8";
+}
+.fa-thermometer-2:before,
+.fa-thermometer-half:before {
+  content: "\f2c9";
+}
+.fa-thermometer-1:before,
+.fa-thermometer-quarter:before {
+  content: "\f2ca";
+}
+.fa-thermometer-0:before,
+.fa-thermometer-empty:before {
+  content: "\f2cb";
+}
+.fa-shower:before {
+  content: "\f2cc";
+}
+.fa-bathtub:before,
+.fa-s15:before,
+.fa-bath:before {
+  content: "\f2cd";
+}
+.fa-podcast:before {
+  content: "\f2ce";
+}
+.fa-window-maximize:before {
+  content: "\f2d0";
+}
+.fa-window-minimize:before {
+  content: "\f2d1";
+}
+.fa-window-restore:before {
+  content: "\f2d2";
+}
+.fa-times-rectangle:before,
+.fa-window-close:before {
+  content: "\f2d3";
+}
+.fa-times-rectangle-o:before,
+.fa-window-close-o:before {
+  content: "\f2d4";
+}
+.fa-bandcamp:before {
+  content: "\f2d5";
+}
+.fa-grav:before {
+  content: "\f2d6";
+}
+.fa-etsy:before {
+  content: "\f2d7";
+}
+.fa-imdb:before {
+  content: "\f2d8";
+}
+.fa-ravelry:before {
+  content: "\f2d9";
+}
+.fa-eercast:before {
+  content: "\f2da";
+}
+.fa-microchip:before {
+  content: "\f2db";
+}
+.fa-snowflake-o:before {
+  content: "\f2dc";
+}
+.fa-superpowers:before {
+  content: "\f2dd";
+}
+.fa-wpexplorer:before {
+  content: "\f2de";
+}
+.fa-meetup:before {
+  content: "\f2e0";
+}
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  border: 0;
+}
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+  position: static;
+  width: auto;
+  height: auto;
+  margin: 0;
+  overflow: visible;
+  clip: auto;
+}
diff --git a/css/font-awesome.min.css b/css/font-awesome.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..540440ce89f2a408aa699b65100e18f15e0f09ca
--- /dev/null
+++ b/css/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
diff --git a/css/styles.css b/css/styles.css
new file mode 100644
index 0000000000000000000000000000000000000000..652bd8091535cee0f6673e58ce8ecf4e627dd864
--- /dev/null
+++ b/css/styles.css
@@ -0,0 +1,44 @@
+
+
+.board {
+    border: 10px solid #fafaf9;
+    background-color: #d4e7e3;
+    color: #141414;
+    padding: 15px;
+    font-size: 22px;
+    width: 50%;
+    /* height: 150px; */
+    margin-bottom: 15px;
+}
+
+#virtual-keyboard {
+    border: 5px #212F3D double;
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+    padding: 15px;
+    background-color: #525252;
+}
+
+.keyboard-row {
+    text-align: center;
+    margin-bottom: 10px;
+    color: white;
+}
+
+#virtual-keyboard a {
+    -webkit-border-radius: 5px;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+    background: #000000;
+    padding: 3px 7px;
+    font-size: 30px;
+    color:#ffffff;
+    text-align: center;
+    margin-right: 15px;
+}
+
+#virtual-keyboard a:hover {
+    text-decoration: none;
+    opacity: 0.8;
+}
\ No newline at end of file
diff --git a/datos.php b/datos.php
new file mode 100644
index 0000000000000000000000000000000000000000..95ba14b5c645ed924d6731c1d29bd65d5feeb3ee
--- /dev/null
+++ b/datos.php
@@ -0,0 +1,67 @@
+<?php
+    // function conexdb(){
+    //     global $server, $usuario, $contrasena, $bd, $conex;
+    //     $server='localhost:3307';
+    //     //$server='localhost:3307';
+    //     $usuario='admin';
+    //     $contrasena='supermnto';
+    //     $bd='velostat';
+    //     $conex = new mysqli($server,$usuario,$contrasena,$bd); 
+    //     if ($conex->connect_errno) {
+    //         echo "Fallo al conectar a MySQL: (". $conex->connect_errno . ") ". $conex->connect_error;
+    //     }
+    // }
+    require_once("funciones.php");
+
+    conexdb();
+    // value=[[11810,58,0,629,480,24,0],[11911,43,0,573,498,79,0],[12012,42,0,570,496,78,0],[12113,41,0,571,496,75,0]]
+    // [[12,1,2,3,4,5,6,7,8],[17,1,2,3,4,5,6,7,8],[23,1,2,3,4,5,6,7,8]]
+
+    // recuperamos el ultimo id_prueba del paciente
+	$result = $conex->query("SELECT id_prueba FROM `PRUEBAS_PACIENTES` ORDER BY id_prueba DESC"); 
+	$row = $result->fetch_assoc();
+	$id_prueba=$row['id_prueba'];
+
+    
+    $output = $_REQUEST['value'];
+    echo "Recibiendo datos para ensayo ".$id_prueba."...<br>
+        ";
+    var_dump($output);
+    echo "<br>
+        ";
+    // quito 2 primeros y 2 ultimos corchete
+    $output = substr($output, 2 , -2);
+    // partimos por cada corchete
+    $datos = explode ("],[", $output);
+
+    print_r ($datos)."<br>
+    ";
+    foreach ($datos as $toma) {
+        echo $toma."<br>";
+        $toma = explode (",", $toma);
+        $i = 0;
+        for ($i=0; $i < 10 ; $i++) { 
+            if (!$toma[$i])  $toma[$i]=0;
+        }
+        $values .= "( NULL, $toma[0], $toma[1], $toma[2], $toma[3], $toma[4], $toma[5],
+                     $toma[6], '$id_prueba'),";
+    } 
+    // quitamos último coma
+    $values = substr($values, 0, -1);
+
+    $sql = "INSERT INTO `DATOS_PRUEBAS_PACIENTES`
+            (`id_datos_pruebas_pacientes`, `s1`, `s2`, `s3`, `s4`, `s5`, `s6`, `timestamp`, `id_prueba`)
+            VALUES
+             ".$values ." 
+            ";
+    echo $sql;
+    if (!$conex->query($sql))
+    {
+        echo "<br>
+        Error actualizando registro: %s\n". $conex->error;
+    }
+    else echo "<br>
+    Actualizado
+    <br>";
+
+?>
\ No newline at end of file
diff --git a/fonts/FontAwesome.otf b/fonts/FontAwesome.otf
new file mode 100644
index 0000000000000000000000000000000000000000..401ec0f36e4f73b8efa40bd6f604fe80d286db70
Binary files /dev/null and b/fonts/FontAwesome.otf differ
diff --git a/fonts/fontawesome-webfont.eot b/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000000000000000000000000000000000000..e9f60ca953f93e35eab4108bd414bc02ddcf3928
Binary files /dev/null and b/fonts/fontawesome-webfont.eot differ
diff --git a/fonts/fontawesome-webfont.svg b/fonts/fontawesome-webfont.svg
new file mode 100644
index 0000000000000000000000000000000000000000..855c845e538b65548118279537a04eab2ec6ef0d
--- /dev/null
+++ b/fonts/fontawesome-webfont.svg
@@ -0,0 +1,2671 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg>
+<metadata>
+Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016
+ By ,,,
+Copyright Dave Gandy 2016. All rights reserved.
+</metadata>
+<defs>
+<font id="FontAwesome" horiz-adv-x="1536" >
+  <font-face 
+    font-family="FontAwesome"
+    font-weight="400"
+    font-stretch="normal"
+    units-per-em="1792"
+    panose-1="0 0 0 0 0 0 0 0 0 0"
+    ascent="1536"
+    descent="-256"
+    bbox="-1.02083 -256.962 2304.6 1537.02"
+    underline-thickness="0"
+    underline-position="0"
+    unicode-range="U+0020-F500"
+  />
+<missing-glyph horiz-adv-x="896" 
+d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" />
+    <glyph glyph-name=".notdef" horiz-adv-x="896" 
+d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z" />
+    <glyph glyph-name=".null" horiz-adv-x="0" 
+ />
+    <glyph glyph-name="nonmarkingreturn" horiz-adv-x="597" 
+ />
+    <glyph glyph-name="space" unicode=" " horiz-adv-x="448" 
+ />
+    <glyph glyph-name="dieresis" unicode="&#xa8;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="copyright" unicode="&#xa9;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="registered" unicode="&#xae;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="acute" unicode="&#xb4;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="AE" unicode="&#xc6;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="Oslash" unicode="&#xd8;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="trademark" unicode="&#x2122;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="infinity" unicode="&#x221e;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="notequal" unicode="&#x2260;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="glass" unicode="&#xf000;" horiz-adv-x="1792" 
+d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
+    <glyph glyph-name="music" unicode="&#xf001;" 
+d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89
+t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
+    <glyph glyph-name="search" unicode="&#xf002;" horiz-adv-x="1664" 
+d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5
+t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+    <glyph glyph-name="envelope" unicode="&#xf003;" horiz-adv-x="1792" 
+d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13
+t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z
+M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+    <glyph glyph-name="heart" unicode="&#xf004;" horiz-adv-x="1792" 
+d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600
+q-18 -18 -44 -18z" />
+    <glyph glyph-name="star" unicode="&#xf005;" horiz-adv-x="1664" 
+d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455
+l502 -73q56 -9 56 -46z" />
+    <glyph glyph-name="star_empty" unicode="&#xf006;" horiz-adv-x="1664" 
+d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500
+l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
+    <glyph glyph-name="user" unicode="&#xf007;" horiz-adv-x="1280" 
+d="M1280 137q0 -109 -62.5 -187t-150.5 -78h-854q-88 0 -150.5 78t-62.5 187q0 85 8.5 160.5t31.5 152t58.5 131t94 89t134.5 34.5q131 -128 313 -128t313 128q76 0 134.5 -34.5t94 -89t58.5 -131t31.5 -152t8.5 -160.5zM1024 1024q0 -159 -112.5 -271.5t-271.5 -112.5
+t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
+    <glyph glyph-name="film" unicode="&#xf008;" horiz-adv-x="1920" 
+d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128
+q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45
+t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128
+q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19
+t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+    <glyph glyph-name="th_large" unicode="&#xf009;" horiz-adv-x="1664" 
+d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38
+h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+    <glyph glyph-name="th" unicode="&#xf00a;" horiz-adv-x="1792" 
+d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320
+q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28
+h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192
+q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
+    <glyph glyph-name="th_list" unicode="&#xf00b;" horiz-adv-x="1792" 
+d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960
+q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28
+h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
+    <glyph glyph-name="ok" unicode="&#xf00c;" horiz-adv-x="1792" 
+d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
+    <glyph glyph-name="remove" unicode="&#xf00d;" horiz-adv-x="1408" 
+d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68
+t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
+    <glyph glyph-name="zoom_in" unicode="&#xf00e;" horiz-adv-x="1664" 
+d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224
+q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5
+t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+    <glyph glyph-name="zoom_out" unicode="&#xf010;" horiz-adv-x="1664" 
+d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z
+M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z
+" />
+    <glyph glyph-name="off" unicode="&#xf011;" 
+d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5
+t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
+    <glyph glyph-name="signal" unicode="&#xf012;" horiz-adv-x="1792" 
+d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23
+v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
+    <glyph glyph-name="cog" unicode="&#xf013;" 
+d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38
+q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13
+l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22
+q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
+    <glyph glyph-name="trash" unicode="&#xf014;" horiz-adv-x="1408" 
+d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576
+q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832
+q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+    <glyph glyph-name="home" unicode="&#xf015;" horiz-adv-x="1664" 
+d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5
+l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
+    <glyph glyph-name="file_alt" unicode="&#xf016;" 
+d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
+" />
+    <glyph glyph-name="time" unicode="&#xf017;" 
+d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640
+q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="road" unicode="&#xf018;" horiz-adv-x="1920" 
+d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256
+q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
+    <glyph glyph-name="download_alt" unicode="&#xf019;" horiz-adv-x="1664" 
+d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136
+q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
+    <glyph glyph-name="download" unicode="&#xf01a;" 
+d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273
+t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="upload" unicode="&#xf01b;" 
+d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198
+t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="inbox" unicode="&#xf01c;" 
+d="M1023 576h316q-1 3 -2.5 8.5t-2.5 7.5l-212 496h-708l-212 -496q-1 -3 -2.5 -8.5t-2.5 -7.5h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552
+q25 -61 25 -123z" />
+    <glyph glyph-name="play_circle" unicode="&#xf01d;" 
+d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640
+q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="repeat" unicode="&#xf01e;" 
+d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q15 0 25 -9
+l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
+    <glyph glyph-name="refresh" unicode="&#xf021;" 
+d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117
+q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5
+q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
+    <glyph glyph-name="list_alt" unicode="&#xf022;" horiz-adv-x="1792" 
+d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z
+M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5
+t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47
+t47 -113z" />
+    <glyph glyph-name="lock" unicode="&#xf023;" horiz-adv-x="1152" 
+d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
+    <glyph glyph-name="flag" unicode="&#xf024;" horiz-adv-x="1792" 
+d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48
+t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="headphones" unicode="&#xf025;" horiz-adv-x="1664" 
+d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78
+t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5
+t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
+    <glyph glyph-name="volume_off" unicode="&#xf026;" horiz-adv-x="768" 
+d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
+    <glyph glyph-name="volume_down" unicode="&#xf027;" horiz-adv-x="1152" 
+d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36
+t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
+    <glyph glyph-name="volume_up" unicode="&#xf028;" horiz-adv-x="1664" 
+d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36
+t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5
+t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289
+t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
+    <glyph glyph-name="qrcode" unicode="&#xf029;" horiz-adv-x="1408" 
+d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z
+M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
+    <glyph glyph-name="barcode" unicode="&#xf02a;" horiz-adv-x="1792" 
+d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z
+M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
+    <glyph glyph-name="tag" unicode="&#xf02b;" 
+d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5
+l715 -714q37 -39 37 -91z" />
+    <glyph glyph-name="tags" unicode="&#xf02c;" horiz-adv-x="1920" 
+d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5
+l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
+    <glyph glyph-name="book" unicode="&#xf02d;" horiz-adv-x="1664" 
+d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23
+q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906
+q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5
+t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
+    <glyph glyph-name="bookmark" unicode="&#xf02e;" horiz-adv-x="1280" 
+d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+    <glyph glyph-name="print" unicode="&#xf02f;" horiz-adv-x="1664" 
+d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68
+v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
+    <glyph glyph-name="camera" unicode="&#xf030;" horiz-adv-x="1920" 
+d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136
+q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+    <glyph glyph-name="font" unicode="&#xf031;" horiz-adv-x="1664" 
+d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57
+q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -5 -0.5 -13.5t-0.5 -12.5q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5
+q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" />
+    <glyph glyph-name="bold" unicode="&#xf032;" horiz-adv-x="1408" 
+d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142
+q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5
+t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68 -0.5t68 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5
+t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" />
+    <glyph glyph-name="italic" unicode="&#xf033;" horiz-adv-x="1024" 
+d="M0 -126l17 85q22 7 61.5 16.5t72 19t59.5 23.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5
+q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
+    <glyph glyph-name="text_height" unicode="&#xf034;" horiz-adv-x="1792" 
+d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2
+t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5
+q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27
+q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" />
+    <glyph glyph-name="text_width" unicode="&#xf035;" 
+d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1
+t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27
+q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5
+t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49
+t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" />
+    <glyph glyph-name="align_left" unicode="&#xf036;" horiz-adv-x="1792" 
+d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45
+t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="align_center" unicode="&#xf037;" horiz-adv-x="1792" 
+d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19
+h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="align_right" unicode="&#xf038;" horiz-adv-x="1792" 
+d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45
+t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="align_justify" unicode="&#xf039;" horiz-adv-x="1792" 
+d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45
+t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="list" unicode="&#xf03a;" horiz-adv-x="1792" 
+d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5
+t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344
+q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5
+t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192
+q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
+    <glyph glyph-name="indent_left" unicode="&#xf03b;" horiz-adv-x="1792" 
+d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5
+t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088
+q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+    <glyph glyph-name="indent_right" unicode="&#xf03c;" horiz-adv-x="1792" 
+d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5
+t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088
+q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+    <glyph glyph-name="facetime_video" unicode="&#xf03d;" horiz-adv-x="1792" 
+d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5
+q39 -17 39 -59z" />
+    <glyph glyph-name="picture" unicode="&#xf03e;" horiz-adv-x="1920" 
+d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216
+q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+    <glyph glyph-name="pencil" unicode="&#xf040;" 
+d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38
+q53 0 91 -38l235 -234q37 -39 37 -91z" />
+    <glyph glyph-name="map_marker" unicode="&#xf041;" horiz-adv-x="1024" 
+d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
+    <glyph glyph-name="adjust" unicode="&#xf042;" 
+d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="tint" unicode="&#xf043;" horiz-adv-x="1024" 
+d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362
+q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
+    <glyph glyph-name="edit" unicode="&#xf044;" horiz-adv-x="1792" 
+d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832
+q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92
+l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
+    <glyph glyph-name="share" unicode="&#xf045;" horiz-adv-x="1664" 
+d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832
+q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5
+t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
+    <glyph glyph-name="check" unicode="&#xf046;" horiz-adv-x="1664" 
+d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832
+q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110
+q24 -24 24 -57t-24 -57z" />
+    <glyph glyph-name="move" unicode="&#xf047;" horiz-adv-x="1792" 
+d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45
+t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+    <glyph glyph-name="step_backward" unicode="&#xf048;" horiz-adv-x="1024" 
+d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19z" />
+    <glyph glyph-name="fast_backward" unicode="&#xf049;" horiz-adv-x="1792" 
+d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19l710 710
+q19 19 32 13t13 -32v-710q4 10 13 19z" />
+    <glyph glyph-name="backward" unicode="&#xf04a;" horiz-adv-x="1664" 
+d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q4 10 13 19z" />
+    <glyph glyph-name="play" unicode="&#xf04b;" horiz-adv-x="1408" 
+d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
+    <glyph glyph-name="pause" unicode="&#xf04c;" 
+d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="stop" unicode="&#xf04d;" 
+d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="forward" unicode="&#xf04e;" horiz-adv-x="1664" 
+d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" />
+    <glyph glyph-name="fast_forward" unicode="&#xf050;" horiz-adv-x="1792" 
+d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19l-710 -710
+q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z" />
+    <glyph glyph-name="step_forward" unicode="&#xf051;" horiz-adv-x="1024" 
+d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19z" />
+    <glyph glyph-name="eject" unicode="&#xf052;" horiz-adv-x="1538" 
+d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
+    <glyph glyph-name="chevron_left" unicode="&#xf053;" horiz-adv-x="1280" 
+d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" />
+    <glyph glyph-name="chevron_right" unicode="&#xf054;" horiz-adv-x="1280" 
+d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" />
+    <glyph glyph-name="plus_sign" unicode="&#xf055;" 
+d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5
+t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="minus_sign" unicode="&#xf056;" 
+d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5
+t103 -385.5z" />
+    <glyph glyph-name="remove_sign" unicode="&#xf057;" 
+d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19
+q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="ok_sign" unicode="&#xf058;" 
+d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
+t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="question_sign" unicode="&#xf059;" 
+d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59
+q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
+t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="info_sign" unicode="&#xf05a;" 
+d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23
+t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="screenshot" unicode="&#xf05b;" 
+d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109
+q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143
+q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="remove_circle" unicode="&#xf05c;" 
+d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23
+l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5
+t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="ok_circle" unicode="&#xf05d;" 
+d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198
+t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="ban_circle" unicode="&#xf05e;" 
+d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61
+t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
+    <glyph glyph-name="arrow_left" unicode="&#xf060;" 
+d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5
+t32.5 -90.5z" />
+    <glyph glyph-name="arrow_right" unicode="&#xf061;" 
+d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
+    <glyph glyph-name="arrow_up" unicode="&#xf062;" horiz-adv-x="1664" 
+d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651
+q37 -39 37 -91z" />
+    <glyph glyph-name="arrow_down" unicode="&#xf063;" horiz-adv-x="1664" 
+d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+    <glyph glyph-name="share_alt" unicode="&#xf064;" horiz-adv-x="1792" 
+d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22
+t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
+    <glyph glyph-name="resize_full" unicode="&#xf065;" 
+d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332
+q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="resize_small" unicode="&#xf066;" 
+d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45
+t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
+    <glyph glyph-name="plus" unicode="&#xf067;" horiz-adv-x="1408" 
+d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
+    <glyph glyph-name="minus" unicode="&#xf068;" horiz-adv-x="1408" 
+d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
+    <glyph glyph-name="asterisk" unicode="&#xf069;" horiz-adv-x="1664" 
+d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154
+q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
+    <glyph glyph-name="exclamation_sign" unicode="&#xf06a;" 
+d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192
+q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
+    <glyph glyph-name="gift" unicode="&#xf06b;" 
+d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320
+q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5
+t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
+    <glyph glyph-name="leaf" unicode="&#xf06c;" horiz-adv-x="1792" 
+d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268
+q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-43 0 -63.5 17.5t-45.5 59.5q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5
+t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
+    <glyph glyph-name="fire" unicode="&#xf06d;" horiz-adv-x="1408" 
+d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1
+q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
+    <glyph glyph-name="eye_open" unicode="&#xf06e;" horiz-adv-x="1792" 
+d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5
+t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
+    <glyph glyph-name="eye_close" unicode="&#xf070;" horiz-adv-x="1792" 
+d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9
+q-106 -189 -316 -567t-315 -566l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5
+q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z
+" />
+    <glyph glyph-name="warning_sign" unicode="&#xf071;" horiz-adv-x="1792" 
+d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185
+q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
+    <glyph glyph-name="plane" unicode="&#xf072;" horiz-adv-x="1408" 
+d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9
+q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
+    <glyph glyph-name="calendar" unicode="&#xf073;" horiz-adv-x="1664" 
+d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z
+M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64
+q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47
+h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+    <glyph glyph-name="random" unicode="&#xf074;" horiz-adv-x="1792" 
+d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1
+t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5
+v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111
+t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+    <glyph glyph-name="comment" unicode="&#xf075;" horiz-adv-x="1792" 
+d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281
+q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
+    <glyph glyph-name="magnet" unicode="&#xf076;" 
+d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384
+q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="chevron_up" unicode="&#xf077;" horiz-adv-x="1792" 
+d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" />
+    <glyph glyph-name="chevron_down" unicode="&#xf078;" horiz-adv-x="1792" 
+d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" />
+    <glyph glyph-name="retweet" unicode="&#xf079;" horiz-adv-x="1920" 
+d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -10 7 -21
+zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z
+" />
+    <glyph glyph-name="shopping_cart" unicode="&#xf07a;" horiz-adv-x="1664" 
+d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45
+t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="folder_close" unicode="&#xf07b;" horiz-adv-x="1664" 
+d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+    <glyph glyph-name="folder_open" unicode="&#xf07c;" horiz-adv-x="1920" 
+d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5
+t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
+    <glyph glyph-name="resize_vertical" unicode="&#xf07d;" horiz-adv-x="768" 
+d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
+    <glyph glyph-name="resize_horizontal" unicode="&#xf07e;" horiz-adv-x="1792" 
+d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+    <glyph glyph-name="bar_chart" unicode="&#xf080;" horiz-adv-x="2048" 
+d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" />
+    <glyph glyph-name="twitter_sign" unicode="&#xf081;" 
+d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4
+q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5
+t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="facebook_sign" unicode="&#xf082;" 
+d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960
+q0 119 84.5 203.5t203.5 84.5h960z" />
+    <glyph glyph-name="camera_retro" unicode="&#xf083;" horiz-adv-x="1792" 
+d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5
+t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280
+q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
+    <glyph glyph-name="key" unicode="&#xf084;" horiz-adv-x="1792" 
+d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26
+l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5
+t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
+    <glyph glyph-name="cogs" unicode="&#xf085;" horiz-adv-x="1920" 
+d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5
+t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -11 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5
+l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7
+l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -8 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31
+q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20
+t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68
+q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70
+q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
+    <glyph glyph-name="comments" unicode="&#xf086;" horiz-adv-x="1792" 
+d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224
+q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7
+q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
+    <glyph glyph-name="thumbs_up_alt" unicode="&#xf087;" 
+d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5
+t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769
+q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128
+q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
+    <glyph glyph-name="thumbs_down_alt" unicode="&#xf088;" 
+d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 31 18 69q0 37 -17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5
+t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z
+M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5
+h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -73 49 -163z" />
+    <glyph glyph-name="star_half" unicode="&#xf089;" horiz-adv-x="896" 
+d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
+    <glyph glyph-name="heart_empty" unicode="&#xf08a;" horiz-adv-x="1792" 
+d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559
+q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5
+q224 0 351 -124t127 -344z" />
+    <glyph glyph-name="signout" unicode="&#xf08b;" horiz-adv-x="1664" 
+d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704
+q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
+    <glyph glyph-name="linkedin_sign" unicode="&#xf08c;" 
+d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5
+q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="pushpin" unicode="&#xf08d;" horiz-adv-x="1152" 
+d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38
+t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
+    <glyph glyph-name="external_link" unicode="&#xf08e;" horiz-adv-x="1792" 
+d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320
+q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="signin" unicode="&#xf090;" 
+d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5
+q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="trophy" unicode="&#xf091;" horiz-adv-x="1664" 
+d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91
+t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96
+q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
+    <glyph glyph-name="github_sign" unicode="&#xf092;" 
+d="M519 336q4 6 -3 13q-9 7 -14 2q-4 -6 3 -13q9 -7 14 -2zM491 377q-5 7 -12 4q-6 -4 0 -12q7 -8 12 -5q6 4 0 13zM450 417q2 4 -5 8q-7 2 -8 -2q-3 -5 4 -8q8 -2 9 2zM471 394q2 1 1.5 4.5t-3.5 5.5q-6 7 -10 3t1 -11q6 -6 11 -2zM557 319q2 7 -9 11q-9 3 -13 -4
+q-2 -7 9 -11q9 -3 13 4zM599 316q0 8 -12 8q-10 0 -10 -8t11 -8t11 8zM638 323q-2 7 -13 5t-9 -9q2 -8 12 -6t10 10zM1280 640q0 212 -150 362t-362 150t-362 -150t-150 -362q0 -167 98 -300.5t252 -185.5q18 -3 26.5 5t8.5 20q0 52 -1 95q-6 -1 -15.5 -2.5t-35.5 -2t-48 4
+t-43.5 20t-29.5 41.5q-23 59 -57 74q-2 1 -4.5 3.5l-8 8t-7 9.5t4 7.5t19.5 3.5q6 0 15 -2t30 -15.5t33 -35.5q16 -28 37.5 -42t43.5 -14t38 3.5t30 9.5q7 47 33 69q-49 6 -86 18.5t-73 39t-55.5 76t-19.5 119.5q0 79 53 137q-24 62 5 136q19 6 54.5 -7.5t60.5 -29.5l26 -16
+q58 17 128 17t128 -17q11 7 28.5 18t55.5 26t57 9q29 -74 5 -136q53 -58 53 -137q0 -57 -14 -100.5t-35.5 -70t-53.5 -44.5t-62.5 -26t-68.5 -12q35 -31 35 -95q0 -40 -0.5 -89t-0.5 -51q0 -12 8.5 -20t26.5 -5q154 52 252 185.5t98 300.5zM1536 1120v-960
+q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="upload_alt" unicode="&#xf093;" horiz-adv-x="1664" 
+d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92
+t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
+    <glyph glyph-name="lemon" unicode="&#xf094;" 
+d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5
+q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44
+q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5
+q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -13 2 -25t3.5 -16.5t7.5 -20.5t8 -20q16 -40 25 -118.5t9 -136.5z" />
+    <glyph glyph-name="phone" unicode="&#xf095;" horiz-adv-x="1408" 
+d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -53 3.5t-57.5 12.5t-47 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-127 79 -264 216t-216 264q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47t-12.5 57.5t-3.5 53q0 92 51 186
+q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174q2 -1 19 -11.5t24 -14
+t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
+    <glyph glyph-name="check_empty" unicode="&#xf096;" horiz-adv-x="1408" 
+d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832
+q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="bookmark_empty" unicode="&#xf097;" horiz-adv-x="1280" 
+d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289
+q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+    <glyph glyph-name="phone_sign" unicode="&#xf098;" 
+d="M1280 343q0 11 -2 16t-18 16.5t-40.5 25t-47.5 26.5t-45.5 25t-28.5 15q-5 3 -19 13t-25 15t-21 5q-15 0 -36.5 -20.5t-39.5 -45t-38.5 -45t-33.5 -20.5q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170 126.5t-127 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5
+t-3.5 16.5q0 13 20.5 33.5t45 38.5t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5
+t320.5 -216.5q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z
+" />
+    <glyph glyph-name="twitter" unicode="&#xf099;" horiz-adv-x="1664" 
+d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41
+q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
+    <glyph glyph-name="facebook" unicode="&#xf09a;" horiz-adv-x="1024" 
+d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" />
+    <glyph glyph-name="github" unicode="&#xf09b;" 
+d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -40 7t-13 30q0 3 0.5 76.5t0.5 134.5q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 119 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24
+q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-85 13.5q-45 -113 -8 -204q-79 -87 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-39 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5
+t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -88.5t0.5 -54.5q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103zM291 305q3 7 -7 12
+q-10 3 -13 -2q-3 -7 7 -12q9 -6 13 2zM322 271q7 5 -2 16q-10 9 -16 3q-7 -5 2 -16q10 -10 16 -3zM352 226q9 7 0 19q-8 13 -17 6q-9 -5 0 -18t17 -7zM394 184q8 8 -4 19q-12 12 -20 3q-9 -8 4 -19q12 -12 20 -3zM451 159q3 11 -13 16q-15 4 -19 -7t13 -15q15 -6 19 6z
+M514 154q0 13 -17 11q-16 0 -16 -11q0 -13 17 -11q16 0 16 11zM572 164q-2 11 -18 9q-16 -3 -14 -15t18 -8t14 14z" />
+    <glyph glyph-name="unlock" unicode="&#xf09c;" horiz-adv-x="1664" 
+d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5
+t316.5 -131.5t131.5 -316.5z" />
+    <glyph glyph-name="credit_card" unicode="&#xf09d;" horiz-adv-x="1920" 
+d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608
+q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
+    <glyph glyph-name="rss" unicode="&#xf09e;" horiz-adv-x="1408" 
+d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5
+t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294
+q187 -186 294 -425.5t120 -501.5z" />
+    <glyph glyph-name="hdd" unicode="&#xf0a0;" 
+d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5
+h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75
+l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
+    <glyph glyph-name="bullhorn" unicode="&#xf0a1;" horiz-adv-x="1792" 
+d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5
+t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
+    <glyph glyph-name="bell" unicode="&#xf0a2;" horiz-adv-x="1792" 
+d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z
+M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5
+t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+    <glyph glyph-name="certificate" unicode="&#xf0a3;" 
+d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70
+l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70
+l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
+    <glyph glyph-name="hand_right" unicode="&#xf0a4;" horiz-adv-x="1792" 
+d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106
+q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43
+q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5
+t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
+    <glyph glyph-name="hand_left" unicode="&#xf0a5;" horiz-adv-x="1792" 
+d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-8 9 -12 14q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576q-50 0 -89 -38.5
+t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45z
+M1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67
+q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
+    <glyph glyph-name="hand_up" unicode="&#xf0a6;" 
+d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576
+q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5
+t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76
+q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
+    <glyph glyph-name="hand_down" unicode="&#xf0a7;" 
+d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33
+t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580
+q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100
+q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
+    <glyph glyph-name="circle_arrow_left" unicode="&#xf0a8;" 
+d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640
+q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="circle_arrow_right" unicode="&#xf0a9;" 
+d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640
+q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="circle_arrow_up" unicode="&#xf0aa;" 
+d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640
+q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="circle_arrow_down" unicode="&#xf0ab;" 
+d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640
+q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="globe" unicode="&#xf0ac;" 
+d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11
+q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 11t-9.5 10q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5
+q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5
+q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5
+t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-4 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3
+q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25
+q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5
+t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5
+t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10.5t17 -19.5q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21
+q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5
+q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3
+q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5
+t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q8 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5
+q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7
+q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
+    <glyph glyph-name="wrench" unicode="&#xf0ad;" horiz-adv-x="1664" 
+d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5
+t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
+    <glyph glyph-name="tasks" unicode="&#xf0ae;" horiz-adv-x="1792" 
+d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19
+t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="filter" unicode="&#xf0b0;" horiz-adv-x="1408" 
+d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
+    <glyph glyph-name="briefcase" unicode="&#xf0b1;" horiz-adv-x="1792" 
+d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68
+t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
+    <glyph glyph-name="fullscreen" unicode="&#xf0b2;" 
+d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144
+l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z
+" />
+    <glyph glyph-name="group" unicode="&#xf0c0;" horiz-adv-x="1920" 
+d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5
+t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75
+t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5
+t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
+    <glyph glyph-name="link" unicode="&#xf0c1;" horiz-adv-x="1664" 
+d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26
+l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15
+t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207
+q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
+    <glyph glyph-name="cloud" unicode="&#xf0c2;" horiz-adv-x="1920" 
+d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z
+" />
+    <glyph glyph-name="beaker" unicode="&#xf0c3;" horiz-adv-x="1664" 
+d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
+    <glyph glyph-name="cut" unicode="&#xf0c4;" horiz-adv-x="1792" 
+d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84
+q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148
+q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108
+q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6
+q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
+    <glyph glyph-name="copy" unicode="&#xf0c5;" horiz-adv-x="1792" 
+d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299
+h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
+    <glyph glyph-name="paper_clip" unicode="&#xf0c6;" horiz-adv-x="1408" 
+d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181
+l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235
+z" />
+    <glyph glyph-name="save" unicode="&#xf0c7;" 
+d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5
+h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
+    <glyph glyph-name="sign_blank" unicode="&#xf0c8;" 
+d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="reorder" unicode="&#xf0c9;" 
+d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45
+t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="ul" unicode="&#xf0ca;" horiz-adv-x="1792" 
+d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5
+t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z
+M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+    <glyph glyph-name="ol" unicode="&#xf0cb;" horiz-adv-x="1792" 
+d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362
+q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5
+t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 121.5t0.5 121.5v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216
+q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+    <glyph glyph-name="strikethrough" unicode="&#xf0cc;" horiz-adv-x="1792" 
+d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 98 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6
+l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -56 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23
+l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
+    <glyph glyph-name="underline" unicode="&#xf0cd;" 
+d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47
+q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41
+q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472
+q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
+    <glyph glyph-name="table" unicode="&#xf0ce;" horiz-adv-x="1664" 
+d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23
+v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192
+q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192
+q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113
+z" />
+    <glyph glyph-name="magic" unicode="&#xf0d0;" horiz-adv-x="1664" 
+d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276
+l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
+    <glyph glyph-name="truck" unicode="&#xf0d1;" horiz-adv-x="1792" 
+d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5
+t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38
+t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="pinterest" unicode="&#xf0d2;" 
+d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134
+q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33
+q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="pinterest_sign" unicode="&#xf0d3;" 
+d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5
+t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5
+t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
+    <glyph glyph-name="google_plus_sign" unicode="&#xf0d4;" 
+d="M917 631q0 26 -6 64h-362v-132h217q-3 -24 -16.5 -50t-37.5 -53t-66.5 -44.5t-96.5 -17.5q-99 0 -169 71t-70 171t70 171t169 71q92 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585
+h109v110h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="google_plus" unicode="&#xf0d5;" horiz-adv-x="2304" 
+d="M1437 623q0 -208 -87 -370.5t-248 -254t-369 -91.5q-149 0 -285 58t-234 156t-156 234t-58 285t58 285t156 234t234 156t285 58q286 0 491 -192l-199 -191q-117 113 -292 113q-123 0 -227.5 -62t-165.5 -168.5t-61 -232.5t61 -232.5t165.5 -168.5t227.5 -62
+q83 0 152.5 23t114.5 57.5t78.5 78.5t49 83t21.5 74h-416v252h692q12 -63 12 -122zM2304 745v-210h-209v-209h-210v209h-209v210h209v209h210v-209h209z" />
+    <glyph glyph-name="money" unicode="&#xf0d6;" horiz-adv-x="1920" 
+d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384
+v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="caret_down" unicode="&#xf0d7;" horiz-adv-x="1024" 
+d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="caret_up" unicode="&#xf0d8;" horiz-adv-x="1024" 
+d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+    <glyph glyph-name="caret_left" unicode="&#xf0d9;" horiz-adv-x="640" 
+d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
+    <glyph glyph-name="caret_right" unicode="&#xf0da;" horiz-adv-x="640" 
+d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
+    <glyph glyph-name="columns" unicode="&#xf0db;" horiz-adv-x="1664" 
+d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
+    <glyph glyph-name="sort" unicode="&#xf0dc;" horiz-adv-x="1024" 
+d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+    <glyph glyph-name="sort_down" unicode="&#xf0dd;" horiz-adv-x="1024" 
+d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="sort_up" unicode="&#xf0de;" horiz-adv-x="1024" 
+d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+    <glyph glyph-name="envelope_alt" unicode="&#xf0e0;" horiz-adv-x="1792" 
+d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123
+q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
+    <glyph glyph-name="linkedin" unicode="&#xf0e1;" 
+d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329
+q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
+    <glyph glyph-name="undo" unicode="&#xf0e2;" 
+d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5
+t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
+    <glyph glyph-name="legal" unicode="&#xf0e3;" horiz-adv-x="1792" 
+d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5
+t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14
+q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28
+q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
+    <glyph glyph-name="dashboard" unicode="&#xf0e4;" horiz-adv-x="1792" 
+d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5
+t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5
+t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29
+q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+    <glyph glyph-name="comment_alt" unicode="&#xf0e5;" horiz-adv-x="1792" 
+d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640
+q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5
+t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+    <glyph glyph-name="comments_alt" unicode="&#xf0e6;" horiz-adv-x="1792" 
+d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257
+t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5
+t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129
+q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
+    <glyph glyph-name="bolt" unicode="&#xf0e7;" horiz-adv-x="896" 
+d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
+    <glyph glyph-name="sitemap" unicode="&#xf0e8;" horiz-adv-x="1792" 
+d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320
+q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68
+z" />
+    <glyph glyph-name="umbrella" unicode="&#xf0e9;" horiz-adv-x="1664" 
+d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97
+q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69
+q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
+    <glyph glyph-name="paste" unicode="&#xf0ea;" horiz-adv-x="1792" 
+d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28
+h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
+    <glyph glyph-name="light_bulb" unicode="&#xf0eb;" horiz-adv-x="1024" 
+d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134
+q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47
+q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5
+t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
+    <glyph glyph-name="exchange" unicode="&#xf0ec;" horiz-adv-x="1792" 
+d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9
+q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+    <glyph glyph-name="cloud_download" unicode="&#xf0ed;" horiz-adv-x="1920" 
+d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088
+q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+    <glyph glyph-name="cloud_upload" unicode="&#xf0ee;" horiz-adv-x="1920" 
+d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088
+q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+    <glyph glyph-name="user_md" unicode="&#xf0f0;" horiz-adv-x="1408" 
+d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56
+t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68
+t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5
+t271.5 -112.5t112.5 -271.5z" />
+    <glyph glyph-name="stethoscope" unicode="&#xf0f1;" horiz-adv-x="1408" 
+d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48
+t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252
+t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
+    <glyph glyph-name="suitcase" unicode="&#xf0f2;" horiz-adv-x="1792" 
+d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66
+t66 -158z" />
+    <glyph glyph-name="bell_alt" unicode="&#xf0f3;" horiz-adv-x="1792" 
+d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5
+t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+    <glyph glyph-name="coffee" unicode="&#xf0f4;" horiz-adv-x="1920" 
+d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45
+t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
+    <glyph glyph-name="food" unicode="&#xf0f5;" horiz-adv-x="1408" 
+d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45
+t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="file_text_alt" unicode="&#xf0f6;" 
+d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
+M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704
+q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" />
+    <glyph glyph-name="building" unicode="&#xf0f7;" horiz-adv-x="1408" 
+d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="hospital" unicode="&#xf0f8;" horiz-adv-x="1408" 
+d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
+M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5
+t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320
+v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="ambulance" unicode="&#xf0f9;" horiz-adv-x="1920" 
+d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5
+t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152
+q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="medkit" unicode="&#xf0fa;" horiz-adv-x="1792" 
+d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32
+q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
+    <glyph glyph-name="fighter_jet" unicode="&#xf0fb;" horiz-adv-x="1920" 
+d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96
+q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q128 -28 200 -52t80 -34z" />
+    <glyph glyph-name="beer" unicode="&#xf0fc;" horiz-adv-x="1664" 
+d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
+    <glyph glyph-name="h_sign" unicode="&#xf0fd;" 
+d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960
+q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="f0fe" unicode="&#xf0fe;" 
+d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960
+q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="double_angle_left" unicode="&#xf100;" horiz-adv-x="1024" 
+d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23
+t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
+    <glyph glyph-name="double_angle_right" unicode="&#xf101;" horiz-adv-x="1024" 
+d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23
+l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+    <glyph glyph-name="double_angle_up" unicode="&#xf102;" horiz-adv-x="1152" 
+d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393
+q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+    <glyph glyph-name="double_angle_down" unicode="&#xf103;" horiz-adv-x="1152" 
+d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23
+t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+    <glyph glyph-name="angle_left" unicode="&#xf104;" horiz-adv-x="640" 
+d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+    <glyph glyph-name="angle_right" unicode="&#xf105;" horiz-adv-x="640" 
+d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+    <glyph glyph-name="angle_up" unicode="&#xf106;" horiz-adv-x="1152" 
+d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+    <glyph glyph-name="angle_down" unicode="&#xf107;" horiz-adv-x="1152" 
+d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+    <glyph glyph-name="desktop" unicode="&#xf108;" horiz-adv-x="1920" 
+d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19
+t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+    <glyph glyph-name="laptop" unicode="&#xf109;" horiz-adv-x="1920" 
+d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z
+M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
+    <glyph glyph-name="tablet" unicode="&#xf10a;" horiz-adv-x="1152" 
+d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832
+q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
+    <glyph glyph-name="mobile_phone" unicode="&#xf10b;" horiz-adv-x="768" 
+d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136
+q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+    <glyph glyph-name="circle_blank" unicode="&#xf10c;" 
+d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103
+t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="quote_left" unicode="&#xf10d;" horiz-adv-x="1664" 
+d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z
+M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
+    <glyph glyph-name="quote_right" unicode="&#xf10e;" horiz-adv-x="1664" 
+d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216
+v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
+    <glyph glyph-name="spinner" unicode="&#xf110;" horiz-adv-x="1792" 
+d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5
+t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-113 -47t-113 47t-47 113t47 113t113 47t113 -47t47 -113z
+M1728 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1088 1344q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1618 1138q0 -93 -66 -158.5t-158 -65.5q-93 0 -158.5 65.5t-65.5 158.5
+q0 92 65.5 158t158.5 66q92 0 158 -66t66 -158z" />
+    <glyph glyph-name="circle" unicode="&#xf111;" 
+d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="reply" unicode="&#xf112;" horiz-adv-x="1792" 
+d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19
+l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
+    <glyph glyph-name="github_alt" unicode="&#xf113;" horiz-adv-x="1664" 
+d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320
+q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86
+t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218
+q0 -87 -27 -168q136 -160 136 -398z" />
+    <glyph glyph-name="folder_close_alt" unicode="&#xf114;" horiz-adv-x="1664" 
+d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320
+q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+    <glyph glyph-name="folder_open_alt" unicode="&#xf115;" horiz-adv-x="1920" 
+d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68
+v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z
+" />
+    <glyph glyph-name="expand_alt" unicode="&#xf116;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="collapse_alt" unicode="&#xf117;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="smile" unicode="&#xf118;" 
+d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5
+t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5
+t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="frown" unicode="&#xf119;" 
+d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5
+t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204
+t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="meh" unicode="&#xf11a;" 
+d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5
+t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640
+q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="gamepad" unicode="&#xf11b;" horiz-adv-x="1920" 
+d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5
+t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150
+t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
+    <glyph glyph-name="keyboard" unicode="&#xf11c;" horiz-adv-x="1920" 
+d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16
+h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16
+h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96
+q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896
+h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
+    <glyph glyph-name="flag_alt" unicode="&#xf11d;" horiz-adv-x="1792" 
+d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9
+h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102
+q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+    <glyph glyph-name="flag_checkered" unicode="&#xf11e;" horiz-adv-x="1792" 
+d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2
+q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266
+q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8
+q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+    <glyph glyph-name="terminal" unicode="&#xf120;" horiz-adv-x="1664" 
+d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9
+t9 -23z" />
+    <glyph glyph-name="code" unicode="&#xf121;" horiz-adv-x="1920" 
+d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5
+l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
+    <glyph glyph-name="reply_all" unicode="&#xf122;" horiz-adv-x="1792" 
+d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1
+q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
+    <glyph glyph-name="star_half_empty" unicode="&#xf123;" horiz-adv-x="1664" 
+d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5
+l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
+    <glyph glyph-name="location_arrow" unicode="&#xf124;" horiz-adv-x="1408" 
+d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
+    <glyph glyph-name="crop" unicode="&#xf125;" horiz-adv-x="1664" 
+d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23
+v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
+    <glyph glyph-name="code_fork" unicode="&#xf126;" horiz-adv-x="1024" 
+d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5
+q-2 -287 -226 -414q-67 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497
+q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
+    <glyph glyph-name="unlink" unicode="&#xf127;" horiz-adv-x="1664" 
+d="M439 265l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320
+q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18
+l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9
+t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+    <glyph glyph-name="question" unicode="&#xf128;" horiz-adv-x="1024" 
+d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5
+t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
+    <glyph glyph-name="_279" unicode="&#xf129;" horiz-adv-x="640" 
+d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192
+q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="exclamation" unicode="&#xf12a;" horiz-adv-x="640" 
+d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
+    <glyph glyph-name="superscript" unicode="&#xf12b;" 
+d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z
+M1534 846v-206h-514l-3 27q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5
+t-65.5 -51.5t-30.5 -63h232v80h126z" />
+    <glyph glyph-name="subscript" unicode="&#xf12c;" 
+d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3q-1 -3 -2.5 -6.5t-3.5 -8t-3 -6.5q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109z
+M1536 -50v-206h-514l-4 27q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73
+h232v80h126z" />
+    <glyph glyph-name="_283" unicode="&#xf12d;" horiz-adv-x="1920" 
+d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
+    <glyph glyph-name="puzzle_piece" unicode="&#xf12e;" horiz-adv-x="1664" 
+d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5
+t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89
+q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117
+q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
+    <glyph glyph-name="microphone" unicode="&#xf130;" horiz-adv-x="1152" 
+d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5
+t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
+    <glyph glyph-name="microphone_off" unicode="&#xf131;" horiz-adv-x="1408" 
+d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128
+q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23
+t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
+    <glyph glyph-name="shield" unicode="&#xf132;" horiz-adv-x="1280" 
+d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150
+t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="calendar_empty" unicode="&#xf133;" horiz-adv-x="1664" 
+d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280
+q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+    <glyph glyph-name="fire_extinguisher" unicode="&#xf134;" horiz-adv-x="1408" 
+d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800
+q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113
+q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
+    <glyph glyph-name="rocket" unicode="&#xf135;" horiz-adv-x="1664" 
+d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1
+q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
+    <glyph glyph-name="maxcdn" unicode="&#xf136;" horiz-adv-x="1792" 
+d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
+    <glyph glyph-name="chevron_sign_left" unicode="&#xf137;" 
+d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
+t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="chevron_sign_right" unicode="&#xf138;" 
+d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
+t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="chevron_sign_up" unicode="&#xf139;" 
+d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
+t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="chevron_sign_down" unicode="&#xf13a;" 
+d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
+t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="html5" unicode="&#xf13b;" horiz-adv-x="1408" 
+d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
+    <glyph glyph-name="css3" unicode="&#xf13c;" horiz-adv-x="1792" 
+d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
+    <glyph glyph-name="anchor" unicode="&#xf13d;" horiz-adv-x="1792" 
+d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352
+q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19
+t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
+    <glyph glyph-name="unlock_alt" unicode="&#xf13e;" horiz-adv-x="1152" 
+d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181
+v-320h736z" />
+    <glyph glyph-name="bullseye" unicode="&#xf140;" 
+d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150
+t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640
+q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="ellipsis_horizontal" unicode="&#xf141;" horiz-adv-x="1408" 
+d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192
+q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+    <glyph glyph-name="ellipsis_vertical" unicode="&#xf142;" horiz-adv-x="384" 
+d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192
+q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+    <glyph glyph-name="_303" unicode="&#xf143;" 
+d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 233 -176.5 396.5t-396.5 176.5q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128
+q13 0 23 10t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960
+q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="play_sign" unicode="&#xf144;" 
+d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56
+q16 -8 32 -8q17 0 32 9z" />
+    <glyph glyph-name="ticket" unicode="&#xf145;" horiz-adv-x="1792" 
+d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136
+t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
+    <glyph glyph-name="minus_sign_alt" unicode="&#xf146;" 
+d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5
+t84.5 -203.5z" />
+    <glyph glyph-name="check_minus" unicode="&#xf147;" horiz-adv-x="1408" 
+d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5
+t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="level_up" unicode="&#xf148;" horiz-adv-x="1024" 
+d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
+    <glyph glyph-name="level_down" unicode="&#xf149;" horiz-adv-x="1024" 
+d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
+    <glyph glyph-name="check_sign" unicode="&#xf14a;" 
+d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5
+t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="edit_sign" unicode="&#xf14b;" 
+d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120
+v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="_312" unicode="&#xf14c;" 
+d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960
+q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="share_sign" unicode="&#xf14d;" 
+d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q11 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5
+t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="compass" unicode="&#xf14e;" 
+d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
+t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="collapse" unicode="&#xf150;" 
+d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120
+v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="collapse_top" unicode="&#xf151;" 
+d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960
+q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="_317" unicode="&#xf152;" 
+d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5
+t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="eur" unicode="&#xf153;" horiz-adv-x="1024" 
+d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9
+t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26
+l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
+    <glyph glyph-name="gbp" unicode="&#xf154;" horiz-adv-x="1024" 
+d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7
+q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
+    <glyph glyph-name="usd" unicode="&#xf155;" horiz-adv-x="1024" 
+d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43
+t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5
+t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50
+t53 -63.5t31.5 -76.5t13 -94z" />
+    <glyph glyph-name="inr" unicode="&#xf156;" horiz-adv-x="898" 
+d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102
+q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
+    <glyph glyph-name="jpy" unicode="&#xf157;" horiz-adv-x="1027" 
+d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61
+l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
+    <glyph glyph-name="rub" unicode="&#xf158;" horiz-adv-x="1280" 
+d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128
+q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
+    <glyph glyph-name="krw" unicode="&#xf159;" horiz-adv-x="1792" 
+d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23
+t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28
+q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
+    <glyph glyph-name="btc" unicode="&#xf15a;" horiz-adv-x="1280" 
+d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164
+l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30
+t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
+    <glyph glyph-name="file" unicode="&#xf15b;" 
+d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" />
+    <glyph glyph-name="file_text" unicode="&#xf15c;" 
+d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704
+q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" />
+    <glyph glyph-name="sort_by_alphabet" unicode="&#xf15d;" horiz-adv-x="1664" 
+d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23
+v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162
+l230 -662h70z" />
+    <glyph glyph-name="_329" unicode="&#xf15e;" horiz-adv-x="1664" 
+d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150
+v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248
+v119h121z" />
+    <glyph glyph-name="sort_by_attributes" unicode="&#xf160;" horiz-adv-x="1792" 
+d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832
+q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256
+q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
+    <glyph glyph-name="sort_by_attributes_alt" unicode="&#xf161;" horiz-adv-x="1792" 
+d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192
+q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832
+q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
+    <glyph glyph-name="sort_by_order" unicode="&#xf162;" 
+d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23
+zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5
+t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
+    <glyph glyph-name="sort_by_order_alt" unicode="&#xf163;" 
+d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9
+t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13
+q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
+    <glyph glyph-name="_334" unicode="&#xf164;" horiz-adv-x="1664" 
+d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76
+q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5
+t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
+    <glyph glyph-name="_335" unicode="&#xf165;" horiz-adv-x="1664" 
+d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135
+t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121
+t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
+    <glyph glyph-name="youtube_sign" unicode="&#xf166;" 
+d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 17 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15
+q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38
+q21 -29 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5
+q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78q7 -23 23 -69l24 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38
+q-51 0 -78 -38q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5
+h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="youtube" unicode="&#xf167;" 
+d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73
+q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51
+q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99
+q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-38 -51 -106 -51q-67 0 -105 51
+q-28 38 -28 118v175q0 80 28 117q38 51 105 51q68 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
+    <glyph glyph-name="xing" unicode="&#xf168;" horiz-adv-x="1408" 
+d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942
+q25 45 64 45h241q22 0 31 -15z" />
+    <glyph glyph-name="xing_sign" unicode="&#xf169;" 
+d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1
+l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="youtube_play" unicode="&#xf16a;" horiz-adv-x="1792" 
+d="M711 408l484 250l-484 253v-503zM896 1270q168 0 324.5 -4.5t229.5 -9.5l73 -4q1 0 17 -1.5t23 -3t23.5 -4.5t28.5 -8t28 -13t31 -19.5t29 -26.5q6 -6 15.5 -18.5t29 -58.5t26.5 -101q8 -64 12.5 -136.5t5.5 -113.5v-40v-136q1 -145 -18 -290q-7 -55 -25 -99.5t-32 -61.5
+l-14 -17q-14 -15 -29 -26.5t-31 -19t-28 -12.5t-28.5 -8t-24 -4.5t-23 -3t-16.5 -1.5q-251 -19 -627 -19q-207 2 -359.5 6.5t-200.5 7.5l-49 4l-36 4q-36 5 -54.5 10t-51 21t-56.5 41q-6 6 -15.5 18.5t-29 58.5t-26.5 101q-8 64 -12.5 136.5t-5.5 113.5v40v136
+q-1 145 18 290q7 55 25 99.5t32 61.5l14 17q14 15 29 26.5t31 19.5t28 13t28.5 8t23.5 4.5t23 3t17 1.5q251 18 627 18z" />
+    <glyph glyph-name="dropbox" unicode="&#xf16b;" horiz-adv-x="1792" 
+d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
+    <glyph glyph-name="stackexchange" unicode="&#xf16c;" 
+d="M1289 -96h-1118v480h-160v-640h1438v640h-160v-480zM347 428l33 157l783 -165l-33 -156zM450 802l67 146l725 -339l-67 -145zM651 1158l102 123l614 -513l-102 -123zM1048 1536l477 -641l-128 -96l-477 641zM330 65v159h800v-159h-800z" />
+    <glyph glyph-name="instagram" unicode="&#xf16d;" 
+d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1162 640q0 -164 -115 -279t-279 -115t-279 115t-115 279t115 279t279 115t279 -115t115 -279zM1270 1050q0 -38 -27 -65t-65 -27t-65 27t-27 65t27 65t65 27t65 -27t27 -65zM768 1270
+q-7 0 -76.5 0.5t-105.5 0t-96.5 -3t-103 -10t-71.5 -18.5q-50 -20 -88 -58t-58 -88q-11 -29 -18.5 -71.5t-10 -103t-3 -96.5t0 -105.5t0.5 -76.5t-0.5 -76.5t0 -105.5t3 -96.5t10 -103t18.5 -71.5q20 -50 58 -88t88 -58q29 -11 71.5 -18.5t103 -10t96.5 -3t105.5 0t76.5 0.5
+t76.5 -0.5t105.5 0t96.5 3t103 10t71.5 18.5q50 20 88 58t58 88q11 29 18.5 71.5t10 103t3 96.5t0 105.5t-0.5 76.5t0.5 76.5t0 105.5t-3 96.5t-10 103t-18.5 71.5q-20 50 -58 88t-88 58q-29 11 -71.5 18.5t-103 10t-96.5 3t-105.5 0t-76.5 -0.5zM1536 640q0 -229 -5 -317
+q-10 -208 -124 -322t-322 -124q-88 -5 -317 -5t-317 5q-208 10 -322 124t-124 322q-5 88 -5 317t5 317q10 208 124 322t322 124q88 5 317 5t317 -5q208 -10 322 -124t124 -322q5 -88 5 -317z" />
+    <glyph glyph-name="flickr" unicode="&#xf16e;" 
+d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150
+t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
+    <glyph glyph-name="adn" unicode="&#xf170;" 
+d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="f171" unicode="&#xf171;" horiz-adv-x="1408" 
+d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22
+t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18
+t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5
+t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
+    <glyph glyph-name="bitbucket_sign" unicode="&#xf172;" 
+d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5
+t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z
+M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120
+v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="tumblr" unicode="&#xf173;" horiz-adv-x="1024" 
+d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14
+q78 2 134 29z" />
+    <glyph glyph-name="tumblr_sign" unicode="&#xf174;" 
+d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z
+M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="long_arrow_down" unicode="&#xf175;" horiz-adv-x="768" 
+d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
+    <glyph glyph-name="long_arrow_up" unicode="&#xf176;" horiz-adv-x="768" 
+d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
+    <glyph glyph-name="long_arrow_left" unicode="&#xf177;" horiz-adv-x="1792" 
+d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
+    <glyph glyph-name="long_arrow_right" unicode="&#xf178;" horiz-adv-x="1792" 
+d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
+    <glyph glyph-name="apple" unicode="&#xf179;" horiz-adv-x="1408" 
+d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q113 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65
+q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
+    <glyph glyph-name="windows" unicode="&#xf17a;" horiz-adv-x="1664" 
+d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
+    <glyph glyph-name="android" unicode="&#xf17b;" horiz-adv-x="1408" 
+d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30
+t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5
+h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
+    <glyph glyph-name="linux" unicode="&#xf17c;" 
+d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-10 -11 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z
+M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7
+q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15
+q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5
+t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19
+q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63
+q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18q-2 -1 -4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92
+q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152
+q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-6 0 -8 -2t0 -4
+t5 -3q14 -4 18 -31q0 -3 8 2q2 2 2 3zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5
+t-30 -18.5t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43
+q-19 4 -51 9.5t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49
+t-14 -48q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54
+q110 143 124 195q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5
+t-40.5 -33.5t-61 -14q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5
+t15.5 47.5q1 -31 8 -56.5t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
+    <glyph glyph-name="dribble" unicode="&#xf17d;" 
+d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81
+t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19
+q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -5 6.5 -17t7.5 -17q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6
+t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="skype" unicode="&#xf17e;" 
+d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5
+t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5
+q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80
+q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
+    <glyph glyph-name="foursquare" unicode="&#xf180;" horiz-adv-x="1280" 
+d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z
+M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324
+l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" />
+    <glyph glyph-name="trello" unicode="&#xf181;" 
+d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408
+q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="female" unicode="&#xf182;" horiz-adv-x="1280" 
+d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43
+q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+    <glyph glyph-name="male" unicode="&#xf183;" horiz-adv-x="1024" 
+d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z
+M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+    <glyph glyph-name="gittip" unicode="&#xf184;" 
+d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
+t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="sun" unicode="&#xf185;" horiz-adv-x="1792" 
+d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4
+l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94
+q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
+    <glyph glyph-name="_366" unicode="&#xf186;" 
+d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61
+t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
+    <glyph glyph-name="archive" unicode="&#xf187;" horiz-adv-x="1792" 
+d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536
+q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="bug" unicode="&#xf188;" horiz-adv-x="1664" 
+d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207
+q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19
+t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
+    <glyph glyph-name="vk" unicode="&#xf189;" horiz-adv-x="1920" 
+d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-40 -51 -55 -72t-30.5 -49.5t-12 -42t13 -34.5t32.5 -43t57 -53q4 -2 5 -4q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58
+t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6
+q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q16 19 38 30q53 26 239 24
+q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2
+q39 5 64 -2.5t31 -16.5z" />
+    <glyph glyph-name="weibo" unicode="&#xf18a;" horiz-adv-x="1792" 
+d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12
+q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422
+q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178
+q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z
+M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
+    <glyph glyph-name="renren" unicode="&#xf18b;" 
+d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495
+q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
+    <glyph glyph-name="_372" unicode="&#xf18c;" horiz-adv-x="1408" 
+d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5
+t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56
+t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -4 1 -50t-1 -72q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5
+t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
+    <glyph glyph-name="stack_exchange" unicode="&#xf18d;" horiz-adv-x="1280" 
+d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z
+" />
+    <glyph glyph-name="_374" unicode="&#xf18e;" 
+d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198
+t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="arrow_circle_alt_left" unicode="&#xf190;" 
+d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198
+t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="_376" unicode="&#xf191;" 
+d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z
+M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="dot_circle_alt" unicode="&#xf192;" 
+d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5
+t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="_378" unicode="&#xf193;" horiz-adv-x="1664" 
+d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128
+q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 17 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
+    <glyph glyph-name="vimeo_square" unicode="&#xf194;" 
+d="M1292 898q10 216 -161 222q-231 8 -312 -261q44 19 82 19q85 0 74 -96q-4 -57 -74 -167t-105 -110q-43 0 -82 169q-13 54 -45 255q-30 189 -160 177q-59 -7 -164 -100l-81 -72l-81 -72l52 -67q76 52 87 52q57 0 107 -179q15 -55 45 -164.5t45 -164.5q68 -179 164 -179
+q157 0 383 294q220 283 226 444zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="_380" unicode="&#xf195;" horiz-adv-x="1152" 
+d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160
+q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+    <glyph glyph-name="plus_square_o" unicode="&#xf196;" horiz-adv-x="1408" 
+d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832
+q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="_382" unicode="&#xf197;" horiz-adv-x="2176" 
+d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40
+t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29
+q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" />
+    <glyph glyph-name="_383" unicode="&#xf198;" horiz-adv-x="1664" 
+d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9
+q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102
+t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" />
+    <glyph glyph-name="_384" unicode="&#xf199;" 
+d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69
+q-47 32 -142 92.5t-142 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13
+t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" />
+    <glyph glyph-name="_385" unicode="&#xf19a;" horiz-adv-x="1792" 
+d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5
+t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21
+t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286
+t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273
+t273 -182.5t331.5 -68z" />
+    <glyph glyph-name="_386" unicode="&#xf19b;" horiz-adv-x="1792" 
+d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" />
+    <glyph glyph-name="_387" unicode="&#xf19c;" horiz-adv-x="2048" 
+d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64
+q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" />
+    <glyph glyph-name="_388" unicode="&#xf19d;" horiz-adv-x="2304" 
+d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433
+q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" />
+    <glyph glyph-name="_389" unicode="&#xf19e;" 
+d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q44 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0
+q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" />
+    <glyph glyph-name="uniF1A0" unicode="&#xf1a0;" 
+d="M768 750h725q12 -67 12 -128q0 -217 -91 -387.5t-259.5 -266.5t-386.5 -96q-157 0 -299 60.5t-245 163.5t-163.5 245t-60.5 299t60.5 299t163.5 245t245 163.5t299 60.5q300 0 515 -201l-209 -201q-123 119 -306 119q-129 0 -238.5 -65t-173.5 -176.5t-64 -243.5
+t64 -243.5t173.5 -176.5t238.5 -65q87 0 160 24t120 60t82 82t51.5 87t22.5 78h-436v264z" />
+    <glyph glyph-name="f1a1" unicode="&#xf1a1;" horiz-adv-x="1792" 
+d="M1095 369q16 -16 0 -31q-62 -62 -199 -62t-199 62q-16 15 0 31q6 6 15 6t15 -6q48 -49 169 -49q120 0 169 49q6 6 15 6t15 -6zM788 550q0 -37 -26 -63t-63 -26t-63.5 26t-26.5 63q0 38 26.5 64t63.5 26t63 -26.5t26 -63.5zM1183 550q0 -37 -26.5 -63t-63.5 -26t-63 26
+t-26 63t26 63.5t63 26.5t63.5 -26t26.5 -64zM1434 670q0 49 -35 84t-85 35t-86 -36q-130 90 -311 96l63 283l200 -45q0 -37 26 -63t63 -26t63.5 26.5t26.5 63.5t-26.5 63.5t-63.5 26.5q-54 0 -80 -50l-221 49q-19 5 -25 -16l-69 -312q-180 -7 -309 -97q-35 37 -87 37
+q-50 0 -85 -35t-35 -84q0 -35 18.5 -64t49.5 -44q-6 -27 -6 -56q0 -142 140 -243t337 -101q198 0 338 101t140 243q0 32 -7 57q30 15 48 43.5t18 63.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191
+t348 71t348 -71t286 -191t191 -286t71 -348z" />
+    <glyph glyph-name="_392" unicode="&#xf1a2;" 
+d="M939 407q13 -13 0 -26q-53 -53 -171 -53t-171 53q-13 13 0 26q5 6 13 6t13 -6q42 -42 145 -42t145 42q5 6 13 6t13 -6zM676 563q0 -31 -23 -54t-54 -23t-54 23t-23 54q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1014 563q0 -31 -23 -54t-54 -23t-54 23t-23 54
+q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1229 666q0 42 -30 72t-73 30q-42 0 -73 -31q-113 78 -267 82l54 243l171 -39q1 -32 23.5 -54t53.5 -22q32 0 54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5q-48 0 -69 -43l-189 42q-17 5 -21 -13l-60 -268q-154 -6 -265 -83
+q-30 32 -74 32q-43 0 -73 -30t-30 -72q0 -30 16 -55t42 -38q-5 -25 -5 -48q0 -122 120 -208.5t289 -86.5q170 0 290 86.5t120 208.5q0 25 -6 49q25 13 40.5 37.5t15.5 54.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960
+q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="_393" unicode="&#xf1a3;" 
+d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150
+v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103
+t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="f1a4" unicode="&#xf1a4;" horiz-adv-x="1920" 
+d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328
+v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" />
+    <glyph glyph-name="_395" unicode="&#xf1a5;" 
+d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5
+t84.5 -203.5z" />
+    <glyph glyph-name="_396" unicode="&#xf1a6;" horiz-adv-x="2048" 
+d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123
+v-369h123z" />
+    <glyph glyph-name="_397" unicode="&#xf1a7;" 
+d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101
+v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960
+q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="_398" unicode="&#xf1a8;" horiz-adv-x="2038" 
+d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14
+q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24
+q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33
+q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5
+t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43
+q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5
+t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13
+t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" />
+    <glyph glyph-name="_399" unicode="&#xf1a9;" 
+d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10
+q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14
+q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14
+t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44
+q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" />
+    <glyph glyph-name="_400" unicode="&#xf1aa;" 
+d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z
+M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5
+t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5
+q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126
+t135.5 51q85 0 145 -60.5t60 -145.5z" />
+    <glyph glyph-name="f1ab" unicode="&#xf1ab;" 
+d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5
+q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28
+q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z
+M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11
+q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q107 36 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5
+q20 0 20 -21v-418z" />
+    <glyph glyph-name="_402" unicode="&#xf1ac;" horiz-adv-x="1792" 
+d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48
+l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23
+t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128
+q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128
+q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" />
+    <glyph glyph-name="_403" unicode="&#xf1ad;" 
+d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9
+t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64
+q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64
+q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9
+t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64
+q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64
+q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9
+t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" />
+    <glyph glyph-name="_404" unicode="&#xf1ae;" horiz-adv-x="1280" 
+d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68q29 28 68.5 28t67.5 -28l228 -228h368l228 228q28 28 68 28t68 -28q28 -29 28 -68.5t-28 -67.5zM864 1152
+q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+    <glyph glyph-name="uniF1B1" unicode="&#xf1b0;" horiz-adv-x="1664" 
+d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5
+q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819
+q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5
+t100.5 134t141.5 55.5z" />
+    <glyph glyph-name="_406" unicode="&#xf1b1;" horiz-adv-x="768" 
+d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" />
+    <glyph glyph-name="_407" unicode="&#xf1b2;" horiz-adv-x="1792" 
+d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z
+" />
+    <glyph glyph-name="_408" unicode="&#xf1b3;" horiz-adv-x="2304" 
+d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67
+t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-4 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70
+v-400l434 -186q36 -16 57 -48t21 -70z" />
+    <glyph glyph-name="_409" unicode="&#xf1b4;" horiz-adv-x="2048" 
+d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658
+q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204
+q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" />
+    <glyph glyph-name="_410" unicode="&#xf1b5;" 
+d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5
+t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217
+t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" />
+    <glyph glyph-name="_411" unicode="&#xf1b6;" horiz-adv-x="1792" 
+d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5
+q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89
+q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" />
+    <glyph glyph-name="_412" unicode="&#xf1b7;" 
+d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5
+q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5
+q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z
+" />
+    <glyph glyph-name="_413" unicode="&#xf1b8;" horiz-adv-x="1792" 
+d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188
+l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5
+t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1
+q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" />
+    <glyph glyph-name="_414" unicode="&#xf1b9;" horiz-adv-x="2048" 
+d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384
+q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5
+l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" />
+    <glyph glyph-name="_415" unicode="&#xf1ba;" horiz-adv-x="2048" 
+d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5
+t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z
+M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" />
+    <glyph glyph-name="_416" unicode="&#xf1bb;" 
+d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384
+q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" />
+    <glyph glyph-name="_417" unicode="&#xf1bc;" 
+d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64
+q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37
+q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="_418" unicode="&#xf1bd;" horiz-adv-x="1024" 
+d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273l-30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273l30 30h301v-303z" />
+    <glyph glyph-name="_419" unicode="&#xf1be;" horiz-adv-x="2304" 
+d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11
+q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245
+q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785
+l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242
+q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236
+q0 -11 -8 -19t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786
+q-13 2 -22 11t-9 22v899q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" />
+    <glyph glyph-name="uniF1C0" unicode="&#xf1c0;" 
+d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127
+t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5
+t-103 128v128q0 69 103 128t280 93.5t385 34.5z" />
+    <glyph glyph-name="uniF1C1" unicode="&#xf1c1;" 
+d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
+M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197
+q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8
+q-1 1 -1 2q-1 2 -1 3q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" />
+    <glyph glyph-name="_422" unicode="&#xf1c2;" 
+d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
+M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4q0 3 -0.5 6.5t-1.5 8t-1 6.5q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5
+t-3.5 -21.5l-4 -21h-4l-2 21q-2 26 -7 46l-99 438h90v107h-300z" />
+    <glyph glyph-name="_423" unicode="&#xf1c3;" 
+d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
+M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107
+h-290v-107h68l189 -272l-194 -283h-68z" />
+    <glyph glyph-name="_424" unicode="&#xf1c4;" 
+d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
+M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" />
+    <glyph glyph-name="_425" unicode="&#xf1c5;" 
+d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
+M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" />
+    <glyph glyph-name="_426" unicode="&#xf1c6;" 
+d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400
+v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79
+q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" />
+    <glyph glyph-name="_427" unicode="&#xf1c7;" 
+d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
+M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5
+q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" />
+    <glyph glyph-name="_428" unicode="&#xf1c8;" 
+d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
+M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" />
+    <glyph glyph-name="_429" unicode="&#xf1c9;" 
+d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
+M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243
+l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" />
+    <glyph glyph-name="_430" unicode="&#xf1ca;" 
+d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406
+q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" />
+    <glyph glyph-name="_431" unicode="&#xf1cb;" horiz-adv-x="1792" 
+d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546
+q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" />
+    <glyph glyph-name="_432" unicode="&#xf1cc;" horiz-adv-x="2048" 
+d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94
+q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55
+t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97l93 -108q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5t-85 -189.5z" />
+    <glyph glyph-name="_433" unicode="&#xf1cd;" horiz-adv-x="1792" 
+d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194
+q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5
+t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" />
+    <glyph glyph-name="_434" unicode="&#xf1ce;" horiz-adv-x="1792" 
+d="M1760 640q0 -176 -68.5 -336t-184 -275.5t-275.5 -184t-336 -68.5t-336 68.5t-275.5 184t-184 275.5t-68.5 336q0 213 97 398.5t265 305.5t374 151v-228q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5
+t136.5 204t51 248.5q0 230 -145.5 406t-366.5 221v228q206 -31 374 -151t265 -305.5t97 -398.5z" />
+    <glyph glyph-name="uniF1D0" unicode="&#xf1d0;" horiz-adv-x="1792" 
+d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41
+t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170
+t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136
+q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" />
+    <glyph glyph-name="uniF1D1" unicode="&#xf1d1;" horiz-adv-x="1792" 
+d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251
+l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162
+q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33
+q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5
+t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71
+t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+    <glyph glyph-name="uniF1D2" unicode="&#xf1d2;" 
+d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85
+q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392
+q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072
+q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="_438" unicode="&#xf1d3;" horiz-adv-x="1792" 
+d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58
+q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47
+q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171
+v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" />
+    <glyph glyph-name="_439" unicode="&#xf1d4;" 
+d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="uniF1D5" unicode="&#xf1d5;" horiz-adv-x="1280" 
+d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5
+t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153
+t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" />
+    <glyph glyph-name="uniF1D6" unicode="&#xf1d6;" horiz-adv-x="1792" 
+d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5
+q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20
+t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5
+t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" />
+    <glyph glyph-name="uniF1D7" unicode="&#xf1d7;" horiz-adv-x="2048" 
+d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25
+q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5
+q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109
+q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" />
+    <glyph glyph-name="_443" unicode="&#xf1d8;" horiz-adv-x="1792" 
+d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" />
+    <glyph glyph-name="_444" unicode="&#xf1d9;" horiz-adv-x="1792" 
+d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137
+l863 639l-478 -797z" />
+    <glyph glyph-name="_445" unicode="&#xf1da;" 
+d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5
+t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23
+t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" />
+    <glyph glyph-name="_446" unicode="&#xf1db;" 
+d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
+t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="_447" unicode="&#xf1dc;" horiz-adv-x="1792" 
+d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15
+t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2
+t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160
+q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5
+q0 -26 -12 -48t-36 -22z" />
+    <glyph glyph-name="_448" unicode="&#xf1dd;" horiz-adv-x="1280" 
+d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179
+q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" />
+    <glyph glyph-name="_449" unicode="&#xf1de;" 
+d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256
+q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" />
+    <glyph glyph-name="uniF1E0" unicode="&#xf1e0;" 
+d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5
+t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" />
+    <glyph glyph-name="_451" unicode="&#xf1e1;" 
+d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5
+t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="_452" unicode="&#xf1e2;" horiz-adv-x="1792" 
+d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5
+t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91
+q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9
+t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+    <glyph glyph-name="_453" unicode="&#xf1e3;" horiz-adv-x="1792" 
+d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323
+l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" />
+    <glyph glyph-name="_454" unicode="&#xf1e4;" horiz-adv-x="1792" 
+d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23
+v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192
+q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23
+zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5
+t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" />
+    <glyph glyph-name="_455" unicode="&#xf1e5;" horiz-adv-x="1792" 
+d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z
+M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" />
+    <glyph glyph-name="_456" unicode="&#xf1e6;" horiz-adv-x="1792" 
+d="M1755 1083q37 -38 37 -90.5t-37 -90.5l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234
+l401 400q38 37 91 37t90 -37z" />
+    <glyph glyph-name="_457" unicode="&#xf1e7;" horiz-adv-x="1792" 
+d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5
+t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z
+M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q4 -2 11.5 -7
+t10.5 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" />
+    <glyph glyph-name="_458" unicode="&#xf1e8;" horiz-adv-x="1792" 
+d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" />
+    <glyph glyph-name="_459" unicode="&#xf1e9;" 
+d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36
+q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q71 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5
+t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87
+q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" />
+    <glyph glyph-name="_460" unicode="&#xf1ea;" horiz-adv-x="2048" 
+d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19
+t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" />
+    <glyph glyph-name="_461" unicode="&#xf1eb;" horiz-adv-x="2048" 
+d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121
+q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z
+M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" />
+    <glyph glyph-name="_462" unicode="&#xf1ec;" horiz-adv-x="1792" 
+d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5
+t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5
+t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5
+t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z
+M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38
+h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" />
+    <glyph glyph-name="_463" unicode="&#xf1ed;" 
+d="M1519 890q18 -84 -4 -204q-87 -444 -565 -444h-44q-25 0 -44 -16.5t-24 -42.5l-4 -19l-55 -346l-2 -15q-5 -26 -24.5 -42.5t-44.5 -16.5h-251q-21 0 -33 15t-9 36q9 56 26.5 168t26.5 168t27 167.5t27 167.5q5 37 43 37h131q133 -2 236 21q175 39 287 144q102 95 155 246
+q24 70 35 133q1 6 2.5 7.5t3.5 1t6 -3.5q79 -59 98 -162zM1347 1172q0 -107 -46 -236q-80 -233 -302 -315q-113 -40 -252 -42q0 -1 -90 -1l-90 1q-100 0 -118 -96q-2 -8 -85 -530q-1 -10 -12 -10h-295q-22 0 -36.5 16.5t-11.5 38.5l232 1471q5 29 27.5 48t51.5 19h598
+q34 0 97.5 -13t111.5 -32q107 -41 163.5 -123t56.5 -196z" />
+    <glyph glyph-name="_464" unicode="&#xf1ee;" horiz-adv-x="1792" 
+d="M441 864q33 0 52 -26q266 -364 362 -774h-446q-127 441 -367 749q-12 16 -3 33.5t29 17.5h373zM1000 507q-49 -199 -125 -393q-79 310 -256 594q40 221 44 449q211 -340 337 -650zM1099 1216q235 -324 384.5 -698.5t184.5 -773.5h-451q-41 665 -553 1472h435zM1792 640
+q0 -424 -101 -812q-67 560 -359 1083q-25 301 -106 584q-4 16 5.5 28.5t25.5 12.5h359q21 0 38.5 -13t22.5 -33q115 -409 115 -850z" />
+    <glyph glyph-name="uniF1F0" unicode="&#xf1f0;" horiz-adv-x="2304" 
+d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27
+q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128
+q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+    <glyph glyph-name="_466" unicode="&#xf1f1;" horiz-adv-x="2304" 
+d="M1119 1195q-128 85 -281 85q-103 0 -197.5 -40.5t-162.5 -108.5t-108.5 -162t-40.5 -197q0 -104 40.5 -198t108.5 -162t162 -108.5t198 -40.5q153 0 281 85q-131 107 -178 265.5t0.5 316.5t177.5 265zM1152 1171q-126 -99 -172 -249.5t-0.5 -300.5t172.5 -249
+q127 99 172.5 249t-0.5 300.5t-172 249.5zM1185 1195q130 -107 177.5 -265.5t0.5 -317t-178 -264.5q128 -85 281 -85q104 0 198 40.5t162 108.5t108.5 162t40.5 198q0 103 -40.5 197t-108.5 162t-162.5 108.5t-197.5 40.5q-153 0 -281 -85zM1926 473h7v3h-17v-3h7v-17h3v17z
+M1955 456h4v20h-5l-6 -13l-6 13h-5v-20h3v15l6 -13h4l5 13v-15zM1947 16v-2h-2h-3v3h3h2v-1zM1947 7h3l-4 5h2l1 1q1 1 1 3t-1 3l-1 1h-3h-6v-13h3v5h1zM685 75q0 19 11 31t30 12q18 0 29 -12.5t11 -30.5q0 -19 -11 -31t-29 -12q-19 0 -30 12t-11 31zM1158 119q30 0 35 -32
+h-70q5 32 35 32zM1514 75q0 19 11 31t29 12t29.5 -12.5t11.5 -30.5q0 -19 -11 -31t-30 -12q-18 0 -29 12t-11 31zM1786 75q0 18 11.5 30.5t29.5 12.5t29.5 -12.5t11.5 -30.5q0 -19 -11.5 -31t-29.5 -12t-29.5 12.5t-11.5 30.5zM1944 3q-2 0 -4 1q-1 0 -3 2t-2 3q-1 2 -1 4
+q0 3 1 4q0 2 2 4l1 1q2 0 2 1q2 1 4 1q3 0 4 -1l4 -2l2 -4v-1q1 -2 1 -3l-1 -1v-3t-1 -1l-1 -2q-2 -2 -4 -2q-1 -1 -4 -1zM599 7h30v85q0 24 -14.5 38.5t-39.5 15.5q-32 0 -47 -24q-14 24 -45 24q-24 0 -39 -20v16h-30v-135h30v75q0 36 33 36q30 0 30 -36v-75h29v75
+q0 36 33 36q30 0 30 -36v-75zM765 7h29v68v67h-29v-16q-17 20 -43 20q-29 0 -48 -20t-19 -51t19 -51t48 -20q28 0 43 20v-17zM943 48q0 34 -47 40l-14 2q-23 4 -23 14q0 15 25 15q23 0 43 -11l12 24q-22 14 -55 14q-26 0 -41 -12t-15 -32q0 -33 47 -39l13 -2q24 -4 24 -14
+q0 -17 -31 -17q-25 0 -45 14l-13 -23q25 -17 58 -17q29 0 45.5 12t16.5 32zM1073 14l-8 25q-13 -7 -26 -7q-19 0 -19 22v61h48v27h-48v41h-30v-41h-28v-27h28v-61q0 -50 47 -50q21 0 36 10zM1159 146q-29 0 -48 -20t-19 -51q0 -32 19.5 -51.5t49.5 -19.5q33 0 55 19l-14 22
+q-18 -15 -39 -15q-34 0 -41 33h101v12q0 32 -18 51.5t-46 19.5zM1318 146q-23 0 -35 -20v16h-30v-135h30v76q0 35 29 35q10 0 18 -4l9 28q-9 4 -21 4zM1348 75q0 -31 19.5 -51t52.5 -20q29 0 48 16l-14 24q-18 -13 -35 -12q-18 0 -29.5 12t-11.5 31t11.5 31t29.5 12
+q19 0 35 -12l14 24q-20 16 -48 16q-33 0 -52.5 -20t-19.5 -51zM1593 7h30v68v67h-30v-16q-15 20 -42 20q-29 0 -48.5 -20t-19.5 -51t19.5 -51t48.5 -20q28 0 42 20v-17zM1726 146q-23 0 -35 -20v16h-29v-135h29v76q0 35 29 35q10 0 18 -4l9 28q-8 4 -21 4zM1866 7h29v68v122
+h-29v-71q-15 20 -43 20t-47.5 -20.5t-19.5 -50.5t19.5 -50.5t47.5 -20.5q29 0 43 20v-17zM1944 27l-2 -1h-3q-2 -1 -4 -3q-3 -1 -3 -4q-1 -2 -1 -6q0 -3 1 -5q0 -2 3 -4q2 -2 4 -3t5 -1q4 0 6 1q0 1 2 2l2 1q1 1 3 4q1 2 1 5q0 4 -1 6q-1 1 -3 4q0 1 -2 2l-2 1q-1 0 -3 0.5
+t-3 0.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+    <glyph glyph-name="_467" unicode="&#xf1f2;" horiz-adv-x="2304" 
+d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42
+q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604
+v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569
+q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73
+t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" />
+    <glyph glyph-name="f1f3" unicode="&#xf1f3;" horiz-adv-x="2304" 
+d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z
+M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260
+l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279
+v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040
+q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168
+q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5
+t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21
+h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5
+t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" />
+    <glyph glyph-name="_469" unicode="&#xf1f4;" horiz-adv-x="2304" 
+d="M745 630q0 -37 -25.5 -61.5t-62.5 -24.5q-29 0 -46.5 16t-17.5 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM1530 779q0 -42 -22 -57t-66 -15l-32 -1l17 107q2 11 13 11h18q22 0 35 -2t25 -12.5t12 -30.5zM1881 630q0 -36 -25.5 -61t-61.5 -25q-29 0 -47 16
+t-18 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM513 801q0 59 -38.5 85.5t-100.5 26.5h-160q-19 0 -21 -19l-65 -408q-1 -6 3 -11t10 -5h76q20 0 22 19l18 110q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM822 489l41 261q1 6 -3 11t-10 5h-76
+q-14 0 -17 -33q-27 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q28 0 58 12t48 32q-4 -12 -4 -21q0 -16 13 -16h69q19 0 22 19zM1269 752q0 5 -4 9.5t-9 4.5h-77q-11 0 -18 -10l-106 -156l-44 150q-5 16 -22 16h-75q-5 0 -9 -4.5t-4 -9.5q0 -2 19.5 -59
+t42 -123t23.5 -70q-82 -112 -82 -120q0 -13 13 -13h77q11 0 18 10l255 368q2 2 2 7zM1649 801q0 59 -38.5 85.5t-100.5 26.5h-159q-20 0 -22 -19l-65 -408q-1 -6 3 -11t10 -5h82q12 0 16 13l18 116q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM1958 489
+l41 261q1 6 -3 11t-10 5h-76q-14 0 -17 -33q-26 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q29 0 59 12t47 32q0 -1 -2 -9t-2 -12q0 -16 13 -16h69q19 0 22 19zM2176 898v1q0 14 -13 14h-74q-11 0 -13 -11l-65 -416l-1 -2q0 -5 4 -9.5t10 -4.5h66
+q19 0 21 19zM392 764q-5 -35 -26 -46t-60 -11l-33 -1l17 107q2 11 13 11h19q40 0 58 -11.5t12 -48.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+    <glyph glyph-name="_470" unicode="&#xf1f5;" horiz-adv-x="2304" 
+d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109
+q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118
+q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151
+q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31
+q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+    <glyph glyph-name="_471" unicode="&#xf1f6;" horiz-adv-x="2048" 
+d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5
+l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5
+l418 363q10 8 23.5 7t21.5 -11z" />
+    <glyph glyph-name="_472" unicode="&#xf1f7;" horiz-adv-x="2048" 
+d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128
+q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161
+q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" />
+    <glyph glyph-name="_473" unicode="&#xf1f8;" horiz-adv-x="1408" 
+d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704
+q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167
+q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+    <glyph glyph-name="_474" unicode="&#xf1f9;" 
+d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5
+t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5
+t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="_475" unicode="&#xf1fa;" 
+d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53
+q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24
+t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61
+t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" />
+    <glyph glyph-name="_476" unicode="&#xf1fb;" horiz-adv-x="1792" 
+d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10
+t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" />
+    <glyph glyph-name="f1fc" unicode="&#xf1fc;" horiz-adv-x="1792" 
+d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5
+t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" />
+    <glyph glyph-name="_478" unicode="&#xf1fd;" horiz-adv-x="1792" 
+d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11q24 0 44 -7t31 -15t33 -27q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5
+t47 37.5q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-24 0 -44 7t-31 15t-33 27q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38
+t-58 27t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448
+h256v448h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5
+q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" />
+    <glyph glyph-name="_479" unicode="&#xf1fe;" horiz-adv-x="2048" 
+d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" />
+    <glyph glyph-name="_480" unicode="&#xf200;" horiz-adv-x="1792" 
+d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="_481" unicode="&#xf201;" horiz-adv-x="2048" 
+d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9
+t9 -23z" />
+    <glyph glyph-name="_482" unicode="&#xf202;" horiz-adv-x="1792" 
+d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20
+q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50
+t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1
+q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" />
+    <glyph glyph-name="_483" unicode="&#xf203;" 
+d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73
+q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110
+q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960
+q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="_484" unicode="&#xf204;" horiz-adv-x="2048" 
+d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5
+t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5
+t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" />
+    <glyph glyph-name="_485" unicode="&#xf205;" horiz-adv-x="2048" 
+d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5
+t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" />
+    <glyph glyph-name="_486" unicode="&#xf206;" horiz-adv-x="2304" 
+d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94
+q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469
+q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400
+q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" />
+    <glyph glyph-name="_487" unicode="&#xf207;" 
+d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5
+h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5
+t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" />
+    <glyph glyph-name="_488" unicode="&#xf208;" horiz-adv-x="2048" 
+d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327
+q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5
+q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" />
+    <glyph glyph-name="_489" unicode="&#xf209;" horiz-adv-x="1280" 
+d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q17 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119
+t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5
+t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14
+q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88
+q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5
+t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" />
+    <glyph glyph-name="_490" unicode="&#xf20a;" horiz-adv-x="2048" 
+d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206
+q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307
+t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14
+t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" />
+    <glyph glyph-name="_491" unicode="&#xf20b;" 
+d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5
+t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+    <glyph glyph-name="_492" unicode="&#xf20c;" 
+d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55
+q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410
+q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" />
+    <glyph glyph-name="_493" unicode="&#xf20d;" 
+d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960q0 -118 -85 -203t-203 -85h-960q-118 0 -203 85t-85 203v960q0 118 85 203t203 85h960q118 0 203 -85t85 -203z" />
+    <glyph glyph-name="_494" unicode="&#xf20e;" horiz-adv-x="2048" 
+d="M2048 641q0 -21 -13 -36.5t-33 -19.5l-205 -356q3 -9 3 -18q0 -20 -12.5 -35.5t-32.5 -19.5l-193 -337q3 -8 3 -16q0 -23 -16.5 -40t-40.5 -17q-25 0 -41 18h-400q-17 -20 -43 -20t-43 20h-399q-17 -20 -43 -20q-23 0 -40 16.5t-17 40.5q0 8 4 20l-193 335
+q-20 4 -32.5 19.5t-12.5 35.5q0 9 3 18l-206 356q-20 5 -32.5 20.5t-12.5 35.5q0 21 13.5 36.5t33.5 19.5l199 344q0 1 -0.5 3t-0.5 3q0 36 34 51l209 363q-4 10 -4 18q0 24 17 40.5t40 16.5q26 0 44 -21h396q16 21 43 21t43 -21h398q18 21 44 21q23 0 40 -16.5t17 -40.5
+q0 -6 -4 -18l207 -358q23 -1 39 -17.5t16 -38.5q0 -13 -7 -27l187 -324q19 -4 31.5 -19.5t12.5 -35.5zM1063 -158h389l-342 354h-143l-342 -354h360q18 16 39 16t39 -16zM112 654q1 -4 1 -13q0 -10 -2 -15l208 -360l15 -6l188 199v347l-187 194q-13 -8 -29 -10zM986 1438
+h-388l190 -200l554 200h-280q-16 -16 -38 -16t-38 16zM1689 226q1 6 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427l333 -343q8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6q14 -5 22 -13zM552 226h402l64 66
+l-309 321l-157 -166v-221zM359 226h163v189l-168 -177q4 -8 5 -12zM358 1051q0 -1 0.5 -2t0.5 -2q0 -16 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314l-223 236zM556 1425l-4 -8v-264l205 74l-191 201q-6 -2 -10 -3zM1447 1438h-16l-621 -224l213 -225zM1023 946
+l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018q-8 13 -8 29v2l-216 376q-5 1 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196l-48 -227l130 227h-82
+zM1729 266l207 361q-2 10 -2 14q0 1 3 16l-171 296l-129 -612l77 -82q5 3 15 7z" />
+    <glyph glyph-name="f210" unicode="&#xf210;" 
+d="M0 856q0 131 91.5 226.5t222.5 95.5h742l352 358v-1470q0 -132 -91.5 -227t-222.5 -95h-780q-131 0 -222.5 95t-91.5 227v790zM1232 102l-176 180v425q0 46 -32 79t-78 33h-484q-46 0 -78 -33t-32 -79v-492q0 -46 32.5 -79.5t77.5 -33.5h770z" />
+    <glyph glyph-name="_496" unicode="&#xf211;" 
+d="M934 1386q-317 -121 -556 -362.5t-358 -560.5q-20 89 -20 176q0 208 102.5 384.5t278.5 279t384 102.5q82 0 169 -19zM1203 1267q93 -65 164 -155q-389 -113 -674.5 -400.5t-396.5 -676.5q-93 72 -155 162q112 386 395 671t667 399zM470 -67q115 356 379.5 622t619.5 384
+q40 -92 54 -195q-292 -120 -516 -345t-343 -518q-103 14 -194 52zM1536 -125q-193 50 -367 115q-135 -84 -290 -107q109 205 274 370.5t369 275.5q-21 -152 -101 -284q65 -175 115 -370z" />
+    <glyph glyph-name="f212" unicode="&#xf212;" horiz-adv-x="2048" 
+d="M1893 1144l155 -1272q-131 0 -257 57q-200 91 -393 91q-226 0 -374 -148q-148 148 -374 148q-193 0 -393 -91q-128 -57 -252 -57h-5l155 1272q224 127 482 127q233 0 387 -106q154 106 387 106q258 0 482 -127zM1398 157q129 0 232 -28.5t260 -93.5l-124 1021
+q-171 78 -368 78q-224 0 -374 -141q-150 141 -374 141q-197 0 -368 -78l-124 -1021q105 43 165.5 65t148.5 39.5t178 17.5q202 0 374 -108q172 108 374 108zM1438 191l-55 907q-211 -4 -359 -155q-152 155 -374 155q-176 0 -336 -66l-114 -941q124 51 228.5 76t221.5 25
+q209 0 374 -102q172 107 374 102z" />
+    <glyph glyph-name="_498" unicode="&#xf213;" horiz-adv-x="2048" 
+d="M1500 165v733q0 21 -15 36t-35 15h-93q-20 0 -35 -15t-15 -36v-733q0 -20 15 -35t35 -15h93q20 0 35 15t15 35zM1216 165v531q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-531q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM924 165v429q0 20 -15 35t-35 15h-101
+q-20 0 -35 -15t-15 -35v-429q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM632 165v362q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-362q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM2048 311q0 -166 -118 -284t-284 -118h-1244q-166 0 -284 118t-118 284
+q0 116 63 214.5t168 148.5q-10 34 -10 73q0 113 80.5 193.5t193.5 80.5q102 0 180 -67q45 183 194 300t338 117q149 0 275 -73.5t199.5 -199.5t73.5 -275q0 -66 -14 -122q135 -33 221 -142.5t86 -247.5z" />
+    <glyph glyph-name="_499" unicode="&#xf214;" 
+d="M0 1536h1536v-1392l-776 -338l-760 338v1392zM1436 209v926h-1336v-926l661 -294zM1436 1235v201h-1336v-201h1336zM181 937v-115h-37v115h37zM181 789v-115h-37v115h37zM181 641v-115h-37v115h37zM181 493v-115h-37v115h37zM181 345v-115h-37v115h37zM207 202l15 34
+l105 -47l-15 -33zM343 142l15 34l105 -46l-15 -34zM478 82l15 34l105 -46l-15 -34zM614 23l15 33l104 -46l-15 -34zM797 10l105 46l15 -33l-105 -47zM932 70l105 46l15 -34l-105 -46zM1068 130l105 46l15 -34l-105 -46zM1203 189l105 47l15 -34l-105 -46zM259 1389v-36h-114
+v36h114zM421 1389v-36h-115v36h115zM583 1389v-36h-115v36h115zM744 1389v-36h-114v36h114zM906 1389v-36h-114v36h114zM1068 1389v-36h-115v36h115zM1230 1389v-36h-115v36h115zM1391 1389v-36h-114v36h114zM181 1049v-79h-37v115h115v-36h-78zM421 1085v-36h-115v36h115z
+M583 1085v-36h-115v36h115zM744 1085v-36h-114v36h114zM906 1085v-36h-114v36h114zM1068 1085v-36h-115v36h115zM1230 1085v-36h-115v36h115zM1355 970v79h-78v36h115v-115h-37zM1355 822v115h37v-115h-37zM1355 674v115h37v-115h-37zM1355 526v115h37v-115h-37zM1355 378
+v115h37v-115h-37zM1355 230v115h37v-115h-37zM760 265q-129 0 -221 91.5t-92 221.5q0 129 92 221t221 92q130 0 221.5 -92t91.5 -221q0 -130 -91.5 -221.5t-221.5 -91.5zM595 646q0 -36 19.5 -56.5t49.5 -25t64 -7t64 -2t49.5 -9t19.5 -30.5q0 -49 -112 -49q-97 0 -123 51
+h-3l-31 -63q67 -42 162 -42q29 0 56.5 5t55.5 16t45.5 33t17.5 53q0 46 -27.5 69.5t-67.5 27t-79.5 3t-67 5t-27.5 25.5q0 21 20.5 33t40.5 15t41 3q34 0 70.5 -11t51.5 -34h3l30 58q-3 1 -21 8.5t-22.5 9t-19.5 7t-22 7t-20 4.5t-24 4t-23 1q-29 0 -56.5 -5t-54 -16.5
+t-43 -34t-16.5 -53.5z" />
+    <glyph glyph-name="_500" unicode="&#xf215;" horiz-adv-x="2048" 
+d="M863 504q0 112 -79.5 191.5t-191.5 79.5t-191 -79.5t-79 -191.5t79 -191t191 -79t191.5 79t79.5 191zM1726 505q0 112 -79 191t-191 79t-191.5 -79t-79.5 -191q0 -113 79.5 -192t191.5 -79t191 79.5t79 191.5zM2048 1314v-1348q0 -44 -31.5 -75.5t-76.5 -31.5h-1832
+q-45 0 -76.5 31.5t-31.5 75.5v1348q0 44 31.5 75.5t76.5 31.5h431q44 0 76 -31.5t32 -75.5v-161h754v161q0 44 32 75.5t76 31.5h431q45 0 76.5 -31.5t31.5 -75.5z" />
+    <glyph glyph-name="_501" unicode="&#xf216;" horiz-adv-x="2048" 
+d="M1430 953zM1690 749q148 0 253 -98.5t105 -244.5q0 -157 -109 -261.5t-267 -104.5q-85 0 -162 27.5t-138 73.5t-118 106t-109 126t-103.5 132.5t-108.5 126.5t-117 106t-136 73.5t-159 27.5q-154 0 -251.5 -91.5t-97.5 -244.5q0 -157 104 -250t263 -93q100 0 208 37.5
+t193 98.5q5 4 21 18.5t30 24t22 9.5q14 0 24.5 -10.5t10.5 -24.5q0 -24 -60 -77q-101 -88 -234.5 -142t-260.5 -54q-133 0 -245.5 58t-180 165t-67.5 241q0 205 141.5 341t347.5 136q120 0 226.5 -43.5t185.5 -113t151.5 -153t139 -167.5t133.5 -153.5t149.5 -113
+t172.5 -43.5q102 0 168.5 61.5t66.5 162.5q0 95 -64.5 159t-159.5 64q-30 0 -81.5 -18.5t-68.5 -18.5q-20 0 -35.5 15t-15.5 35q0 18 8.5 57t8.5 59q0 159 -107.5 263t-266.5 104q-58 0 -111.5 -18.5t-84 -40.5t-55.5 -40.5t-33 -18.5q-15 0 -25.5 10.5t-10.5 25.5
+q0 19 25 46q59 67 147 103.5t182 36.5q191 0 318 -125.5t127 -315.5q0 -37 -4 -66q57 15 115 15z" />
+    <glyph glyph-name="_502" unicode="&#xf217;" horiz-adv-x="1664" 
+d="M1216 832q0 26 -19 45t-45 19h-128v128q0 26 -19 45t-45 19t-45 -19t-19 -45v-128h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128v-128q0 -26 19 -45t45 -19t45 19t19 45v128h128q26 0 45 19t19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5
+t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920
+q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="_503" unicode="&#xf218;" horiz-adv-x="1664" 
+d="M1280 832q0 26 -19 45t-45 19t-45 -19l-147 -146v293q0 26 -19 45t-45 19t-45 -19t-19 -45v-293l-147 146q-19 19 -45 19t-45 -19t-19 -45t19 -45l256 -256q19 -19 45 -19t45 19l256 256q19 19 19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5
+t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920
+q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="_504" unicode="&#xf219;" horiz-adv-x="2048" 
+d="M212 768l623 -665l-300 665h-323zM1024 -4l349 772h-698zM538 896l204 384h-262l-288 -384h346zM1213 103l623 665h-323zM683 896h682l-204 384h-274zM1510 896h346l-288 384h-262zM1651 1382l384 -512q14 -18 13 -41.5t-17 -40.5l-960 -1024q-18 -20 -47 -20t-47 20
+l-960 1024q-16 17 -17 40.5t13 41.5l384 512q18 26 51 26h1152q33 0 51 -26z" />
+    <glyph glyph-name="_505" unicode="&#xf21a;" horiz-adv-x="2048" 
+d="M1811 -19q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83
+q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83
+q19 19 45 19t45 -19l83 -83zM237 19q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -82l83 82q19 19 45 19t45 -19l83 -82l64 64v293l-210 314q-17 26 -7 56.5t40 40.5l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58q30 -10 40 -40.5t-7 -56.5l-210 -314
+v-293l19 18q19 19 45 19t45 -19l83 -82l83 82q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83
+q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83zM640 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" />
+    <glyph glyph-name="_506" unicode="&#xf21b;" 
+d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010q-2 4 -4 6q-10 8 -96 8q-70 0 -167 -19q-7 -2 -21 -2t-21 2q-97 19 -167 19q-86 0 -96 -8q-2 -2 -4 -6q2 -18 4 -27q2 -3 7.5 -6.5t7.5 -10.5q2 -4 7.5 -20.5t7 -20.5t7.5 -17t8.5 -17t9 -14
+t12 -13.5t14 -9.5t17.5 -8t20.5 -4t24.5 -2q36 0 59 12.5t32.5 30t14.5 34.5t11.5 29.5t17.5 12.5h12q11 0 17.5 -12.5t11.5 -29.5t14.5 -34.5t32.5 -30t59 -12.5q13 0 24.5 2t20.5 4t17.5 8t14 9.5t12 13.5t9 14t8.5 17t7.5 17t7 20.5t7.5 20.5q2 7 7.5 10.5t7.5 6.5
+q2 9 4 27zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 61 4.5 118t19 125.5t37.5 123.5t63.5 103.5t93.5 74.5l-90 220h214q-22 64 -22 128q0 12 2 32q-194 40 -194 96q0 57 210 99q17 62 51.5 134t70.5 114q32 37 76 37q30 0 84 -31t84 -31t84 31
+t84 31q44 0 76 -37q36 -42 70.5 -114t51.5 -134q210 -42 210 -99q0 -56 -194 -96q7 -81 -20 -160h214l-82 -225q63 -33 107.5 -96.5t65.5 -143.5t29 -151.5t8 -148.5z" />
+    <glyph glyph-name="_507" unicode="&#xf21c;" horiz-adv-x="2304" 
+d="M2301 500q12 -103 -22 -198.5t-99 -163.5t-158.5 -106t-196.5 -31q-161 11 -279.5 125t-134.5 274q-12 111 27.5 210.5t118.5 170.5l-71 107q-96 -80 -151 -194t-55 -244q0 -27 -18.5 -46.5t-45.5 -19.5h-256h-69q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5
+t-131.5 316.5t131.5 316.5t316.5 131.5q76 0 152 -27l24 45q-123 110 -304 110h-64q-26 0 -45 19t-19 45t19 45t45 19h128q78 0 145 -13.5t116.5 -38.5t71.5 -39.5t51 -36.5h512h115l-85 128h-222q-30 0 -49 22.5t-14 52.5q4 23 23 38t43 15h253q33 0 53 -28l70 -105
+l114 114q19 19 46 19h101q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-179l115 -172q131 63 275 36q143 -26 244 -134.5t118 -253.5zM448 128q115 0 203 72.5t111 183.5h-314q-35 0 -55 31q-18 32 -1 63l147 277q-47 13 -91 13q-132 0 -226 -94t-94 -226t94 -226
+t226 -94zM1856 128q132 0 226 94t94 226t-94 226t-226 94q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94z" />
+    <glyph glyph-name="_508" unicode="&#xf21d;" 
+d="M1408 0q0 -63 -61.5 -113.5t-164 -81t-225 -46t-253.5 -15.5t-253.5 15.5t-225 46t-164 81t-61.5 113.5q0 49 33 88.5t91 66.5t118 44.5t131 29.5q26 5 48 -10.5t26 -41.5q5 -26 -10.5 -48t-41.5 -26q-58 -10 -106 -23.5t-76.5 -25.5t-48.5 -23.5t-27.5 -19.5t-8.5 -12
+q3 -11 27 -26.5t73 -33t114 -32.5t160.5 -25t201.5 -10t201.5 10t160.5 25t114 33t73 33.5t27 27.5q-1 4 -8.5 11t-27.5 19t-48.5 23.5t-76.5 25t-106 23.5q-26 4 -41.5 26t-10.5 48q4 26 26 41.5t48 10.5q71 -12 131 -29.5t118 -44.5t91 -66.5t33 -88.5zM1024 896v-384
+q0 -26 -19 -45t-45 -19h-64v-384q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v384h-64q-26 0 -45 19t-19 45v384q0 53 37.5 90.5t90.5 37.5h384q53 0 90.5 -37.5t37.5 -90.5zM928 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5
+t158.5 -65.5t65.5 -158.5z" />
+    <glyph glyph-name="_509" unicode="&#xf21e;" horiz-adv-x="1792" 
+d="M1280 512h305q-5 -6 -10 -10.5t-9 -7.5l-3 -4l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-5 2 -21 20h369q22 0 39.5 13.5t22.5 34.5l70 281l190 -667q6 -20 23 -33t39 -13q21 0 38 13t23 33l146 485l56 -112q18 -35 57 -35zM1792 940q0 -145 -103 -300h-369l-111 221
+q-8 17 -25.5 27t-36.5 8q-45 -5 -56 -46l-129 -430l-196 686q-6 20 -23.5 33t-39.5 13t-39 -13.5t-22 -34.5l-116 -464h-423q-103 155 -103 300q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124
+t127 -344z" />
+    <glyph glyph-name="venus" unicode="&#xf221;" horiz-adv-x="1280" 
+d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292
+q11 134 80.5 249t182 188t245.5 88q170 19 319 -54t236 -212t87 -306zM128 960q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
+    <glyph glyph-name="_511" unicode="&#xf222;" 
+d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-382 -383q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5
+q203 0 359 -126l382 382h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+    <glyph glyph-name="_512" unicode="&#xf223;" horiz-adv-x="1280" 
+d="M830 1220q145 -72 233.5 -210.5t88.5 -305.5q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5
+t-147.5 384.5q0 167 88.5 305.5t233.5 210.5q-165 96 -228 273q-6 16 3.5 29.5t26.5 13.5h69q21 0 29 -20q44 -106 140 -171t214 -65t214 65t140 171q8 20 37 20h61q17 0 26.5 -13.5t3.5 -29.5q-63 -177 -228 -273zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5
+t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+    <glyph glyph-name="_513" unicode="&#xf224;" 
+d="M1024 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64
+q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-149 16 -270.5 103t-186.5 223.5t-53 291.5q16 204 160 353.5t347 172.5q118 14 228 -19t198 -103l255 254h-134q-14 0 -23 9t-9 23v64zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5
+t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+    <glyph glyph-name="_514" unicode="&#xf225;" horiz-adv-x="1792" 
+d="M1280 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64
+q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5t-147.5 384.5q0 201 126 359l-52 53l-101 -111q-9 -10 -22 -10.5t-23 7.5l-48 44q-10 8 -10.5 21.5t8.5 23.5l105 115l-111 112v-134q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9
+t-9 23v288q0 26 19 45t45 19h288q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-133l106 -107l86 94q9 10 22 10.5t23 -7.5l48 -44q10 -8 10.5 -21.5t-8.5 -23.5l-90 -99l57 -56q158 126 359 126t359 -126l255 254h-134q-14 0 -23 9t-9 23v64zM832 256q185 0 316.5 131.5
+t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+    <glyph glyph-name="_515" unicode="&#xf226;" horiz-adv-x="1792" 
+d="M1790 1007q12 -155 -52.5 -292t-186 -224t-271.5 -103v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-512v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23
+t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292q17 206 164.5 356.5t352.5 169.5q206 21 377 -94q171 115 377 94q205 -19 352.5 -169.5t164.5 -356.5zM896 647q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM576 512q115 0 218 57q-154 165 -154 391
+q0 224 154 391q-103 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5zM1152 128v260q-137 15 -256 94q-119 -79 -256 -94v-260h512zM1216 512q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5q-115 0 -218 -57q154 -167 154 -391
+q0 -226 -154 -391q103 -57 218 -57z" />
+    <glyph glyph-name="_516" unicode="&#xf227;" horiz-adv-x="1920" 
+d="M1536 1120q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-31 -182 -166 -312t-318 -156q-210 -29 -384.5 80t-241.5 300q-117 6 -221 57.5t-177.5 133t-113.5 192.5t-32 230
+q9 135 78 252t182 191.5t248 89.5q118 14 227.5 -19t198.5 -103l255 254h-134q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q59 -74 93 -169q182 -9 328 -124l255 254h-134q-14 0 -23 9
+t-9 23v64zM1024 704q0 20 -4 58q-162 -25 -271 -150t-109 -292q0 -20 4 -58q162 25 271 150t109 292zM128 704q0 -168 111 -294t276 -149q-3 29 -3 59q0 210 135 369.5t338 196.5q-53 120 -163.5 193t-245.5 73q-185 0 -316.5 -131.5t-131.5 -316.5zM1088 -128
+q185 0 316.5 131.5t131.5 316.5q0 168 -111 294t-276 149q3 -28 3 -59q0 -210 -135 -369.5t-338 -196.5q53 -120 163.5 -193t245.5 -73z" />
+    <glyph glyph-name="_517" unicode="&#xf228;" horiz-adv-x="2048" 
+d="M1664 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-32 -180 -164.5 -310t-313.5 -157q-223 -34 -409 90q-117 -78 -256 -93v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23
+t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-155 17 -279.5 109.5t-187 237.5t-39.5 307q25 187 159.5 322.5t320.5 164.5q224 34 410 -90q146 97 320 97q201 0 359 -126l255 254h-134q-14 0 -23 9
+t-9 23v64zM896 391q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM128 704q0 -185 131.5 -316.5t316.5 -131.5q117 0 218 57q-154 167 -154 391t154 391q-101 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5zM1216 256q185 0 316.5 131.5t131.5 316.5
+t-131.5 316.5t-316.5 131.5q-117 0 -218 -57q154 -167 154 -391t-154 -391q101 -57 218 -57z" />
+    <glyph glyph-name="_518" unicode="&#xf229;" 
+d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-213 -214l140 -140q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-140 141l-78 -79q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5
+t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5q203 0 359 -126l78 78l-172 172q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l172 -172l213 213h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5
+t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+    <glyph glyph-name="_519" unicode="&#xf22a;" horiz-adv-x="1280" 
+d="M640 892q217 -24 364.5 -187.5t147.5 -384.5q0 -167 -87 -306t-236 -212t-319 -54q-133 15 -245.5 88t-182 188t-80.5 249q-12 155 52.5 292t186 224t271.5 103v132h-160q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h160v165l-92 -92q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22
+t9 23l202 201q19 19 45 19t45 -19l202 -201q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-92 92v-165h160q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-160v-132zM576 -128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5
+t131.5 -316.5t316.5 -131.5z" />
+    <glyph glyph-name="_520" unicode="&#xf22b;" horiz-adv-x="2048" 
+d="M1901 621q19 -19 19 -45t-19 -45l-294 -294q-9 -10 -22.5 -10t-22.5 10l-45 45q-10 9 -10 22.5t10 22.5l185 185h-294v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-132q-24 -217 -187.5 -364.5t-384.5 -147.5q-167 0 -306 87t-212 236t-54 319q15 133 88 245.5
+t188 182t249 80.5q155 12 292 -52.5t224 -186t103 -271.5h132v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h294l-185 185q-10 9 -10 22.5t10 22.5l45 45q9 10 22.5 10t22.5 -10zM576 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5
+t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+    <glyph glyph-name="_521" unicode="&#xf22c;" horiz-adv-x="1280" 
+d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-612q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v612q-217 24 -364.5 187.5t-147.5 384.5q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM576 512q185 0 316.5 131.5
+t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+    <glyph glyph-name="_522" unicode="&#xf22d;" horiz-adv-x="1280" 
+d="M1024 576q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1152 576q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123
+t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5z" />
+    <glyph glyph-name="_523" unicode="&#xf22e;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="_524" unicode="&#xf22f;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="_525" unicode="&#xf230;" 
+d="M1451 1408q35 0 60 -25t25 -60v-1366q0 -35 -25 -60t-60 -25h-391v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-735q-35 0 -60 25t-25 60v1366q0 35 25 60t60 25h1366z" />
+    <glyph glyph-name="_526" unicode="&#xf231;" horiz-adv-x="1280" 
+d="M0 939q0 108 37.5 203.5t103.5 166.5t152 123t185 78t202 26q158 0 294 -66.5t221 -193.5t85 -287q0 -96 -19 -188t-60 -177t-100 -149.5t-145 -103t-189 -38.5q-68 0 -135 32t-96 88q-10 -39 -28 -112.5t-23.5 -95t-20.5 -71t-26 -71t-32 -62.5t-46 -77.5t-62 -86.5
+l-14 -5l-9 10q-15 157 -15 188q0 92 21.5 206.5t66.5 287.5t52 203q-32 65 -32 169q0 83 52 156t132 73q61 0 95 -40.5t34 -102.5q0 -66 -44 -191t-44 -187q0 -63 45 -104.5t109 -41.5q55 0 102 25t78.5 68t56 95t38 110.5t20 111t6.5 99.5q0 173 -109.5 269.5t-285.5 96.5
+q-200 0 -334 -129.5t-134 -328.5q0 -44 12.5 -85t27 -65t27 -45.5t12.5 -30.5q0 -28 -15 -73t-37 -45q-2 0 -17 3q-51 15 -90.5 56t-61 94.5t-32.5 108t-11 106.5z" />
+    <glyph glyph-name="_527" unicode="&#xf232;" 
+d="M985 562q13 0 97.5 -44t89.5 -53q2 -5 2 -15q0 -33 -17 -76q-16 -39 -71 -65.5t-102 -26.5q-57 0 -190 62q-98 45 -170 118t-148 185q-72 107 -71 194v8q3 91 74 158q24 22 52 22q6 0 18 -1.5t19 -1.5q19 0 26.5 -6.5t15.5 -27.5q8 -20 33 -88t25 -75q0 -21 -34.5 -57.5
+t-34.5 -46.5q0 -7 5 -15q34 -73 102 -137q56 -53 151 -101q12 -7 22 -7q15 0 54 48.5t52 48.5zM782 32q127 0 243.5 50t200.5 134t134 200.5t50 243.5t-50 243.5t-134 200.5t-200.5 134t-243.5 50t-243.5 -50t-200.5 -134t-134 -200.5t-50 -243.5q0 -203 120 -368l-79 -233
+l242 77q158 -104 345 -104zM782 1414q153 0 292.5 -60t240.5 -161t161 -240.5t60 -292.5t-60 -292.5t-161 -240.5t-240.5 -161t-292.5 -60q-195 0 -365 94l-417 -134l136 405q-108 178 -108 389q0 153 60 292.5t161 240.5t240.5 161t292.5 60z" />
+    <glyph glyph-name="_528" unicode="&#xf233;" horiz-adv-x="1792" 
+d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM128 1152h1024v128h-1024v-128zM1696 704q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1696 1216
+q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" />
+    <glyph glyph-name="_529" unicode="&#xf234;" horiz-adv-x="2048" 
+d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1664 512h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5
+t-9.5 22.5v352h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352zM928 288q0 -52 38 -90t90 -38h256v-238q-68 -50 -171 -50h-874q-121 0 -194 69t-73 190q0 53 3.5 103.5t14 109t26.5 108.5
+t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q79 -61 154.5 -91.5t164.5 -30.5t164.5 30.5t154.5 91.5q20 17 39 17q132 0 217 -96h-223q-52 0 -90 -38t-38 -90v-192z" />
+    <glyph glyph-name="_530" unicode="&#xf235;" horiz-adv-x="2048" 
+d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1781 320l249 -249q9 -9 9 -23q0 -13 -9 -22l-136 -136q-9 -9 -22 -9q-14 0 -23 9l-249 249l-249 -249q-9 -9 -23 -9q-13 0 -22 9l-136 136
+q-9 9 -9 22q0 14 9 23l249 249l-249 249q-9 9 -9 23q0 13 9 22l136 136q9 9 22 9q14 0 23 -9l249 -249l249 249q9 9 23 9q13 0 22 -9l136 -136q9 -9 9 -22q0 -14 -9 -23zM1283 320l-181 -181q-37 -37 -37 -91q0 -53 37 -90l83 -83q-21 -3 -44 -3h-874q-121 0 -194 69
+t-73 190q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q154 -122 319 -122t319 122q20 17 39 17q28 0 57 -6q-28 -27 -41 -50t-13 -56q0 -54 37 -91z" />
+    <glyph glyph-name="_531" unicode="&#xf236;" horiz-adv-x="2048" 
+d="M256 512h1728q26 0 45 -19t19 -45v-448h-256v256h-1536v-256h-256v1216q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-704zM832 832q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM2048 576v64q0 159 -112.5 271.5t-271.5 112.5h-704
+q-26 0 -45 -19t-19 -45v-384h1152z" />
+    <glyph glyph-name="_532" unicode="&#xf237;" 
+d="M1536 1536l-192 -448h192v-192h-274l-55 -128h329v-192h-411l-357 -832l-357 832h-411v192h329l-55 128h-274v192h192l-192 448h256l323 -768h378l323 768h256zM768 320l108 256h-216z" />
+    <glyph glyph-name="_533" unicode="&#xf238;" 
+d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM768 192q80 0 136 56t56 136t-56 136t-136 56
+t-136 -56t-56 -136t56 -136t136 -56zM1344 768v512h-1152v-512h1152z" />
+    <glyph glyph-name="_534" unicode="&#xf239;" 
+d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM288 224q66 0 113 47t47 113t-47 113t-113 47
+t-113 -47t-47 -113t47 -113t113 -47zM704 768v512h-544v-512h544zM1248 224q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM1408 768v512h-576v-512h576z" />
+    <glyph glyph-name="_535" unicode="&#xf23a;" horiz-adv-x="1792" 
+d="M597 1115v-1173q0 -25 -12.5 -42.5t-36.5 -17.5q-17 0 -33 8l-465 233q-21 10 -35.5 33.5t-14.5 46.5v1140q0 20 10 34t29 14q14 0 44 -15l511 -256q3 -3 3 -5zM661 1014l534 -866l-534 266v600zM1792 996v-1054q0 -25 -14 -40.5t-38 -15.5t-47 13l-441 220zM1789 1116
+q0 -3 -256.5 -419.5t-300.5 -487.5l-390 634l324 527q17 28 52 28q14 0 26 -6l541 -270q4 -2 4 -6z" />
+    <glyph glyph-name="_536" unicode="&#xf23b;" 
+d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1408v-1536h-1536v1536h1536z" />
+    <glyph glyph-name="_537" unicode="&#xf23c;" horiz-adv-x="2296" 
+d="M478 -139q-8 -16 -27 -34.5t-37 -25.5q-25 -9 -51.5 3.5t-28.5 31.5q-1 22 40 55t68 38q23 4 34 -21.5t2 -46.5zM1819 -139q7 -16 26 -34.5t38 -25.5q25 -9 51.5 3.5t27.5 31.5q2 22 -39.5 55t-68.5 38q-22 4 -33 -21.5t-2 -46.5zM1867 -30q13 -27 56.5 -59.5t77.5 -41.5
+q45 -13 82 4.5t37 50.5q0 46 -67.5 100.5t-115.5 59.5q-40 5 -63.5 -37.5t-6.5 -76.5zM428 -30q-13 -27 -56 -59.5t-77 -41.5q-45 -13 -82 4.5t-37 50.5q0 46 67.5 100.5t115.5 59.5q40 5 63 -37.5t6 -76.5zM1158 1094h1q-41 0 -76 -15q27 -8 44 -30.5t17 -49.5
+q0 -35 -27 -60t-65 -25q-52 0 -80 43q-5 -23 -5 -42q0 -74 56 -126.5t135 -52.5q80 0 136 52.5t56 126.5t-56 126.5t-136 52.5zM1462 1312q-99 109 -220.5 131.5t-245.5 -44.5q27 60 82.5 96.5t118 39.5t121.5 -17t99.5 -74.5t44.5 -131.5zM2212 73q8 -11 -11 -42
+q7 -23 7 -40q1 -56 -44.5 -112.5t-109.5 -91.5t-118 -37q-48 -2 -92 21.5t-66 65.5q-687 -25 -1259 0q-23 -41 -66.5 -65t-92.5 -22q-86 3 -179.5 80.5t-92.5 160.5q2 22 7 40q-19 31 -11 42q6 10 31 1q14 22 41 51q-7 29 2 38q11 10 39 -4q29 20 59 34q0 29 13 37
+q23 12 51 -16q35 5 61 -2q18 -4 38 -19v73q-11 0 -18 2q-53 10 -97 44.5t-55 87.5q-9 38 0 81q15 62 93 95q2 17 19 35.5t36 23.5t33 -7.5t19 -30.5h13q46 -5 60 -23q3 -3 5 -7q10 1 30.5 3.5t30.5 3.5q-15 11 -30 17q-23 40 -91 43q0 6 1 10q-62 2 -118.5 18.5t-84.5 47.5
+q-32 36 -42.5 92t-2.5 112q16 126 90 179q23 16 52 4.5t32 -40.5q0 -1 1.5 -14t2.5 -21t3 -20t5.5 -19t8.5 -10q27 -14 76 -12q48 46 98 74q-40 4 -162 -14l47 46q61 58 163 111q145 73 282 86q-20 8 -41 15.5t-47 14t-42.5 10.5t-47.5 11t-43 10q595 126 904 -139
+q98 -84 158 -222q85 -10 121 9h1q5 3 8.5 10t5.5 19t3 19.5t3 21.5l1 14q3 28 32 40t52 -5q73 -52 91 -178q7 -57 -3.5 -113t-42.5 -91q-28 -32 -83.5 -48.5t-115.5 -18.5v-10q-71 -2 -95 -43q-14 -5 -31 -17q11 -1 32 -3.5t30 -3.5q1 5 5 8q16 18 60 23h13q5 18 19 30t33 8
+t36 -23t19 -36q79 -32 93 -95q9 -40 1 -81q-12 -53 -56 -88t-97 -44q-10 -2 -17 -2q0 -49 -1 -73q20 15 38 19q26 7 61 2q28 28 51 16q14 -9 14 -37q33 -16 59 -34q27 13 38 4q10 -10 2 -38q28 -30 41 -51q23 8 31 -1zM1937 1025q0 -29 -9 -54q82 -32 112 -132
+q4 37 -9.5 98.5t-41.5 90.5q-20 19 -36 17t-16 -20zM1859 925q35 -42 47.5 -108.5t-0.5 -124.5q67 13 97 45q13 14 18 28q-3 64 -31 114.5t-79 66.5q-15 -15 -52 -21zM1822 921q-30 0 -44 1q42 -115 53 -239q21 0 43 3q16 68 1 135t-53 100zM258 839q30 100 112 132
+q-9 25 -9 54q0 18 -16.5 20t-35.5 -17q-28 -29 -41.5 -90.5t-9.5 -98.5zM294 737q29 -31 97 -45q-13 58 -0.5 124.5t47.5 108.5v0q-37 6 -52 21q-51 -16 -78.5 -66t-31.5 -115q9 -17 18 -28zM471 683q14 124 73 235q-19 -4 -55 -18l-45 -19v1q-46 -89 -20 -196q25 -3 47 -3z
+M1434 644q8 -38 16.5 -108.5t11.5 -89.5q3 -18 9.5 -21.5t23.5 4.5q40 20 62 85.5t23 125.5q-24 2 -146 4zM1152 1285q-116 0 -199 -82.5t-83 -198.5q0 -117 83 -199.5t199 -82.5t199 82.5t83 199.5q0 116 -83 198.5t-199 82.5zM1380 646q-105 2 -211 0v1q-1 -27 2.5 -86
+t13.5 -66q29 -14 93.5 -14.5t95.5 10.5q9 3 11 39t-0.5 69.5t-4.5 46.5zM1112 447q8 4 9.5 48t-0.5 88t-4 63v1q-212 -3 -214 -3q-4 -20 -7 -62t0 -83t14 -46q34 -15 101 -16t101 10zM718 636q-16 -59 4.5 -118.5t77.5 -84.5q15 -8 24 -5t12 21q3 16 8 90t10 103
+q-69 -2 -136 -6zM591 510q3 -23 -34 -36q132 -141 271.5 -240t305.5 -154q172 49 310.5 146t293.5 250q-33 13 -30 34q0 2 0.5 3.5t1.5 3t1 2.5v1v-1q-17 2 -50 5.5t-48 4.5q-26 -90 -82 -132q-51 -38 -82 1q-5 6 -9 14q-7 13 -17 62q-2 -5 -5 -9t-7.5 -7t-8 -5.5t-9.5 -4
+l-10 -2.5t-12 -2l-12 -1.5t-13.5 -1t-13.5 -0.5q-106 -9 -163 11q-4 -17 -10 -26.5t-21 -15t-23 -7t-36 -3.5q-6 -1 -9 -1q-179 -17 -203 40q-2 -63 -56 -54q-47 8 -91 54q-12 13 -20 26q-17 29 -26 65q-58 -6 -87 -10q1 -2 4 -10zM507 -118q3 14 3 30q-17 71 -51 130
+t-73 70q-41 12 -101.5 -14.5t-104.5 -80t-39 -107.5q35 -53 100 -93t119 -42q51 -2 94 28t53 79zM510 53q23 -63 27 -119q195 113 392 174q-98 52 -180.5 120t-179.5 165q-6 -4 -29 -13q0 -1 -1 -4t-1 -5q31 -18 22 -37q-12 -23 -56 -34q-10 -13 -29 -24h-1q-2 -83 1 -150
+q19 -34 35 -73zM579 -113q532 -21 1145 0q-254 147 -428 196q-76 -35 -156 -57q-8 -3 -16 0q-65 21 -129 49q-208 -60 -416 -188h-1v-1q1 0 1 1zM1763 -67q4 54 28 120q14 38 33 71l-1 -1q3 77 3 153q-15 8 -30 25q-42 9 -56 33q-9 20 22 38q-2 4 -2 9q-16 4 -28 12
+q-204 -190 -383 -284q198 -59 414 -176zM2155 -90q5 54 -39 107.5t-104 80t-102 14.5q-38 -11 -72.5 -70.5t-51.5 -129.5q0 -16 3 -30q10 -49 53 -79t94 -28q54 2 119 42t100 93z" />
+    <glyph glyph-name="_538" unicode="&#xf23d;" horiz-adv-x="2304" 
+d="M1524 -25q0 -68 -48 -116t-116 -48t-116.5 48t-48.5 116t48.5 116.5t116.5 48.5t116 -48.5t48 -116.5zM775 -25q0 -68 -48.5 -116t-116.5 -48t-116 48t-48 116t48 116.5t116 48.5t116.5 -48.5t48.5 -116.5zM0 1469q57 -60 110.5 -104.5t121 -82t136 -63t166 -45.5
+t200 -31.5t250 -18.5t304 -9.5t372.5 -2.5q139 0 244.5 -5t181 -16.5t124 -27.5t71 -39.5t24 -51.5t-19.5 -64t-56.5 -76.5t-89.5 -91t-116 -104.5t-139 -119q-185 -157 -286 -247q29 51 76.5 109t94 105.5t94.5 98.5t83 91.5t54 80.5t13 70t-45.5 55.5t-116.5 41t-204 23.5
+t-304 5q-168 -2 -314 6t-256 23t-204.5 41t-159.5 51.5t-122.5 62.5t-91.5 66.5t-68 71.5t-50.5 69.5t-40 68t-36.5 59.5z" />
+    <glyph glyph-name="_539" unicode="&#xf23e;" horiz-adv-x="1792" 
+d="M896 1472q-169 0 -323 -66t-265.5 -177.5t-177.5 -265.5t-66 -323t66 -323t177.5 -265.5t265.5 -177.5t323 -66t323 66t265.5 177.5t177.5 265.5t66 323t-66 323t-177.5 265.5t-265.5 177.5t-323 66zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348
+t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM496 704q16 0 16 -16v-480q0 -16 -16 -16h-32q-16 0 -16 16v480q0 16 16 16h32zM896 640q53 0 90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-114q0 -14 -9 -23
+t-23 -9h-64q-14 0 -23 9t-9 23v114q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5zM896 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM544 928v-96
+q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5v-96q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 146 -103 249t-249 103t-249 -103t-103 -249zM1408 192v512q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-512
+q0 -26 19 -45t45 -19h896q26 0 45 19t19 45z" />
+    <glyph glyph-name="_540" unicode="&#xf240;" horiz-adv-x="2304" 
+d="M1920 1024v-768h-1664v768h1664zM2048 448h128v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288zM2304 832v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113
+v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160q53 0 90.5 -37.5t37.5 -90.5z" />
+    <glyph glyph-name="_541" unicode="&#xf241;" horiz-adv-x="2304" 
+d="M256 256v768h1280v-768h-1280zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9
+h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+    <glyph glyph-name="_542" unicode="&#xf242;" horiz-adv-x="2304" 
+d="M256 256v768h896v-768h-896zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9
+h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+    <glyph glyph-name="_543" unicode="&#xf243;" horiz-adv-x="2304" 
+d="M256 256v768h512v-768h-512zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9
+h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+    <glyph glyph-name="_544" unicode="&#xf244;" horiz-adv-x="2304" 
+d="M2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23
+v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+    <glyph glyph-name="_545" unicode="&#xf245;" horiz-adv-x="1280" 
+d="M1133 493q31 -30 14 -69q-17 -40 -59 -40h-382l201 -476q10 -25 0 -49t-34 -35l-177 -75q-25 -10 -49 0t-35 34l-191 452l-312 -312q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v1504q0 42 40 59q12 5 24 5q27 0 45 -19z" />
+    <glyph glyph-name="_546" unicode="&#xf246;" horiz-adv-x="1024" 
+d="M832 1408q-320 0 -320 -224v-416h128v-128h-128v-544q0 -224 320 -224h64v-128h-64q-272 0 -384 146q-112 -146 -384 -146h-64v128h64q320 0 320 224v544h-128v128h128v416q0 224 -320 224h-64v128h64q272 0 384 -146q112 146 384 146h64v-128h-64z" />
+    <glyph glyph-name="_547" unicode="&#xf247;" horiz-adv-x="2048" 
+d="M2048 1152h-128v-1024h128v-384h-384v128h-1280v-128h-384v384h128v1024h-128v384h384v-128h1280v128h384v-384zM1792 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 -128v128h-128v-128h128zM1664 0v128h128v1024h-128v128h-1280v-128h-128v-1024h128v-128
+h1280zM1920 -128v128h-128v-128h128zM1280 896h384v-768h-896v256h-384v768h896v-256zM512 512h640v512h-640v-512zM1536 256v512h-256v-384h-384v-128h640z" />
+    <glyph glyph-name="_548" unicode="&#xf248;" horiz-adv-x="2304" 
+d="M2304 768h-128v-640h128v-384h-384v128h-896v-128h-384v384h128v128h-384v-128h-384v384h128v640h-128v384h384v-128h896v128h384v-384h-128v-128h384v128h384v-384zM2048 1024v-128h128v128h-128zM1408 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 256
+v128h-128v-128h128zM1536 384h-128v-128h128v128zM384 384h896v128h128v640h-128v128h-896v-128h-128v-640h128v-128zM896 -128v128h-128v-128h128zM2176 -128v128h-128v-128h128zM2048 128v640h-128v128h-384v-384h128v-384h-384v128h-384v-128h128v-128h896v128h128z" />
+    <glyph glyph-name="_549" unicode="&#xf249;" 
+d="M1024 288v-416h-928q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68v-928h-416q-40 0 -68 -28t-28 -68zM1152 256h381q-15 -82 -65 -132l-184 -184q-50 -50 -132 -65v381z" />
+    <glyph glyph-name="_550" unicode="&#xf24a;" 
+d="M1400 256h-248v-248q29 10 41 22l185 185q12 12 22 41zM1120 384h288v896h-1280v-1280h896v288q0 40 28 68t68 28zM1536 1312v-1024q0 -40 -20 -88t-48 -76l-184 -184q-28 -28 -76 -48t-88 -20h-1024q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68
+z" />
+    <glyph glyph-name="_551" unicode="&#xf24b;" horiz-adv-x="2304" 
+d="M1951 538q0 -26 -15.5 -44.5t-38.5 -23.5q-8 -2 -18 -2h-153v140h153q10 0 18 -2q23 -5 38.5 -23.5t15.5 -44.5zM1933 751q0 -25 -15 -42t-38 -21q-3 -1 -15 -1h-139v129h139q3 0 8.5 -0.5t6.5 -0.5q23 -4 38 -21.5t15 -42.5zM728 587v308h-228v-308q0 -58 -38 -94.5
+t-105 -36.5q-108 0 -229 59v-112q53 -15 121 -23t109 -9l42 -1q328 0 328 217zM1442 403v113q-99 -52 -200 -59q-108 -8 -169 41t-61 142t61 142t169 41q101 -7 200 -58v112q-48 12 -100 19.5t-80 9.5l-28 2q-127 6 -218.5 -14t-140.5 -60t-71 -88t-22 -106t22 -106t71 -88
+t140.5 -60t218.5 -14q101 4 208 31zM2176 518q0 54 -43 88.5t-109 39.5v3q57 8 89 41.5t32 79.5q0 55 -41 88t-107 36q-3 0 -12 0.5t-14 0.5h-455v-510h491q74 0 121.5 36.5t47.5 96.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90
+t90 38h2048q52 0 90 -38t38 -90z" />
+    <glyph glyph-name="_552" unicode="&#xf24c;" horiz-adv-x="2304" 
+d="M858 295v693q-106 -41 -172 -135.5t-66 -211.5t66 -211.5t172 -134.5zM1362 641q0 117 -66 211.5t-172 135.5v-694q106 41 172 135.5t66 211.5zM1577 641q0 -159 -78.5 -294t-213.5 -213.5t-294 -78.5q-119 0 -227.5 46.5t-187 125t-125 187t-46.5 227.5q0 159 78.5 294
+t213.5 213.5t294 78.5t294 -78.5t213.5 -213.5t78.5 -294zM1960 634q0 139 -55.5 261.5t-147.5 205.5t-213.5 131t-252.5 48h-301q-176 0 -323.5 -81t-235 -230t-87.5 -335q0 -171 87 -317.5t236 -231.5t323 -85h301q129 0 251.5 50.5t214.5 135t147.5 202.5t55.5 246z
+M2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+    <glyph glyph-name="_553" unicode="&#xf24d;" horiz-adv-x="1792" 
+d="M1664 -96v1088q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5zM1792 992v-1088q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113
+zM1408 1376v-160h-128v160q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h160v-128h-160q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113z" />
+    <glyph glyph-name="_554" unicode="&#xf24e;" horiz-adv-x="2304" 
+d="M1728 1088l-384 -704h768zM448 1088l-384 -704h768zM1269 1280q-14 -40 -45.5 -71.5t-71.5 -45.5v-1291h608q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1344q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h608v1291q-40 14 -71.5 45.5t-45.5 71.5h-491q-14 0 -23 9t-9 23v64
+q0 14 9 23t23 9h491q21 57 70 92.5t111 35.5t111 -35.5t70 -92.5h491q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-491zM1088 1264q33 0 56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5zM2176 384q0 -73 -46.5 -131t-117.5 -91
+t-144.5 -49.5t-139.5 -16.5t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81zM896 384q0 -73 -46.5 -131t-117.5 -91t-144.5 -49.5t-139.5 -16.5
+t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81z" />
+    <glyph glyph-name="_555" unicode="&#xf250;" 
+d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
+t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-77 -29 -149 -92.5
+t-129.5 -152.5t-92.5 -210t-35 -253h1024q0 132 -35 253t-92.5 210t-129.5 152.5t-149 92.5q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
+    <glyph glyph-name="_556" unicode="&#xf251;" 
+d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
+t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -66 9 -128h1006q9 61 9 128zM1280 -128q0 130 -34 249.5t-90.5 208t-126.5 152t-146 94.5h-230q-76 -31 -146 -94.5t-126.5 -152t-90.5 -208t-34 -249.5h1024z" />
+    <glyph glyph-name="_557" unicode="&#xf252;" 
+d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
+t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -206 85 -384h854q85 178 85 384zM1223 192q-54 141 -145.5 241.5t-194.5 142.5h-230q-103 -42 -194.5 -142.5t-145.5 -241.5h910z" />
+    <glyph glyph-name="_558" unicode="&#xf253;" 
+d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9
+t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-137 -51 -244 -196
+h700q-107 145 -244 196q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
+    <glyph glyph-name="_559" unicode="&#xf254;" 
+d="M1504 -64q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472zM130 0q3 55 16 107t30 95t46 87t53.5 76t64.5 69.5t66 60t70.5 55t66.5 47.5t65 43q-43 28 -65 43t-66.5 47.5t-70.5 55t-66 60t-64.5 69.5t-53.5 76t-46 87
+t-30 95t-16 107h1276q-3 -55 -16 -107t-30 -95t-46 -87t-53.5 -76t-64.5 -69.5t-66 -60t-70.5 -55t-66.5 -47.5t-65 -43q43 -28 65 -43t66.5 -47.5t70.5 -55t66 -60t64.5 -69.5t53.5 -76t46 -87t30 -95t16 -107h-1276zM1504 1536q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9
+h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472z" />
+    <glyph glyph-name="_560" unicode="&#xf255;" 
+d="M768 1152q-53 0 -90.5 -37.5t-37.5 -90.5v-128h-32v93q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-429l-32 30v172q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-224q0 -47 35 -82l310 -296q39 -39 39 -102q0 -26 19 -45t45 -19h640q26 0 45 19t19 45v25
+q0 41 10 77l108 436q10 36 10 77v246q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-32h-32v125q0 40 -25 72.5t-64 40.5q-14 2 -23 2q-46 0 -79 -33t-33 -79v-128h-32v122q0 51 -32.5 89.5t-82.5 43.5q-5 1 -13 1zM768 1280q84 0 149 -50q57 34 123 34q59 0 111 -27
+t86 -76q27 7 59 7q100 0 170 -71.5t70 -171.5v-246q0 -51 -13 -108l-109 -436q-6 -24 -6 -71q0 -80 -56 -136t-136 -56h-640q-84 0 -138 58.5t-54 142.5l-308 296q-76 73 -76 175v224q0 99 70.5 169.5t169.5 70.5q11 0 16 -1q6 95 75.5 160t164.5 65q52 0 98 -21
+q72 69 174 69z" />
+    <glyph glyph-name="_561" unicode="&#xf256;" horiz-adv-x="1792" 
+d="M880 1408q-46 0 -79 -33t-33 -79v-656h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528v-256l-154 205q-38 51 -102 51q-53 0 -90.5 -37.5t-37.5 -90.5q0 -43 26 -77l384 -512q38 -51 102 -51h688q34 0 61 22t34 56l76 405q5 32 5 59v498q0 46 -33 79t-79 33t-79 -33
+t-33 -79v-272h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528h-32v656q0 46 -33 79t-79 33zM880 1536q68 0 125.5 -35.5t88.5 -96.5q19 4 42 4q99 0 169.5 -70.5t70.5 -169.5v-17q105 6 180.5 -64t75.5 -175v-498q0 -40 -8 -83l-76 -404q-14 -79 -76.5 -131t-143.5 -52
+h-688q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 106 75 181t181 75q78 0 128 -34v434q0 99 70.5 169.5t169.5 70.5q23 0 42 -4q31 61 88.5 96.5t125.5 35.5z" />
+    <glyph glyph-name="_562" unicode="&#xf257;" horiz-adv-x="1792" 
+d="M1073 -128h-177q-163 0 -226 141q-23 49 -23 102v5q-62 30 -98.5 88.5t-36.5 127.5q0 38 5 48h-261q-106 0 -181 75t-75 181t75 181t181 75h113l-44 17q-74 28 -119.5 93.5t-45.5 145.5q0 106 75 181t181 75q46 0 91 -17l628 -239h401q106 0 181 -75t75 -181v-668
+q0 -88 -54 -157.5t-140 -90.5l-339 -85q-92 -23 -186 -23zM1024 583l-155 -71l-163 -74q-30 -14 -48 -41.5t-18 -60.5q0 -46 33 -79t79 -33q26 0 46 10l338 154q-49 10 -80.5 50t-31.5 90v55zM1344 272q0 46 -33 79t-79 33q-26 0 -46 -10l-290 -132q-28 -13 -37 -17
+t-30.5 -17t-29.5 -23.5t-16 -29t-8 -40.5q0 -50 31.5 -82t81.5 -32q20 0 38 9l352 160q30 14 48 41.5t18 60.5zM1112 1024l-650 248q-24 8 -46 8q-53 0 -90.5 -37.5t-37.5 -90.5q0 -40 22.5 -73t59.5 -47l526 -200v-64h-640q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5
+t90.5 -37.5h535l233 106v198q0 63 46 106l111 102h-69zM1073 0q82 0 155 19l339 85q43 11 70 45.5t27 78.5v668q0 53 -37.5 90.5t-90.5 37.5h-308l-136 -126q-36 -33 -36 -82v-296q0 -46 33 -77t79 -31t79 35t33 81v208h32v-208q0 -70 -57 -114q52 -8 86.5 -48.5t34.5 -93.5
+q0 -42 -23 -78t-61 -53l-310 -141h91z" />
+    <glyph glyph-name="_563" unicode="&#xf258;" horiz-adv-x="2048" 
+d="M1151 1536q61 0 116 -28t91 -77l572 -781q118 -159 118 -359v-355q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v177l-286 143h-546q-80 0 -136 56t-56 136v32q0 119 84.5 203.5t203.5 84.5h420l42 128h-686q-100 0 -173.5 67.5t-81.5 166.5q-65 79 -65 182v32
+q0 80 56 136t136 56h959zM1920 -64v355q0 157 -93 284l-573 781q-39 52 -103 52h-959q-26 0 -45 -19t-19 -45q0 -32 1.5 -49.5t9.5 -40.5t25 -43q10 31 35.5 50t56.5 19h832v-32h-832q-26 0 -45 -19t-19 -45q0 -44 3 -58q8 -44 44 -73t81 -29h640h91q40 0 68 -28t28 -68
+q0 -15 -5 -30l-64 -192q-10 -29 -35 -47.5t-56 -18.5h-443q-66 0 -113 -47t-47 -113v-32q0 -26 19 -45t45 -19h561q16 0 29 -7l317 -158q24 -13 38.5 -36t14.5 -50v-197q0 -26 19 -45t45 -19h384q26 0 45 19t19 45z" />
+    <glyph glyph-name="_564" unicode="&#xf259;" horiz-adv-x="2048" 
+d="M459 -256q-77 0 -137.5 47.5t-79.5 122.5l-101 401q-13 57 -13 108q0 45 -5 67l-116 477q-7 27 -7 57q0 93 62 161t155 78q17 85 82.5 139t152.5 54q83 0 148 -51.5t85 -132.5l83 -348l103 428q20 81 85 132.5t148 51.5q89 0 155.5 -57.5t80.5 -144.5q92 -10 152 -79
+t60 -162q0 -24 -7 -59l-123 -512q10 7 37.5 28.5t38.5 29.5t35 23t41 20.5t41.5 11t49.5 5.5q105 0 180 -74t75 -179q0 -62 -28.5 -118t-78.5 -94l-507 -380q-68 -51 -153 -51h-694zM1104 1408q-38 0 -68.5 -24t-39.5 -62l-164 -682h-127l-145 602q-9 38 -39.5 62t-68.5 24
+q-48 0 -80 -33t-32 -80q0 -15 3 -28l132 -547h-26l-99 408q-9 37 -40 62.5t-69 25.5q-47 0 -80 -33t-33 -79q0 -14 3 -26l116 -478q7 -28 9 -86t10 -88l100 -401q8 -32 34 -52.5t59 -20.5h694q42 0 76 26l507 379q56 43 56 110q0 52 -37.5 88.5t-89.5 36.5q-43 0 -77 -26
+l-307 -230v227q0 4 32 138t68 282t39 161q4 18 4 29q0 47 -32 81t-79 34q-39 0 -69.5 -24t-39.5 -62l-116 -482h-26l150 624q3 14 3 28q0 48 -31.5 82t-79.5 34z" />
+    <glyph glyph-name="_565" unicode="&#xf25a;" horiz-adv-x="1792" 
+d="M640 1408q-53 0 -90.5 -37.5t-37.5 -90.5v-512v-384l-151 202q-41 54 -107 54q-52 0 -89 -38t-37 -90q0 -43 26 -77l384 -512q38 -51 102 -51h718q22 0 39.5 13.5t22.5 34.5l92 368q24 96 24 194v217q0 41 -28 71t-68 30t-68 -28t-28 -68h-32v61q0 48 -32 81.5t-80 33.5
+q-46 0 -79 -33t-33 -79v-64h-32v90q0 55 -37 94.5t-91 39.5q-53 0 -90.5 -37.5t-37.5 -90.5v-96h-32v570q0 55 -37 94.5t-91 39.5zM640 1536q107 0 181.5 -77.5t74.5 -184.5v-220q22 2 32 2q99 0 173 -69q47 21 99 21q113 0 184 -87q27 7 56 7q94 0 159 -67.5t65 -161.5
+v-217q0 -116 -28 -225l-92 -368q-16 -64 -68 -104.5t-118 -40.5h-718q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 105 74.5 180.5t179.5 75.5q71 0 130 -35v547q0 106 75 181t181 75zM768 128v384h-32v-384h32zM1024 128v384h-32v-384h32zM1280 128v384h-32
+v-384h32z" />
+    <glyph glyph-name="_566" unicode="&#xf25b;" 
+d="M1288 889q60 0 107 -23q141 -63 141 -226v-177q0 -94 -23 -186l-85 -339q-21 -86 -90.5 -140t-157.5 -54h-668q-106 0 -181 75t-75 181v401l-239 628q-17 45 -17 91q0 106 75 181t181 75q80 0 145.5 -45.5t93.5 -119.5l17 -44v113q0 106 75 181t181 75t181 -75t75 -181
+v-261q27 5 48 5q69 0 127.5 -36.5t88.5 -98.5zM1072 896q-33 0 -60.5 -18t-41.5 -48l-74 -163l-71 -155h55q50 0 90 -31.5t50 -80.5l154 338q10 20 10 46q0 46 -33 79t-79 33zM1293 761q-22 0 -40.5 -8t-29 -16t-23.5 -29.5t-17 -30.5t-17 -37l-132 -290q-10 -20 -10 -46
+q0 -46 33 -79t79 -33q33 0 60.5 18t41.5 48l160 352q9 18 9 38q0 50 -32 81.5t-82 31.5zM128 1120q0 -22 8 -46l248 -650v-69l102 111q43 46 106 46h198l106 233v535q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-640h-64l-200 526q-14 37 -47 59.5t-73 22.5
+q-53 0 -90.5 -37.5t-37.5 -90.5zM1180 -128q44 0 78.5 27t45.5 70l85 339q19 73 19 155v91l-141 -310q-17 -38 -53 -61t-78 -23q-53 0 -93.5 34.5t-48.5 86.5q-44 -57 -114 -57h-208v32h208q46 0 81 33t35 79t-31 79t-77 33h-296q-49 0 -82 -36l-126 -136v-308
+q0 -53 37.5 -90.5t90.5 -37.5h668z" />
+    <glyph glyph-name="_567" unicode="&#xf25c;" horiz-adv-x="1973" 
+d="M857 992v-117q0 -13 -9.5 -22t-22.5 -9h-298v-812q0 -13 -9 -22.5t-22 -9.5h-135q-13 0 -22.5 9t-9.5 23v812h-297q-13 0 -22.5 9t-9.5 22v117q0 14 9 23t23 9h793q13 0 22.5 -9.5t9.5 -22.5zM1895 995l77 -961q1 -13 -8 -24q-10 -10 -23 -10h-134q-12 0 -21 8.5
+t-10 20.5l-46 588l-189 -425q-8 -19 -29 -19h-120q-20 0 -29 19l-188 427l-45 -590q-1 -12 -10 -20.5t-21 -8.5h-135q-13 0 -23 10q-9 10 -9 24l78 961q1 12 10 20.5t21 8.5h142q20 0 29 -19l220 -520q10 -24 20 -51q3 7 9.5 24.5t10.5 26.5l221 520q9 19 29 19h141
+q13 0 22 -8.5t10 -20.5z" />
+    <glyph glyph-name="_568" unicode="&#xf25d;" horiz-adv-x="1792" 
+d="M1042 833q0 88 -60 121q-33 18 -117 18h-123v-281h162q66 0 102 37t36 105zM1094 548l205 -373q8 -17 -1 -31q-8 -16 -27 -16h-152q-20 0 -28 17l-194 365h-155v-350q0 -14 -9 -23t-23 -9h-134q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h294q128 0 190 -24q85 -31 134 -109
+t49 -180q0 -92 -42.5 -165.5t-115.5 -109.5q6 -10 9 -16zM896 1376q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM1792 640
+q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+    <glyph glyph-name="_569" unicode="&#xf25e;" horiz-adv-x="1792" 
+d="M605 303q153 0 257 104q14 18 3 36l-45 82q-6 13 -24 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13.5t-23.5 -14.5t-28.5 -13t-33.5 -9.5t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78
+q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-148 0 -246 -96.5t-98 -240.5q0 -146 97 -241.5t247 -95.5zM1235 303q153 0 257 104q14 18 4 36l-45 82q-8 14 -25 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13.5t-23.5 -14.5t-28.5 -13t-33.5 -9.5
+t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-147 0 -245.5 -96.5t-98.5 -240.5q0 -146 97 -241.5t247 -95.5zM896 1376
+q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191
+t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71z" />
+    <glyph glyph-name="f260" unicode="&#xf260;" horiz-adv-x="2048" 
+d="M736 736l384 -384l-384 -384l-672 672l672 672l168 -168l-96 -96l-72 72l-480 -480l480 -480l193 193l-289 287zM1312 1312l672 -672l-672 -672l-168 168l96 96l72 -72l480 480l-480 480l-193 -193l289 -287l-96 -96l-384 384z" />
+    <glyph glyph-name="f261" unicode="&#xf261;" horiz-adv-x="1792" 
+d="M717 182l271 271l-279 279l-88 -88l192 -191l-96 -96l-279 279l279 279l40 -40l87 87l-127 128l-454 -454zM1075 190l454 454l-454 454l-271 -271l279 -279l88 88l-192 191l96 96l279 -279l-279 -279l-40 40l-87 -88zM1792 640q0 -182 -71 -348t-191 -286t-286 -191
+t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+    <glyph glyph-name="_572" unicode="&#xf262;" horiz-adv-x="2304" 
+d="M651 539q0 -39 -27.5 -66.5t-65.5 -27.5q-39 0 -66.5 27.5t-27.5 66.5q0 38 27.5 65.5t66.5 27.5q38 0 65.5 -27.5t27.5 -65.5zM1805 540q0 -39 -27.5 -66.5t-66.5 -27.5t-66.5 27.5t-27.5 66.5t27.5 66t66.5 27t66.5 -27t27.5 -66zM765 539q0 79 -56.5 136t-136.5 57
+t-136.5 -56.5t-56.5 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM1918 540q0 80 -56.5 136.5t-136.5 56.5q-79 0 -136 -56.5t-57 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM850 539q0 -116 -81.5 -197.5t-196.5 -81.5q-116 0 -197.5 82t-81.5 197
+t82 196.5t197 81.5t196.5 -81.5t81.5 -196.5zM2004 540q0 -115 -81.5 -196.5t-197.5 -81.5q-115 0 -196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5q116 0 197.5 -81.5t81.5 -196.5zM1040 537q0 191 -135.5 326.5t-326.5 135.5q-125 0 -231 -62t-168 -168.5t-62 -231.5
+t62 -231.5t168 -168.5t231 -62q191 0 326.5 135.5t135.5 326.5zM1708 1110q-254 111 -556 111q-319 0 -573 -110q117 0 223 -45.5t182.5 -122.5t122 -183t45.5 -223q0 115 43.5 219.5t118 180.5t177.5 123t217 50zM2187 537q0 191 -135 326.5t-326 135.5t-326.5 -135.5
+t-135.5 -326.5t135.5 -326.5t326.5 -135.5t326 135.5t135 326.5zM1921 1103h383q-44 -51 -75 -114.5t-40 -114.5q110 -151 110 -337q0 -156 -77 -288t-209 -208.5t-287 -76.5q-133 0 -249 56t-196 155q-47 -56 -129 -179q-11 22 -53.5 82.5t-74.5 97.5
+q-80 -99 -196.5 -155.5t-249.5 -56.5q-155 0 -287 76.5t-209 208.5t-77 288q0 186 110 337q-9 51 -40 114.5t-75 114.5h365q149 100 355 156.5t432 56.5q224 0 421 -56t348 -157z" />
+    <glyph glyph-name="f263" unicode="&#xf263;" horiz-adv-x="1280" 
+d="M640 629q-188 0 -321 133t-133 320q0 188 133 321t321 133t321 -133t133 -321q0 -187 -133 -320t-321 -133zM640 1306q-92 0 -157.5 -65.5t-65.5 -158.5q0 -92 65.5 -157.5t157.5 -65.5t157.5 65.5t65.5 157.5q0 93 -65.5 158.5t-157.5 65.5zM1163 574q13 -27 15 -49.5
+t-4.5 -40.5t-26.5 -38.5t-42.5 -37t-61.5 -41.5q-115 -73 -315 -94l73 -72l267 -267q30 -31 30 -74t-30 -73l-12 -13q-31 -30 -74 -30t-74 30q-67 68 -267 268l-267 -268q-31 -30 -74 -30t-73 30l-12 13q-31 30 -31 73t31 74l267 267l72 72q-203 21 -317 94
+q-39 25 -61.5 41.5t-42.5 37t-26.5 38.5t-4.5 40.5t15 49.5q10 20 28 35t42 22t56 -2t65 -35q5 -4 15 -11t43 -24.5t69 -30.5t92 -24t113 -11q91 0 174 25.5t120 50.5l38 25q33 26 65 35t56 2t42 -22t28 -35z" />
+    <glyph glyph-name="_574" unicode="&#xf264;" 
+d="M927 956q0 -66 -46.5 -112.5t-112.5 -46.5t-112.5 46.5t-46.5 112.5t46.5 112.5t112.5 46.5t112.5 -46.5t46.5 -112.5zM1141 593q-10 20 -28 32t-47.5 9.5t-60.5 -27.5q-10 -8 -29 -20t-81 -32t-127 -20t-124 18t-86 36l-27 18q-31 25 -60.5 27.5t-47.5 -9.5t-28 -32
+q-22 -45 -2 -74.5t87 -73.5q83 -53 226 -67l-51 -52q-142 -142 -191 -190q-22 -22 -22 -52.5t22 -52.5l9 -9q22 -22 52.5 -22t52.5 22l191 191q114 -115 191 -191q22 -22 52.5 -22t52.5 22l9 9q22 22 22 52.5t-22 52.5l-191 190l-52 52q141 14 225 67q67 44 87 73.5t-2 74.5
+zM1092 956q0 134 -95 229t-229 95t-229 -95t-95 -229t95 -229t229 -95t229 95t95 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="_575" unicode="&#xf265;" horiz-adv-x="1720" 
+d="M1565 1408q65 0 110 -45.5t45 -110.5v-519q0 -176 -68 -336t-182.5 -275t-274 -182.5t-334.5 -67.5q-176 0 -335.5 67.5t-274.5 182.5t-183 275t-68 336v519q0 64 46 110t110 46h1409zM861 344q47 0 82 33l404 388q37 35 37 85q0 49 -34.5 83.5t-83.5 34.5q-47 0 -82 -33
+l-323 -310l-323 310q-35 33 -81 33q-49 0 -83.5 -34.5t-34.5 -83.5q0 -51 36 -85l405 -388q33 -33 81 -33z" />
+    <glyph glyph-name="_576" unicode="&#xf266;" horiz-adv-x="2304" 
+d="M1494 -103l-295 695q-25 -49 -158.5 -305.5t-198.5 -389.5q-1 -1 -27.5 -0.5t-26.5 1.5q-82 193 -255.5 587t-259.5 596q-21 50 -66.5 107.5t-103.5 100.5t-102 43q0 5 -0.5 24t-0.5 27h583v-50q-39 -2 -79.5 -16t-66.5 -43t-10 -64q26 -59 216.5 -499t235.5 -540
+q31 61 140 266.5t131 247.5q-19 39 -126 281t-136 295q-38 69 -201 71v50l513 -1v-47q-60 -2 -93.5 -25t-12.5 -69q33 -70 87 -189.5t86 -187.5q110 214 173 363q24 55 -10 79.5t-129 26.5q1 7 1 25v24q64 0 170.5 0.5t180 1t92.5 0.5v-49q-62 -2 -119 -33t-90 -81
+l-213 -442q13 -33 127.5 -290t121.5 -274l441 1017q-14 38 -49.5 62.5t-65 31.5t-55.5 8v50l460 -4l1 -2l-1 -44q-139 -4 -201 -145q-526 -1216 -559 -1291h-49z" />
+    <glyph glyph-name="_577" unicode="&#xf267;" horiz-adv-x="1792" 
+d="M949 643q0 -26 -16.5 -45t-41.5 -19q-26 0 -45 16.5t-19 41.5q0 26 17 45t42 19t44 -16.5t19 -41.5zM964 585l350 581q-9 -8 -67.5 -62.5t-125.5 -116.5t-136.5 -127t-117 -110.5t-50.5 -51.5l-349 -580q7 7 67 62t126 116.5t136 127t117 111t50 50.5zM1611 640
+q0 -201 -104 -371q-3 2 -17 11t-26.5 16.5t-16.5 7.5q-13 0 -13 -13q0 -10 59 -44q-74 -112 -184.5 -190.5t-241.5 -110.5l-16 67q-1 10 -15 10q-5 0 -8 -5.5t-2 -9.5l16 -68q-72 -15 -146 -15q-199 0 -372 105q1 2 13 20.5t21.5 33.5t9.5 19q0 13 -13 13q-6 0 -17 -14.5
+t-22.5 -34.5t-13.5 -23q-113 75 -192 187.5t-110 244.5l69 15q10 3 10 15q0 5 -5.5 8t-10.5 2l-68 -15q-14 72 -14 139q0 206 109 379q2 -1 18.5 -12t30 -19t17.5 -8q13 0 13 12q0 6 -12.5 15.5t-32.5 21.5l-20 12q77 112 189 189t244 107l15 -67q2 -10 15 -10q5 0 8 5.5
+t2 10.5l-15 66q71 13 134 13q204 0 379 -109q-39 -56 -39 -65q0 -13 12 -13q11 0 48 64q111 -75 187.5 -186t107.5 -241l-56 -12q-10 -2 -10 -16q0 -5 5.5 -8t9.5 -2l57 13q14 -72 14 -140zM1696 640q0 163 -63.5 311t-170.5 255t-255 170.5t-311 63.5t-311 -63.5
+t-255 -170.5t-170.5 -255t-63.5 -311t63.5 -311t170.5 -255t255 -170.5t311 -63.5t311 63.5t255 170.5t170.5 255t63.5 311zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191
+t191 -286t71 -348z" />
+    <glyph glyph-name="_578" unicode="&#xf268;" horiz-adv-x="1792" 
+d="M893 1536q240 2 451 -120q232 -134 352 -372l-742 39q-160 9 -294 -74.5t-185 -229.5l-276 424q128 159 311 245.5t383 87.5zM146 1131l337 -663q72 -143 211 -217t293 -45l-230 -451q-212 33 -385 157.5t-272.5 316t-99.5 411.5q0 267 146 491zM1732 962
+q58 -150 59.5 -310.5t-48.5 -306t-153 -272t-246 -209.5q-230 -133 -498 -119l405 623q88 131 82.5 290.5t-106.5 277.5zM896 942q125 0 213.5 -88.5t88.5 -213.5t-88.5 -213.5t-213.5 -88.5t-213.5 88.5t-88.5 213.5t88.5 213.5t213.5 88.5z" />
+    <glyph glyph-name="_579" unicode="&#xf269;" horiz-adv-x="1792" 
+d="M903 -256q-283 0 -504.5 150.5t-329.5 398.5q-58 131 -67 301t26 332.5t111 312t179 242.5l-11 -281q11 14 68 15.5t70 -15.5q42 81 160.5 138t234.5 59q-54 -45 -119.5 -148.5t-58.5 -163.5q25 -8 62.5 -13.5t63 -7.5t68 -4t50.5 -3q15 -5 9.5 -45.5t-30.5 -75.5
+q-5 -7 -16.5 -18.5t-56.5 -35.5t-101 -34l15 -189l-139 67q-18 -43 -7.5 -81.5t36 -66.5t65.5 -41.5t81 -6.5q51 9 98 34.5t83.5 45t73.5 17.5q61 -4 89.5 -33t19.5 -65q-1 -2 -2.5 -5.5t-8.5 -12.5t-18 -15.5t-31.5 -10.5t-46.5 -1q-60 -95 -144.5 -135.5t-209.5 -29.5
+q74 -61 162.5 -82.5t168.5 -6t154.5 52t128 87.5t80.5 104q43 91 39 192.5t-37.5 188.5t-78.5 125q87 -38 137 -79.5t77 -112.5q15 170 -57.5 343t-209.5 284q265 -77 412 -279.5t151 -517.5q2 -127 -40.5 -255t-123.5 -238t-189 -196t-247.5 -135.5t-288.5 -49.5z" />
+    <glyph glyph-name="_580" unicode="&#xf26a;" horiz-adv-x="1792" 
+d="M1493 1308q-165 110 -359 110q-155 0 -293 -73t-240 -200q-75 -93 -119.5 -218t-48.5 -266v-42q4 -141 48.5 -266t119.5 -218q102 -127 240 -200t293 -73q194 0 359 110q-121 -108 -274.5 -168t-322.5 -60q-29 0 -43 1q-175 8 -333 82t-272 193t-181 281t-67 339
+q0 182 71 348t191 286t286 191t348 71h3q168 -1 320.5 -60.5t273.5 -167.5zM1792 640q0 -192 -77 -362.5t-213 -296.5q-104 -63 -222 -63q-137 0 -255 84q154 56 253.5 233t99.5 405q0 227 -99 404t-253 234q119 83 254 83q119 0 226 -65q135 -125 210.5 -295t75.5 -361z
+" />
+    <glyph glyph-name="_581" unicode="&#xf26b;" horiz-adv-x="1792" 
+d="M1792 599q0 -56 -7 -104h-1151q0 -146 109.5 -244.5t257.5 -98.5q99 0 185.5 46.5t136.5 130.5h423q-56 -159 -170.5 -281t-267.5 -188.5t-321 -66.5q-187 0 -356 83q-228 -116 -394 -116q-237 0 -237 263q0 115 45 275q17 60 109 229q199 360 475 606
+q-184 -79 -427 -354q63 274 283.5 449.5t501.5 175.5q30 0 45 -1q255 117 433 117q64 0 116 -13t94.5 -40.5t66.5 -76.5t24 -115q0 -116 -75 -286q101 -182 101 -390zM1722 1239q0 83 -53 132t-137 49q-108 0 -254 -70q121 -47 222.5 -131.5t170.5 -195.5q51 135 51 216z
+M128 2q0 -86 48.5 -132.5t134.5 -46.5q115 0 266 83q-122 72 -213.5 183t-137.5 245q-98 -205 -98 -332zM632 715h728q-5 142 -113 237t-251 95q-144 0 -251.5 -95t-112.5 -237z" />
+    <glyph glyph-name="_582" unicode="&#xf26c;" horiz-adv-x="2048" 
+d="M1792 288v960q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1248v-960q0 -66 -47 -113t-113 -47h-736v-128h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23
+v64q0 14 9 23t23 9h352v128h-736q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+    <glyph glyph-name="_583" unicode="&#xf26d;" horiz-adv-x="1792" 
+d="M138 1408h197q-70 -64 -126 -149q-36 -56 -59 -115t-30 -125.5t-8.5 -120t10.5 -132t21 -126t28 -136.5q4 -19 6 -28q51 -238 81 -329q57 -171 152 -275h-272q-48 0 -82 34t-34 82v1304q0 48 34 82t82 34zM1346 1408h308q48 0 82 -34t34 -82v-1304q0 -48 -34 -82t-82 -34
+h-178q212 210 196 565l-469 -101q-2 -45 -12 -82t-31 -72t-59.5 -59.5t-93.5 -36.5q-123 -26 -199 40q-32 27 -53 61t-51.5 129t-64.5 258q-35 163 -45.5 263t-5.5 139t23 77q20 41 62.5 73t102.5 45q45 12 83.5 6.5t67 -17t54 -35t43 -48t34.5 -56.5l468 100
+q-68 175 -180 287z" />
+    <glyph glyph-name="_584" unicode="&#xf26e;" 
+d="M1401 -11l-6 -6q-113 -113 -259 -175q-154 -64 -317 -64q-165 0 -317 64q-148 63 -259 175q-113 112 -175 258q-42 103 -54 189q-4 28 48 36q51 8 56 -20q1 -1 1 -4q18 -90 46 -159q50 -124 152 -226q98 -98 226 -152q132 -56 276 -56q143 0 276 56q128 55 225 152l6 6
+q10 10 25 6q12 -3 33 -22q36 -37 17 -58zM929 604l-66 -66l63 -63q21 -21 -7 -49q-17 -17 -32 -17q-10 0 -19 10l-62 61l-66 -66q-5 -5 -15 -5q-15 0 -31 16l-2 2q-18 15 -18 29q0 7 8 17l66 65l-66 66q-16 16 14 45q18 18 31 18q6 0 13 -5l65 -66l65 65q18 17 48 -13
+q27 -27 11 -44zM1400 547q0 -118 -46 -228q-45 -105 -126 -186q-80 -80 -187 -126t-228 -46t-228 46t-187 126q-82 82 -125 186q-15 33 -15 40h-1q-9 27 43 44q50 16 60 -12q37 -99 97 -167h1v339v2q3 136 102 232q105 103 253 103q147 0 251 -103t104 -249
+q0 -147 -104.5 -251t-250.5 -104q-58 0 -112 16q-28 11 -13 61q16 51 44 43l14 -3q14 -3 33 -6t30 -3q104 0 176 71.5t72 174.5q0 101 -72 171q-71 71 -175 71q-107 0 -178 -80q-64 -72 -64 -160v-413q110 -67 242 -67q96 0 185 36.5t156 103.5t103.5 155t36.5 183
+q0 198 -141 339q-140 140 -339 140q-200 0 -340 -140q-53 -53 -77 -87l-2 -2q-8 -11 -13 -15.5t-21.5 -9.5t-38.5 3q-21 5 -36.5 16.5t-15.5 26.5v680q0 15 10.5 26.5t27.5 11.5h877q30 0 30 -55t-30 -55h-811v-483h1q40 42 102 84t108 61q109 46 231 46q121 0 228 -46
+t187 -126q81 -81 126 -186q46 -112 46 -229zM1369 1128q9 -8 9 -18t-5.5 -18t-16.5 -21q-26 -26 -39 -26q-9 0 -16 7q-106 91 -207 133q-128 56 -276 56q-133 0 -262 -49q-27 -10 -45 37q-9 25 -8 38q3 16 16 20q130 57 299 57q164 0 316 -64q137 -58 235 -152z" />
+    <glyph glyph-name="_585" unicode="&#xf270;" horiz-adv-x="1792" 
+d="M1551 60q15 6 26 3t11 -17.5t-15 -33.5q-13 -16 -44 -43.5t-95.5 -68t-141 -74t-188 -58t-229.5 -24.5q-119 0 -238 31t-209 76.5t-172.5 104t-132.5 105t-84 87.5q-8 9 -10 16.5t1 12t8 7t11.5 2t11.5 -4.5q192 -117 300 -166q389 -176 799 -90q190 40 391 135z
+M1758 175q11 -16 2.5 -69.5t-28.5 -102.5q-34 -83 -85 -124q-17 -14 -26 -9t0 24q21 45 44.5 121.5t6.5 98.5q-5 7 -15.5 11.5t-27 6t-29.5 2.5t-35 0t-31.5 -2t-31 -3t-22.5 -2q-6 -1 -13 -1.5t-11 -1t-8.5 -1t-7 -0.5h-5.5h-4.5t-3 0.5t-2 1.5l-1.5 3q-6 16 47 40t103 30
+q46 7 108 1t76 -24zM1364 618q0 -31 13.5 -64t32 -58t37.5 -46t33 -32l13 -11l-227 -224q-40 37 -79 75.5t-58 58.5l-19 20q-11 11 -25 33q-38 -59 -97.5 -102.5t-127.5 -63.5t-140 -23t-137.5 21t-117.5 65.5t-83 113t-31 162.5q0 84 28 154t72 116.5t106.5 83t122.5 57
+t130 34.5t119.5 18.5t99.5 6.5v127q0 65 -21 97q-34 53 -121 53q-6 0 -16.5 -1t-40.5 -12t-56 -29.5t-56 -59.5t-48 -96l-294 27q0 60 22 119t67 113t108 95t151.5 65.5t190.5 24.5q100 0 181 -25t129.5 -61.5t81 -83t45 -86t12.5 -73.5v-589zM692 597q0 -86 70 -133
+q66 -44 139 -22q84 25 114 123q14 45 14 101v162q-59 -2 -111 -12t-106.5 -33.5t-87 -71t-32.5 -114.5z" />
+    <glyph glyph-name="_586" unicode="&#xf271;" horiz-adv-x="1792" 
+d="M1536 1280q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128zM1152 1376v-288q0 -14 9 -23t23 -9
+h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 1376v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM1536 -128v1024h-1408v-1024h1408zM896 448h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224
+v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224z" />
+    <glyph glyph-name="_587" unicode="&#xf272;" horiz-adv-x="1792" 
+d="M1152 416v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23
+t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47
+t47 -113v-96h128q52 0 90 -38t38 -90z" />
+    <glyph glyph-name="_588" unicode="&#xf273;" horiz-adv-x="1792" 
+d="M1111 151l-46 -46q-9 -9 -22 -9t-23 9l-188 189l-188 -189q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22t9 23l189 188l-189 188q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l188 -188l188 188q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23l-188 -188l188 -188q9 -10 9 -23t-9 -22z
+M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280
+q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+    <glyph glyph-name="_589" unicode="&#xf274;" horiz-adv-x="1792" 
+d="M1303 572l-512 -512q-10 -9 -23 -9t-23 9l-288 288q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l220 -220l444 444q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23
+t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47
+t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+    <glyph glyph-name="_590" unicode="&#xf275;" horiz-adv-x="1792" 
+d="M448 1536q26 0 45 -19t19 -45v-891l536 429q17 14 40 14q26 0 45 -19t19 -45v-379l536 429q17 14 40 14q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h384z" />
+    <glyph glyph-name="_591" unicode="&#xf276;" horiz-adv-x="1024" 
+d="M512 448q66 0 128 15v-655q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v655q62 -15 128 -15zM512 1536q212 0 362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362t150 362t362 150zM512 1312q14 0 23 9t9 23t-9 23t-23 9q-146 0 -249 -103t-103 -249
+q0 -14 9 -23t23 -9t23 9t9 23q0 119 84.5 203.5t203.5 84.5z" />
+    <glyph glyph-name="_592" unicode="&#xf277;" horiz-adv-x="1792" 
+d="M1745 1239q10 -10 10 -23t-10 -23l-141 -141q-28 -28 -68 -28h-1344q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h576v64q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-64h512q40 0 68 -28zM768 320h256v-512q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v512zM1600 768
+q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1344q-40 0 -68 28l-141 141q-10 10 -10 23t10 23l141 141q28 28 68 28h512v192h256v-192h576z" />
+    <glyph glyph-name="_593" unicode="&#xf278;" horiz-adv-x="2048" 
+d="M2020 1525q28 -20 28 -53v-1408q0 -20 -11 -36t-29 -23l-640 -256q-24 -11 -48 0l-616 246l-616 -246q-10 -5 -24 -5q-19 0 -36 11q-28 20 -28 53v1408q0 20 11 36t29 23l640 256q24 11 48 0l616 -246l616 246q32 13 60 -6zM736 1390v-1270l576 -230v1270zM128 1173
+v-1270l544 217v1270zM1920 107v1270l-544 -217v-1270z" />
+    <glyph glyph-name="_594" unicode="&#xf279;" horiz-adv-x="1792" 
+d="M512 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472q0 20 17 28l480 256q7 4 15 4zM1760 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472
+q0 20 17 28l480 256q7 4 15 4zM640 1536q8 0 14 -3l512 -256q18 -10 18 -29v-1472q0 -13 -9.5 -22.5t-22.5 -9.5q-8 0 -14 3l-512 256q-18 10 -18 29v1472q0 13 9.5 22.5t22.5 9.5z" />
+    <glyph glyph-name="_595" unicode="&#xf27a;" horiz-adv-x="1792" 
+d="M640 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 640q0 53 -37.5 90.5t-90.5 37.5
+t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-110 0 -211 18q-173 -173 -435 -229q-52 -10 -86 -13q-12 -1 -22 6t-13 18q-4 15 20 37q5 5 23.5 21.5t25.5 23.5t23.5 25.5t24 31.5t20.5 37
+t20 48t14.5 57.5t12.5 72.5q-146 90 -229.5 216.5t-83.5 269.5q0 174 120 321.5t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+    <glyph glyph-name="_596" unicode="&#xf27b;" horiz-adv-x="1792" 
+d="M640 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 -53 -37.5 -90.5t-90.5 -37.5
+t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5
+t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51
+t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 130 71 248.5t191 204.5t286 136.5t348 50.5t348 -50.5t286 -136.5t191 -204.5t71 -248.5z" />
+    <glyph glyph-name="_597" unicode="&#xf27c;" horiz-adv-x="1024" 
+d="M512 345l512 295v-591l-512 -296v592zM0 640v-591l512 296zM512 1527v-591l-512 -296v591zM512 936l512 295v-591z" />
+    <glyph glyph-name="_598" unicode="&#xf27d;" horiz-adv-x="1792" 
+d="M1709 1018q-10 -236 -332 -651q-333 -431 -562 -431q-142 0 -240 263q-44 160 -132 482q-72 262 -157 262q-18 0 -127 -76l-77 98q24 21 108 96.5t130 115.5q156 138 241 146q95 9 153 -55.5t81 -203.5q44 -287 66 -373q55 -249 120 -249q51 0 154 161q101 161 109 246
+q13 139 -109 139q-57 0 -121 -26q120 393 459 382q251 -8 236 -326z" />
+    <glyph glyph-name="f27e" unicode="&#xf27e;" 
+d="M0 1408h1536v-1536h-1536v1536zM1085 293l-221 631l221 297h-634l221 -297l-221 -631l317 -304z" />
+    <glyph glyph-name="uniF280" unicode="&#xf280;" 
+d="M0 1408h1536v-1536h-1536v1536zM908 1088l-12 -33l75 -83l-31 -114l25 -25l107 57l107 -57l25 25l-31 114l75 83l-12 33h-95l-53 96h-32l-53 -96h-95zM641 925q32 0 44.5 -16t11.5 -63l174 21q0 55 -17.5 92.5t-50.5 56t-69 25.5t-85 7q-133 0 -199 -57.5t-66 -182.5v-72
+h-96v-128h76q20 0 20 -8v-382q0 -14 -5 -20t-18 -7l-73 -7v-88h448v86l-149 14q-6 1 -8.5 1.5t-3.5 2.5t-0.5 4t1 7t0.5 10v387h191l38 128h-231q-6 0 -2 6t4 9v80q0 27 1.5 40.5t7.5 28t19.5 20t36.5 5.5zM1248 96v86l-54 9q-7 1 -9.5 2.5t-2.5 3t1 7.5t1 12v520h-275
+l-23 -101l83 -22q23 -7 23 -27v-370q0 -14 -6 -18.5t-20 -6.5l-70 -9v-86h352z" />
+    <glyph glyph-name="uniF281" unicode="&#xf281;" horiz-adv-x="1792" 
+d="M1792 690q0 -58 -29.5 -105.5t-79.5 -72.5q12 -46 12 -96q0 -155 -106.5 -287t-290.5 -208.5t-400 -76.5t-399.5 76.5t-290 208.5t-106.5 287q0 47 11 94q-51 25 -82 73.5t-31 106.5q0 82 58 140.5t141 58.5q85 0 145 -63q218 152 515 162l116 521q3 13 15 21t26 5
+l369 -81q18 37 54 59.5t79 22.5q62 0 106 -43.5t44 -105.5t-44 -106t-106 -44t-105.5 43.5t-43.5 105.5l-334 74l-104 -472q300 -9 519 -160q58 61 143 61q83 0 141 -58.5t58 -140.5zM418 491q0 -62 43.5 -106t105.5 -44t106 44t44 106t-44 105.5t-106 43.5q-61 0 -105 -44
+t-44 -105zM1228 136q11 11 11 26t-11 26q-10 10 -25 10t-26 -10q-41 -42 -121 -62t-160 -20t-160 20t-121 62q-11 10 -26 10t-25 -10q-11 -10 -11 -25.5t11 -26.5q43 -43 118.5 -68t122.5 -29.5t91 -4.5t91 4.5t122.5 29.5t118.5 68zM1225 341q62 0 105.5 44t43.5 106
+q0 61 -44 105t-105 44q-62 0 -106 -43.5t-44 -105.5t44 -106t106 -44z" />
+    <glyph glyph-name="_602" unicode="&#xf282;" horiz-adv-x="1792" 
+d="M69 741h1q16 126 58.5 241.5t115 217t167.5 176t223.5 117.5t276.5 43q231 0 414 -105.5t294 -303.5q104 -187 104 -442v-188h-1125q1 -111 53.5 -192.5t136.5 -122.5t189.5 -57t213 -3t208 46.5t173.5 84.5v-377q-92 -55 -229.5 -92t-312.5 -38t-316 53
+q-189 73 -311.5 249t-124.5 372q-3 242 111 412t325 268q-48 -60 -78 -125.5t-46 -159.5h635q8 77 -8 140t-47 101.5t-70.5 66.5t-80.5 41t-75 20.5t-56 8.5l-22 1q-135 -5 -259.5 -44.5t-223.5 -104.5t-176 -140.5t-138 -163.5z" />
+    <glyph glyph-name="_603" unicode="&#xf283;" horiz-adv-x="2304" 
+d="M0 32v608h2304v-608q0 -66 -47 -113t-113 -47h-1984q-66 0 -113 47t-47 113zM640 256v-128h384v128h-384zM256 256v-128h256v128h-256zM2144 1408q66 0 113 -47t47 -113v-224h-2304v224q0 66 47 113t113 47h1984z" />
+    <glyph glyph-name="_604" unicode="&#xf284;" horiz-adv-x="1792" 
+d="M1584 246l-218 111q-74 -120 -196.5 -189t-263.5 -69q-147 0 -271 72t-196 196t-72 270q0 110 42.5 209.5t115 172t172 115t209.5 42.5q131 0 247.5 -60.5t192.5 -168.5l215 125q-110 169 -286.5 265t-378.5 96q-161 0 -308 -63t-253 -169t-169 -253t-63 -308t63 -308
+t169 -253t253 -169t308 -63q213 0 397.5 107t290.5 292zM1030 643l693 -352q-116 -253 -334.5 -400t-492.5 -147q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71q260 0 470.5 -133.5t335.5 -366.5zM1543 640h-39v-160h-96v352h136q32 0 54.5 -20
+t28.5 -48t1 -56t-27.5 -48t-57.5 -20z" />
+    <glyph glyph-name="uniF285" unicode="&#xf285;" horiz-adv-x="1792" 
+d="M1427 827l-614 386l92 151h855zM405 562l-184 116v858l1183 -743zM1424 697l147 -95v-858l-532 335zM1387 718l-500 -802h-855l356 571z" />
+    <glyph glyph-name="uniF286" unicode="&#xf286;" horiz-adv-x="1792" 
+d="M640 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1152 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1664 496v-752h-640v320q0 80 -56 136t-136 56t-136 -56t-56 -136v-320h-640v752q0 16 16 16h96
+q16 0 16 -16v-112h128v624q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 6 2.5 9.5t8.5 5t9.5 2t11.5 0t9 -0.5v391q-32 15 -32 50q0 23 16.5 39t38.5 16t38.5 -16t16.5 -39q0 -35 -32 -50v-17q45 10 83 10q21 0 59.5 -7.5t54.5 -7.5
+q17 0 47 7.5t37 7.5q16 0 16 -16v-210q0 -15 -35 -21.5t-62 -6.5q-18 0 -54.5 7.5t-55.5 7.5q-40 0 -90 -12v-133q1 0 9 0.5t11.5 0t9.5 -2t8.5 -5t2.5 -9.5v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-624h128v112q0 16 16 16h96
+q16 0 16 -16z" />
+    <glyph glyph-name="_607" unicode="&#xf287;" horiz-adv-x="2304" 
+d="M2288 731q16 -8 16 -27t-16 -27l-320 -192q-8 -5 -16 -5q-9 0 -16 4q-16 10 -16 28v128h-858q37 -58 83 -165q16 -37 24.5 -55t24 -49t27 -47t27 -34t31.5 -26t33 -8h96v96q0 14 9 23t23 9h320q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v96h-96
+q-32 0 -61 10t-51 23.5t-45 40.5t-37 46t-33.5 57t-28.5 57.5t-28 60.5q-23 53 -37 81.5t-36 65t-44.5 53.5t-46.5 17h-360q-22 -84 -91 -138t-157 -54q-106 0 -181 75t-75 181t75 181t181 75q88 0 157 -54t91 -138h104q24 0 46.5 17t44.5 53.5t36 65t37 81.5q19 41 28 60.5
+t28.5 57.5t33.5 57t37 46t45 40.5t51 23.5t61 10h107q21 57 70 92.5t111 35.5q80 0 136 -56t56 -136t-56 -136t-136 -56q-62 0 -111 35.5t-70 92.5h-107q-17 0 -33 -8t-31.5 -26t-27 -34t-27 -47t-24 -49t-24.5 -55q-46 -107 -83 -165h1114v128q0 18 16 28t32 -1z" />
+    <glyph glyph-name="_608" unicode="&#xf288;" horiz-adv-x="1792" 
+d="M1150 774q0 -56 -39.5 -95t-95.5 -39h-253v269h253q56 0 95.5 -39.5t39.5 -95.5zM1329 774q0 130 -91.5 222t-222.5 92h-433v-896h180v269h253q130 0 222 91.5t92 221.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348
+t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+    <glyph glyph-name="_609" unicode="&#xf289;" horiz-adv-x="2304" 
+d="M1645 438q0 59 -34 106.5t-87 68.5q-7 -45 -23 -92q-7 -24 -27.5 -38t-44.5 -14q-12 0 -24 3q-31 10 -45 38.5t-4 58.5q23 71 23 143q0 123 -61 227.5t-166 165.5t-228 61q-134 0 -247 -73t-167 -194q108 -28 188 -106q22 -23 22 -55t-22 -54t-54 -22t-55 22
+q-75 75 -180 75q-106 0 -181 -74.5t-75 -180.5t75 -180.5t181 -74.5h1046q79 0 134.5 55.5t55.5 133.5zM1798 438q0 -142 -100.5 -242t-242.5 -100h-1046q-169 0 -289 119.5t-120 288.5q0 153 100 267t249 136q62 184 221 298t354 114q235 0 408.5 -158.5t196.5 -389.5
+q116 -25 192.5 -118.5t76.5 -214.5zM2048 438q0 -175 -97 -319q-23 -33 -64 -33q-24 0 -43 13q-26 17 -32 48.5t12 57.5q71 104 71 233t-71 233q-18 26 -12 57t32 49t57.5 11.5t49.5 -32.5q97 -142 97 -318zM2304 438q0 -244 -134 -443q-23 -34 -64 -34q-23 0 -42 13
+q-26 18 -32.5 49t11.5 57q108 164 108 358q0 195 -108 357q-18 26 -11.5 57.5t32.5 48.5q26 18 57 12t49 -33q134 -198 134 -442z" />
+    <glyph glyph-name="_610" unicode="&#xf28a;" 
+d="M1500 -13q0 -89 -63 -152.5t-153 -63.5t-153.5 63.5t-63.5 152.5q0 90 63.5 153.5t153.5 63.5t153 -63.5t63 -153.5zM1267 268q-115 -15 -192.5 -102.5t-77.5 -205.5q0 -74 33 -138q-146 -78 -379 -78q-109 0 -201 21t-153.5 54.5t-110.5 76.5t-76 85t-44.5 83
+t-23.5 66.5t-6 39.5q0 19 4.5 42.5t18.5 56t36.5 58t64 43.5t94.5 18t94 -17.5t63 -41t35.5 -53t17.5 -49t4 -33.5q0 -34 -23 -81q28 -27 82 -42t93 -17l40 -1q115 0 190 51t75 133q0 26 -9 48.5t-31.5 44.5t-49.5 41t-74 44t-93.5 47.5t-119.5 56.5q-28 13 -43 20
+q-116 55 -187 100t-122.5 102t-72 125.5t-20.5 162.5q0 78 20.5 150t66 137.5t112.5 114t166.5 77t221.5 28.5q120 0 220 -26t164.5 -67t109.5 -94t64 -105.5t19 -103.5q0 -46 -15 -82.5t-36.5 -58t-48.5 -36t-49 -19.5t-39 -5h-8h-32t-39 5t-44 14t-41 28t-37 46t-24 70.5
+t-10 97.5q-15 16 -59 25.5t-81 10.5l-37 1q-68 0 -117.5 -31t-70.5 -70t-21 -76q0 -24 5 -43t24 -46t53 -51t97 -53.5t150 -58.5q76 -25 138.5 -53.5t109 -55.5t83 -59t60.5 -59.5t41 -62.5t26.5 -62t14.5 -63.5t6 -62t1 -62.5z" />
+    <glyph glyph-name="_611" unicode="&#xf28b;" 
+d="M704 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1152 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103
+t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="_612" unicode="&#xf28c;" 
+d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273
+t73 -273t198 -198t273 -73zM864 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192z" />
+    <glyph glyph-name="_613" unicode="&#xf28d;" 
+d="M1088 352v576q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5
+t103 -385.5z" />
+    <glyph glyph-name="_614" unicode="&#xf28e;" 
+d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273
+t73 -273t198 -198t273 -73zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h576q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-576z" />
+    <glyph glyph-name="_615" unicode="&#xf290;" horiz-adv-x="1792" 
+d="M1757 128l35 -313q3 -28 -16 -50q-19 -21 -48 -21h-1664q-29 0 -48 21q-19 22 -16 50l35 313h1722zM1664 967l86 -775h-1708l86 775q3 24 21 40.5t43 16.5h256v-128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v128h384v-128q0 -53 37.5 -90.5t90.5 -37.5
+t90.5 37.5t37.5 90.5v128h256q25 0 43 -16.5t21 -40.5zM1280 1152v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
+    <glyph glyph-name="_616" unicode="&#xf291;" horiz-adv-x="2048" 
+d="M1920 768q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-15l-115 -662q-8 -46 -44 -76t-82 -30h-1280q-46 0 -82 30t-44 76l-115 662h-15q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5h1792zM485 -32q26 2 43.5 22.5t15.5 46.5l-32 416q-2 26 -22.5 43.5
+t-46.5 15.5t-43.5 -22.5t-15.5 -46.5l32 -416q2 -25 20.5 -42t43.5 -17h5zM896 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1280 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1632 27l32 416
+q2 26 -15.5 46.5t-43.5 22.5t-46.5 -15.5t-22.5 -43.5l-32 -416q-2 -26 15.5 -46.5t43.5 -22.5h5q25 0 43.5 17t20.5 42zM476 1244l-93 -412h-132l101 441q19 88 89 143.5t160 55.5h167q0 26 19 45t45 19h384q26 0 45 -19t19 -45h167q90 0 160 -55.5t89 -143.5l101 -441
+h-132l-93 412q-11 44 -45.5 72t-79.5 28h-167q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45h-167q-45 0 -79.5 -28t-45.5 -72z" />
+    <glyph glyph-name="_617" unicode="&#xf292;" horiz-adv-x="1792" 
+d="M991 512l64 256h-254l-64 -256h254zM1759 1016l-56 -224q-7 -24 -31 -24h-327l-64 -256h311q15 0 25 -12q10 -14 6 -28l-56 -224q-5 -24 -31 -24h-327l-81 -328q-7 -24 -31 -24h-224q-16 0 -26 12q-9 12 -6 28l78 312h-254l-81 -328q-7 -24 -31 -24h-225q-15 0 -25 12
+q-9 12 -6 28l78 312h-311q-15 0 -25 12q-9 12 -6 28l56 224q7 24 31 24h327l64 256h-311q-15 0 -25 12q-10 14 -6 28l56 224q5 24 31 24h327l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h254l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h311
+q15 0 25 -12q9 -12 6 -28z" />
+    <glyph glyph-name="_618" unicode="&#xf293;" 
+d="M841 483l148 -148l-149 -149zM840 1094l149 -149l-148 -148zM710 -130l464 464l-306 306l306 306l-464 464v-611l-255 255l-93 -93l320 -321l-320 -321l93 -93l255 255v-611zM1429 640q0 -209 -32 -365.5t-87.5 -257t-140.5 -162.5t-181.5 -86.5t-219.5 -24.5
+t-219.5 24.5t-181.5 86.5t-140.5 162.5t-87.5 257t-32 365.5t32 365.5t87.5 257t140.5 162.5t181.5 86.5t219.5 24.5t219.5 -24.5t181.5 -86.5t140.5 -162.5t87.5 -257t32 -365.5z" />
+    <glyph glyph-name="_619" unicode="&#xf294;" horiz-adv-x="1024" 
+d="M596 113l173 172l-173 172v-344zM596 823l173 172l-173 172v-344zM628 640l356 -356l-539 -540v711l-297 -296l-108 108l372 373l-372 373l108 108l297 -296v711l539 -540z" />
+    <glyph glyph-name="_620" unicode="&#xf295;" 
+d="M1280 256q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM512 1024q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5
+t112.5 -271.5zM1440 1344q0 -20 -13 -38l-1056 -1408q-19 -26 -51 -26h-160q-26 0 -45 19t-19 45q0 20 13 38l1056 1408q19 26 51 26h160q26 0 45 -19t19 -45zM768 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5
+t271.5 -112.5t112.5 -271.5z" />
+    <glyph glyph-name="_621" unicode="&#xf296;" horiz-adv-x="1792" 
+d="M104 830l792 -1015l-868 630q-18 13 -25 34.5t0 42.5l101 308v0zM566 830h660l-330 -1015v0zM368 1442l198 -612h-462l198 612q8 23 33 23t33 -23zM1688 830l101 -308q7 -21 0 -42.5t-25 -34.5l-868 -630l792 1015v0zM1688 830h-462l198 612q8 23 33 23t33 -23z" />
+    <glyph glyph-name="_622" unicode="&#xf297;" horiz-adv-x="1792" 
+d="M384 704h160v224h-160v-224zM1221 372v92q-104 -36 -243 -38q-135 -1 -259.5 46.5t-220.5 122.5l1 -96q88 -80 212 -128.5t272 -47.5q129 0 238 49zM640 704h640v224h-640v-224zM1792 736q0 -187 -99 -352q89 -102 89 -229q0 -157 -129.5 -268t-313.5 -111
+q-122 0 -225 52.5t-161 140.5q-19 -1 -57 -1t-57 1q-58 -88 -161 -140.5t-225 -52.5q-184 0 -313.5 111t-129.5 268q0 127 89 229q-99 165 -99 352q0 209 120 385.5t326.5 279.5t449.5 103t449.5 -103t326.5 -279.5t120 -385.5z" />
+    <glyph glyph-name="_623" unicode="&#xf298;" 
+d="M515 625v-128h-252v128h252zM515 880v-127h-252v127h252zM1273 369v-128h-341v128h341zM1273 625v-128h-672v128h672zM1273 880v-127h-672v127h672zM1408 20v1240q0 8 -6 14t-14 6h-32l-378 -256l-210 171l-210 -171l-378 256h-32q-8 0 -14 -6t-6 -14v-1240q0 -8 6 -14
+t14 -6h1240q8 0 14 6t6 14zM553 1130l185 150h-406zM983 1130l221 150h-406zM1536 1260v-1240q0 -62 -43 -105t-105 -43h-1240q-62 0 -105 43t-43 105v1240q0 62 43 105t105 43h1240q62 0 105 -43t43 -105z" />
+    <glyph glyph-name="_624" unicode="&#xf299;" horiz-adv-x="1792" 
+d="M896 720q-104 196 -160 278q-139 202 -347 318q-34 19 -70 36q-89 40 -94 32t34 -38l39 -31q62 -43 112.5 -93.5t94.5 -116.5t70.5 -113t70.5 -131q9 -17 13 -25q44 -84 84 -153t98 -154t115.5 -150t131 -123.5t148.5 -90.5q153 -66 154 -60q1 3 -49 37q-53 36 -81 57
+q-77 58 -179 211t-185 310zM549 177q-76 60 -132.5 125t-98 143.5t-71 154.5t-58.5 186t-52 209t-60.5 252t-76.5 289q273 0 497.5 -36t379 -92t271 -144.5t185.5 -172.5t110 -198.5t56 -199.5t12.5 -198.5t-9.5 -173t-20 -143.5t-13 -107l323 -327h-104l-281 285
+q-22 -2 -91.5 -14t-121.5 -19t-138 -6t-160.5 17t-167.5 59t-179 111z" />
+    <glyph glyph-name="_625" unicode="&#xf29a;" horiz-adv-x="1792" 
+d="M1374 879q-6 26 -28.5 39.5t-48.5 7.5q-261 -62 -401 -62t-401 62q-26 6 -48.5 -7.5t-28.5 -39.5t7.5 -48.5t39.5 -28.5q194 -46 303 -58q-2 -158 -15.5 -269t-26.5 -155.5t-41 -115.5l-9 -21q-10 -25 1 -49t36 -34q9 -4 23 -4q44 0 60 41l8 20q54 139 71 259h42
+q17 -120 71 -259l8 -20q16 -41 60 -41q14 0 23 4q25 10 36 34t1 49l-9 21q-28 71 -41 115.5t-26.5 155.5t-15.5 269q109 12 303 58q26 6 39.5 28.5t7.5 48.5zM1024 1024q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z
+M1600 640q0 -143 -55.5 -273.5t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5zM896 1408q-156 0 -298 -61t-245 -164t-164 -245t-61 -298t61 -298
+t164 -245t245 -164t298 -61t298 61t245 164t164 245t61 298t-61 298t-164 245t-245 164t-298 61zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+    <glyph glyph-name="_626" unicode="&#xf29b;" 
+d="M1438 723q34 -35 29 -82l-44 -551q-4 -42 -34.5 -70t-71.5 -28q-6 0 -9 1q-44 3 -72.5 36.5t-25.5 77.5l35 429l-143 -8q55 -113 55 -240q0 -216 -148 -372l-137 137q91 101 91 235q0 145 -102.5 248t-247.5 103q-134 0 -236 -92l-137 138q120 114 284 141l264 300
+l-149 87l-181 -161q-33 -30 -77 -27.5t-73 35.5t-26.5 77t34.5 73l239 213q26 23 60 26.5t64 -14.5l488 -283q36 -21 48 -68q17 -67 -26 -117l-205 -232l371 20q49 3 83 -32zM1240 1180q-74 0 -126 52t-52 126t52 126t126 52t126.5 -52t52.5 -126t-52.5 -126t-126.5 -52z
+M613 -62q106 0 196 61l139 -139q-146 -116 -335 -116q-148 0 -273.5 73t-198.5 198t-73 273q0 188 116 336l139 -139q-60 -88 -60 -197q0 -145 102.5 -247.5t247.5 -102.5z" />
+    <glyph glyph-name="_627" unicode="&#xf29c;" 
+d="M880 336v-160q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h160q14 0 23 -9t9 -23zM1136 832q0 -50 -15 -90t-45.5 -69t-52 -44t-59.5 -36q-32 -18 -46.5 -28t-26 -24t-11.5 -29v-32q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v68q0 35 10.5 64.5
+t24 47.5t39 35.5t41 25.5t44.5 21q53 25 75 43t22 49q0 42 -43.5 71.5t-95.5 29.5q-56 0 -95 -27q-29 -20 -80 -83q-9 -12 -25 -12q-11 0 -19 6l-108 82q-10 7 -12 20t5 23q122 192 349 192q129 0 238.5 -89.5t109.5 -214.5zM768 1280q-130 0 -248.5 -51t-204 -136.5
+t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5
+t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="_628" unicode="&#xf29d;" horiz-adv-x="1408" 
+d="M366 1225q-64 0 -110 45.5t-46 110.5q0 64 46 109.5t110 45.5t109.5 -45.5t45.5 -109.5q0 -65 -45.5 -110.5t-109.5 -45.5zM917 583q0 -50 -30 -67.5t-63.5 -6.5t-47.5 34l-367 438q-7 12 -14 15.5t-11 1.5l-3 -3q-7 -8 4 -21l122 -139l1 -354l-161 -457
+q-67 -192 -92 -234q-15 -26 -28 -32q-50 -26 -103 -1q-29 13 -41.5 43t-9.5 57q2 17 197 618l5 416l-85 -164l35 -222q4 -24 -1 -42t-14 -27.5t-19 -16t-17 -7.5l-7 -2q-19 -3 -34.5 3t-24 16t-14 22t-7.5 19.5t-2 9.5l-46 299l211 381q23 34 113 34q75 0 107 -40l424 -521
+q7 -5 14 -17l3 -3l-1 -1q7 -13 7 -29zM514 433q43 -113 88.5 -225t69.5 -168l24 -55q36 -93 42 -125q11 -70 -36 -97q-35 -22 -66 -16t-51 22t-29 35h-1q-6 16 -8 25l-124 351zM1338 -159q31 -49 31 -57q0 -5 -3 -7q-9 -5 -14.5 0.5t-15.5 26t-16 30.5q-114 172 -423 661
+q3 -1 7 1t7 4l3 2q11 9 11 17z" />
+    <glyph glyph-name="_629" unicode="&#xf29e;" horiz-adv-x="2304" 
+d="M504 542h171l-1 265zM1530 641q0 87 -50.5 140t-146.5 53h-54v-388h52q91 0 145 57t54 138zM956 1018l1 -756q0 -14 -9.5 -24t-23.5 -10h-216q-14 0 -23.5 10t-9.5 24v62h-291l-55 -81q-10 -15 -28 -15h-267q-21 0 -30.5 18t3.5 35l556 757q9 14 27 14h332q14 0 24 -10
+t10 -24zM1783 641q0 -193 -125.5 -303t-324.5 -110h-270q-14 0 -24 10t-10 24v756q0 14 10 24t24 10h268q200 0 326 -109t126 -302zM1939 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5
+t-7.5 60t-20 91.5t-41 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2123 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-45 -108t-74 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5
+h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2304 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66 104.5t41 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96
+t9.5 -70.5z" />
+    <glyph glyph-name="uniF2A0" unicode="&#xf2a0;" horiz-adv-x="1408" 
+d="M617 -153q0 11 -13 58t-31 107t-20 69q-1 4 -5 26.5t-8.5 36t-13.5 21.5q-15 14 -51 14q-23 0 -70 -5.5t-71 -5.5q-34 0 -47 11q-6 5 -11 15.5t-7.5 20t-6.5 24t-5 18.5q-37 128 -37 255t37 255q1 4 5 18.5t6.5 24t7.5 20t11 15.5q13 11 47 11q24 0 71 -5.5t70 -5.5
+q36 0 51 14q9 8 13.5 21.5t8.5 36t5 26.5q2 9 20 69t31 107t13 58q0 22 -43.5 52.5t-75.5 42.5q-20 8 -45 8q-34 0 -98 -18q-57 -17 -96.5 -40.5t-71 -66t-46 -70t-45.5 -94.5q-6 -12 -9 -19q-49 -107 -68 -216t-19 -244t19 -244t68 -216q56 -122 83 -161q63 -91 179 -127
+l6 -2q64 -18 98 -18q25 0 45 8q32 12 75.5 42.5t43.5 52.5zM776 760q-26 0 -45 19t-19 45.5t19 45.5q37 37 37 90q0 52 -37 91q-19 19 -19 45t19 45t45 19t45 -19q75 -75 75 -181t-75 -181q-21 -19 -45 -19zM957 579q-27 0 -45 19q-19 19 -19 45t19 45q112 114 112 272
+t-112 272q-19 19 -19 45t19 45t45 19t45 -19q150 -150 150 -362t-150 -362q-18 -19 -45 -19zM1138 398q-27 0 -45 19q-19 19 -19 45t19 45q90 91 138.5 208t48.5 245t-48.5 245t-138.5 208q-19 19 -19 45t19 45t45 19t45 -19q109 -109 167 -249t58 -294t-58 -294t-167 -249
+q-18 -19 -45 -19z" />
+    <glyph glyph-name="uniF2A1" unicode="&#xf2a1;" horiz-adv-x="2176" 
+d="M192 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 352
+q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 864
+q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 1376q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 192q0 -80 -56 -136
+t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 1216q0 -80 -56 -136t-136 -56
+t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 192q0 -80 -56 -136t-136 -56t-136 56
+t-56 136t56 136t136 56t136 -56t56 -136zM1664 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136
+t56 136t136 56t136 -56t56 -136zM2176 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z" />
+    <glyph glyph-name="uniF2A2" unicode="&#xf2a2;" horiz-adv-x="1792" 
+d="M128 -192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM320 0q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM365 365l256 -256l-90 -90l-256 256zM704 384q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45z
+M1411 704q0 -59 -11.5 -108.5t-37.5 -93.5t-44 -67.5t-53 -64.5q-31 -35 -45.5 -54t-33.5 -50t-26.5 -64t-7.5 -74q0 -159 -112.5 -271.5t-271.5 -112.5q-26 0 -45 19t-19 45t19 45t45 19q106 0 181 75t75 181q0 57 11.5 105.5t37 91t43.5 66.5t52 63q40 46 59.5 72
+t37.5 74.5t18 103.5q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM896 576q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45
+t45 19t45 -19t19 -45zM1184 704q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 93 -65.5 158.5t-158.5 65.5q-92 0 -158 -65.5t-66 -158.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 146 103 249t249 103t249 -103t103 -249zM1578 993q10 -25 -1 -49t-36 -34q-9 -4 -23 -4
+q-19 0 -35.5 11t-23.5 30q-68 178 -224 295q-21 16 -25 42t12 47q17 21 43 25t47 -12q183 -137 266 -351zM1788 1074q9 -25 -1.5 -49t-35.5 -34q-11 -4 -23 -4q-44 0 -60 41q-92 238 -297 393q-22 16 -25.5 42t12.5 47q16 22 42 25.5t47 -12.5q235 -175 341 -449z" />
+    <glyph glyph-name="uniF2A3" unicode="&#xf2a3;" horiz-adv-x="2304" 
+d="M1032 576q-59 2 -84 55q-17 34 -48 53.5t-68 19.5q-53 0 -90.5 -37.5t-37.5 -90.5q0 -56 36 -89l10 -8q34 -31 82 -31q37 0 68 19.5t48 53.5q25 53 84 55zM1600 704q0 56 -36 89l-10 8q-34 31 -82 31q-37 0 -68 -19.5t-48 -53.5q-25 -53 -84 -55q59 -2 84 -55
+q17 -34 48 -53.5t68 -19.5q53 0 90.5 37.5t37.5 90.5zM1174 925q-17 -35 -55 -48t-73 4q-62 31 -134 31q-51 0 -99 -17q3 0 9.5 0.5t9.5 0.5q92 0 170.5 -50t118.5 -133q17 -36 3.5 -73.5t-49.5 -54.5q-18 -9 -39 -9q21 0 39 -9q36 -17 49.5 -54.5t-3.5 -73.5
+q-40 -83 -118.5 -133t-170.5 -50h-6q-16 2 -44 4l-290 27l-239 -120q-14 -7 -29 -7q-40 0 -57 35l-160 320q-11 23 -4 47.5t29 37.5l209 119l148 267q17 155 91.5 291.5t195.5 236.5q31 25 70.5 21.5t64.5 -34.5t21.5 -70t-34.5 -65q-70 -59 -117 -128q123 84 267 101
+q40 5 71.5 -19t35.5 -64q5 -40 -19 -71.5t-64 -35.5q-84 -10 -159 -55q46 10 99 10q115 0 218 -50q36 -18 49 -55.5t-5 -73.5zM2137 1085l160 -320q11 -23 4 -47.5t-29 -37.5l-209 -119l-148 -267q-17 -155 -91.5 -291.5t-195.5 -236.5q-26 -22 -61 -22q-45 0 -74 35
+q-25 31 -21.5 70t34.5 65q70 59 117 128q-123 -84 -267 -101q-4 -1 -12 -1q-36 0 -63.5 24t-31.5 60q-5 40 19 71.5t64 35.5q84 10 159 55q-46 -10 -99 -10q-115 0 -218 50q-36 18 -49 55.5t5 73.5q17 35 55 48t73 -4q62 -31 134 -31q51 0 99 17q-3 0 -9.5 -0.5t-9.5 -0.5
+q-92 0 -170.5 50t-118.5 133q-17 36 -3.5 73.5t49.5 54.5q18 9 39 9q-21 0 -39 9q-36 17 -49.5 54.5t3.5 73.5q40 83 118.5 133t170.5 50h6h1q14 -2 42 -4l291 -27l239 120q14 7 29 7q40 0 57 -35z" />
+    <glyph glyph-name="uniF2A4" unicode="&#xf2a4;" horiz-adv-x="1792" 
+d="M1056 704q0 -26 19 -45t45 -19t45 19t19 45q0 146 -103 249t-249 103t-249 -103t-103 -249q0 -26 19 -45t45 -19t45 19t19 45q0 93 66 158.5t158 65.5t158 -65.5t66 -158.5zM835 1280q-117 0 -223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5q0 -26 19 -45t45 -19t45 19
+t19 45q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -55 -18 -103.5t-37.5 -74.5t-59.5 -72q-34 -39 -52 -63t-43.5 -66.5t-37 -91t-11.5 -105.5q0 -106 -75 -181t-181 -75q-26 0 -45 -19t-19 -45t19 -45t45 -19q159 0 271.5 112.5t112.5 271.5q0 41 7.5 74
+t26.5 64t33.5 50t45.5 54q35 41 53 64.5t44 67.5t37.5 93.5t11.5 108.5q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5zM591 561l226 -226l-579 -579q-12 -12 -29 -12t-29 12l-168 168q-12 12 -12 29t12 29zM1612 1524l168 -168q12 -12 12 -29t-12 -30l-233 -233
+l-26 -25l-71 -71q-66 153 -195 258l91 91l207 207q13 12 30 12t29 -12z" />
+    <glyph glyph-name="uniF2A5" unicode="&#xf2a5;" 
+d="M866 1021q0 -27 -13 -94q-11 -50 -31.5 -150t-30.5 -150q-2 -11 -4.5 -12.5t-13.5 -2.5q-20 -2 -31 -2q-58 0 -84 49.5t-26 113.5q0 88 35 174t103 124q28 14 51 14q28 0 36.5 -16.5t8.5 -47.5zM1352 597q0 14 -39 75.5t-52 66.5q-21 8 -34 8q-91 0 -226 -77l-2 2
+q3 22 27.5 135t24.5 178q0 233 -242 233q-24 0 -68 -6q-94 -17 -168.5 -89.5t-111.5 -166.5t-37 -189q0 -146 80.5 -225t227.5 -79q25 0 25 -3t-1 -5q-4 -34 -26 -117q-14 -52 -51.5 -101t-82.5 -49q-42 0 -42 47q0 24 10.5 47.5t25 39.5t29.5 28.5t26 20t11 8.5q0 3 -7 10
+q-24 22 -58.5 36.5t-65.5 14.5q-35 0 -63.5 -34t-41 -75t-12.5 -75q0 -88 51.5 -142t138.5 -54q82 0 155 53t117.5 126t65.5 153q6 22 15.5 66.5t14.5 66.5q3 12 14 18q118 60 227 60q48 0 127 -18q1 -1 4 -1q5 0 9.5 4.5t4.5 8.5zM1536 1120v-960q0 -119 -84.5 -203.5
+t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="uniF2A6" unicode="&#xf2a6;" horiz-adv-x="1535" 
+d="M744 1231q0 24 -2 38.5t-8.5 30t-21 23t-37.5 7.5q-39 0 -78 -23q-105 -58 -159 -190.5t-54 -269.5q0 -44 8.5 -85.5t26.5 -80.5t52.5 -62.5t81.5 -23.5q4 0 18 -0.5t20 0t16 3t15 8.5t7 16q16 77 48 231.5t48 231.5q19 91 19 146zM1498 575q0 -7 -7.5 -13.5t-15.5 -6.5
+l-6 1q-22 3 -62 11t-72 12.5t-63 4.5q-167 0 -351 -93q-15 -8 -21 -27q-10 -36 -24.5 -105.5t-22.5 -100.5q-23 -91 -70 -179.5t-112.5 -164.5t-154.5 -123t-185 -47q-135 0 -214.5 83.5t-79.5 219.5q0 53 19.5 117t63 116.5t97.5 52.5q38 0 120 -33.5t83 -61.5
+q0 -1 -16.5 -12.5t-39.5 -31t-46 -44.5t-39 -61t-16 -74q0 -33 16.5 -53t48.5 -20q45 0 85 31.5t66.5 78t48 105.5t32.5 107t16 90v9q0 2 -3.5 3.5t-8.5 1.5h-10t-10 -0.5t-6 -0.5q-227 0 -352 122.5t-125 348.5q0 108 34.5 221t96 210t156 167.5t204.5 89.5q52 9 106 9
+q374 0 374 -360q0 -98 -38 -273t-43 -211l3 -3q101 57 182.5 88t167.5 31q22 0 53 -13q19 -7 80 -102.5t61 -116.5z" />
+    <glyph glyph-name="uniF2A7" unicode="&#xf2a7;" horiz-adv-x="1664" 
+d="M831 863q32 0 59 -18l222 -148q61 -40 110 -97l146 -170q40 -46 29 -106l-72 -413q-6 -32 -29.5 -53.5t-55.5 -25.5l-527 -56l-352 -32h-9q-39 0 -67.5 28t-28.5 68q0 37 27 64t65 32l260 32h-448q-41 0 -69.5 30t-26.5 71q2 39 32 65t69 26l442 1l-521 64q-41 5 -66 37
+t-19 73q6 35 34.5 57.5t65.5 22.5h10l481 -60l-351 94q-38 10 -62 41.5t-18 68.5q6 36 33 58.5t62 22.5q6 0 20 -2l448 -96l217 -37q1 0 3 -0.5t3 -0.5q23 0 30.5 23t-12.5 36l-186 125q-35 23 -42 63.5t18 73.5q27 38 76 38zM761 661l186 -125l-218 37l-5 2l-36 38
+l-238 262q-1 1 -2.5 3.5t-2.5 3.5q-24 31 -18.5 70t37.5 64q31 23 68 17.5t64 -33.5l142 -147q-2 -1 -5 -3.5t-4 -4.5q-32 -45 -23 -99t55 -85zM1648 1115l15 -266q4 -73 -11 -147l-48 -219q-12 -59 -67 -87l-106 -54q2 62 -39 109l-146 170q-53 61 -117 103l-222 148
+q-34 23 -76 23q-51 0 -88 -37l-235 312q-25 33 -18 73.5t41 63.5q33 22 71.5 14t62.5 -40l266 -352l-262 455q-21 35 -10.5 75t47.5 59q35 18 72.5 6t57.5 -46l241 -420l-136 337q-15 35 -4.5 74t44.5 56q37 19 76 6t56 -51l193 -415l101 -196q8 -15 23 -17.5t27 7.5t11 26
+l-12 224q-2 41 26 71t69 31q39 0 67 -28.5t30 -67.5z" />
+    <glyph glyph-name="uniF2A8" unicode="&#xf2a8;" horiz-adv-x="1792" 
+d="M335 180q-2 0 -6 2q-86 57 -168.5 145t-139.5 180q-21 30 -21 69q0 9 2 19t4 18t7 18t8.5 16t10.5 17t10 15t12 15.5t11 14.5q184 251 452 365q-110 198 -110 211q0 19 17 29q116 64 128 64q18 0 28 -16l124 -229q92 19 192 19q266 0 497.5 -137.5t378.5 -369.5
+q20 -31 20 -69t-20 -69q-91 -142 -218.5 -253.5t-278.5 -175.5q110 -198 110 -211q0 -20 -17 -29q-116 -64 -127 -64q-19 0 -29 16l-124 229l-64 119l-444 820l7 7q-58 -24 -99 -47q3 -5 127 -234t243 -449t119 -223q0 -7 -9 -9q-13 -3 -72 -3q-57 0 -60 7l-456 841
+q-39 -28 -82 -68q24 -43 214 -393.5t190 -354.5q0 -10 -11 -10q-14 0 -82.5 22t-72.5 28l-106 197l-224 413q-44 -53 -78 -106q2 -3 18 -25t23 -34l176 -327q0 -10 -10 -10zM1165 282l49 -91q273 111 450 385q-180 277 -459 389q67 -64 103 -148.5t36 -176.5
+q0 -106 -47 -200.5t-132 -157.5zM848 896q0 -20 14 -34t34 -14q86 0 147 -61t61 -147q0 -20 14 -34t34 -14t34 14t14 34q0 126 -89 215t-215 89q-20 0 -34 -14t-14 -34zM1214 961l-9 4l7 -7z" />
+    <glyph glyph-name="uniF2A9" unicode="&#xf2a9;" horiz-adv-x="1280" 
+d="M1050 430q0 -215 -147 -374q-148 -161 -378 -161q-232 0 -378 161q-147 159 -147 374q0 147 68 270.5t189 196.5t268 73q96 0 182 -31q-32 -62 -39 -126q-66 28 -143 28q-167 0 -280.5 -123t-113.5 -291q0 -170 112.5 -288.5t281.5 -118.5t281 118.5t112 288.5
+q0 89 -32 166q66 13 123 49q41 -98 41 -212zM846 619q0 -192 -79.5 -345t-238.5 -253l-14 -1q-29 0 -62 5q83 32 146.5 102.5t99.5 154.5t58.5 189t30 192.5t7.5 178.5q0 69 -3 103q55 -160 55 -326zM791 947v-2q-73 214 -206 440q88 -59 142.5 -186.5t63.5 -251.5z
+M1035 744q-83 0 -160 75q218 120 290 247q19 37 21 56q-42 -94 -139.5 -166.5t-204.5 -97.5q-35 54 -35 113q0 37 17 79t43 68q46 44 157 74q59 16 106 58.5t74 100.5q74 -105 74 -253q0 -109 -24 -170q-32 -77 -88.5 -130.5t-130.5 -53.5z" />
+    <glyph glyph-name="uniF2AA" unicode="&#xf2aa;" 
+d="M1050 495q0 78 -28 147q-41 -25 -85 -34q22 -50 22 -114q0 -117 -77 -198.5t-193 -81.5t-193.5 81.5t-77.5 198.5q0 115 78 199.5t193 84.5q53 0 98 -19q4 43 27 87q-60 21 -125 21q-154 0 -257.5 -108.5t-103.5 -263.5t103.5 -261t257.5 -106t257.5 106.5t103.5 260.5z
+M872 850q2 -24 2 -71q0 -63 -5 -123t-20.5 -132.5t-40.5 -130t-68.5 -106t-100.5 -70.5q21 -3 42 -3h10q219 139 219 411q0 116 -38 225zM872 850q-4 80 -44 171.5t-98 130.5q92 -156 142 -302zM1207 955q0 102 -51 174q-41 -86 -124 -109q-69 -19 -109 -53.5t-40 -99.5
+q0 -40 24 -77q74 17 140.5 67t95.5 115q-4 -52 -74.5 -111.5t-138.5 -97.5q52 -52 110 -52q51 0 90 37t60 90q17 42 17 117zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5
+t84.5 -203.5z" />
+    <glyph glyph-name="uniF2AB" unicode="&#xf2ab;" 
+d="M1279 388q0 22 -22 27q-67 15 -118 59t-80 108q-7 19 -7 25q0 15 19.5 26t43 17t43 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-12 0 -32 -8t-31 -8q-4 0 -12 2q5 95 5 114q0 79 -17 114q-36 78 -103 121.5t-152 43.5q-199 0 -275 -165q-17 -35 -17 -114q0 -19 5 -114
+q-4 -2 -14 -2q-12 0 -32 7.5t-30 7.5q-21 0 -38.5 -12t-17.5 -32q0 -21 19.5 -35.5t43 -20.5t43 -17t19.5 -26q0 -6 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -46 137 -68q2 -5 6 -26t11.5 -30.5t23.5 -9.5q12 0 37.5 4.5t39.5 4.5q35 0 67 -15t54 -32.5t57.5 -32.5
+t76.5 -15q43 0 79 15t57.5 32.5t53.5 32.5t67 15q14 0 39.5 -4t38.5 -4q16 0 23 10t11 30t6 25q137 22 137 68zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5
+t103 -385.5z" />
+    <glyph glyph-name="uniF2AC" unicode="&#xf2ac;" horiz-adv-x="1664" 
+d="M848 1408q134 1 240.5 -68.5t163.5 -192.5q27 -58 27 -179q0 -47 -9 -191q14 -7 28 -7q18 0 51 13.5t51 13.5q29 0 56 -18t27 -46q0 -32 -31.5 -54t-69 -31.5t-69 -29t-31.5 -47.5q0 -15 12 -43q37 -82 102.5 -150t144.5 -101q28 -12 80 -23q28 -6 28 -35
+q0 -70 -219 -103q-7 -11 -11 -39t-14 -46.5t-33 -18.5q-20 0 -62 6.5t-64 6.5q-37 0 -62 -5q-32 -5 -63 -22.5t-58 -38t-58 -40.5t-76 -33.5t-99 -13.5q-52 0 -96.5 13.5t-75 33.5t-57.5 40.5t-58 38t-62 22.5q-26 5 -63 5q-24 0 -65.5 -7.5t-58.5 -7.5q-25 0 -35 18.5
+t-14 47.5t-11 40q-219 33 -219 103q0 29 28 35q52 11 80 23q78 32 144.5 101t102.5 150q12 28 12 43q0 28 -31.5 47.5t-69.5 29.5t-69.5 31.5t-31.5 52.5q0 27 26 45.5t55 18.5q15 0 48 -13t53 -13q18 0 32 7q-9 142 -9 190q0 122 27 180q64 137 172 198t264 63z" />
+    <glyph glyph-name="uniF2AD" unicode="&#xf2ad;" 
+d="M1280 388q0 22 -22 27q-67 14 -118 58t-80 109q-7 14 -7 25q0 15 19.5 26t42.5 17t42.5 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-11 0 -31 -8t-32 -8q-4 0 -12 2q5 63 5 115q0 78 -17 114q-36 78 -102.5 121.5t-152.5 43.5q-198 0 -275 -165q-18 -38 -18 -115
+q0 -38 6 -114q-10 -2 -15 -2q-11 0 -31.5 8t-30.5 8q-20 0 -37.5 -12.5t-17.5 -32.5q0 -21 19.5 -35.5t42.5 -20.5t42.5 -17t19.5 -26q0 -11 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -47 138 -69q2 -5 6 -26t11 -30.5t23 -9.5q13 0 38.5 5t38.5 5q35 0 67.5 -15
+t54.5 -32.5t57.5 -32.5t76.5 -15q43 0 79 15t57.5 32.5t54 32.5t67.5 15q13 0 39 -4.5t39 -4.5q15 0 22.5 9.5t11.5 31t5 24.5q138 22 138 69zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960
+q119 0 203.5 -84.5t84.5 -203.5z" />
+    <glyph glyph-name="uniF2AE" unicode="&#xf2ae;" horiz-adv-x="2304" 
+d="M2304 1536q-69 -46 -125 -92t-89 -81t-59.5 -71.5t-37.5 -57.5t-22 -44.5t-14 -29.5q-10 -18 -35.5 -136.5t-48.5 -164.5q-15 -29 -50 -60.5t-67.5 -50.5t-72.5 -41t-48 -28q-47 -31 -151 -231q-341 14 -630 -158q-92 -53 -303 -179q47 16 86 31t55 22l15 7
+q71 27 163 64.5t133.5 53.5t108 34.5t142.5 31.5q186 31 465 -7q1 0 10 -3q11 -6 14 -17t-3 -22l-194 -345q-15 -29 -47 -22q-128 24 -354 24q-146 0 -402 -44.5t-392 -46.5q-82 -1 -149 13t-107 37t-61 40t-33 34l-1 1v2q0 6 6 6q138 0 371 55q192 366 374.5 524t383.5 158
+q5 0 14.5 -0.5t38 -5t55 -12t61.5 -24.5t63 -39.5t54 -59t40 -82.5l102 177q2 4 21 42.5t44.5 86.5t61 109.5t84 133.5t100.5 137q66 82 128 141.5t121.5 96.5t92.5 53.5t88 39.5z" />
+    <glyph glyph-name="uniF2B0" unicode="&#xf2b0;" 
+d="M1322 640q0 -45 -5 -76l-236 14l224 -78q-19 -73 -58 -141l-214 103l177 -158q-44 -61 -107 -108l-157 178l103 -215q-61 -37 -140 -59l-79 228l14 -240q-38 -6 -76 -6t-76 6l14 238l-78 -226q-74 19 -140 59l103 215l-157 -178q-59 43 -108 108l178 158l-214 -104
+q-39 69 -58 141l224 79l-237 -14q-5 42 -5 76q0 35 5 77l238 -14l-225 79q19 73 58 140l214 -104l-177 159q46 61 107 108l158 -178l-103 215q67 39 140 58l77 -224l-13 236q36 6 75 6q38 0 76 -6l-14 -237l78 225q74 -19 140 -59l-103 -214l158 178q61 -47 107 -108
+l-177 -159l213 104q37 -62 58 -141l-224 -78l237 14q5 -31 5 -77zM1352 640q0 160 -78.5 295.5t-213 214t-292.5 78.5q-119 0 -227 -46.5t-186.5 -125t-124.5 -187.5t-46 -229q0 -119 46 -228t124.5 -187.5t186.5 -125t227 -46.5q158 0 292.5 78.5t213 214t78.5 294.5z
+M1425 1023v-766l-657 -383l-657 383v766l657 383zM768 -183l708 412v823l-708 411l-708 -411v-823zM1536 1088v-896l-768 -448l-768 448v896l768 448z" />
+    <glyph glyph-name="uniF2B1" unicode="&#xf2b1;" horiz-adv-x="1664" 
+d="M339 1318h691l-26 -72h-665q-110 0 -188.5 -79t-78.5 -189v-771q0 -95 60.5 -169.5t153.5 -93.5q23 -5 98 -5v-72h-45q-140 0 -239.5 100t-99.5 240v771q0 140 99.5 240t239.5 100zM1190 1536h247l-482 -1294q-23 -61 -40.5 -103.5t-45 -98t-54 -93.5t-64.5 -78.5
+t-79.5 -65t-95.5 -41t-116 -18.5v195q163 26 220 182q20 52 20 105q0 54 -20 106l-285 733h228l187 -585zM1664 978v-1111h-795q37 55 45 73h678v1038q0 85 -49.5 155t-129.5 99l25 67q101 -34 163.5 -123.5t62.5 -197.5z" />
+    <glyph glyph-name="uniF2B2" unicode="&#xf2b2;" horiz-adv-x="1792" 
+d="M852 1227q0 -29 -17 -52.5t-45 -23.5t-45 23.5t-17 52.5t17 52.5t45 23.5t45 -23.5t17 -52.5zM688 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50 -21.5t-20 -51.5v-114q0 -30 20.5 -52t49.5 -22q30 0 50.5 22t20.5 52zM860 -149v114q0 30 -20 51.5t-50 21.5t-50.5 -21.5
+t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22q29 0 49.5 22t20.5 52zM1034 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1208 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114
+q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1476 535q-84 -160 -232 -259.5t-323 -99.5q-123 0 -229.5 51.5t-178.5 137t-113 197.5t-41 232q0 88 21 174q-104 -175 -104 -390q0 -162 65 -312t185 -251q30 57 91 57q56 0 86 -50q32 50 87 50q56 0 86 -50q32 50 87 50t87 -50
+q30 50 86 50q28 0 52.5 -15.5t37.5 -40.5q112 94 177 231.5t73 287.5zM1326 564q0 75 -72 75q-17 0 -47 -6q-95 -19 -149 -19q-226 0 -226 243q0 86 30 204q-83 -127 -83 -275q0 -150 89 -260.5t235 -110.5q111 0 210 70q13 48 13 79zM884 1223q0 50 -32 89.5t-81 39.5
+t-81 -39.5t-32 -89.5q0 -51 31.5 -90.5t81.5 -39.5t81.5 39.5t31.5 90.5zM1513 884q0 96 -37.5 179t-113 137t-173.5 54q-77 0 -149 -35t-127 -94q-48 -159 -48 -268q0 -104 45.5 -157t147.5 -53q53 0 142 19q36 6 53 6q51 0 77.5 -28t26.5 -80q0 -26 -4 -46
+q75 68 117.5 165.5t42.5 200.5zM1792 667q0 -111 -33.5 -249.5t-93.5 -204.5q-58 -64 -195 -142.5t-228 -104.5l-4 -1v-114q0 -43 -29.5 -75t-72.5 -32q-56 0 -86 50q-32 -50 -87 -50t-87 50q-30 -50 -86 -50q-55 0 -87 50q-30 -50 -86 -50q-47 0 -75 33.5t-28 81.5
+q-90 -68 -198 -68q-118 0 -211 80q54 1 106 20q-113 31 -182 127q32 -7 71 -7q89 0 164 46q-192 192 -240 306q-24 56 -24 160q0 57 9 125.5t31.5 146.5t55 141t86.5 105t120 42q59 0 81 -52q19 29 42 54q2 3 12 13t13 16q10 15 23 38t25 42t28 39q87 111 211.5 177
+t260.5 66q35 0 62 -4q59 64 146 64q83 0 140 -57q5 -5 5 -12q0 -5 -6 -13.5t-12.5 -16t-16 -17l-10.5 -10.5q17 -6 36 -18t19 -24q0 -6 -16 -25q157 -138 197 -378q25 30 60 30q45 0 100 -49q90 -80 90 -279z" />
+    <glyph glyph-name="uniF2B3" unicode="&#xf2b3;" 
+d="M917 631q0 33 -6 64h-362v-132h217q-12 -76 -74.5 -120.5t-142.5 -44.5q-99 0 -169 71.5t-70 170.5t70 170.5t169 71.5q93 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585h109v110
+h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+    <glyph glyph-name="uniF2B4" unicode="&#xf2b4;" 
+d="M1536 1024v-839q0 -48 -49 -62q-174 -52 -338 -52q-73 0 -215.5 29.5t-227.5 29.5q-164 0 -370 -48v-338h-160v1368q-63 25 -101 81t-38 124q0 91 64 155t155 64t155 -64t64 -155q0 -68 -38 -124t-101 -81v-68q190 44 343 44q99 0 198 -15q14 -2 111.5 -22.5t149.5 -20.5
+q77 0 165 18q11 2 80 21t89 19q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="uniF2B5" unicode="&#xf2b5;" horiz-adv-x="2304" 
+d="M192 384q40 0 56 32t0 64t-56 32t-56 -32t0 -64t56 -32zM1665 442q-10 13 -38.5 50t-41.5 54t-38 49t-42.5 53t-40.5 47t-45 49l-125 -140q-83 -94 -208.5 -92t-205.5 98q-57 69 -56.5 158t58.5 157l177 206q-22 11 -51 16.5t-47.5 6t-56.5 -0.5t-49 -1q-92 0 -158 -66
+l-158 -158h-155v-544q5 0 21 0.5t22 0t19.5 -2t20.5 -4.5t17.5 -8.5t18.5 -13.5l297 -292q115 -111 227 -111q78 0 125 47q57 -20 112.5 8t72.5 85q74 -6 127 44q20 18 36 45.5t14 50.5q10 -10 43 -10q43 0 77 21t49.5 53t12 71.5t-30.5 73.5zM1824 384h96v512h-93l-157 180
+q-66 76 -169 76h-167q-89 0 -146 -67l-209 -243q-28 -33 -28 -75t27 -75q43 -51 110 -52t111 49l193 218q25 23 53.5 21.5t47 -27t8.5 -56.5q16 -19 56 -63t60 -68q29 -36 82.5 -105.5t64.5 -84.5q52 -66 60 -140zM2112 384q40 0 56 32t0 64t-56 32t-56 -32t0 -64t56 -32z
+M2304 960v-640q0 -26 -19 -45t-45 -19h-434q-27 -65 -82 -106.5t-125 -51.5q-33 -48 -80.5 -81.5t-102.5 -45.5q-42 -53 -104.5 -81.5t-128.5 -24.5q-60 -34 -126 -39.5t-127.5 14t-117 53.5t-103.5 81l-287 282h-358q-26 0 -45 19t-19 45v672q0 26 19 45t45 19h421
+q14 14 47 48t47.5 48t44 40t50.5 37.5t51 25.5t62 19.5t68 5.5h117q99 0 181 -56q82 56 181 56h167q35 0 67 -6t56.5 -14.5t51.5 -26.5t44.5 -31t43 -39.5t39 -42t41 -48t41.5 -48.5h355q26 0 45 -19t19 -45z" />
+    <glyph glyph-name="uniF2B6" unicode="&#xf2b6;" horiz-adv-x="1792" 
+d="M1792 882v-978q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v978q0 15 11 24q8 7 39 34.5t41.5 36t45.5 37.5t70 55.5t96 73t143.5 107t192.5 140.5q5 4 52.5 40t71.5 52.5t64 35t69 18.5t69 -18.5t65 -35.5t71 -52t52 -40q110 -80 192.5 -140.5t143.5 -107
+t96 -73t70 -55.5t45.5 -37.5t41.5 -36t39 -34.5q11 -9 11 -24zM1228 297q263 191 345 252q11 8 12.5 20.5t-6.5 23.5l-38 52q-8 11 -21 12.5t-24 -6.5q-231 -169 -343 -250q-5 -3 -52 -39t-71.5 -52.5t-64.5 -35t-69 -18.5t-69 18.5t-64.5 35t-71.5 52.5t-52 39
+q-186 134 -343 250q-11 8 -24 6.5t-21 -12.5l-38 -52q-8 -11 -6.5 -23.5t12.5 -20.5q82 -61 345 -252q10 -8 50 -38t65 -47t64 -39.5t77.5 -33.5t75.5 -11t75.5 11t79 34.5t64.5 39.5t65 47.5t48 36.5z" />
+    <glyph glyph-name="uniF2B7" unicode="&#xf2b7;" horiz-adv-x="1792" 
+d="M1474 623l39 -51q8 -11 6.5 -23.5t-11.5 -20.5q-43 -34 -126.5 -98.5t-146.5 -113t-67 -51.5q-39 -32 -60 -48t-60.5 -41t-76.5 -36.5t-74 -11.5h-1h-1q-37 0 -74 11.5t-76 36.5t-61 41.5t-60 47.5q-5 4 -65 50.5t-143.5 111t-122.5 94.5q-11 8 -12.5 20.5t6.5 23.5
+l37 52q8 11 21.5 13t24.5 -7q94 -73 306 -236q5 -4 43.5 -35t60.5 -46.5t56.5 -32.5t58.5 -17h1h1q24 0 58.5 17t56.5 32.5t60.5 46.5t43.5 35q258 198 313 242q11 8 24 6.5t21 -12.5zM1664 -96v928q-90 83 -159 139q-91 74 -389 304q-3 2 -43 35t-61 48t-56 32.5t-59 17.5
+h-1h-1q-24 0 -59 -17.5t-56 -32.5t-61 -48t-43 -35q-215 -166 -315.5 -245.5t-129.5 -104t-82 -74.5q-14 -12 -21 -19v-928q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 832v-928q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v928q0 56 41 94
+q123 114 350 290.5t233 181.5q36 30 59 47.5t61.5 42t76 36.5t74.5 12h1h1q37 0 74.5 -12t76 -36.5t61.5 -42t59 -47.5q43 -36 156 -122t226 -177t201 -173q41 -38 41 -94z" />
+    <glyph glyph-name="uniF2B8" unicode="&#xf2b8;" 
+d="M330 1l202 -214l-34 236l-216 213zM556 -225l274 218l-11 245l-300 -215zM245 413l227 -213l-48 327l-245 204zM495 189l317 214l-14 324l-352 -200zM843 178l95 -80l-2 239l-103 79q0 -1 1 -8.5t0 -12t-5 -7.5l-78 -52l85 -70q7 -6 7 -88zM138 930l256 -200l-68 465
+l-279 173zM1173 267l15 234l-230 -164l2 -240zM417 722l373 194l-19 441l-423 -163zM1270 357l20 233l-226 142l-2 -105l144 -95q6 -4 4 -9l-7 -119zM1461 496l30 222l-179 -128l-20 -228zM1273 329l-71 49l-8 -117q0 -5 -4 -8l-234 -187q-7 -5 -14 0l-98 83l7 -161
+q0 -5 -4 -8l-293 -234q-4 -2 -6 -2q-8 2 -8 3l-228 242q-4 4 -59 277q-2 7 5 11l61 37q-94 86 -95 92l-72 351q-2 7 6 12l94 45q-133 100 -135 108l-96 466q-2 10 7 13l433 135q5 0 8 -1l317 -153q6 -4 6 -9l20 -463q0 -7 -6 -10l-118 -61l126 -85q5 -2 5 -8l5 -123l121 74
+q5 4 11 0l84 -56l3 110q0 6 5 9l206 126q6 3 11 0l245 -135q4 -4 5 -7t-6.5 -60t-17.5 -124.5t-10 -70.5q0 -5 -4 -7l-191 -153q-6 -5 -13 0z" />
+    <glyph glyph-name="uniF2B9" unicode="&#xf2b9;" horiz-adv-x="1664" 
+d="M1201 298q0 57 -5.5 107t-21 100.5t-39.5 86t-64 58t-91 22.5q-6 -4 -33.5 -20.5t-42.5 -24.5t-40.5 -20t-49 -17t-46.5 -5t-46.5 5t-49 17t-40.5 20t-42.5 24.5t-33.5 20.5q-51 0 -91 -22.5t-64 -58t-39.5 -86t-21 -100.5t-5.5 -107q0 -73 42 -121.5t103 -48.5h576
+q61 0 103 48.5t42 121.5zM1028 892q0 108 -76.5 184t-183.5 76t-183.5 -76t-76.5 -184q0 -107 76.5 -183t183.5 -76t183.5 76t76.5 183zM1664 352v-192q0 -14 -9 -23t-23 -9h-96v-224q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h1216
+q66 0 113 -47t47 -113v-224h96q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-96v-128h96q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-96v-128h96q14 0 23 -9t9 -23z" />
+    <glyph glyph-name="uniF2BA" unicode="&#xf2ba;" horiz-adv-x="1664" 
+d="M1028 892q0 -107 -76.5 -183t-183.5 -76t-183.5 76t-76.5 183q0 108 76.5 184t183.5 76t183.5 -76t76.5 -184zM980 672q46 0 82.5 -17t60 -47.5t39.5 -67t24 -81t11.5 -82.5t3.5 -79q0 -67 -39.5 -118.5t-105.5 -51.5h-576q-66 0 -105.5 51.5t-39.5 118.5q0 48 4.5 93.5
+t18.5 98.5t36.5 91.5t63 64.5t93.5 26h5q7 -4 32 -19.5t35.5 -21t33 -17t37 -16t35 -9t39.5 -4.5t39.5 4.5t35 9t37 16t33 17t35.5 21t32 19.5zM1664 928q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-128h96q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-128h96
+q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-96v-224q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h1216q66 0 113 -47t47 -113v-224h96q13 0 22.5 -9.5t9.5 -22.5v-192zM1408 -96v1472q0 13 -9.5 22.5t-22.5 9.5h-1216
+q-13 0 -22.5 -9.5t-9.5 -22.5v-1472q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5z" />
+    <glyph glyph-name="uniF2BB" unicode="&#xf2bb;" horiz-adv-x="2048" 
+d="M1024 405q0 64 -9 117.5t-29.5 103t-60.5 78t-97 28.5q-6 -4 -30 -18t-37.5 -21.5t-35.5 -17.5t-43 -14.5t-42 -4.5t-42 4.5t-43 14.5t-35.5 17.5t-37.5 21.5t-30 18q-57 0 -97 -28.5t-60.5 -78t-29.5 -103t-9 -117.5t37 -106.5t91 -42.5h512q54 0 91 42.5t37 106.5z
+M867 925q0 94 -66.5 160.5t-160.5 66.5t-160.5 -66.5t-66.5 -160.5t66.5 -160.5t160.5 -66.5t160.5 66.5t66.5 160.5zM1792 416v64q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1792 676v56q0 15 -10.5 25.5t-25.5 10.5h-568
+q-15 0 -25.5 -10.5t-10.5 -25.5v-56q0 -15 10.5 -25.5t25.5 -10.5h568q15 0 25.5 10.5t10.5 25.5zM1792 928v64q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-352v96q0 14 -9 23t-23 9
+h-64q-14 0 -23 -9t-9 -23v-96h-768v96q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-96h-352q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" />
+    <glyph glyph-name="uniF2BC" unicode="&#xf2bc;" horiz-adv-x="2048" 
+d="M1024 405q0 -64 -37 -106.5t-91 -42.5h-512q-54 0 -91 42.5t-37 106.5t9 117.5t29.5 103t60.5 78t97 28.5q6 -4 30 -18t37.5 -21.5t35.5 -17.5t43 -14.5t42 -4.5t42 4.5t43 14.5t35.5 17.5t37.5 21.5t30 18q57 0 97 -28.5t60.5 -78t29.5 -103t9 -117.5zM867 925
+q0 -94 -66.5 -160.5t-160.5 -66.5t-160.5 66.5t-66.5 160.5t66.5 160.5t160.5 66.5t160.5 -66.5t66.5 -160.5zM1792 480v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM1792 732v-56q0 -15 -10.5 -25.5t-25.5 -10.5h-568
+q-15 0 -25.5 10.5t-10.5 25.5v56q0 15 10.5 25.5t25.5 10.5h568q15 0 25.5 -10.5t10.5 -25.5zM1792 992v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM1920 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1728q-13 0 -22.5 -9.5
+t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h352v96q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-96h768v96q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-96h352q13 0 22.5 9.5t9.5 22.5zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-1728q-66 0 -113 47t-47 113v1216q0 66 47 113
+t113 47h1728q66 0 113 -47t47 -113z" />
+    <glyph glyph-name="uniF2BD" unicode="&#xf2bd;" horiz-adv-x="1792" 
+d="M1523 197q-22 155 -87.5 257.5t-184.5 118.5q-67 -74 -159.5 -115.5t-195.5 -41.5t-195.5 41.5t-159.5 115.5q-119 -16 -184.5 -118.5t-87.5 -257.5q106 -150 271 -237.5t356 -87.5t356 87.5t271 237.5zM1280 896q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5
+t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1792 640q0 -182 -71 -347.5t-190.5 -286t-285.5 -191.5t-349 -71q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+    <glyph glyph-name="uniF2BE" unicode="&#xf2be;" horiz-adv-x="1792" 
+d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348q0 -181 -70.5 -347t-190.5 -286t-286 -191.5t-349 -71.5t-349 71t-285.5 191.5t-190.5 286t-71 347.5t71 348t191 286t286 191t348 71zM1515 185q149 205 149 455q0 156 -61 298t-164 245t-245 164t-298 61t-298 -61
+t-245 -164t-164 -245t-61 -298q0 -250 149 -455q66 327 306 327q131 -128 313 -128t313 128q240 0 306 -327zM1280 832q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5z" />
+    <glyph glyph-name="uniF2C0" unicode="&#xf2c0;" 
+d="M1201 752q47 -14 89.5 -38t89 -73t79.5 -115.5t55 -172t22 -236.5q0 -154 -100 -263.5t-241 -109.5h-854q-141 0 -241 109.5t-100 263.5q0 131 22 236.5t55 172t79.5 115.5t89 73t89.5 38q-79 125 -79 272q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5
+t198.5 -40.5t163.5 -109.5t109.5 -163.5t40.5 -198.5q0 -147 -79 -272zM768 1408q-159 0 -271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5zM1195 -128q88 0 150.5 71.5t62.5 173.5q0 239 -78.5 377t-225.5 145
+q-145 -127 -336 -127t-336 127q-147 -7 -225.5 -145t-78.5 -377q0 -102 62.5 -173.5t150.5 -71.5h854z" />
+    <glyph glyph-name="uniF2C1" unicode="&#xf2c1;" horiz-adv-x="1280" 
+d="M1024 278q0 -64 -37 -107t-91 -43h-512q-54 0 -91 43t-37 107t9 118t29.5 104t61 78.5t96.5 28.5q80 -75 188 -75t188 75q56 0 96.5 -28.5t61 -78.5t29.5 -104t9 -118zM870 797q0 -94 -67.5 -160.5t-162.5 -66.5t-162.5 66.5t-67.5 160.5t67.5 160.5t162.5 66.5
+t162.5 -66.5t67.5 -160.5zM1152 -96v1376h-1024v-1376q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1280 1376v-1472q0 -66 -47 -113t-113 -47h-960q-66 0 -113 47t-47 113v1472q0 66 47 113t113 47h352v-96q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v96h352
+q66 0 113 -47t47 -113z" />
+    <glyph glyph-name="uniF2C2" unicode="&#xf2c2;" horiz-adv-x="2048" 
+d="M896 324q0 54 -7.5 100.5t-24.5 90t-51 68.5t-81 25q-64 -64 -156 -64t-156 64q-47 0 -81 -25t-51 -68.5t-24.5 -90t-7.5 -100.5q0 -55 31.5 -93.5t75.5 -38.5h426q44 0 75.5 38.5t31.5 93.5zM768 768q0 80 -56 136t-136 56t-136 -56t-56 -136t56 -136t136 -56t136 56
+t56 136zM1792 288v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1408 544v64q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1792 544v64q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23
+v-64q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1792 800v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM128 1152h1792v96q0 14 -9 23t-23 9h-1728q-14 0 -23 -9t-9 -23v-96zM2048 1248v-1216q0 -66 -47 -113t-113 -47h-1728
+q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" />
+    <glyph glyph-name="uniF2C3" unicode="&#xf2c3;" horiz-adv-x="2048" 
+d="M896 324q0 -55 -31.5 -93.5t-75.5 -38.5h-426q-44 0 -75.5 38.5t-31.5 93.5q0 54 7.5 100.5t24.5 90t51 68.5t81 25q64 -64 156 -64t156 64q47 0 81 -25t51 -68.5t24.5 -90t7.5 -100.5zM768 768q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z
+M1792 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1408 608v-64q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h320q14 0 23 -9t9 -23zM1792 608v-64q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v64
+q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 864v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1920 32v1120h-1792v-1120q0 -13 9.5 -22.5t22.5 -9.5h1728q13 0 22.5 9.5t9.5 22.5zM2048 1248v-1216q0 -66 -47 -113t-113 -47
+h-1728q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1728q66 0 113 -47t47 -113z" />
+    <glyph glyph-name="uniF2C4" unicode="&#xf2c4;" horiz-adv-x="1792" 
+d="M1255 749q0 318 -105 474.5t-330 156.5q-222 0 -326 -157t-104 -474q0 -316 104 -471.5t326 -155.5q74 0 131 17q-22 43 -39 73t-44 65t-53.5 56.5t-63 36t-77.5 14.5q-46 0 -79 -16l-49 97q105 91 276 91q132 0 215.5 -54t150.5 -155q67 149 67 402zM1645 117h117
+q3 -27 -2 -67t-26.5 -95t-58 -100.5t-107 -78t-162.5 -32.5q-71 0 -130.5 19t-105.5 56t-79 78t-66 96q-97 -27 -205 -27q-150 0 -292.5 58t-253 158.5t-178 249t-67.5 317.5q0 170 67.5 319.5t178.5 250.5t253.5 159t291.5 58q121 0 238.5 -36t217 -106t176 -164.5
+t119.5 -219t43 -261.5q0 -190 -80.5 -347.5t-218.5 -264.5q47 -70 93.5 -106.5t104.5 -36.5q61 0 94 37.5t38 85.5z" />
+    <glyph glyph-name="uniF2C5" unicode="&#xf2c5;" horiz-adv-x="2304" 
+d="M453 -101q0 -21 -16 -37.5t-37 -16.5q-1 0 -13 3q-63 15 -162 140q-225 284 -225 676q0 341 213 614q39 51 95 103.5t94 52.5q19 0 35 -13.5t16 -32.5q0 -27 -63 -90q-98 -102 -147 -184q-119 -199 -119 -449q0 -281 123 -491q50 -85 136 -173q2 -3 14.5 -16t19.5 -21
+t17 -20.5t14.5 -23.5t4.5 -21zM1796 33q0 -29 -17.5 -48.5t-46.5 -19.5h-1081q-26 0 -45 19t-19 45q0 29 17.5 48.5t46.5 19.5h1081q26 0 45 -19t19 -45zM1581 644q0 -134 -67 -233q-25 -38 -69.5 -78.5t-83.5 -60.5q-16 -10 -27 -10q-7 0 -15 6t-8 12q0 9 19 30t42 46
+t42 67.5t19 88.5q0 76 -35 130q-29 42 -46 42q-3 0 -3 -5q0 -12 7.5 -35.5t7.5 -36.5q0 -22 -21.5 -35t-44.5 -13q-66 0 -66 76q0 15 1.5 44t1.5 44q0 25 -10 46q-13 25 -42 53.5t-51 28.5q-5 0 -7 -0.5t-3.5 -2.5t-1.5 -6q0 -2 16 -26t16 -54q0 -37 -19 -68t-46 -54
+t-53.5 -46t-45.5 -54t-19 -68q0 -98 42 -160q29 -43 79 -63q16 -5 17 -10q1 -2 1 -5q0 -16 -18 -16q-6 0 -33 11q-119 43 -195 139.5t-76 218.5q0 55 24.5 115.5t60 115t70.5 108.5t59.5 113.5t24.5 111.5q0 53 -25 94q-29 48 -56 64q-19 9 -19 21q0 20 41 20q50 0 110 -29
+q41 -19 71 -44.5t49.5 -51t33.5 -62.5t22 -69t16 -80q0 -1 3 -17.5t4.5 -25t5.5 -25t9 -27t11 -21.5t14.5 -16.5t18.5 -5.5q23 0 37 14t14 37q0 25 -20 67t-20 52t10 10q27 0 93 -70q72 -76 102.5 -156t30.5 -186zM2304 615q0 -274 -138 -503q-19 -32 -48 -72t-68 -86.5
+t-81 -77t-74 -30.5q-16 0 -31 15.5t-15 31.5q0 15 29 50.5t68.5 77t48.5 52.5q183 230 183 531q0 131 -20.5 235t-72.5 211q-58 119 -163 228q-2 3 -13 13.5t-16.5 16.5t-15 17.5t-15 20t-9.5 18.5t-4 19q0 19 16 35.5t35 16.5q70 0 196 -169q98 -131 146 -273t60 -314
+q2 -42 2 -64z" />
+    <glyph glyph-name="uniF2C6" unicode="&#xf2c6;" horiz-adv-x="1792" 
+d="M1189 229l147 693q9 44 -10.5 63t-51.5 7l-864 -333q-29 -11 -39.5 -25t-2.5 -26.5t32 -19.5l221 -69l513 323q21 14 32 6q7 -5 -4 -15l-415 -375v0v0l-16 -228q23 0 45 22l108 104l224 -165q64 -36 81 38zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71
+t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+    <glyph glyph-name="uniF2C7" unicode="&#xf2c7;" horiz-adv-x="1024" 
+d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v907h128v-907q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5
+t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192
+v128h192z" />
+    <glyph glyph-name="uniF2C8" unicode="&#xf2c8;" horiz-adv-x="1024" 
+d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v651h128v-651q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5
+t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192
+v128h192z" />
+    <glyph glyph-name="uniF2C9" unicode="&#xf2c9;" horiz-adv-x="1024" 
+d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v395h128v-395q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5
+t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192
+v128h192z" />
+    <glyph glyph-name="uniF2CA" unicode="&#xf2ca;" horiz-adv-x="1024" 
+d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 60 35 110t93 71v139h128v-139q58 -21 93 -71t35 -110zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5
+t93.5 226.5zM896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192
+v128h192z" />
+    <glyph glyph-name="uniF2CB" unicode="&#xf2cb;" horiz-adv-x="1024" 
+d="M640 192q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 79 56 135.5t136 56.5t136 -56.5t56 -135.5zM768 192q0 77 -34 144t-94 112v768q0 80 -56 136t-136 56t-136 -56t-56 -136v-768q-60 -45 -94 -112t-34 -144q0 -133 93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5z
+M896 192q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 182 128 313v711q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5v-711q128 -131 128 -313zM1024 768v-128h-192v128h192zM1024 1024v-128h-192v128h192zM1024 1280v-128h-192v128h192z" />
+    <glyph glyph-name="uniF2CC" unicode="&#xf2cc;" horiz-adv-x="1920" 
+d="M1433 1287q10 -10 10 -23t-10 -23l-626 -626q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l44 44q-72 91 -81.5 207t46.5 215q-74 71 -176 71q-106 0 -181 -75t-75 -181v-1280h-256v1280q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5q106 0 201 -41
+t166 -115q94 39 197 24.5t185 -79.5l44 44q10 10 23 10t23 -10zM1344 1024q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1600 896q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1856 1024q26 0 45 -19t19 -45t-19 -45t-45 -19
+t-45 19t-19 45t19 45t45 19zM1216 896q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1408 832q0 26 19 45t45 19t45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45zM1728 896q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 768
+q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1344 640q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1600 768q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1216 512q-26 0 -45 19t-19 45t19 45t45 19t45 -19
+t19 -45t-19 -45t-45 -19zM1472 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 512q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1344 512q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1216 384
+q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1088 256q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19z" />
+    <glyph glyph-name="uniF2CD" unicode="&#xf2cd;" horiz-adv-x="1792" 
+d="M1664 448v-192q0 -169 -128 -286v-194q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v118q-63 -22 -128 -22h-768q-65 0 -128 22v-110q0 -17 -9.5 -28.5t-22.5 -11.5h-64q-13 0 -22.5 11.5t-9.5 28.5v186q-128 117 -128 286v192h1536zM704 864q0 -14 -9 -23t-23 -9t-23 9
+t-9 23t9 23t23 9t23 -9t9 -23zM768 928q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM704 992q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 992q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM768 1056q0 -14 -9 -23t-23 -9t-23 9
+t-9 23t9 23t23 9t23 -9t9 -23zM704 1120q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1792 608v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v640q0 106 75 181t181 75q108 0 184 -78q46 19 98 12t93 -39l22 22q11 11 22 0l42 -42
+q11 -11 0 -22l-314 -314q-11 -11 -22 0l-42 42q-11 11 0 22l22 22q-36 46 -40.5 104t23.5 108q-37 35 -88 35q-53 0 -90.5 -37.5t-37.5 -90.5v-640h1504q14 0 23 -9t9 -23zM896 1056q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 1120q0 -14 -9 -23t-23 -9
+t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM768 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM960 1120q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM896 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM832 1248q0 -14 -9 -23
+t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1024 1184q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM960 1248q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23zM1088 1248q0 -14 -9 -23t-23 -9t-23 9t-9 23t9 23t23 9t23 -9t9 -23z" />
+    <glyph glyph-name="uniF2CE" unicode="&#xf2ce;" 
+d="M994 344q0 -86 -17 -197q-31 -215 -55 -313q-22 -90 -152 -90t-152 90q-24 98 -55 313q-17 110 -17 197q0 168 224 168t224 -168zM1536 768q0 -240 -134 -434t-350 -280q-8 -3 -15 3t-6 15q7 48 10 66q4 32 6 47q1 9 9 12q159 81 255.5 234t96.5 337q0 180 -91 330.5
+t-247 234.5t-337 74q-124 -7 -237 -61t-193.5 -140.5t-128 -202t-46.5 -240.5q1 -184 99 -336.5t257 -231.5q7 -3 9 -12q3 -21 6 -45q1 -9 5 -32.5t6 -35.5q1 -9 -6.5 -15t-15.5 -2q-148 58 -261 169.5t-173.5 264t-52.5 319.5q7 143 66 273.5t154.5 227t225 157.5t272.5 70
+q164 10 315.5 -46.5t261 -160.5t175 -250.5t65.5 -308.5zM994 800q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5zM1282 768q0 -122 -53.5 -228.5t-146.5 -177.5q-8 -6 -16 -2t-10 14q-6 52 -29 92q-7 10 3 20
+q58 54 91 127t33 155q0 111 -58.5 204t-157.5 141.5t-212 36.5q-133 -15 -229 -113t-109 -231q-10 -92 23.5 -176t98.5 -144q10 -10 3 -20q-24 -41 -29 -93q-2 -9 -10 -13t-16 2q-95 74 -148.5 183t-51.5 234q3 131 69 244t177 181.5t241 74.5q144 7 268 -60t196.5 -187.5
+t72.5 -263.5z" />
+    <glyph glyph-name="uniF2D0" unicode="&#xf2d0;" horiz-adv-x="1792" 
+d="M256 128h1280v768h-1280v-768zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+    <glyph glyph-name="uniF2D1" unicode="&#xf2d1;" horiz-adv-x="1792" 
+d="M1792 224v-192q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+    <glyph glyph-name="uniF2D2" unicode="&#xf2d2;" horiz-adv-x="2048" 
+d="M256 0h768v512h-768v-512zM1280 512h512v768h-768v-256h96q66 0 113 -47t47 -113v-352zM2048 1376v-960q0 -66 -47 -113t-113 -47h-608v-352q0 -66 -47 -113t-113 -47h-960q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h608v352q0 66 47 113t113 47h960q66 0 113 -47
+t47 -113z" />
+    <glyph glyph-name="uniF2D3" unicode="&#xf2d3;" horiz-adv-x="1792" 
+d="M1175 215l146 146q10 10 10 23t-10 23l-233 233l233 233q10 10 10 23t-10 23l-146 146q-10 10 -23 10t-23 -10l-233 -233l-233 233q-10 10 -23 10t-23 -10l-146 -146q-10 -10 -10 -23t10 -23l233 -233l-233 -233q-10 -10 -10 -23t10 -23l146 -146q10 -10 23 -10t23 10
+l233 233l233 -233q10 -10 23 -10t23 10zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+    <glyph glyph-name="uniF2D4" unicode="&#xf2d4;" horiz-adv-x="1792" 
+d="M1257 425l-146 -146q-10 -10 -23 -10t-23 10l-169 169l-169 -169q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l169 169l-169 169q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l169 -169l169 169q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23
+l-169 -169l169 -169q10 -10 10 -23t-10 -23zM256 128h1280v1024h-1280v-1024zM1792 1248v-1216q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+    <glyph glyph-name="uniF2D5" unicode="&#xf2d5;" horiz-adv-x="1792" 
+d="M1070 358l306 564h-654l-306 -564h654zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+    <glyph glyph-name="uniF2D6" unicode="&#xf2d6;" horiz-adv-x="1794" 
+d="M1291 1060q-15 17 -35 8.5t-26 -28.5t5 -38q14 -17 40 -14.5t34 20.5t-18 52zM895 814q-8 -8 -19.5 -8t-18.5 8q-8 8 -8 19t8 18q7 8 18.5 8t19.5 -8q7 -7 7 -18t-7 -19zM1060 740l-35 -35q-12 -13 -29.5 -13t-30.5 13l-38 38q-12 13 -12 30t12 30l35 35q12 12 29.5 12
+t30.5 -12l38 -39q12 -12 12 -29.5t-12 -29.5zM951 870q-7 -8 -18.5 -8t-19.5 8q-7 8 -7 19t7 19q8 8 19 8t19 -8t8 -19t-8 -19zM1354 968q-34 -64 -107.5 -85.5t-127.5 16.5q-38 28 -61 66.5t-21 87.5t39 92t75.5 53t70.5 -5t70 -51q2 -2 13 -12.5t14.5 -13.5t13 -13.5
+t12.5 -15.5t10 -15.5t8.5 -18t4 -18.5t1 -21t-5 -22t-9.5 -24zM1555 486q3 20 -8.5 34.5t-27.5 21.5t-33 17t-23 20q-40 71 -84 98.5t-113 11.5q19 13 40 18.5t33 4.5l12 -1q2 45 -34 90q6 20 6.5 40.5t-2.5 30.5l-3 10q43 24 71 65t34 91q10 84 -43 150.5t-137 76.5
+q-60 7 -114 -18.5t-82 -74.5q-30 -51 -33.5 -101t14.5 -87t43.5 -64t56.5 -42q-45 4 -88 36t-57 88q-28 108 32 222q-16 21 -29 32q-50 0 -89 -19q19 24 42 37t36 14l13 1q0 50 -13 78q-10 21 -32.5 28.5t-47 -3.5t-37.5 -40q2 4 4 7q-7 -28 -6.5 -75.5t19 -117t48.5 -122.5
+q-25 -14 -47 -36q-35 -16 -85.5 -70.5t-84.5 -101.5l-33 -46q-90 -34 -181 -125.5t-75 -162.5q1 -16 11 -27q-15 -12 -30 -30q-21 -25 -21 -54t21.5 -40t63.5 6q41 19 77 49.5t55 60.5q-2 2 -6.5 5t-20.5 7.5t-33 3.5q23 5 51 12.5t40 10t27.5 6t26 4t23.5 0.5q14 -7 22 34
+q7 37 7 90q0 102 -40 150q106 -103 101 -219q-1 -29 -15 -50t-27 -27l-13 -6q-4 -7 -19 -32t-26 -45.5t-26.5 -52t-25 -61t-17 -63t-6.5 -66.5t10 -63q-35 54 -37 80q-22 -24 -34.5 -39t-33.5 -42t-30.5 -46t-16.5 -41t-0.5 -38t25.5 -27q45 -25 144 64t190.5 221.5
+t122.5 228.5q86 52 145 115.5t86 119.5q47 -93 154 -178q104 -83 167 -80q39 2 46 43zM1794 640q0 -182 -71 -348t-191 -286t-286.5 -191t-348.5 -71t-348.5 71t-286.5 191t-191 286t-71 348t71 348t191 286t286.5 191t348.5 71t348.5 -71t286.5 -191t191 -286t71 -348z" />
+    <glyph glyph-name="uniF2D7" unicode="&#xf2d7;" 
+d="M518 1353v-655q103 -1 191.5 1.5t125.5 5.5l37 3q68 2 90.5 24.5t39.5 94.5l33 142h103l-14 -322l7 -319h-103l-29 127q-15 68 -45 93t-84 26q-87 8 -352 8v-556q0 -78 43.5 -115.5t133.5 -37.5h357q35 0 59.5 2t55 7.5t54 18t48.5 32t46 50.5t39 73l93 216h89
+q-6 -37 -31.5 -252t-30.5 -276q-146 5 -263.5 8t-162.5 4h-44h-628l-376 -12v102l127 25q67 13 91.5 37t25.5 79l8 643q3 402 -8 645q-2 61 -25.5 84t-91.5 36l-127 24v102l376 -12h702q139 0 374 27q-6 -68 -14 -194.5t-12 -219.5l-5 -92h-93l-32 124q-31 121 -74 179.5
+t-113 58.5h-548q-28 0 -35.5 -8.5t-7.5 -30.5z" />
+    <glyph glyph-name="uniF2D8" unicode="&#xf2d8;" 
+d="M922 739v-182q0 -4 0.5 -15t0 -15l-1.5 -12t-3.5 -11.5t-6.5 -7.5t-11 -5.5t-16 -1.5v309q9 0 16 -1t11 -5t6.5 -5.5t3.5 -9.5t1 -10.5v-13.5v-14zM1238 643v-121q0 -1 0.5 -12.5t0 -15.5t-2.5 -11.5t-7.5 -10.5t-13.5 -3q-9 0 -14 9q-4 10 -4 165v7v8.5v9t1.5 8.5l3.5 7
+t5 5.5t8 1.5q6 0 10 -1.5t6.5 -4.5t4 -6t2 -8.5t0.5 -8v-9.5v-9zM180 407h122v472h-122v-472zM614 407h106v472h-159l-28 -221q-20 148 -32 221h-158v-472h107v312l45 -312h76l43 319v-319zM1039 712q0 67 -5 90q-3 16 -11 28.5t-17 20.5t-25 14t-26.5 8.5t-31 4t-29 1.5
+h-29.5h-12h-91v-472h56q169 -1 197 24.5t25 180.5q-1 62 -1 100zM1356 515v133q0 29 -2 45t-9.5 33.5t-24.5 25t-46 7.5q-46 0 -77 -34v154h-117v-472h110l7 30q30 -36 77 -36q50 0 66 30.5t16 83.5zM1536 1248v-1216q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113
+v1216q0 66 47 113t113 47h1216q66 0 113 -47t47 -113z" />
+    <glyph glyph-name="uniF2D9" unicode="&#xf2d9;" horiz-adv-x="2176" 
+d="M1143 -197q-6 1 -11 4q-13 8 -36 23t-86 65t-116.5 104.5t-112 140t-89.5 172.5q-17 3 -175 37q66 -213 235 -362t391 -184zM502 409l168 -28q-25 76 -41 167.5t-19 145.5l-4 53q-84 -82 -121 -224q5 -65 17 -114zM612 1018q-43 -64 -77 -148q44 46 74 68zM2049 584
+q0 161 -62 307t-167.5 252t-250.5 168.5t-304 62.5q-147 0 -281 -52.5t-240 -148.5q-30 -58 -45 -160q60 51 143 83.5t158.5 43t143 13.5t108.5 -1l40 -3q33 -1 53 -15.5t24.5 -33t6.5 -37t-1 -28.5q-126 11 -227.5 0.5t-183 -43.5t-142.5 -71.5t-131 -98.5
+q4 -36 11.5 -92.5t35.5 -178t62 -179.5q123 -6 247.5 14.5t214.5 53.5t162.5 67t109.5 59l37 24q22 16 39.5 20.5t30.5 -5t17 -34.5q14 -97 -39 -121q-208 -97 -467 -134q-135 -20 -317 -16q41 -96 110 -176.5t137 -127t130.5 -79t101.5 -43.5l39 -12q143 -23 263 15
+q195 99 314 289t119 418zM2123 621q-14 -135 -40 -212q-70 -208 -181.5 -346.5t-318.5 -253.5q-48 -33 -82 -44q-72 -26 -163 -16q-36 -3 -73 -3q-283 0 -504.5 173t-295.5 442q-1 0 -4 0.5t-5 0.5q-6 -50 2.5 -112.5t26 -115t36 -98t31.5 -71.5l14 -26q8 -12 54 -82
+q-71 38 -124.5 106.5t-78.5 140t-39.5 137t-17.5 107.5l-2 42q-5 2 -33.5 12.5t-48.5 18t-53 20.5t-57.5 25t-50 25.5t-42.5 27t-25 25.5q19 -10 50.5 -25.5t113 -45.5t145.5 -38l2 32q11 149 94 290q41 202 176 365q28 115 81 214q15 28 32 45t49 32q158 74 303.5 104
+t302 11t306.5 -97q220 -115 333 -336t87 -474z" />
+    <glyph glyph-name="uniF2DA" unicode="&#xf2da;" horiz-adv-x="1792" 
+d="M1341 752q29 44 -6.5 129.5t-121.5 142.5q-58 39 -125.5 53.5t-118 4.5t-68.5 -37q-12 -23 -4.5 -28t42.5 -10q23 -3 38.5 -5t44.5 -9.5t56 -17.5q36 -13 67.5 -31.5t53 -37t40 -38.5t30.5 -38t22 -34.5t16.5 -28.5t12 -18.5t10.5 -6t11 9.5zM1704 178
+q-52 -127 -148.5 -220t-214.5 -141.5t-253 -60.5t-266 13.5t-251 91t-210 161.5t-141.5 235.5t-46.5 303.5q1 41 8.5 84.5t12.5 64t24 80.5t23 73q-51 -208 1 -397t173 -318t291 -206t346 -83t349 74.5t289 244.5q20 27 18 14q0 -4 -4 -14zM1465 627q0 -104 -40.5 -199
+t-108.5 -164t-162 -109.5t-198 -40.5t-198 40.5t-162 109.5t-108.5 164t-40.5 199t40.5 199t108.5 164t162 109.5t198 40.5t198 -40.5t162 -109.5t108.5 -164t40.5 -199zM1752 915q-65 147 -180.5 251t-253 153.5t-292 53.5t-301 -36.5t-275.5 -129t-220 -211.5t-131 -297
+t-10 -373q-49 161 -51.5 311.5t35.5 272.5t109 227t165.5 180.5t207 126t232 71t242.5 9t236 -54t216 -124.5t178 -197q33 -50 62 -121t31 -112zM1690 573q12 244 -136.5 416t-396.5 240q-8 0 -10 5t24 8q125 -4 230 -50t173 -120t116 -168.5t58.5 -199t-1 -208
+t-61.5 -197.5t-122.5 -167t-185 -117.5t-248.5 -46.5q108 30 201.5 80t174 123t129.5 176.5t55 225.5z" />
+    <glyph glyph-name="uniF2DB" unicode="&#xf2db;" 
+d="M192 256v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 512v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 768v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16
+q0 16 16 16h112zM192 1024v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM192 1280v-128h-112q-16 0 -16 16v16h-48q-16 0 -16 16v32q0 16 16 16h48v16q0 16 16 16h112zM1280 1440v-1472q0 -40 -28 -68t-68 -28h-832q-40 0 -68 28
+t-28 68v1472q0 40 28 68t68 28h832q40 0 68 -28t28 -68zM1536 208v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 464v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 720v-32
+q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 976v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16h48q16 0 16 -16zM1536 1232v-32q0 -16 -16 -16h-48v-16q0 -16 -16 -16h-112v128h112q16 0 16 -16v-16
+h48q16 0 16 -16z" />
+    <glyph glyph-name="uniF2DC" unicode="&#xf2dc;" horiz-adv-x="1664" 
+d="M1566 419l-167 -33l186 -107q23 -13 29.5 -38.5t-6.5 -48.5q-14 -23 -39 -29.5t-48 6.5l-186 106l55 -160q13 -38 -12 -63.5t-60.5 -20.5t-48.5 42l-102 300l-271 156v-313l208 -238q16 -18 17 -39t-11 -36.5t-28.5 -25t-37 -5.5t-36.5 22l-112 128v-214q0 -26 -19 -45
+t-45 -19t-45 19t-19 45v214l-112 -128q-16 -18 -36.5 -22t-37 5.5t-28.5 25t-11 36.5t17 39l208 238v313l-271 -156l-102 -300q-13 -37 -48.5 -42t-60.5 20.5t-12 63.5l55 160l-186 -106q-23 -13 -48 -6.5t-39 29.5q-13 23 -6.5 48.5t29.5 38.5l186 107l-167 33
+q-29 6 -42 29t-8.5 46.5t25.5 40t50 10.5l310 -62l271 157l-271 157l-310 -62q-4 -1 -13 -1q-27 0 -44 18t-19 40t11 43t40 26l167 33l-186 107q-23 13 -29.5 38.5t6.5 48.5t39 30t48 -7l186 -106l-55 160q-13 38 12 63.5t60.5 20.5t48.5 -42l102 -300l271 -156v313
+l-208 238q-16 18 -17 39t11 36.5t28.5 25t37 5.5t36.5 -22l112 -128v214q0 26 19 45t45 19t45 -19t19 -45v-214l112 128q16 18 36.5 22t37 -5.5t28.5 -25t11 -36.5t-17 -39l-208 -238v-313l271 156l102 300q13 37 48.5 42t60.5 -20.5t12 -63.5l-55 -160l186 106
+q23 13 48 6.5t39 -29.5q13 -23 6.5 -48.5t-29.5 -38.5l-186 -107l167 -33q27 -5 40 -26t11 -43t-19 -40t-44 -18q-9 0 -13 1l-310 62l-271 -157l271 -157l310 62q29 6 50 -10.5t25.5 -40t-8.5 -46.5t-42 -29z" />
+    <glyph glyph-name="uniF2DD" unicode="&#xf2dd;" horiz-adv-x="1792" 
+d="M1473 607q7 118 -33 226.5t-113 189t-177 131t-221 57.5q-116 7 -225.5 -32t-192 -110.5t-135 -175t-59.5 -220.5q-7 -118 33 -226.5t113 -189t177.5 -131t221.5 -57.5q155 -9 293 59t224 195.5t94 283.5zM1792 1536l-349 -348q120 -117 180.5 -272t50.5 -321
+q-11 -183 -102 -339t-241 -255.5t-332 -124.5l-999 -132l347 347q-120 116 -180.5 271.5t-50.5 321.5q11 184 102 340t241.5 255.5t332.5 124.5q167 22 500 66t500 66z" />
+    <glyph glyph-name="uniF2DE" unicode="&#xf2de;" horiz-adv-x="1792" 
+d="M948 508l163 -329h-51l-175 350l-171 -350h-49l179 374l-78 33l21 49l240 -102l-21 -50zM563 1100l304 -130l-130 -304l-304 130zM907 915l240 -103l-103 -239l-239 102zM1188 765l191 -81l-82 -190l-190 81zM1680 640q0 159 -62 304t-167.5 250.5t-250.5 167.5t-304 62
+t-304 -62t-250.5 -167.5t-167.5 -250.5t-62 -304t62 -304t167.5 -250.5t250.5 -167.5t304 -62t304 62t250.5 167.5t167.5 250.5t62 304zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71
+t286 -191t191 -286t71 -348z" />
+    <glyph glyph-name="uniF2E0" unicode="&#xf2e0;" horiz-adv-x="1920" 
+d="M1334 302q-4 24 -27.5 34t-49.5 10.5t-48.5 12.5t-25.5 38q-5 47 33 139.5t75 181t32 127.5q-14 101 -117 103q-45 1 -75 -16l-3 -2l-5 -2.5t-4.5 -2t-5 -2t-5 -0.5t-6 1.5t-6 3.5t-6.5 5q-3 2 -9 8.5t-9 9t-8.5 7.5t-9.5 7.5t-9.5 5.5t-11 4.5t-11.5 2.5q-30 5 -48 -3
+t-45 -31q-1 -1 -9 -8.5t-12.5 -11t-15 -10t-16.5 -5.5t-17 3q-54 27 -84 40q-41 18 -94 -5t-76 -65q-16 -28 -41 -98.5t-43.5 -132.5t-40 -134t-21.5 -73q-22 -69 18.5 -119t110.5 -46q30 2 50.5 15t38.5 46q7 13 79 199.5t77 194.5q6 11 21.5 18t29.5 0q27 -15 21 -53
+q-2 -18 -51 -139.5t-50 -132.5q-6 -38 19.5 -56.5t60.5 -7t55 49.5q4 8 45.5 92t81.5 163.5t46 88.5q20 29 41 28q29 0 25 -38q-2 -16 -65.5 -147.5t-70.5 -159.5q-12 -53 13 -103t74 -74q17 -9 51 -15.5t71.5 -8t62.5 14t20 48.5zM383 86q3 -15 -5 -27.5t-23 -15.5
+q-14 -3 -26.5 5t-15.5 23q-3 14 5 27t22 16t27 -5t16 -23zM953 -177q12 -17 8.5 -37.5t-20.5 -32.5t-37.5 -8t-32.5 21q-11 17 -7.5 37.5t20.5 32.5t37.5 8t31.5 -21zM177 635q-18 -27 -49.5 -33t-57.5 13q-26 18 -32 50t12 58q18 27 49.5 33t57.5 -12q26 -19 32 -50.5
+t-12 -58.5zM1467 -42q19 -28 13 -61.5t-34 -52.5t-60.5 -13t-51.5 34t-13 61t33 53q28 19 60.5 13t52.5 -34zM1579 562q69 -113 42.5 -244.5t-134.5 -207.5q-90 -63 -199 -60q-20 -80 -84.5 -127t-143.5 -44.5t-140 57.5q-12 -9 -13 -10q-103 -71 -225 -48.5t-193 126.5
+q-50 73 -53 164q-83 14 -142.5 70.5t-80.5 128t-2 152t81 138.5q-36 60 -38 128t24.5 125t79.5 98.5t121 50.5q32 85 99 148t146.5 91.5t168 17t159.5 -66.5q72 21 140 17.5t128.5 -36t104.5 -80t67.5 -115t17.5 -140.5q52 -16 87 -57t45.5 -89t-5.5 -99.5t-58 -87.5z
+M455 1222q14 -20 9.5 -44.5t-24.5 -38.5q-19 -14 -43.5 -9.5t-37.5 24.5q-14 20 -9.5 44.5t24.5 38.5q19 14 43.5 9.5t37.5 -24.5zM614 1503q4 -16 -5 -30.5t-26 -18.5t-31 5.5t-18 26.5q-3 17 6.5 31t25.5 18q17 4 31 -5.5t17 -26.5zM1800 555q4 -20 -6.5 -37t-30.5 -21
+q-19 -4 -36 6.5t-21 30.5t6.5 37t30.5 22q20 4 36.5 -7.5t20.5 -30.5zM1136 1448q16 -27 8.5 -58.5t-35.5 -47.5q-27 -16 -57.5 -8.5t-46.5 34.5q-16 28 -8.5 59t34.5 48t58 9t47 -36zM1882 792q4 -15 -4 -27.5t-23 -16.5q-15 -3 -27.5 5.5t-15.5 22.5q-3 15 5 28t23 16
+q14 3 26.5 -5t15.5 -23zM1691 1033q15 -22 10.5 -49t-26.5 -43q-22 -15 -49 -10t-42 27t-10 49t27 43t48.5 11t41.5 -28z" />
+    <glyph glyph-name="uniF2E1" unicode="&#xf2e1;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="uniF2E2" unicode="&#xf2e2;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="uniF2E3" unicode="&#xf2e3;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="uniF2E4" unicode="&#xf2e4;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="uniF2E5" unicode="&#xf2e5;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="uniF2E6" unicode="&#xf2e6;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="uniF2E7" unicode="&#xf2e7;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="_698" unicode="&#xf2e8;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="uniF2E9" unicode="&#xf2e9;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="uniF2EA" unicode="&#xf2ea;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="uniF2EB" unicode="&#xf2eb;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="uniF2EC" unicode="&#xf2ec;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="uniF2ED" unicode="&#xf2ed;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="uniF2EE" unicode="&#xf2ee;" horiz-adv-x="1792" 
+ />
+    <glyph glyph-name="lessequal" unicode="&#xf500;" horiz-adv-x="1792" 
+ />
+  </font>
+</defs></svg>
diff --git a/fonts/fontawesome-webfont.ttf b/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..35acda2fa1196aad98c2adf4378a7611dd713aa3
Binary files /dev/null and b/fonts/fontawesome-webfont.ttf differ
diff --git a/fonts/fontawesome-webfont.woff b/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000000000000000000000000000000000000..400014a4b06eee3d0c0d54402a47ab2601b2862b
Binary files /dev/null and b/fonts/fontawesome-webfont.woff differ
diff --git a/fonts/fontawesome-webfont.woff2 b/fonts/fontawesome-webfont.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..4d13fc60404b91e398a37200c4a77b645cfd9586
Binary files /dev/null and b/fonts/fontawesome-webfont.woff2 differ
diff --git a/funciones.php b/funciones.php
new file mode 100644
index 0000000000000000000000000000000000000000..8ef934031cbb50a5454a390ac5b7554ea18f5667
--- /dev/null
+++ b/funciones.php
@@ -0,0 +1,47 @@
+<?php
+function conexdb(){
+	global $conex;
+	$server='arduiacob.i234.me:3307';
+	$usuario = "velostat";
+	$password = "Paula@R4.0";
+	$based = "velostat1";
+	$conex = new mysqli($server,$usuario,$password,$based); 
+	if ($conex->connect_errno) {
+		echo "Fallo al conectar a MySQL: (". $conex->connect_errno . ") ". $conex->connect_error;
+	}
+}
+
+/*
+Menú plegable 
+*/
+function barra(){
+	global $conex, $html, $chmod, $id_admin, $nombre, $hoy, $dia_ant;
+	conexdb(); //Si no hemos conectado a la base de datos conectamos.
+	$id_admin=$_REQUEST["variable"]; 
+	// Comprobar permisos:
+	if ($result = $conex->query("SELECT * FROM `TRABAJADORES` WHERE `dni_trabajador`= '$id_admin'"))
+	{
+		$row = $result->fetch_assoc();
+		$nombre = $row['nombre'];
+		$permisos = $row['permisos'];
+		
+		$html->assign("nombre",$nombre);
+		$html->assign("permisos",$permisos);
+		$imagen_id = imagen('media/images/personal/',$id_admin);
+		$html->assign("imagen_id",$imagen_id);
+		$html->assign("id_admin",$id_admin);
+	}
+
+	$html->assign("barra",$barra);
+
+}
+
+function imagen($ruta, $nombre){
+	$imagen=$ruta.$nombre.'.png'; // Aqui obtienes la imagen del usuario de BBDD
+	if(! file_exists($imagen)){
+	$imagen = 'media/images/no_image/no_image.png';
+	}
+	return $imagen;
+}
+
+?>
diff --git a/ges_ens.php b/ges_ens.php
new file mode 100644
index 0000000000000000000000000000000000000000..799f2c99d69de74d93d5d2fac85dd06841a5d0a7
--- /dev/null
+++ b/ges_ens.php
@@ -0,0 +1,74 @@
+<?php session_start(); 
+require_once("funciones.php");
+require('include.php');
+/*
+* Archivo de control. Gestionar ensayos
+* Caso de uso: CREAR ENSAYO
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+	
+	$id_admin=$_GET["variable"]; 
+	$accion =$_GET["accion"];
+	$id_ensayo = $_POST['id_ensayo'];
+	if($id_ensayo=="") $id_ensayo = $_GET['id'];
+
+	$html=new Smarty;
+	
+	
+	// Barra
+	barra();
+	// Fin de barra
+
+	// Valores para el formulario:
+		// Id ensayo
+		// Tipo
+		// Colocación sensores
+		// Duración
+		// Repeticiones
+		// Comentarios
+		// Fecha creación
+	
+	if($accion == 1 && $id_ensayo!=""){//eliminar un ensayo
+		$sql="DELETE FROM `ENSAYOS` WHERE `id_ensayo`='$id_ensayo'";
+		$id_ensayo = "";
+		if ($conex->query($sql)){
+			$mensaje ="Ensayo borrado con éxito";
+		}else{
+			$mensaje ="Error al borrar el ensayo";
+		}
+	}else{
+		if ($id_ensayo){
+		
+			if ($result = $conex->query("SELECT * FROM `ENSAYOS` WHERE `id_ensayo`='$id_ensayo'")){
+				$row = $result->fetch_assoc();
+				$mod_campos = [ $row['id_ensayo'],$row['tipo'],$row['coloc_sensores'],$row['duracion'],$row['repeticiones'],$row['comentarios']];
+				$mensaje = "Modificando ensayo";
+			}
+			else {
+				$mensaje = "Error inesperado en lectura registro de '$id_ensayo'";
+			}
+			$html->assign("mod_campos",$mod_campos);
+		}
+	}
+
+
+	//Mostramos una tabla con todos los ensayos
+	$x=0;
+	if ($result = $conex->query("SELECT * FROM `ENSAYOS` ORDER BY `id_ensayo` ASC")){
+		while ($row = $result->fetch_assoc()) {
+			$campos[$x] = array($row['id_ensayo'],$row['tipo'],nl2br($row['coloc_sensores'],false),$row['duracion'],$row['repeticiones'],nl2br($row['comentarios'],false),$row['fecha_creacion'],$row['fecha_modificacion']);
+			$x++;
+		}
+	} else{
+		$mensaje= "Ha habido un error inesperado.";
+	}
+
+	$html->assign("id_admin",$id_admin);
+	$html->assign("mensaje",$mensaje);
+	$html->assign("campos",$campos);
+	$html->display("ges_ens.tpl");
+
+}
+else	@header('location:index.php');
+
+?>		
diff --git a/ges_ens_nuevo.php b/ges_ens_nuevo.php
new file mode 100644
index 0000000000000000000000000000000000000000..08216450a4bbf06e494128917023bfc5d73aa80b
--- /dev/null
+++ b/ges_ens_nuevo.php
@@ -0,0 +1,66 @@
+<?php session_start(); 
+require_once("funciones.php");
+require('include.php');
+/*
+* Archivo de control. Crear ensayo nuevo
+* Caso de uso: Crear ensayo
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+
+	$id_admin=$_GET["variable"]; 
+
+	$html=new Smarty;
+	$mensaje="Registro de nuevo ensayo";
+
+	// Barra
+	barra();
+	// Fin de barra
+
+	// Valores para el formulario:
+		// Id ensayo
+		// Tipo
+		// Colocación sensores
+		// Duración
+		// Repeticiones
+		// Comentarios
+		// Fecha creación
+	
+	$tipo = ($_POST["tipo"]);
+	$coloc_sensores = ($_POST["coloc_sensores"]);
+	$duracion = ($_POST["duracion"]);
+	$repeticiones = ($_POST["repeticiones"]);
+	$comentarios = ($_POST["comentarios"]);
+
+	if($tipo != ""){
+		$mensaje="";
+		//Comprobamos que no se repita el nombre
+		if ($result = $conex->query("SELECT * FROM `ENSAYOS`")){
+			while ($row = $result->fetch_assoc()) {
+				if($row['tipo'] == $tipo){
+					$mensaje="El ensayo, '$tipo', ya existe.";
+				}
+			}
+
+			if($mensaje==""){
+				if($comentarios == ""){
+					$sql="INSERT INTO `ENSAYOS` (`tipo`, `coloc_sensores`, `duracion`, `repeticiones`, `comentarios`, `fecha_creacion`, `fecha_modificacion`, `dni_trabajador` ) 
+					VALUES ('$tipo', '$coloc_sensores', '$duracion', '$repeticiones', NULL, NOW(), NULL, '$id_admin')";
+				}else{
+					$sql="INSERT INTO `ENSAYOS` (`tipo`, `coloc_sensores`, `duracion`, `repeticiones`, `comentarios`, `fecha_creacion`, `fecha_modificacion`, `dni_trabajador` ) 
+					VALUES ('$tipo', '$coloc_sensores', '$duracion', '$repeticiones', '$comentarios' , NOW(), NULL, '$id_admin')";
+				}
+				if ($conex->query($sql))
+					$mensaje= "Actualizado resgistro de Ensayos para: '$tipo'";
+				else $mensaje= "Error actualizando base de datos";
+			}
+		}
+	}
+	
+	$html->assign("id_admin",$id_admin);
+	$html->assign("mensaje",$mensaje);
+	$html->display("ges_ens_nuevo.tpl");
+
+}
+else	@header('location:index.php');
+
+?>		
diff --git a/ges_ens_val.php b/ges_ens_val.php
new file mode 100644
index 0000000000000000000000000000000000000000..06c7e1cfc16f580b764c20b04656792d47706f87
--- /dev/null
+++ b/ges_ens_val.php
@@ -0,0 +1,59 @@
+<?php session_start(); 
+require_once("funciones.php");
+require('include.php');
+/*
+* Archivo de control. Validaci�n de la modificaci�n de ensayos
+* Caso de uso: --
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+	
+	$id_admin=	$_GET["variable"]; 
+	
+	$html=new Smarty;
+	
+	// Barra
+	barra();
+	// Fin de barra
+
+	//Descargamos los datos del formulario
+	$id_ensayo = ($_GET["id"]);
+	$tipo = ($_POST["tipo"]);
+	$coloc_sensores = ($_POST["coloc_sensores"]);
+	$duracion = ($_POST["duracion"]);
+	$repeticiones = ($_POST["repeticiones"]);
+	$comentarios = ($_POST["comentarios"]);
+	$mensaje="";
+
+	if($mensaje == ""){
+		if($comentarios == ""){
+			$sql = "UPDATE `ENSAYOS` SET `tipo`='$tipo', `comentarios`= NULL, `coloc_sensores`='$coloc_sensores', `duracion`='$duracion', `repeticiones`='$repeticiones', `fecha_modificacion` = NOW()
+			WHERE `id_ensayo`='$id_ensayo'";
+		}else{
+			$sql = "UPDATE `ENSAYOS` SET `tipo`='$tipo', `comentarios`= '$comentarios', `coloc_sensores`='$coloc_sensores', `duracion`='$duracion', `repeticiones`='$repeticiones', `fecha_modificacion` = NOW()
+			WHERE `id_ensayo`='$id_ensayo'";
+		}
+		if (!$conex->query($sql)){
+			$mensaje="Nombre: '$tipo'. Error: %s\n' $conex->error";
+		}else{
+			$mensaje= "Actualizado registro de Ensayos";
+		}
+	}
+
+	//Mostramos una tabla con todos los ensayos
+	$x=0;
+	if ($result = $conex->query("SELECT * FROM `ENSAYOS` ORDER BY `id_ensayo` ASC")){
+		while ($row = $result->fetch_assoc()) {
+			$campos[$x] = array($row['id_ensayo'],$row['tipo'],nl2br($row['coloc_sensores']),$row['duracion'],$row['repeticiones'],$row['comentarios'],$row['fecha_creacion'],$row['fecha_modificacion']);
+			$x++;
+		}
+	} else $mensaje= "Ha habido un error inesperado.";
+
+	$html->assign("id_admin",$id_admin);
+	$html->assign("mensaje",$mensaje);
+	$html->assign("campos",$campos);
+	$html->display("ges_ens.tpl");
+
+}
+else	@header('location:index.php');
+
+?>		
diff --git a/ges_pat.php b/ges_pat.php
new file mode 100644
index 0000000000000000000000000000000000000000..80d2fcb1c53f127c0a3b6a26d7d646a0584ec99e
--- /dev/null
+++ b/ges_pat.php
@@ -0,0 +1,69 @@
+<?php session_start(); 
+require_once("funciones.php");
+require('include.php');
+/*
+* Archivo de control. Gestionar las patologías
+* Caso de uso: AÑADIR PATOLOGÍA, MODIFICAR PATOLOGIA Y ELIMINAR PATOLOGIA
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+
+	$id_admin=$_GET["variable"]; 
+	$accion =$_GET["accion"];
+	$id_patologia = $_POST['id_patologia'];
+	if($id_patologia=="") $id_patologia = $_GET['id'];
+
+	$html=new Smarty;
+
+	// Barra
+	barra();
+	// Fin de barra
+
+	// Valores para el formulario:
+		// Id patologia
+		// Nombre
+		// Descripción
+
+	
+	if($accion == 1 && $id_patologia!=""){//eliminar una patologia
+		$sql="DELETE FROM `PATOLOGIAS` WHERE `id_patologia`='$id_patologia'";
+		$id_patologia = "";
+		if ($conex->query($sql)){
+			$mensaje ="Patología borrada con éxito";
+		}else{
+			$mensaje ="Error al borrar la patología";
+		}
+	}else{
+		if ($id_patologia){
+		
+			if ($result = $conex->query("SELECT * FROM `PATOLOGIAS` WHERE `id_patologia`='$id_patologia'")){
+				$row = $result->fetch_assoc();
+				$mod_campos = [ $row['id_patologia'],$row['nombre'],$row['descripcion']];
+				$mensaje = "Modificando patologia";
+			}
+			else {
+				$mensaje = "Error inesperado en lectura registro de '$id_patologia'";
+			}
+			$html->assign("mod_campos",$mod_campos);
+		}
+	}
+
+
+	//Mostramos una tabla con todas las patologias
+	$x=0;
+	if ($result = $conex->query("SELECT * FROM `PATOLOGIAS` ORDER BY `nombre` ASC")){
+		while ($row = $result->fetch_assoc()) {
+			$campos[$x] = array($row['id_patologia'],$row['nombre'],$row['descripcion']);
+			$x++;
+		}
+	} else $mensaje= "Ha habido un error inesperado.";
+
+	$html->assign("id_admin",$id_admin);
+	$html->assign("mensaje",$mensaje);
+	$html->assign("campos",$campos);
+
+	$html->display("ges_pat.tpl");
+
+}
+else	@header('location:index.php');
+
+?>		
diff --git a/ges_pat_nueva.php b/ges_pat_nueva.php
new file mode 100644
index 0000000000000000000000000000000000000000..41a02b6ad01e9e6e4d365d5c38b937f03ca9406a
--- /dev/null
+++ b/ges_pat_nueva.php
@@ -0,0 +1,59 @@
+<?php session_start(); 
+require_once("funciones.php");
+require('include.php');
+/*
+* Archivo de control. Añadir patología
+* Caso de uso: AÑADIR PATOLOGÍA
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+
+	$id_admin=$_GET["variable"]; 
+
+	$html=new Smarty;
+	$mensaje="Registro de nueva patología";
+	// Barra
+	barra();
+	// Fin de barra
+
+	// Valores para el formulario:
+		// Id patologia
+		// Nombre
+		// Descripción
+
+	$nombre = ($_POST["nombre"]);
+	$descripcion = ($_POST["descripcion"]);
+
+	//Si tenemos un nombre para la patologia
+	if($nombre != ""){
+		$mensaje="";
+		//Comprobamos que no se repita el nombre
+		if ($result = $conex->query("SELECT * FROM `PATOLOGIAS`")){
+			while ($row = $result->fetch_assoc()) {
+				if($row['nombre'] == $nombre){
+					$mensaje="La patología, '$nombre', ya existe.";
+				}
+			}
+
+			if($mensaje==""){
+				if($descripcion == ""){
+					$sql="INSERT INTO `PATOLOGIAS` (`nombre`, `descripcion`) VALUES ('$nombre', NULL)";
+				}else{
+					$sql="INSERT INTO `PATOLOGIAS` (`nombre`, `descripcion`) VALUES ('$nombre', '$descripcion')";
+				}
+				if ($conex->query($sql))
+					$mensaje= "Actualizado resgistro de Patologias para: '$nombre'";
+				else $mensaje= "Error actualizando base de datos";
+			}
+		}
+	}
+	
+	$html->assign("id_admin",$id_admin);
+	$html->assign("mensaje",$mensaje);
+	$html->assign("campos",$campos);
+
+	$html->display("ges_pat_nueva.tpl");
+
+}
+else	@header('location:index.php');
+
+?>		
diff --git a/ges_pat_val.php b/ges_pat_val.php
new file mode 100644
index 0000000000000000000000000000000000000000..4178ef45db6894dab1bca7c1ee846ce92723e36a
--- /dev/null
+++ b/ges_pat_val.php
@@ -0,0 +1,58 @@
+<?php session_start(); 
+require_once("funciones.php");
+require('include.php');
+/*
+* Archivo de control. Confirmaci�n de las modificaciones en las patolog�as
+* Caso de uso: MODIFICAR PATOLOGIA
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+	$id_admin=	$_GET["variable"]; 
+	
+	$html=new Smarty;
+
+	
+	// Barra
+	barra();
+	// Fin de barra
+
+	//Descargamos los datos del formulario
+	$id_patologia = ($_GET["id"]);
+	$nombre = ($_POST["nombre"]);
+	$descripcion = ($_POST["descripcion"]);
+	$mensaje="";
+
+	
+	if($descripcion == ""){
+		$sql = "UPDATE `PATOLOGIAS` SET `nombre`='$nombre', `descripcion`= NULL
+		WHERE `id_patologia`='$id_patologia'";
+	}else{
+		$sql = "UPDATE `PATOLOGIAS` SET `nombre`='$nombre', `descripcion`='$descripcion'
+		WHERE `id_patologia`='$id_patologia'";
+	}
+	if (!$conex->query($sql)){
+		$mensaje="Nombre: '$nombre' Descripcion: '$descripcion' Error: %s\n' $conex->error";
+	}else{
+		$mensaje="Actualizado registro de Patolog�as";
+	}
+
+	//Mostramos una tabla con todas las patologias
+	$x=0;
+	if ($result = $conex->query("SELECT * FROM `PATOLOGIAS` ORDER BY `nombre` ASC")){
+		while ($row = $result->fetch_assoc()) {
+			$campos[$x] = array($row['id_patologia'],$row['nombre'],$row['descripcion']);
+			if ($id_patologia == $row['id_patologia']) $patologia = $campos[$x];
+			$x++;
+		}
+	} else $mensaje= "Ha habido un error inesperado.";
+
+	$html->assign("id_admin",$id_admin);
+	$html->assign("mensaje",$mensaje);
+	$html->assign("patologia",$patologia);
+	$html->assign("campos",$campos);
+
+	$html->display("ges_pat.tpl");
+
+}
+else	@header('location:index.php');
+
+?>		
diff --git a/include.php b/include.php
new file mode 100644
index 0000000000000000000000000000000000000000..fa8eb5aec3479b73a837633f6698f5c1e710bce6
--- /dev/null
+++ b/include.php
@@ -0,0 +1,13 @@
+<?php
+define ('RUTA','/volume1/web/velostat/');
+//clase smarty la cual es esencial para todo el proyecto
+include_once('Smarty.class.php');
+$smarty = new Smarty;
+//directorio template_dir en la carpeta templates lo cual indica que ahí irán todos los archivos html
+$smarty->template_dir = RUTA.'templates/';
+$smarty->config_dir = RUTA.'configs/';
+$smarty->cache_dir = RUTA.'cache/';
+//$smarty->image_dir = RUTA.'images/';
+// templates_c que será donde se ubiquen los cache de los templates “pre” cargados para que la pagina cargue mas rápido
+$smarty->compile_dir = RUTA.'templates_c/';
+?>
\ No newline at end of file
diff --git a/index.php b/index.php
new file mode 100644
index 0000000000000000000000000000000000000000..d1363e680a094c4f091cb4b1fc2eaa86158a280c
--- /dev/null
+++ b/index.php
@@ -0,0 +1,15 @@
+<?php
+/*
+* Archivo de control. Página de inicio 
+* Caso de uso: INICIAR SESION EN EL SISTEMA
+*/
+session_start();
+//cargamos las librerías de smarty
+require('include.php');
+$titulo="WEB APP de administración Sensores de Presión";
+$html=new Smarty;
+$html->assign("titulo",$titulo);
+
+$html->display("inicio.tpl");
+
+?>
\ No newline at end of file
diff --git a/log_out.php b/log_out.php
new file mode 100644
index 0000000000000000000000000000000000000000..9f808e1429c03f8f5fcb90edffd27ede9b21607d
--- /dev/null
+++ b/log_out.php
@@ -0,0 +1,12 @@
+<?php session_start();
+/*
+* Archivo de control. Cerrar sesi�n en el sistema
+* Caso de uso: --
+*/
+	require('include.php');
+	require_once('funciones.php');
+	session_unset();
+	session_destroy();
+	header("Location: index.php");
+	exit();
+?>
diff --git a/login.php b/login.php
new file mode 100644
index 0000000000000000000000000000000000000000..9ac3a6b830c2972cb14310e20067a62ee2c87f88
--- /dev/null
+++ b/login.php
@@ -0,0 +1,55 @@
+<?php session_start();
+	require('include.php');
+	require_once('funciones.php');
+	/*
+	* Archivo de control. Comprobación del inicio de sesión en el sistema
+	* Caso de uso: INICIAR SESION EN EL SISTEMA
+	*/
+
+	if ( isset($_REQUEST["login"]) && isset($_REQUEST["pass"]) ){
+		$titulo="WEB APP de administración Sensores de Presión";
+		conexdb();
+		//$conex=new mysqli($server,$usuario,$contrasena,$bd);
+		//printf("conjunto de caracteres iniciales: %s\n", $conex->character_set_name());
+
+		$login=mysqli_real_escape_string($conex, $_REQUEST["login"]);
+		$pass=mysqli_real_escape_string($conex, $_REQUEST["pass"]);
+
+		$html=new Smarty;
+			/*
+			if(isset($_POST["g-recaptcha-response"])){
+				$captcha=$_POST["g-recaptcha-response"];
+				$secreto='6LcX5igUAAAAAOANYillOv7O8Io4tDQewva8FztQ';
+				$response=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secreto."&response=".$captcha."");
+				$decoded_response = json_decode($response, true);
+			}
+			*/
+
+		$query="SELECT count(*) as num, dni_trabajador as id_admin, contraseña as pass, permisos FROM `TRABAJADORES` WHERE login='".mysqli_real_escape_string($conex, $login)."'";
+			
+		$result=$conex->query($query);
+
+		$row=$result->fetch_assoc();
+
+		$html->assign("id_admin", $row["id_admin"]);
+
+		$passhasheada=sha1($pass);
+
+		$html->assign("titulo",$titulo);
+		$html->assign("login", $login);
+
+		if ( ($row['num']>0 && $passhasheada==$row["pass"] && mysqli_real_escape_string($conex, $passhasheada) ) || ( $row['num']>0 && $passhasheada==$row["pass"] && mysqli_real_escape_string($conex, $passhasheada) )){
+			//Exito
+			$_SESSION['valido']=1;
+			$_SESSION['user']=$row["id_admin"];
+
+			$html->display("login.tpl");
+
+		}else {
+			//Fallo
+			$mensaje="Autenticación erróena";
+			$html->assign("mensaje",$mensaje);	
+			$html->display("inicio.tpl");
+		}
+	}
+?>
diff --git a/media/audio/check.mp3 b/media/audio/check.mp3
new file mode 100644
index 0000000000000000000000000000000000000000..e2cb941ef8eb3f8e9afbb7ec05639e6abc05748d
Binary files /dev/null and b/media/audio/check.mp3 differ
diff --git a/media/images/ensayo/Cara asco.png b/media/images/ensayo/Cara asco.png
new file mode 100644
index 0000000000000000000000000000000000000000..ac9b3584e8edc20bc40aca4a572ec4b93fa96c37
Binary files /dev/null and b/media/images/ensayo/Cara asco.png differ
diff --git a/media/images/ensayo/Cierre de ojos.png b/media/images/ensayo/Cierre de ojos.png
new file mode 100644
index 0000000000000000000000000000000000000000..e842a2675e54e93e9eca081b8288d2c1bb0e1552
Binary files /dev/null and b/media/images/ensayo/Cierre de ojos.png differ
diff --git a/media/images/ensayo/Protusion labial.png b/media/images/ensayo/Protusion labial.png
new file mode 100644
index 0000000000000000000000000000000000000000..f5c318aafe7428fbfa103e68ac42ec78893d0eb8
Binary files /dev/null and b/media/images/ensayo/Protusion labial.png differ
diff --git a/media/images/ensayo/Reposo.png b/media/images/ensayo/Reposo.png
new file mode 100644
index 0000000000000000000000000000000000000000..4cd24f5e729cf7ca10c0c9088e37ef67af0b5327
Binary files /dev/null and b/media/images/ensayo/Reposo.png differ
diff --git a/media/images/ensayo/Sonrisa dientes.png b/media/images/ensayo/Sonrisa dientes.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9deec250f0edf243f8f05d72610fc79aacc6246
Binary files /dev/null and b/media/images/ensayo/Sonrisa dientes.png differ
diff --git a/media/images/ensayo/Subir cejas.png b/media/images/ensayo/Subir cejas.png
new file mode 100644
index 0000000000000000000000000000000000000000..d8c730afebf9192b537ab90a31681de406c02db6
Binary files /dev/null and b/media/images/ensayo/Subir cejas.png differ
diff --git a/media/images/ensayo/Thumbs.db b/media/images/ensayo/Thumbs.db
new file mode 100644
index 0000000000000000000000000000000000000000..98e6f3cc649bf974b7c1f913a06112fb181b04ce
Binary files /dev/null and b/media/images/ensayo/Thumbs.db differ
diff --git a/media/images/favicon/sensor.png b/media/images/favicon/sensor.png
new file mode 100644
index 0000000000000000000000000000000000000000..b88c2567312099bdb478ac255e395c50cabae64f
Binary files /dev/null and b/media/images/favicon/sensor.png differ
diff --git a/media/images/no_image/no_image.png b/media/images/no_image/no_image.png
new file mode 100644
index 0000000000000000000000000000000000000000..7dcb8dbfc21526695fc8df723b5cb213178189bf
Binary files /dev/null and b/media/images/no_image/no_image.png differ
diff --git a/media/images/personal/1.png b/media/images/personal/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..b1c2584b3f90a255127db4bcc5a931c376a4c600
Binary files /dev/null and b/media/images/personal/1.png differ
diff --git a/media/images/personal/3.png b/media/images/personal/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed76bfd2d04267650bf7485781f8efd32ba9482f
Binary files /dev/null and b/media/images/personal/3.png differ
diff --git a/mod_gestor.php b/mod_gestor.php
new file mode 100644
index 0000000000000000000000000000000000000000..5224e955947f09e595438a265487496fa1e57dc1
--- /dev/null
+++ b/mod_gestor.php
@@ -0,0 +1,51 @@
+<?php session_start(); 
+require_once("funciones.php");
+require('include.php');
+/*
+* Archivo de control. Modificación de los trabajadores de la clinica y gestores de la web
+* Caso de uso: --
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+
+	$id_admin = $_GET['variable'];
+	$html=new Smarty;
+
+	$mod_n_emp = $_GET['nombre'];
+
+	//Cargamos la barra 
+	barra();
+
+	$mensaje="";
+
+	//Si se han seleccionado filas a modificar
+	if ($mod_n_emp)	{
+		$mensaje = "Modificar Trabajador. ".$mod_n_emp;
+		if ($result = $conex->query("SELECT * FROM `TRABAJADORES` WHERE `dni_trabajador`= '$mod_n_emp'")){
+			$row = $result->fetch_assoc();
+				$mod_campos = [ $row['dni_trabajador'],$row['login'],$row['nombre'],$row['apellidos'],$row['titulacion'],$row['permisos'], imagen('media/images/personal/',$row['dni_trabajador'])];
+		}
+		else {
+			$mensaje = "Error inesperado en lectura registro de $mod_n_emp";
+		}
+		
+		$html->assign("mod_campos",$mod_campos);
+	}
+
+	//Mostramos una tabla con todos los usuarios para marcar el que queremos modificar
+	$x=0;
+	if ($result = $conex->query("SELECT * FROM `TRABAJADORES` ORDER BY `nombre` ASC")){
+		while ($row = $result->fetch_assoc()) {
+			$campos[$x] = array($row['dni_trabajador'],$row['login'],$row['nombre'],$row['apellidos'],$row['titulacion'],$row['permisos'], imagen('media/images/personal/',$row['dni_trabajador']));
+			$x++;
+		}
+	} else $mensaje= "Ha habido un error inesperado.";
+
+	$html->assign("mensaje",$mensaje);
+	$html->assign("campos",$campos);
+	$html->assign("id_admin",$id_admin);
+	$html->display("mod_gestor.tpl");
+
+}
+
+else	
+	@header('location:index.php');
diff --git a/mod_gestor_val.php b/mod_gestor_val.php
new file mode 100644
index 0000000000000000000000000000000000000000..c39250d0a043d04b74a55beb5677de5794a586f1
--- /dev/null
+++ b/mod_gestor_val.php
@@ -0,0 +1,75 @@
+<?php session_start(); 
+require_once("funciones.php");
+require('include.php');
+/*
+* Archivo de control. Validación de la modificación de trabajadores y gestores de la web
+* Caso de uso: --
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+
+	$id_admin = $_GET['variable'];
+	$html=new Smarty;
+
+	//Barra
+	barra();
+
+	$mensaje="";
+
+	// Descargamos las variables del formulario:
+	$dni_trabajador = ($_GET['id']);
+	$nombre = ($_POST['nombre']);
+	$apellidos = ($_POST['apellidos']);
+	$nick = ($_POST['login']);
+	$permisos = ($_POST['permisos']);
+	$titulacion = ($_POST['titulacion']);
+	$pass  = sha1(mysqli_real_escape_string($conex, $_POST['pass']));
+	$passrw= sha1(mysqli_real_escape_string($conex, $_POST['passrw']));
+	
+
+		if ($pass != $passrw) 
+			$mensaje="Las contraseñas no coinciden";
+		else{	
+			
+			// Comprobamos que no se repita nick
+			$result = $conex->query("SELECT * FROM TRABAJADORES WHERE `dni_trabajador`<>'$dni_trabajador'");
+			while ($row = $result->fetch_assoc()){
+				if ($row['dni_trabajador'] != $dni_trabajador){
+					 if ($row['login'] == $nick)
+						$mensaje = "El nick '$nick', ya existe para otro trabajador";
+				}
+			}
+		}
+		if ($mensaje=="")
+		{
+			// Si todos los campos están bien entonces actualizamos el nuevo usuario
+			if ($pass != 'da39a3ee5e6b4b0d3255bfef95601890afd80709') // ese hash = sin contraseña
+				$sql="UPDATE `TRABAJADORES` SET  `dni_trabajador` = '$dni_trabajador', `nombre` = '$nombre', `apellidos` = '$apellidos', `login` = '$nick', `contraseña` = '$pass', `titulacion` = '$titulacion', `permisos` = '$permisos'  
+				WHERE `dni_trabajador` = '$dni_trabajador'";
+			else  
+				$sql="UPDATE `TRABAJADORES` SET `dni_trabajador` = '$dni_trabajador', `nombre` = '$nombre', `apellidos` = '$apellidos', `login` = '$nick', `permisos` = '$permisos', `titulacion` = '$titulacion' 
+				WHERE `dni_trabajador` = '$dni_trabajador'";
+			if ($conex->query($sql))
+				$mensaje= "Actualizado resgistro para: $nombre $apellidos";
+			else $mensaje= "Error actualizando base de datos";
+		}
+
+	//Mostramos una tabla con todos los usuarios para marcar el que queremos modificar
+	$x=0;
+	if ($result = $conex->query("SELECT * FROM `TRABAJADORES` ORDER BY `nombre` ASC")){
+		while ($row = $result->fetch_assoc()) {
+			$campos[$x] = array($row['dni_trabajador'],$row['login'],$row['nombre'],$row['apellidos'],$row['titulacion'],$row['permisos'], imagen('media/images/personal/',$row['dni_trabajador']));
+ 			$x++;
+		}
+	} else $mensaje= "Ha habido un error inesperado.";
+
+	$html->assign("mensaje",$mensaje);
+	$html->assign("campos",$campos);
+	$html->assign("id_admin",$id_admin);
+
+	$html->display("mod_gestor.tpl");
+
+}
+
+else	
+	@header('location:index.php');
+?>
diff --git a/mod_pac.php b/mod_pac.php
new file mode 100644
index 0000000000000000000000000000000000000000..2424d73a7535ad927b8f0fbe64039fd7b2e51748
--- /dev/null
+++ b/mod_pac.php
@@ -0,0 +1,98 @@
+<?php session_start();
+require('include.php');
+require_once("funciones.php");
+/*
+* Archivo de control. Comprobación del inicio de sesión en el sistema
+* Caso de uso: INICIAR SESION EN EL SISTEMA
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+	
+	$id_admin=$_GET["variable"]; 
+
+	// Comprueba que sigue en la sesión
+	$html=new Smarty;
+
+
+	//Cargamos la barra
+	barra();
+	
+	//Capturamos los datos del formulario
+	$dni_paciente = ($_POST["dni"]);
+	$nombre = ($_POST["nombre"]);
+	$apellidos = ($_POST["apellidos"]);
+	$edad = ($_POST["edad"]);
+	$sexo = ($_POST["sexo"]);
+	$anotaciones = ($_POST["anotaciones"]);
+	
+	if ($anotaciones != "" ) {
+		$sql="UPDATE `PACIENTES` SET `nombre` = '$nombre', `apellidos` = '$apellidos', `sexo` = '$sexo' , `edad` = '$edad', `anotaciones` = '$anotaciones' WHERE `PACIENTES`.`dni_paciente` = '$dni_paciente'";
+	}else{  
+		$sql="UPDATE `PACIENTES` SET `nombre` = '$nombre', `apellidos` = '$apellidos', `sexo` = '$sexo' , `edad` = '$edad', `anotaciones` = NULL WHERE `PACIENTES`.`dni_paciente` = '$dni_paciente'";
+	}
+	if ($conex->query($sql)){
+		$mensaje= "Actualizado resgistro para $nombre";
+	}else{ $mensaje= "Error actualizando base de datos";
+	}
+
+
+	$sql="SELECT tipo, fecha, simetria, PRUEBAS_PACIENTES.anotaciones, PRUEBAS_PACIENTES.id_prueba
+		FROM ENSAYOS, PRUEBAS_PACIENTES
+		WHERE `dni_paciente`='$dni_paciente' AND ENSAYOS.id_ensayo=PRUEBAS_PACIENTES.id_ensayo
+		ORDER BY fecha DESC
+	 ";
+	$result=$conex->query($sql);
+
+	// rellenamos array con tabla obtenida
+	//Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])),
+	$x = 0;
+	while ($row = $result->fetch_assoc()){
+		$entrada[$x]=[
+			$row['id_prueba'],
+			$row['tipo'],
+			$row['fecha'],
+			$row['simetria'],
+			$row['anotaciones']
+					];
+		$x++;
+	}
+	
+	$html->assign("entrada",$entrada);
+
+	
+	$sql="SELECT dni_paciente,id_etiologia, etiologia, fecha_lesion, cuadrantes, comentarios, PATOLOGIAS.nombre
+	FROM ETIOLOGIAS, PATOLOGIAS
+	WHERE `dni_paciente`='$dni_paciente' AND PATOLOGIAS.id_patologia=ETIOLOGIAS.id_patologia
+	ORDER BY fecha_lesion DESC
+	 ";
+	if($result=$conex->query($sql)){
+		// rellenamos array con tabla obtenida
+		//Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])),
+		$x = 0;
+		while ($row = $result->fetch_assoc()){
+			$etiologia[$x]=[
+				$row['id_etiologia'],
+				$row['etiologia'],
+				$row['fecha_lesion'],
+				$row['cuadrantes'],
+				$row['comentarios'],
+				$row['nombre']
+						];
+			$x++;
+		}
+		$html->assign("etiologia",$etiologia);
+	}
+
+	$sql="SELECT * FROM PACIENTES WHERE `dni_paciente`='$dni_paciente'";
+	$result=$conex->query($sql);
+	$row = $result->fetch_assoc();
+	$sujeto = [ $row['dni_paciente'],$row['nombre'],$row['apellidos'],$row['sexo'],$row['edad'],$row['anotaciones']];
+
+	$html->assign("mensaje",$mensaje);
+	$html->assign("id_admin",$id_admin);
+	$html->assign("sujeto",$sujeto);
+	
+	$html->display("pac_reg.tpl");
+}
+
+else	@header('location:index.php');
+?>		
diff --git a/mod_pass.php b/mod_pass.php
new file mode 100644
index 0000000000000000000000000000000000000000..47f7132502c64db992781820f8dbffce950a4072
--- /dev/null
+++ b/mod_pass.php
@@ -0,0 +1,65 @@
+<?php session_start(); 
+require_once("funciones.php");
+require('include.php');
+/*
+* Archivo de control. Modificación de la contraseña del usuario
+* Caso de uso: --
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+
+	$id_admin = $_GET['variable'];
+	$html=new Smarty;
+
+	barra();
+
+	$mensaje="";
+
+	// Descargamos las variables del formulario:
+	$oldpass  = sha1(mysqli_real_escape_string($conex, $_POST['oldpass']));
+	$pass  = sha1(mysqli_real_escape_string($conex, $_POST['pass']));
+	$passrw= sha1(mysqli_real_escape_string($conex, $_POST['passrw']));
+
+	if($pass != "da39a3ee5e6b4b0d3255bfef95601890afd80709"){// ese hash = sin contraseña
+		if ($pass != $passrw){
+			$mensaje="Error al escribir la nueva contraseña, intentelo de nuevo";
+			$pass = "";
+		}else{	
+			// Comprobamos que coincida la anterior pass
+			$result = $conex->query("SELECT * FROM TRABAJADORES WHERE `dni_trabajador`='$id_admin'");
+			while ($row = $result->fetch_assoc()){
+				if ($row['dni_trabajador'] == $id_admin){
+					if ($row['contraseña'] != $oldpass){
+						$mensaje = "La contraseña antigua no coincide";
+						$pass = "";
+					}else{
+						$passrw = "";
+					}
+				}
+			}
+		}
+	}
+	if ($pass!="" && $passrw == ""){
+		// Si todos los campos están bien entonces actualizamos el nuevo usuario
+		if ($pass == 'da39a3ee5e6b4b0d3255bfef95601890afd80709'){ // ese hash = sin contraseña
+			$mensaje = "La nueva contraseña no es válida";
+		}else{
+			$sql="UPDATE `TRABAJADORES` SET `contraseña` = '$pass' WHERE `TRABAJADORES`.`dni_trabajador` = '$id_admin'";
+			if ($conex->query($sql)){
+				$mensaje= "Actualizado resgistro para $id_admin";
+			}else {
+				$mensaje= "Error actualizando base de datos";
+			}
+		}	
+		
+	}
+	$imagen = imagen('media/images/personal/', $id_admin);
+	$html->assign("imagen",$imagen);
+	$html->assign("mensaje",$mensaje);
+	$html->assign("id_admin",$id_admin);
+	$html->display("mod_pass.tpl");
+
+}
+
+else	
+	@header('location:index.php');
+?>
diff --git a/pac_reg.php b/pac_reg.php
new file mode 100644
index 0000000000000000000000000000000000000000..8bd47edcc14ac3c541a860363e08db61ddecb298
--- /dev/null
+++ b/pac_reg.php
@@ -0,0 +1,75 @@
+<?php session_start();
+require('include.php');
+require_once("funciones.php");
+/*
+* Archivo de control. Se muestran las pruebas realizadas a un paciente y sus datos
+* Caso de uso: VER DATOS DE UN PACIENTE, MODIFICAR UN PACIENTE, BORRAR UN PACIENTE y CONSULTAR PRUEBA
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+	$id_admin=$_GET["variable"]; 
+	$id_paciente=$_GET["id"];
+	// Comprueba que sigue en la sesión
+	$html=new Smarty;
+
+	barra();
+	
+	
+	$sql="SELECT tipo, fecha, simetria, PRUEBAS_PACIENTES.anotaciones, PRUEBAS_PACIENTES.id_prueba
+		FROM ENSAYOS, PRUEBAS_PACIENTES
+		WHERE `dni_paciente`='$id_paciente' AND ENSAYOS.id_ensayo=PRUEBAS_PACIENTES.id_ensayo
+		ORDER BY fecha DESC
+	 ";
+	if($result=$conex->query($sql)){
+		// rellenamos array con tabla obtenida de las pruebas
+		//Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])),
+		$x = 0;
+		while ($row = $result->fetch_assoc()){
+			$entrada[$x]=[
+				$row['id_prueba'],
+				$row['tipo'],
+				$row['fecha'],
+				$row['simetria'],
+				$row['anotaciones']
+						];
+			$x++;
+		}
+		$html->assign("entrada",$entrada);
+	}
+
+	//Obtenemos las etiologias del paciente
+	$sql="SELECT dni_paciente,id_etiologia, etiologia, fecha_lesion, cuadrantes, comentarios, PATOLOGIAS.nombre
+		FROM ETIOLOGIAS, PATOLOGIAS
+		WHERE `dni_paciente`='$id_paciente' AND PATOLOGIAS.id_patologia=ETIOLOGIAS.id_patologia
+		ORDER BY fecha_lesion DESC
+	 ";
+	if($result=$conex->query($sql)){
+		// rellenamos array con tabla obtenida
+		//Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])),
+		$x = 0;
+		while ($row = $result->fetch_assoc()){
+			$etiologia[$x]=[
+				$row['id_etiologia'],
+				$row['etiologia'],
+				$row['fecha_lesion'],
+				$row['cuadrantes'],
+				$row['comentarios'],
+				$row['nombre']
+						];
+			$x++;
+		}
+		$html->assign("etiologia",$etiologia);
+	}
+
+	//Obtenemos los datos del paciente
+	$sql="SELECT * FROM PACIENTES WHERE `dni_paciente`='$id_paciente'";
+	$result=$conex->query($sql);
+	$row = $result->fetch_assoc();
+	$sujeto = [ $row['dni_paciente'],$row['nombre'],$row['apellidos'],$row['sexo'],$row['edad'],$row['anotaciones']];
+	$html->assign("sujeto",$sujeto);
+
+
+	$html->assign("id_admin",$id_admin);
+	$html->display("pac_reg.tpl");
+}
+else	@header('location:index.php');
+?>		
diff --git a/plugins/block.textformat.php b/plugins/block.textformat.php
new file mode 100644
index 0000000000000000000000000000000000000000..5e494637ed38519e9f36c5e56742fd3d88befbcd
--- /dev/null
+++ b/plugins/block.textformat.php
@@ -0,0 +1,121 @@
+<?php
+/**
+ * Smarty plugin to format text blocks
+ *
+ * @package    Smarty
+ * @subpackage PluginsBlock
+ */
+/**
+ * Smarty {textformat}{/textformat} block plugin
+ * Type:     block function
+ * Name:     textformat
+ * Purpose:  format text a certain way with preset styles
+ *           or custom wrap/indent settings
+ * Params:
+ *
+ * - style         - string (email)
+ * - indent        - integer (0)
+ * - wrap          - integer (80)
+ * - wrap_char     - string ("\n")
+ * - indent_char   - string (" ")
+ * - wrap_boundary - boolean (true)
+ *
+ * @link   http://www.smarty.net/manual/en/language.function.textformat.php {textformat}
+ *         (Smarty online manual)
+ *
+ * @param array                    $params   parameters
+ * @param string                   $content  contents of the block
+ * @param Smarty_Internal_Template $template template object
+ * @param boolean                  &$repeat  repeat flag
+ *
+ * @return string content re-formatted
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @throws \SmartyException
+ */
+function smarty_block_textformat($params, $content, Smarty_Internal_Template $template, &$repeat)
+{
+    if (is_null($content)) {
+        return;
+    }
+    if (Smarty::$_MBSTRING) {
+        $template->_checkPlugins(
+            array(
+                array(
+                    'function' => 'smarty_modifier_mb_wordwrap',
+                    'file'     => SMARTY_PLUGINS_DIR . 'modifier.mb_wordwrap.php'
+                )
+            )
+        );
+    }
+    $style = null;
+    $indent = 0;
+    $indent_first = 0;
+    $indent_char = ' ';
+    $wrap = 80;
+    $wrap_char = "\n";
+    $wrap_cut = false;
+    $assign = null;
+    foreach ($params as $_key => $_val) {
+        switch ($_key) {
+            case 'style':
+            case 'indent_char':
+            case 'wrap_char':
+            case 'assign':
+                $$_key = (string)$_val;
+                break;
+            case 'indent':
+            case 'indent_first':
+            case 'wrap':
+                $$_key = (int)$_val;
+                break;
+            case 'wrap_cut':
+                $$_key = (bool)$_val;
+                break;
+            default:
+                trigger_error("textformat: unknown attribute '{$_key}'");
+        }
+    }
+    if ($style === 'email') {
+        $wrap = 72;
+    }
+    // split into paragraphs
+    $_paragraphs = preg_split('![\r\n]{2}!', $content);
+    foreach ($_paragraphs as &$_paragraph) {
+        if (!$_paragraph) {
+            continue;
+        }
+        // convert mult. spaces & special chars to single space
+        $_paragraph =
+            preg_replace(
+                array(
+                    '!\s+!' . Smarty::$_UTF8_MODIFIER,
+                    '!(^\s+)|(\s+$)!' . Smarty::$_UTF8_MODIFIER
+                ),
+                array(
+                    ' ',
+                    ''
+                ),
+                $_paragraph
+            );
+        // indent first line
+        if ($indent_first > 0) {
+            $_paragraph = str_repeat($indent_char, $indent_first) . $_paragraph;
+        }
+        // wordwrap sentences
+        if (Smarty::$_MBSTRING) {
+            $_paragraph = smarty_modifier_mb_wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut);
+        } else {
+            $_paragraph = wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut);
+        }
+        // indent lines
+        if ($indent > 0) {
+            $_paragraph = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraph);
+        }
+    }
+    $_output = implode($wrap_char . $wrap_char, $_paragraphs);
+    if ($assign) {
+        $template->assign($assign, $_output);
+    } else {
+        return $_output;
+    }
+}
diff --git a/plugins/function.counter.php b/plugins/function.counter.php
new file mode 100644
index 0000000000000000000000000000000000000000..a4129e77c7f3b519c3098e8d84a34ef24a844d7e
--- /dev/null
+++ b/plugins/function.counter.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsFunction
+ */
+/**
+ * Smarty {counter} function plugin
+ * Type:     function
+ * Name:     counter
+ * Purpose:  print out a counter value
+ *
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @link   http://www.smarty.net/manual/en/language.function.counter.php {counter}
+ *         (Smarty online manual)
+ *
+ * @param array                    $params   parameters
+ * @param Smarty_Internal_Template $template template object
+ *
+ * @return string|null
+ */
+function smarty_function_counter($params, $template)
+{
+    static $counters = array();
+    $name = (isset($params[ 'name' ])) ? $params[ 'name' ] : 'default';
+    if (!isset($counters[ $name ])) {
+        $counters[ $name ] = array('start' => 1, 'skip' => 1, 'direction' => 'up', 'count' => 1);
+    }
+    $counter =& $counters[ $name ];
+    if (isset($params[ 'start' ])) {
+        $counter[ 'start' ] = $counter[ 'count' ] = (int)$params[ 'start' ];
+    }
+    if (!empty($params[ 'assign' ])) {
+        $counter[ 'assign' ] = $params[ 'assign' ];
+    }
+    if (isset($counter[ 'assign' ])) {
+        $template->assign($counter[ 'assign' ], $counter[ 'count' ]);
+    }
+    if (isset($params[ 'print' ])) {
+        $print = (bool)$params[ 'print' ];
+    } else {
+        $print = empty($counter[ 'assign' ]);
+    }
+    if ($print) {
+        $retval = $counter[ 'count' ];
+    } else {
+        $retval = null;
+    }
+    if (isset($params[ 'skip' ])) {
+        $counter[ 'skip' ] = $params[ 'skip' ];
+    }
+    if (isset($params[ 'direction' ])) {
+        $counter[ 'direction' ] = $params[ 'direction' ];
+    }
+    if ($counter[ 'direction' ] === 'down') {
+        $counter[ 'count' ] -= $counter[ 'skip' ];
+    } else {
+        $counter[ 'count' ] += $counter[ 'skip' ];
+    }
+    return $retval;
+}
diff --git a/plugins/function.cycle.php b/plugins/function.cycle.php
new file mode 100644
index 0000000000000000000000000000000000000000..07ffcc5e243cd81aa6dd6dd68237b85945dccd1c
--- /dev/null
+++ b/plugins/function.cycle.php
@@ -0,0 +1,92 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsFunction
+ */
+/**
+ * Smarty {cycle} function plugin
+ * Type:     function
+ * Name:     cycle
+ * Date:     May 3, 2002
+ * Purpose:  cycle through given values
+ * Params:
+ *
+ * - name      - name of cycle (optional)
+ * - values    - comma separated list of values to cycle, or an array of values to cycle
+ *               (this can be left out for subsequent calls)
+ * - reset     - boolean - resets given var to true
+ * - print     - boolean - print var or not. default is true
+ * - advance   - boolean - whether or not to advance the cycle
+ * - delimiter - the value delimiter, default is ","
+ * - assign    - boolean, assigns to template var instead of printed.
+ *
+ * Examples:
+ *
+ * {cycle values="#eeeeee,#d0d0d0d"}
+ * {cycle name=row values="one,two,three" reset=true}
+ * {cycle name=row}
+ *
+ * @link    http://www.smarty.net/manual/en/language.function.cycle.php {cycle}
+ *           (Smarty online manual)
+ * @author  Monte Ohrt <monte at ohrt dot com>
+ * @author  credit to Mark Priatel <mpriatel@rogers.com>
+ * @author  credit to Gerard <gerard@interfold.com>
+ * @author  credit to Jason Sweat <jsweat_php@yahoo.com>
+ * @version 1.3
+ *
+ * @param array                    $params   parameters
+ * @param Smarty_Internal_Template $template template object
+ *
+ * @return string|null
+ */
+function smarty_function_cycle($params, $template)
+{
+    static $cycle_vars;
+    $name = (empty($params[ 'name' ])) ? 'default' : $params[ 'name' ];
+    $print = (isset($params[ 'print' ])) ? (bool)$params[ 'print' ] : true;
+    $advance = (isset($params[ 'advance' ])) ? (bool)$params[ 'advance' ] : true;
+    $reset = (isset($params[ 'reset' ])) ? (bool)$params[ 'reset' ] : false;
+    if (!isset($params[ 'values' ])) {
+        if (!isset($cycle_vars[ $name ][ 'values' ])) {
+            trigger_error('cycle: missing \'values\' parameter');
+            return;
+        }
+    } else {
+        if (isset($cycle_vars[ $name ][ 'values' ]) && $cycle_vars[ $name ][ 'values' ] !== $params[ 'values' ]) {
+            $cycle_vars[ $name ][ 'index' ] = 0;
+        }
+        $cycle_vars[ $name ][ 'values' ] = $params[ 'values' ];
+    }
+    if (isset($params[ 'delimiter' ])) {
+        $cycle_vars[ $name ][ 'delimiter' ] = $params[ 'delimiter' ];
+    } elseif (!isset($cycle_vars[ $name ][ 'delimiter' ])) {
+        $cycle_vars[ $name ][ 'delimiter' ] = ',';
+    }
+    if (is_array($cycle_vars[ $name ][ 'values' ])) {
+        $cycle_array = $cycle_vars[ $name ][ 'values' ];
+    } else {
+        $cycle_array = explode($cycle_vars[ $name ][ 'delimiter' ], $cycle_vars[ $name ][ 'values' ]);
+    }
+    if (!isset($cycle_vars[ $name ][ 'index' ]) || $reset) {
+        $cycle_vars[ $name ][ 'index' ] = 0;
+    }
+    if (isset($params[ 'assign' ])) {
+        $print = false;
+        $template->assign($params[ 'assign' ], $cycle_array[ $cycle_vars[ $name ][ 'index' ] ]);
+    }
+    if ($print) {
+        $retval = $cycle_array[ $cycle_vars[ $name ][ 'index' ] ];
+    } else {
+        $retval = null;
+    }
+    if ($advance) {
+        if ($cycle_vars[ $name ][ 'index' ] >= count($cycle_array) - 1) {
+            $cycle_vars[ $name ][ 'index' ] = 0;
+        } else {
+            $cycle_vars[ $name ][ 'index' ]++;
+        }
+    }
+    return $retval;
+}
diff --git a/plugins/function.fetch.php b/plugins/function.fetch.php
new file mode 100644
index 0000000000000000000000000000000000000000..768761b2380ae610a5f4d3ee2fbc995a0a5b1a08
--- /dev/null
+++ b/plugins/function.fetch.php
@@ -0,0 +1,204 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsFunction
+ */
+/**
+ * Smarty {fetch} plugin
+ * Type:     function
+ * Name:     fetch
+ * Purpose:  fetch file, web or ftp data and display results
+ *
+ * @link   http://www.smarty.net/manual/en/language.function.fetch.php {fetch}
+ *         (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ *
+ * @param array                    $params   parameters
+ * @param Smarty_Internal_Template $template template object
+ *
+ * @throws SmartyException
+ * @return string|null if the assign parameter is passed, Smarty assigns the result to a template variable
+ */
+function smarty_function_fetch($params, $template)
+{
+    if (empty($params[ 'file' ])) {
+        trigger_error('[plugin] fetch parameter \'file\' cannot be empty', E_USER_NOTICE);
+        return;
+    }
+    // strip file protocol
+    if (stripos($params[ 'file' ], 'file://') === 0) {
+        $params[ 'file' ] = substr($params[ 'file' ], 7);
+    }
+    $protocol = strpos($params[ 'file' ], '://');
+    if ($protocol !== false) {
+        $protocol = strtolower(substr($params[ 'file' ], 0, $protocol));
+    }
+    if (isset($template->smarty->security_policy)) {
+        if ($protocol) {
+            // remote resource (or php stream, …)
+            if (!$template->smarty->security_policy->isTrustedUri($params[ 'file' ])) {
+                return;
+            }
+        } else {
+            // local file
+            if (!$template->smarty->security_policy->isTrustedResourceDir($params[ 'file' ])) {
+                return;
+            }
+        }
+    }
+    $content = '';
+    if ($protocol === 'http') {
+        // http fetch
+        if ($uri_parts = parse_url($params[ 'file' ])) {
+            // set defaults
+            $host = $server_name = $uri_parts[ 'host' ];
+            $timeout = 30;
+            $accept = 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*';
+            $agent = 'Smarty Template Engine ' . Smarty::SMARTY_VERSION;
+            $referer = '';
+            $uri = !empty($uri_parts[ 'path' ]) ? $uri_parts[ 'path' ] : '/';
+            $uri .= !empty($uri_parts[ 'query' ]) ? '?' . $uri_parts[ 'query' ] : '';
+            $_is_proxy = false;
+            if (empty($uri_parts[ 'port' ])) {
+                $port = 80;
+            } else {
+                $port = $uri_parts[ 'port' ];
+            }
+            if (!empty($uri_parts[ 'user' ])) {
+                $user = $uri_parts[ 'user' ];
+            }
+            if (!empty($uri_parts[ 'pass' ])) {
+                $pass = $uri_parts[ 'pass' ];
+            }
+            // loop through parameters, setup headers
+            foreach ($params as $param_key => $param_value) {
+                switch ($param_key) {
+                    case 'file':
+                    case 'assign':
+                    case 'assign_headers':
+                        break;
+                    case 'user':
+                        if (!empty($param_value)) {
+                            $user = $param_value;
+                        }
+                        break;
+                    case 'pass':
+                        if (!empty($param_value)) {
+                            $pass = $param_value;
+                        }
+                        break;
+                    case 'accept':
+                        if (!empty($param_value)) {
+                            $accept = $param_value;
+                        }
+                        break;
+                    case 'header':
+                        if (!empty($param_value)) {
+                            if (!preg_match('![\w\d-]+: .+!', $param_value)) {
+                                trigger_error("[plugin] invalid header format '{$param_value}'", E_USER_NOTICE);
+                                return;
+                            } else {
+                                $extra_headers[] = $param_value;
+                            }
+                        }
+                        break;
+                    case 'proxy_host':
+                        if (!empty($param_value)) {
+                            $proxy_host = $param_value;
+                        }
+                        break;
+                    case 'proxy_port':
+                        if (!preg_match('!\D!', $param_value)) {
+                            $proxy_port = (int)$param_value;
+                        } else {
+                            trigger_error("[plugin] invalid value for attribute '{$param_key }'", E_USER_NOTICE);
+                            return;
+                        }
+                        break;
+                    case 'agent':
+                        if (!empty($param_value)) {
+                            $agent = $param_value;
+                        }
+                        break;
+                    case 'referer':
+                        if (!empty($param_value)) {
+                            $referer = $param_value;
+                        }
+                        break;
+                    case 'timeout':
+                        if (!preg_match('!\D!', $param_value)) {
+                            $timeout = (int)$param_value;
+                        } else {
+                            trigger_error("[plugin] invalid value for attribute '{$param_key}'", E_USER_NOTICE);
+                            return;
+                        }
+                        break;
+                    default:
+                        trigger_error("[plugin] unrecognized attribute '{$param_key}'", E_USER_NOTICE);
+                        return;
+                }
+            }
+            if (!empty($proxy_host) && !empty($proxy_port)) {
+                $_is_proxy = true;
+                $fp = fsockopen($proxy_host, $proxy_port, $errno, $errstr, $timeout);
+            } else {
+                $fp = fsockopen($server_name, $port, $errno, $errstr, $timeout);
+            }
+            if (!$fp) {
+                trigger_error("[plugin] unable to fetch: $errstr ($errno)", E_USER_NOTICE);
+                return;
+            } else {
+                if ($_is_proxy) {
+                    fputs($fp, 'GET ' . $params[ 'file' ] . " HTTP/1.0\r\n");
+                } else {
+                    fputs($fp, "GET $uri HTTP/1.0\r\n");
+                }
+                if (!empty($host)) {
+                    fputs($fp, "Host: $host\r\n");
+                }
+                if (!empty($accept)) {
+                    fputs($fp, "Accept: $accept\r\n");
+                }
+                if (!empty($agent)) {
+                    fputs($fp, "User-Agent: $agent\r\n");
+                }
+                if (!empty($referer)) {
+                    fputs($fp, "Referer: $referer\r\n");
+                }
+                if (isset($extra_headers) && is_array($extra_headers)) {
+                    foreach ($extra_headers as $curr_header) {
+                        fputs($fp, $curr_header . "\r\n");
+                    }
+                }
+                if (!empty($user) && !empty($pass)) {
+                    fputs($fp, 'Authorization: BASIC ' . base64_encode("$user:$pass") . "\r\n");
+                }
+                fputs($fp, "\r\n");
+                while (!feof($fp)) {
+                    $content .= fgets($fp, 4096);
+                }
+                fclose($fp);
+                $csplit = preg_split("!\r\n\r\n!", $content, 2);
+                $content = $csplit[ 1 ];
+                if (!empty($params[ 'assign_headers' ])) {
+                    $template->assign($params[ 'assign_headers' ], preg_split("!\r\n!", $csplit[ 0 ]));
+                }
+            }
+        } else {
+            trigger_error("[plugin fetch] unable to parse URL, check syntax", E_USER_NOTICE);
+            return;
+        }
+    } else {
+        $content = @file_get_contents($params[ 'file' ]);
+        if ($content === false) {
+            throw new SmartyException("{fetch} cannot read resource '" . $params[ 'file' ] . "'");
+        }
+    }
+    if (!empty($params[ 'assign' ])) {
+        $template->assign($params[ 'assign' ], $content);
+    } else {
+        return $content;
+    }
+}
diff --git a/plugins/function.html_checkboxes.php b/plugins/function.html_checkboxes.php
new file mode 100644
index 0000000000000000000000000000000000000000..302358edd88ed24bafd4403852b788b26d2ca801
--- /dev/null
+++ b/plugins/function.html_checkboxes.php
@@ -0,0 +1,286 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsFunction
+ */
+/**
+ * Smarty {html_checkboxes} function plugin
+ * File:       function.html_checkboxes.php
+ * Type:       function
+ * Name:       html_checkboxes
+ * Date:       24.Feb.2003
+ * Purpose:    Prints out a list of checkbox input types
+ * Examples:
+ *
+ * {html_checkboxes values=$ids output=$names}
+ * {html_checkboxes values=$ids name='box' separator='<br>' output=$names}
+ * {html_checkboxes values=$ids checked=$checked separator='<br>' output=$names}
+ *
+ * Params:
+ *
+ * - name       (optional) - string default "checkbox"
+ * - values     (required) - array
+ * - options    (optional) - associative array
+ * - checked    (optional) - array default not set
+ * - separator  (optional) - ie <br> or &nbsp;
+ * - output     (optional) - the output next to each checkbox
+ * - assign     (optional) - assign the output as an array to this variable
+ * - escape     (optional) - escape the content (not value), defaults to true
+ *
+ * @link    http://www.smarty.net/manual/en/language.function.html.checkboxes.php {html_checkboxes}
+ *             (Smarty online manual)
+ * @author  Christopher Kvarme <christopher.kvarme@flashjab.com>
+ * @author  credits to Monte Ohrt <monte at ohrt dot com>
+ * @version 1.0
+ *
+ * @param array                    $params   parameters
+ * @param Smarty_Internal_Template $template template object
+ *
+ * @return string
+ * @uses    smarty_function_escape_special_chars()
+ * @throws \SmartyException
+ */
+function smarty_function_html_checkboxes($params, Smarty_Internal_Template $template)
+{
+    $template->_checkPlugins(
+        array(
+            array(
+                'function' => 'smarty_function_escape_special_chars',
+                'file'     => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
+            )
+        )
+    );
+    $name = 'checkbox';
+    $values = null;
+    $options = null;
+    $selected = array();
+    $separator = '';
+    $escape = true;
+    $labels = true;
+    $label_ids = false;
+    $output = null;
+    $extra = '';
+    foreach ($params as $_key => $_val) {
+        switch ($_key) {
+            case 'name':
+            case 'separator':
+                $$_key = (string)$_val;
+                break;
+            case 'escape':
+            case 'labels':
+            case 'label_ids':
+                $$_key = (bool)$_val;
+                break;
+            case 'options':
+                $$_key = (array)$_val;
+                break;
+            case 'values':
+            case 'output':
+                $$_key = array_values((array)$_val);
+                break;
+            case 'checked':
+            case 'selected':
+                if (is_array($_val)) {
+                    $selected = array();
+                    foreach ($_val as $_sel) {
+                        if (is_object($_sel)) {
+                            if (method_exists($_sel, '__toString')) {
+                                $_sel = smarty_function_escape_special_chars((string)$_sel->__toString());
+                            } else {
+                                trigger_error(
+                                    'html_checkboxes: selected attribute contains an object of class \'' .
+                                    get_class($_sel) . '\' without __toString() method',
+                                    E_USER_NOTICE
+                                );
+                                continue;
+                            }
+                        } else {
+                            $_sel = smarty_function_escape_special_chars((string)$_sel);
+                        }
+                        $selected[ $_sel ] = true;
+                    }
+                } elseif (is_object($_val)) {
+                    if (method_exists($_val, '__toString')) {
+                        $selected = smarty_function_escape_special_chars((string)$_val->__toString());
+                    } else {
+                        trigger_error(
+                            'html_checkboxes: selected attribute is an object of class \'' . get_class($_val) .
+                            '\' without __toString() method',
+                            E_USER_NOTICE
+                        );
+                    }
+                } else {
+                    $selected = smarty_function_escape_special_chars((string)$_val);
+                }
+                break;
+            case 'checkboxes':
+                trigger_error(
+                    'html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead',
+                    E_USER_WARNING
+                );
+                $options = (array)$_val;
+                break;
+            case 'assign':
+                break;
+            case 'strict':
+                break;
+            case 'disabled':
+            case 'readonly':
+                if (!empty($params[ 'strict' ])) {
+                    if (!is_scalar($_val)) {
+                        trigger_error(
+                            "html_options: {$_key} attribute must be a scalar, only boolean true or string '{$_key}' will actually add the attribute",
+                            E_USER_NOTICE
+                        );
+                    }
+                    if ($_val === true || $_val === $_key) {
+                        $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"';
+                    }
+                    break;
+                }
+            // omit break; to fall through!
+            // no break
+            default:
+                if (!is_array($_val)) {
+                    $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
+                } else {
+                    trigger_error("html_checkboxes: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
+                }
+                break;
+        }
+    }
+    if (!isset($options) && !isset($values)) {
+        return '';
+    } /* raise error here? */
+    $_html_result = array();
+    if (isset($options)) {
+        foreach ($options as $_key => $_val) {
+            $_html_result[] =
+                smarty_function_html_checkboxes_output(
+                    $name,
+                    $_key,
+                    $_val,
+                    $selected,
+                    $extra,
+                    $separator,
+                    $labels,
+                    $label_ids,
+                    $escape
+                );
+        }
+    } else {
+        foreach ($values as $_i => $_key) {
+            $_val = isset($output[ $_i ]) ? $output[ $_i ] : '';
+            $_html_result[] =
+                smarty_function_html_checkboxes_output(
+                    $name,
+                    $_key,
+                    $_val,
+                    $selected,
+                    $extra,
+                    $separator,
+                    $labels,
+                    $label_ids,
+                    $escape
+                );
+        }
+    }
+    if (!empty($params[ 'assign' ])) {
+        $template->assign($params[ 'assign' ], $_html_result);
+    } else {
+        return implode("\n", $_html_result);
+    }
+}
+
+/**
+ * @param      $name
+ * @param      $value
+ * @param      $output
+ * @param      $selected
+ * @param      $extra
+ * @param      $separator
+ * @param      $labels
+ * @param      $label_ids
+ * @param bool $escape
+ *
+ * @return string
+ */
+function smarty_function_html_checkboxes_output(
+    $name,
+    $value,
+    $output,
+    $selected,
+    $extra,
+    $separator,
+    $labels,
+    $label_ids,
+    $escape = true
+) {
+    $_output = '';
+    if (is_object($value)) {
+        if (method_exists($value, '__toString')) {
+            $value = (string)$value->__toString();
+        } else {
+            trigger_error(
+                'html_options: value is an object of class \'' . get_class($value) .
+                '\' without __toString() method',
+                E_USER_NOTICE
+            );
+            return '';
+        }
+    } else {
+        $value = (string)$value;
+    }
+    if (is_object($output)) {
+        if (method_exists($output, '__toString')) {
+            $output = (string)$output->__toString();
+        } else {
+            trigger_error(
+                'html_options: output is an object of class \'' . get_class($output) .
+                '\' without __toString() method',
+                E_USER_NOTICE
+            );
+            return '';
+        }
+    } else {
+        $output = (string)$output;
+    }
+    if ($labels) {
+        if ($label_ids) {
+            $_id = smarty_function_escape_special_chars(
+                preg_replace(
+                    '![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER,
+                    '_',
+                    $name . '_' . $value
+                )
+            );
+            $_output .= '<label for="' . $_id . '">';
+        } else {
+            $_output .= '<label>';
+        }
+    }
+    $name = smarty_function_escape_special_chars($name);
+    $value = smarty_function_escape_special_chars($value);
+    if ($escape) {
+        $output = smarty_function_escape_special_chars($output);
+    }
+    $_output .= '<input type="checkbox" name="' . $name . '[]" value="' . $value . '"';
+    if ($labels && $label_ids) {
+        $_output .= ' id="' . $_id . '"';
+    }
+    if (is_array($selected)) {
+        if (isset($selected[ $value ])) {
+            $_output .= ' checked="checked"';
+        }
+    } elseif ($value === $selected) {
+        $_output .= ' checked="checked"';
+    }
+    $_output .= $extra . ' />' . $output;
+    if ($labels) {
+        $_output .= '</label>';
+    }
+    $_output .= $separator;
+    return $_output;
+}
diff --git a/plugins/function.html_image.php b/plugins/function.html_image.php
new file mode 100644
index 0000000000000000000000000000000000000000..ad468e4f15d8b9a56d3d344ea276598c89778733
--- /dev/null
+++ b/plugins/function.html_image.php
@@ -0,0 +1,158 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsFunction
+ */
+/**
+ * Smarty {html_image} function plugin
+ * Type:     function
+ * Name:     html_image
+ * Date:     Feb 24, 2003
+ * Purpose:  format HTML tags for the image
+ * Examples: {html_image file="/images/masthead.gif"}
+ * Output:   <img src="/images/masthead.gif" width=400 height=23>
+ * Params:
+ *
+ * - file        - (required) - file (and path) of image
+ * - height      - (optional) - image height (default actual height)
+ * - width       - (optional) - image width (default actual width)
+ * - basedir     - (optional) - base directory for absolute paths, default is environment variable DOCUMENT_ROOT
+ * - path_prefix - prefix for path output (optional, default empty)
+ *
+ * @link    http://www.smarty.net/manual/en/language.function.html.image.php {html_image}
+ *          (Smarty online manual)
+ * @author  Monte Ohrt <monte at ohrt dot com>
+ * @author  credits to Duda <duda@big.hu>
+ * @version 1.0
+ *
+ * @param array                    $params   parameters
+ * @param Smarty_Internal_Template $template template object
+ *
+ * @throws SmartyException
+ * @return string
+ * @uses    smarty_function_escape_special_chars()
+ */
+function smarty_function_html_image($params, Smarty_Internal_Template $template)
+{
+    $template->_checkPlugins(
+        array(
+            array(
+                'function' => 'smarty_function_escape_special_chars',
+                'file'     => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
+            )
+        )
+    );
+    $alt = '';
+    $file = '';
+    $height = '';
+    $width = '';
+    $extra = '';
+    $prefix = '';
+    $suffix = '';
+    $path_prefix = '';
+    $basedir = isset($_SERVER[ 'DOCUMENT_ROOT' ]) ? $_SERVER[ 'DOCUMENT_ROOT' ] : '';
+    foreach ($params as $_key => $_val) {
+        switch ($_key) {
+            case 'file':
+            case 'height':
+            case 'width':
+            case 'dpi':
+            case 'path_prefix':
+            case 'basedir':
+                $$_key = $_val;
+                break;
+            case 'alt':
+                if (!is_array($_val)) {
+                    $$_key = smarty_function_escape_special_chars($_val);
+                } else {
+                    throw new SmartyException(
+                        "html_image: extra attribute '{$_key}' cannot be an array",
+                        E_USER_NOTICE
+                    );
+                }
+                break;
+            case 'link':
+            case 'href':
+                $prefix = '<a href="' . $_val . '">';
+                $suffix = '</a>';
+                break;
+            default:
+                if (!is_array($_val)) {
+                    $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
+                } else {
+                    throw new SmartyException(
+                        "html_image: extra attribute '{$_key}' cannot be an array",
+                        E_USER_NOTICE
+                    );
+                }
+                break;
+        }
+    }
+    if (empty($file)) {
+        trigger_error('html_image: missing \'file\' parameter', E_USER_NOTICE);
+        return;
+    }
+    if ($file[ 0 ] === '/') {
+        $_image_path = $basedir . $file;
+    } else {
+        $_image_path = $file;
+    }
+    // strip file protocol
+    if (stripos($params[ 'file' ], 'file://') === 0) {
+        $params[ 'file' ] = substr($params[ 'file' ], 7);
+    }
+    $protocol = strpos($params[ 'file' ], '://');
+    if ($protocol !== false) {
+        $protocol = strtolower(substr($params[ 'file' ], 0, $protocol));
+    }
+    if (isset($template->smarty->security_policy)) {
+        if ($protocol) {
+            // remote resource (or php stream, …)
+            if (!$template->smarty->security_policy->isTrustedUri($params[ 'file' ])) {
+                return;
+            }
+        } else {
+            // local file
+            if (!$template->smarty->security_policy->isTrustedResourceDir($_image_path)) {
+                return;
+            }
+        }
+    }
+    if (!isset($params[ 'width' ]) || !isset($params[ 'height' ])) {
+        // FIXME: (rodneyrehm) getimagesize() loads the complete file off a remote resource, use custom [jpg,png,gif]header reader!
+        if (!$_image_data = @getimagesize($_image_path)) {
+            if (!file_exists($_image_path)) {
+                trigger_error("html_image: unable to find '{$_image_path}'", E_USER_NOTICE);
+                return;
+            } elseif (!is_readable($_image_path)) {
+                trigger_error("html_image: unable to read '{$_image_path}'", E_USER_NOTICE);
+                return;
+            } else {
+                trigger_error("html_image: '{$_image_path}' is not a valid image file", E_USER_NOTICE);
+                return;
+            }
+        }
+        if (!isset($params[ 'width' ])) {
+            $width = $_image_data[ 0 ];
+        }
+        if (!isset($params[ 'height' ])) {
+            $height = $_image_data[ 1 ];
+        }
+    }
+    if (isset($params[ 'dpi' ])) {
+        if (strstr($_SERVER[ 'HTTP_USER_AGENT' ], 'Mac')) {
+            // FIXME: (rodneyrehm) wrong dpi assumption
+            // don't know who thought this up… even if it was true in 1998, it's definitely wrong in 2011.
+            $dpi_default = 72;
+        } else {
+            $dpi_default = 96;
+        }
+        $_resize = $dpi_default / $params[ 'dpi' ];
+        $width = round($width * $_resize);
+        $height = round($height * $_resize);
+    }
+    return $prefix . '<img src="' . $path_prefix . $file . '" alt="' . $alt . '" width="' . $width . '" height="' .
+           $height . '"' . $extra . ' />' . $suffix;
+}
diff --git a/plugins/function.html_options.php b/plugins/function.html_options.php
new file mode 100644
index 0000000000000000000000000000000000000000..6907e8ee1264c084dab964df84c8b61c2cd872a7
--- /dev/null
+++ b/plugins/function.html_options.php
@@ -0,0 +1,230 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsFunction
+ */
+/**
+ * Smarty {html_options} function plugin
+ * Type:     function
+ * Name:     html_options
+ * Purpose:  Prints the list of <option> tags generated from
+ *           the passed parameters
+ * Params:
+ *
+ * - name       (optional) - string default "select"
+ * - values     (required) - if no options supplied) - array
+ * - options    (required) - if no values supplied) - associative array
+ * - selected   (optional) - string default not set
+ * - output     (required) - if not options supplied) - array
+ * - id         (optional) - string default not set
+ * - class      (optional) - string default not set
+ *
+ * @link   http://www.smarty.net/manual/en/language.function.html.options.php {html_image}
+ *           (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author Ralf Strehle (minor optimization) <ralf dot strehle at yahoo dot de>
+ *
+ * @param array                     $params parameters
+ *
+ * @param \Smarty_Internal_Template $template
+ *
+ * @return string
+ * @uses   smarty_function_escape_special_chars()
+ * @throws \SmartyException
+ */
+function smarty_function_html_options($params, Smarty_Internal_Template $template)
+{
+    $template->_checkPlugins(
+        array(
+            array(
+                'function' => 'smarty_function_escape_special_chars',
+                'file'     => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
+            )
+        )
+    );
+    $name = null;
+    $values = null;
+    $options = null;
+    $selected = null;
+    $output = null;
+    $id = null;
+    $class = null;
+    $extra = '';
+    foreach ($params as $_key => $_val) {
+        switch ($_key) {
+            case 'name':
+            case 'class':
+            case 'id':
+                $$_key = (string)$_val;
+                break;
+            case 'options':
+                $options = (array)$_val;
+                break;
+            case 'values':
+            case 'output':
+                $$_key = array_values((array)$_val);
+                break;
+            case 'selected':
+                if (is_array($_val)) {
+                    $selected = array();
+                    foreach ($_val as $_sel) {
+                        if (is_object($_sel)) {
+                            if (method_exists($_sel, '__toString')) {
+                                $_sel = smarty_function_escape_special_chars((string)$_sel->__toString());
+                            } else {
+                                trigger_error(
+                                    'html_options: selected attribute contains an object of class \'' .
+                                    get_class($_sel) . '\' without __toString() method',
+                                    E_USER_NOTICE
+                                );
+                                continue;
+                            }
+                        } else {
+                            $_sel = smarty_function_escape_special_chars((string)$_sel);
+                        }
+                        $selected[ $_sel ] = true;
+                    }
+                } elseif (is_object($_val)) {
+                    if (method_exists($_val, '__toString')) {
+                        $selected = smarty_function_escape_special_chars((string)$_val->__toString());
+                    } else {
+                        trigger_error(
+                            'html_options: selected attribute is an object of class \'' . get_class($_val) .
+                            '\' without __toString() method',
+                            E_USER_NOTICE
+                        );
+                    }
+                } else {
+                    $selected = smarty_function_escape_special_chars((string)$_val);
+                }
+                break;
+            case 'strict':
+                break;
+            case 'disabled':
+            case 'readonly':
+                if (!empty($params[ 'strict' ])) {
+                    if (!is_scalar($_val)) {
+                        trigger_error(
+                            "html_options: {$_key} attribute must be a scalar, only boolean true or string '{$_key}' will actually add the attribute",
+                            E_USER_NOTICE
+                        );
+                    }
+                    if ($_val === true || $_val === $_key) {
+                        $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"';
+                    }
+                    break;
+                }
+            // omit break; to fall through!
+            // no break
+            default:
+                if (!is_array($_val)) {
+                    $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
+                } else {
+                    trigger_error("html_options: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
+                }
+                break;
+        }
+    }
+    if (!isset($options) && !isset($values)) {
+        /* raise error here? */
+        return '';
+    }
+    $_html_result = '';
+    $_idx = 0;
+    if (isset($options)) {
+        foreach ($options as $_key => $_val) {
+            $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx);
+        }
+    } else {
+        foreach ($values as $_i => $_key) {
+            $_val = isset($output[ $_i ]) ? $output[ $_i ] : '';
+            $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx);
+        }
+    }
+    if (!empty($name)) {
+        $_html_class = !empty($class) ? ' class="' . $class . '"' : '';
+        $_html_id = !empty($id) ? ' id="' . $id . '"' : '';
+        $_html_result =
+            '<select name="' . $name . '"' . $_html_class . $_html_id . $extra . '>' . "\n" . $_html_result .
+            '</select>' . "\n";
+    }
+    return $_html_result;
+}
+
+/**
+ * @param $key
+ * @param $value
+ * @param $selected
+ * @param $id
+ * @param $class
+ * @param $idx
+ *
+ * @return string
+ */
+function smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, &$idx)
+{
+    if (!is_array($value)) {
+        $_key = smarty_function_escape_special_chars($key);
+        $_html_result = '<option value="' . $_key . '"';
+        if (is_array($selected)) {
+            if (isset($selected[ $_key ])) {
+                $_html_result .= ' selected="selected"';
+            }
+        } elseif ($_key === $selected) {
+            $_html_result .= ' selected="selected"';
+        }
+        $_html_class = !empty($class) ? ' class="' . $class . ' option"' : '';
+        $_html_id = !empty($id) ? ' id="' . $id . '-' . $idx . '"' : '';
+        if (is_object($value)) {
+            if (method_exists($value, '__toString')) {
+                $value = smarty_function_escape_special_chars((string)$value->__toString());
+            } else {
+                trigger_error(
+                    'html_options: value is an object of class \'' . get_class($value) .
+                    '\' without __toString() method',
+                    E_USER_NOTICE
+                );
+                return '';
+            }
+        } else {
+            $value = smarty_function_escape_special_chars((string)$value);
+        }
+        $_html_result .= $_html_class . $_html_id . '>' . $value . '</option>' . "\n";
+        $idx++;
+    } else {
+        $_idx = 0;
+        $_html_result =
+            smarty_function_html_options_optgroup(
+                $key,
+                $value,
+                $selected,
+                !empty($id) ? ($id . '-' . $idx) : null,
+                $class,
+                $_idx
+            );
+        $idx++;
+    }
+    return $_html_result;
+}
+
+/**
+ * @param $key
+ * @param $values
+ * @param $selected
+ * @param $id
+ * @param $class
+ * @param $idx
+ *
+ * @return string
+ */
+function smarty_function_html_options_optgroup($key, $values, $selected, $id, $class, &$idx)
+{
+    $optgroup_html = '<optgroup label="' . smarty_function_escape_special_chars($key) . '">' . "\n";
+    foreach ($values as $key => $value) {
+        $optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, $idx);
+    }
+    $optgroup_html .= "</optgroup>\n";
+    return $optgroup_html;
+}
diff --git a/plugins/function.html_radios.php b/plugins/function.html_radios.php
new file mode 100644
index 0000000000000000000000000000000000000000..5e834587cd0c24f4a563d4a116335046b0586d5c
--- /dev/null
+++ b/plugins/function.html_radios.php
@@ -0,0 +1,266 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsFunction
+ */
+/**
+ * Smarty {html_radios} function plugin
+ * File:       function.html_radios.php
+ * Type:       function
+ * Name:       html_radios
+ * Date:       24.Feb.2003
+ * Purpose:    Prints out a list of radio input types
+ * Params:
+ *
+ * - name       (optional) - string default "radio"
+ * - values     (required) - array
+ * - options    (required) - associative array
+ * - checked    (optional) - array default not set
+ * - separator  (optional) - ie <br> or &nbsp;
+ * - output     (optional) - the output next to each radio button
+ * - assign     (optional) - assign the output as an array to this variable
+ * - escape     (optional) - escape the content (not value), defaults to true
+ *
+ * Examples:
+ *
+ * {html_radios values=$ids output=$names}
+ * {html_radios values=$ids name='box' separator='<br>' output=$names}
+ * {html_radios values=$ids checked=$checked separator='<br>' output=$names}
+ *
+ * @link    http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios}
+ *          (Smarty online manual)
+ * @author  Christopher Kvarme <christopher.kvarme@flashjab.com>
+ * @author  credits to Monte Ohrt <monte at ohrt dot com>
+ * @version 1.0
+ *
+ * @param array                    $params   parameters
+ * @param Smarty_Internal_Template $template template object
+ *
+ * @return string
+ * @uses    smarty_function_escape_special_chars()
+ * @throws \SmartyException
+ */
+function smarty_function_html_radios($params, Smarty_Internal_Template $template)
+{
+    $template->_checkPlugins(
+        array(
+            array(
+                'function' => 'smarty_function_escape_special_chars',
+                'file'     => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
+            )
+        )
+    );
+    $name = 'radio';
+    $values = null;
+    $options = null;
+    $selected = null;
+    $separator = '';
+    $escape = true;
+    $labels = true;
+    $label_ids = false;
+    $output = null;
+    $extra = '';
+    foreach ($params as $_key => $_val) {
+        switch ($_key) {
+            case 'name':
+            case 'separator':
+                $$_key = (string)$_val;
+                break;
+            case 'checked':
+            case 'selected':
+                if (is_array($_val)) {
+                    trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING);
+                } elseif (is_object($_val)) {
+                    if (method_exists($_val, '__toString')) {
+                        $selected = smarty_function_escape_special_chars((string)$_val->__toString());
+                    } else {
+                        trigger_error(
+                            'html_radios: selected attribute is an object of class \'' . get_class($_val) .
+                            '\' without __toString() method',
+                            E_USER_NOTICE
+                        );
+                    }
+                } else {
+                    $selected = (string)$_val;
+                }
+                break;
+            case 'escape':
+            case 'labels':
+            case 'label_ids':
+                $$_key = (bool)$_val;
+                break;
+            case 'options':
+                $$_key = (array)$_val;
+                break;
+            case 'values':
+            case 'output':
+                $$_key = array_values((array)$_val);
+                break;
+            case 'radios':
+                trigger_error(
+                    'html_radios: the use of the "radios" attribute is deprecated, use "options" instead',
+                    E_USER_WARNING
+                );
+                $options = (array)$_val;
+                break;
+            case 'assign':
+                break;
+            case 'strict':
+                break;
+            case 'disabled':
+            case 'readonly':
+                if (!empty($params[ 'strict' ])) {
+                    if (!is_scalar($_val)) {
+                        trigger_error(
+                            "html_options: {$_key} attribute must be a scalar, only boolean true or string '$_key' will actually add the attribute",
+                            E_USER_NOTICE
+                        );
+                    }
+                    if ($_val === true || $_val === $_key) {
+                        $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"';
+                    }
+                    break;
+                }
+            // omit break; to fall through!
+            // no break
+            default:
+                if (!is_array($_val)) {
+                    $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"';
+                } else {
+                    trigger_error("html_radios: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
+                }
+                break;
+        }
+    }
+    if (!isset($options) && !isset($values)) {
+        /* raise error here? */
+        return '';
+    }
+    $_html_result = array();
+    if (isset($options)) {
+        foreach ($options as $_key => $_val) {
+            $_html_result[] =
+                smarty_function_html_radios_output(
+                    $name,
+                    $_key,
+                    $_val,
+                    $selected,
+                    $extra,
+                    $separator,
+                    $labels,
+                    $label_ids,
+                    $escape
+                );
+        }
+    } else {
+        foreach ($values as $_i => $_key) {
+            $_val = isset($output[ $_i ]) ? $output[ $_i ] : '';
+            $_html_result[] =
+                smarty_function_html_radios_output(
+                    $name,
+                    $_key,
+                    $_val,
+                    $selected,
+                    $extra,
+                    $separator,
+                    $labels,
+                    $label_ids,
+                    $escape
+                );
+        }
+    }
+    if (!empty($params[ 'assign' ])) {
+        $template->assign($params[ 'assign' ], $_html_result);
+    } else {
+        return implode("\n", $_html_result);
+    }
+}
+
+/**
+ * @param $name
+ * @param $value
+ * @param $output
+ * @param $selected
+ * @param $extra
+ * @param $separator
+ * @param $labels
+ * @param $label_ids
+ * @param $escape
+ *
+ * @return string
+ */
+function smarty_function_html_radios_output(
+    $name,
+    $value,
+    $output,
+    $selected,
+    $extra,
+    $separator,
+    $labels,
+    $label_ids,
+    $escape
+) {
+    $_output = '';
+    if (is_object($value)) {
+        if (method_exists($value, '__toString')) {
+            $value = (string)$value->__toString();
+        } else {
+            trigger_error(
+                'html_options: value is an object of class \'' . get_class($value) .
+                '\' without __toString() method',
+                E_USER_NOTICE
+            );
+            return '';
+        }
+    } else {
+        $value = (string)$value;
+    }
+    if (is_object($output)) {
+        if (method_exists($output, '__toString')) {
+            $output = (string)$output->__toString();
+        } else {
+            trigger_error(
+                'html_options: output is an object of class \'' . get_class($output) .
+                '\' without __toString() method',
+                E_USER_NOTICE
+            );
+            return '';
+        }
+    } else {
+        $output = (string)$output;
+    }
+    if ($labels) {
+        if ($label_ids) {
+            $_id = smarty_function_escape_special_chars(
+                preg_replace(
+                    '![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER,
+                    '_',
+                    $name . '_' . $value
+                )
+            );
+            $_output .= '<label for="' . $_id . '">';
+        } else {
+            $_output .= '<label>';
+        }
+    }
+    $name = smarty_function_escape_special_chars($name);
+    $value = smarty_function_escape_special_chars($value);
+    if ($escape) {
+        $output = smarty_function_escape_special_chars($output);
+    }
+    $_output .= '<input type="radio" name="' . $name . '" value="' . $value . '"';
+    if ($labels && $label_ids) {
+        $_output .= ' id="' . $_id . '"';
+    }
+    if ($value === $selected) {
+        $_output .= ' checked="checked"';
+    }
+    $_output .= $extra . ' />' . $output;
+    if ($labels) {
+        $_output .= '</label>';
+    }
+    $_output .= $separator;
+    return $_output;
+}
diff --git a/plugins/function.html_select_date.php b/plugins/function.html_select_date.php
new file mode 100644
index 0000000000000000000000000000000000000000..86403e3dc048a4d4c9f2aaed08799114f05877ae
--- /dev/null
+++ b/plugins/function.html_select_date.php
@@ -0,0 +1,388 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsFunction
+ */
+/**
+ * Smarty {html_select_date} plugin
+ * Type:     function
+ * Name:     html_select_date
+ * Purpose:  Prints the dropdowns for date selection.
+ * ChangeLog:
+ *
+ *            - 1.0 initial release
+ *            - 1.1 added support for +/- N syntax for begin
+ *              and end year values. (Monte)
+ *            - 1.2 added support for yyyy-mm-dd syntax for
+ *              time value. (Jan Rosier)
+ *            - 1.3 added support for choosing format for
+ *              month values (Gary Loescher)
+ *            - 1.3.1 added support for choosing format for
+ *              day values (Marcus Bointon)
+ *            - 1.3.2 support negative timestamps, force year
+ *              dropdown to include given date unless explicitly set (Monte)
+ *            - 1.3.4 fix behaviour of 0000-00-00 00:00:00 dates to match that
+ *              of 0000-00-00 dates (cybot, boots)
+ *            - 2.0 complete rewrite for performance,
+ *              added attributes month_names, *_id
+ *
+ * @link    http://www.smarty.net/manual/en/language.function.html.select.date.php {html_select_date}
+ *           (Smarty online manual)
+ * @version 2.0
+ * @author  Andrei Zmievski
+ * @author  Monte Ohrt <monte at ohrt dot com>
+ * @author  Rodney Rehm
+ *
+ * @param array                     $params parameters
+ *
+ * @param \Smarty_Internal_Template $template
+ *
+ * @return string
+ * @throws \SmartyException
+ */
+function smarty_function_html_select_date($params, Smarty_Internal_Template $template)
+{
+    $template->_checkPlugins(
+        array(
+            array(
+                'function' => 'smarty_function_escape_special_chars',
+                'file'     => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
+            )
+        )
+    );
+    // generate timestamps used for month names only
+    static $_month_timestamps = null;
+    static $_current_year = null;
+    if ($_month_timestamps === null) {
+        $_current_year = date('Y');
+        $_month_timestamps = array();
+        for ($i = 1; $i <= 12; $i++) {
+            $_month_timestamps[ $i ] = mktime(0, 0, 0, $i, 1, 2000);
+        }
+    }
+    /* Default values. */
+    $prefix = 'Date_';
+    $start_year = null;
+    $end_year = null;
+    $display_days = true;
+    $display_months = true;
+    $display_years = true;
+    $month_format = '%B';
+    /* Write months as numbers by default  GL */
+    $month_value_format = '%m';
+    $day_format = '%02d';
+    /* Write day values using this format MB */
+    $day_value_format = '%d';
+    $year_as_text = false;
+    /* Display years in reverse order? Ie. 2000,1999,.... */
+    $reverse_years = false;
+    /* Should the select boxes be part of an array when returned from PHP?
+       e.g. setting it to "birthday", would create "birthday[Day]",
+       "birthday[Month]" & "birthday[Year]". Can be combined with prefix */
+    $field_array = null;
+    /* <select size>'s of the different <select> tags.
+       If not set, uses default dropdown. */
+    $day_size = null;
+    $month_size = null;
+    $year_size = null;
+    /* Unparsed attributes common to *ALL* the <select>/<input> tags.
+       An example might be in the template: all_extra ='class ="foo"'. */
+    $all_extra = null;
+    /* Separate attributes for the tags. */
+    $day_extra = null;
+    $month_extra = null;
+    $year_extra = null;
+    /* Order in which to display the fields.
+       "D" -> day, "M" -> month, "Y" -> year. */
+    $field_order = 'MDY';
+    /* String printed between the different fields. */
+    $field_separator = "\n";
+    $option_separator = "\n";
+    $time = null;
+    // $all_empty = null;
+    // $day_empty = null;
+    // $month_empty = null;
+    // $year_empty = null;
+    $extra_attrs = '';
+    $all_id = null;
+    $day_id = null;
+    $month_id = null;
+    $year_id = null;
+    foreach ($params as $_key => $_value) {
+        switch ($_key) {
+            case 'time':
+                if (!is_array($_value) && $_value !== null) {
+                    $template->_checkPlugins(
+                        array(
+                            array(
+                                'function' => 'smarty_make_timestamp',
+                                'file'     => SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'
+                            )
+                        )
+                    );
+                    $time = smarty_make_timestamp($_value);
+                }
+                break;
+            case 'month_names':
+                if (is_array($_value) && count($_value) === 12) {
+                    $$_key = $_value;
+                } else {
+                    trigger_error('html_select_date: month_names must be an array of 12 strings', E_USER_NOTICE);
+                }
+                break;
+            case 'prefix':
+            case 'field_array':
+            case 'start_year':
+            case 'end_year':
+            case 'day_format':
+            case 'day_value_format':
+            case 'month_format':
+            case 'month_value_format':
+            case 'day_size':
+            case 'month_size':
+            case 'year_size':
+            case 'all_extra':
+            case 'day_extra':
+            case 'month_extra':
+            case 'year_extra':
+            case 'field_order':
+            case 'field_separator':
+            case 'option_separator':
+            case 'all_empty':
+            case 'month_empty':
+            case 'day_empty':
+            case 'year_empty':
+            case 'all_id':
+            case 'month_id':
+            case 'day_id':
+            case 'year_id':
+                $$_key = (string)$_value;
+                break;
+            case 'display_days':
+            case 'display_months':
+            case 'display_years':
+            case 'year_as_text':
+            case 'reverse_years':
+                $$_key = (bool)$_value;
+                break;
+            default:
+                if (!is_array($_value)) {
+                    $extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"';
+                } else {
+                    trigger_error("html_select_date: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
+                }
+                break;
+        }
+    }
+    // Note: date() is faster than strftime()
+    // Note: explode(date()) is faster than date() date() date()
+    if (isset($params[ 'time' ]) && is_array($params[ 'time' ])) {
+        if (isset($params[ 'time' ][ $prefix . 'Year' ])) {
+            // $_REQUEST[$field_array] given
+            foreach (array(
+                'Y' => 'Year',
+                'm' => 'Month',
+                'd' => 'Day'
+            ) as $_elementKey => $_elementName) {
+                $_variableName = '_' . strtolower($_elementName);
+                $$_variableName =
+                    isset($params[ 'time' ][ $prefix . $_elementName ]) ? $params[ 'time' ][ $prefix . $_elementName ] :
+                        date($_elementKey);
+            }
+        } elseif (isset($params[ 'time' ][ $field_array ][ $prefix . 'Year' ])) {
+            // $_REQUEST given
+            foreach (array(
+                'Y' => 'Year',
+                'm' => 'Month',
+                'd' => 'Day'
+            ) as $_elementKey => $_elementName) {
+                $_variableName = '_' . strtolower($_elementName);
+                $$_variableName = isset($params[ 'time' ][ $field_array ][ $prefix . $_elementName ]) ?
+                    $params[ 'time' ][ $field_array ][ $prefix . $_elementName ] : date($_elementKey);
+            }
+        } else {
+            // no date found, use NOW
+            list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d'));
+        }
+    } elseif ($time === null) {
+        if (array_key_exists('time', $params)) {
+            $_year = $_month = $_day = $time = null;
+        } else {
+            list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d'));
+        }
+    } else {
+        list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d', $time));
+    }
+    // make syntax "+N" or "-N" work with $start_year and $end_year
+    // Note preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match) is slower than trim+substr
+    foreach (array(
+        'start',
+        'end'
+    ) as $key) {
+        $key .= '_year';
+        $t = $$key;
+        if ($t === null) {
+            $$key = (int)$_current_year;
+        } elseif ($t[ 0 ] === '+') {
+            $$key = (int)($_current_year + (int)trim(substr($t, 1)));
+        } elseif ($t[ 0 ] === '-') {
+            $$key = (int)($_current_year - (int)trim(substr($t, 1)));
+        } else {
+            $$key = (int)$$key;
+        }
+    }
+    // flip for ascending or descending
+    if (($start_year > $end_year && !$reverse_years) || ($start_year < $end_year && $reverse_years)) {
+        $t = $end_year;
+        $end_year = $start_year;
+        $start_year = $t;
+    }
+    // generate year <select> or <input>
+    if ($display_years) {
+        $_extra = '';
+        $_name = $field_array ? ($field_array . '[' . $prefix . 'Year]') : ($prefix . 'Year');
+        if ($all_extra) {
+            $_extra .= ' ' . $all_extra;
+        }
+        if ($year_extra) {
+            $_extra .= ' ' . $year_extra;
+        }
+        if ($year_as_text) {
+            $_html_years =
+                '<input type="text" name="' . $_name . '" value="' . $_year . '" size="4" maxlength="4"' . $_extra .
+                $extra_attrs . ' />';
+        } else {
+            $_html_years = '<select name="' . $_name . '"';
+            if ($year_id !== null || $all_id !== null) {
+                $_html_years .= ' id="' . smarty_function_escape_special_chars(
+                        $year_id !== null ?
+                            ($year_id ? $year_id : $_name) :
+                            ($all_id ? ($all_id . $_name) :
+                                $_name)
+                    ) . '"';
+            }
+            if ($year_size) {
+                $_html_years .= ' size="' . $year_size . '"';
+            }
+            $_html_years .= $_extra . $extra_attrs . '>' . $option_separator;
+            if (isset($year_empty) || isset($all_empty)) {
+                $_html_years .= '<option value="">' . (isset($year_empty) ? $year_empty : $all_empty) . '</option>' .
+                                $option_separator;
+            }
+            $op = $start_year > $end_year ? -1 : 1;
+            for ($i = $start_year; $op > 0 ? $i <= $end_year : $i >= $end_year; $i += $op) {
+                $_html_years .= '<option value="' . $i . '"' . ($_year == $i ? ' selected="selected"' : '') . '>' . $i .
+                                '</option>' . $option_separator;
+            }
+            $_html_years .= '</select>';
+        }
+    }
+    // generate month <select> or <input>
+    if ($display_months) {
+        $_extra = '';
+        $_name = $field_array ? ($field_array . '[' . $prefix . 'Month]') : ($prefix . 'Month');
+        if ($all_extra) {
+            $_extra .= ' ' . $all_extra;
+        }
+        if ($month_extra) {
+            $_extra .= ' ' . $month_extra;
+        }
+        $_html_months = '<select name="' . $_name . '"';
+        if ($month_id !== null || $all_id !== null) {
+            $_html_months .= ' id="' . smarty_function_escape_special_chars(
+                    $month_id !== null ?
+                        ($month_id ? $month_id : $_name) :
+                        ($all_id ? ($all_id . $_name) :
+                            $_name)
+                ) . '"';
+        }
+        if ($month_size) {
+            $_html_months .= ' size="' . $month_size . '"';
+        }
+        $_html_months .= $_extra . $extra_attrs . '>' . $option_separator;
+        if (isset($month_empty) || isset($all_empty)) {
+            $_html_months .= '<option value="">' . (isset($month_empty) ? $month_empty : $all_empty) . '</option>' .
+                             $option_separator;
+        }
+        for ($i = 1; $i <= 12; $i++) {
+            $_val = sprintf('%02d', $i);
+            $_text = isset($month_names) ? smarty_function_escape_special_chars($month_names[ $i ]) :
+                ($month_format === '%m' ? $_val : strftime($month_format, $_month_timestamps[ $i ]));
+            $_value = $month_value_format === '%m' ? $_val : strftime($month_value_format, $_month_timestamps[ $i ]);
+            $_html_months .= '<option value="' . $_value . '"' . ($_val == $_month ? ' selected="selected"' : '') .
+                             '>' . $_text . '</option>' . $option_separator;
+        }
+        $_html_months .= '</select>';
+    }
+    // generate day <select> or <input>
+    if ($display_days) {
+        $_extra = '';
+        $_name = $field_array ? ($field_array . '[' . $prefix . 'Day]') : ($prefix . 'Day');
+        if ($all_extra) {
+            $_extra .= ' ' . $all_extra;
+        }
+        if ($day_extra) {
+            $_extra .= ' ' . $day_extra;
+        }
+        $_html_days = '<select name="' . $_name . '"';
+        if ($day_id !== null || $all_id !== null) {
+            $_html_days .= ' id="' .
+                           smarty_function_escape_special_chars(
+                               $day_id !== null ? ($day_id ? $day_id : $_name) :
+                                   ($all_id ? ($all_id . $_name) : $_name)
+                           ) . '"';
+        }
+        if ($day_size) {
+            $_html_days .= ' size="' . $day_size . '"';
+        }
+        $_html_days .= $_extra . $extra_attrs . '>' . $option_separator;
+        if (isset($day_empty) || isset($all_empty)) {
+            $_html_days .= '<option value="">' . (isset($day_empty) ? $day_empty : $all_empty) . '</option>' .
+                           $option_separator;
+        }
+        for ($i = 1; $i <= 31; $i++) {
+            $_val = sprintf('%02d', $i);
+            $_text = $day_format === '%02d' ? $_val : sprintf($day_format, $i);
+            $_value = $day_value_format === '%02d' ? $_val : sprintf($day_value_format, $i);
+            $_html_days .= '<option value="' . $_value . '"' . ($_val == $_day ? ' selected="selected"' : '') . '>' .
+                           $_text . '</option>' . $option_separator;
+        }
+        $_html_days .= '</select>';
+    }
+    // order the fields for output
+    $_html = '';
+    for ($i = 0; $i <= 2; $i++) {
+        switch ($field_order[ $i ]) {
+            case 'Y':
+            case 'y':
+                if (isset($_html_years)) {
+                    if ($_html) {
+                        $_html .= $field_separator;
+                    }
+                    $_html .= $_html_years;
+                }
+                break;
+            case 'm':
+            case 'M':
+                if (isset($_html_months)) {
+                    if ($_html) {
+                        $_html .= $field_separator;
+                    }
+                    $_html .= $_html_months;
+                }
+                break;
+            case 'd':
+            case 'D':
+                if (isset($_html_days)) {
+                    if ($_html) {
+                        $_html .= $field_separator;
+                    }
+                    $_html .= $_html_days;
+                }
+                break;
+        }
+    }
+    return $_html;
+}
diff --git a/plugins/function.html_select_time.php b/plugins/function.html_select_time.php
new file mode 100644
index 0000000000000000000000000000000000000000..cb047bc0aac0fc341c7c6bbfdec2af8a217f09cc
--- /dev/null
+++ b/plugins/function.html_select_time.php
@@ -0,0 +1,354 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsFunction
+ */
+/**
+ * Smarty {html_select_time} function plugin
+ * Type:     function
+ * Name:     html_select_time
+ * Purpose:  Prints the dropdowns for time selection
+ *
+ * @link   http://www.smarty.net/manual/en/language.function.html.select.time.php {html_select_time}
+ *           (Smarty online manual)
+ * @author Roberto Berto <roberto@berto.net>
+ * @author Monte Ohrt <monte AT ohrt DOT com>
+ *
+ * @param array                     $params parameters
+ *
+ * @param \Smarty_Internal_Template $template
+ *
+ * @return string
+ * @uses   smarty_make_timestamp()
+ * @throws \SmartyException
+ */
+function smarty_function_html_select_time($params, Smarty_Internal_Template $template)
+{
+    $template->_checkPlugins(
+        array(
+            array(
+                'function' => 'smarty_function_escape_special_chars',
+                'file'     => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
+            )
+        )
+    );
+    $prefix = 'Time_';
+    $field_array = null;
+    $field_separator = "\n";
+    $option_separator = "\n";
+    $time = null;
+    $display_hours = true;
+    $display_minutes = true;
+    $display_seconds = true;
+    $display_meridian = true;
+    $hour_format = '%02d';
+    $hour_value_format = '%02d';
+    $minute_format = '%02d';
+    $minute_value_format = '%02d';
+    $second_format = '%02d';
+    $second_value_format = '%02d';
+    $hour_size = null;
+    $minute_size = null;
+    $second_size = null;
+    $meridian_size = null;
+    $all_empty = null;
+    $hour_empty = null;
+    $minute_empty = null;
+    $second_empty = null;
+    $meridian_empty = null;
+    $all_id = null;
+    $hour_id = null;
+    $minute_id = null;
+    $second_id = null;
+    $meridian_id = null;
+    $use_24_hours = true;
+    $minute_interval = 1;
+    $second_interval = 1;
+    $extra_attrs = '';
+    $all_extra = null;
+    $hour_extra = null;
+    $minute_extra = null;
+    $second_extra = null;
+    $meridian_extra = null;
+    foreach ($params as $_key => $_value) {
+        switch ($_key) {
+            case 'time':
+                if (!is_array($_value) && $_value !== null) {
+                    $template->_checkPlugins(
+                        array(
+                            array(
+                                'function' => 'smarty_make_timestamp',
+                                'file'     => SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'
+                            )
+                        )
+                    );
+                    $time = smarty_make_timestamp($_value);
+                }
+                break;
+            case 'prefix':
+            case 'field_array':
+            case 'field_separator':
+            case 'option_separator':
+            case 'all_extra':
+            case 'hour_extra':
+            case 'minute_extra':
+            case 'second_extra':
+            case 'meridian_extra':
+            case 'all_empty':
+            case 'hour_empty':
+            case 'minute_empty':
+            case 'second_empty':
+            case 'meridian_empty':
+            case 'all_id':
+            case 'hour_id':
+            case 'minute_id':
+            case 'second_id':
+            case 'meridian_id':
+            case 'hour_format':
+            case 'hour_value_format':
+            case 'minute_format':
+            case 'minute_value_format':
+            case 'second_format':
+            case 'second_value_format':
+                $$_key = (string)$_value;
+                break;
+            case 'display_hours':
+            case 'display_minutes':
+            case 'display_seconds':
+            case 'display_meridian':
+            case 'use_24_hours':
+                $$_key = (bool)$_value;
+                break;
+            case 'minute_interval':
+            case 'second_interval':
+            case 'hour_size':
+            case 'minute_size':
+            case 'second_size':
+            case 'meridian_size':
+                $$_key = (int)$_value;
+                break;
+            default:
+                if (!is_array($_value)) {
+                    $extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"';
+                } else {
+                    trigger_error("html_select_date: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE);
+                }
+                break;
+        }
+    }
+    if (isset($params[ 'time' ]) && is_array($params[ 'time' ])) {
+        if (isset($params[ 'time' ][ $prefix . 'Hour' ])) {
+            // $_REQUEST[$field_array] given
+            foreach (array(
+                'H' => 'Hour',
+                'i' => 'Minute',
+                's' => 'Second'
+            ) as $_elementKey => $_elementName) {
+                $_variableName = '_' . strtolower($_elementName);
+                $$_variableName =
+                    isset($params[ 'time' ][ $prefix . $_elementName ]) ? $params[ 'time' ][ $prefix . $_elementName ] :
+                        date($_elementKey);
+            }
+            $_meridian =
+                isset($params[ 'time' ][ $prefix . 'Meridian' ]) ? (' ' . $params[ 'time' ][ $prefix . 'Meridian' ]) :
+                    '';
+            $time = strtotime($_hour . ':' . $_minute . ':' . $_second . $_meridian);
+            list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
+        } elseif (isset($params[ 'time' ][ $field_array ][ $prefix . 'Hour' ])) {
+            // $_REQUEST given
+            foreach (array(
+                'H' => 'Hour',
+                'i' => 'Minute',
+                's' => 'Second'
+            ) as $_elementKey => $_elementName) {
+                $_variableName = '_' . strtolower($_elementName);
+                $$_variableName = isset($params[ 'time' ][ $field_array ][ $prefix . $_elementName ]) ?
+                    $params[ 'time' ][ $field_array ][ $prefix . $_elementName ] : date($_elementKey);
+            }
+            $_meridian = isset($params[ 'time' ][ $field_array ][ $prefix . 'Meridian' ]) ?
+                (' ' . $params[ 'time' ][ $field_array ][ $prefix . 'Meridian' ]) : '';
+            $time = strtotime($_hour . ':' . $_minute . ':' . $_second . $_meridian);
+            list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
+        } else {
+            // no date found, use NOW
+            list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d'));
+        }
+    } elseif ($time === null) {
+        if (array_key_exists('time', $params)) {
+            $_hour = $_minute = $_second = $time = null;
+        } else {
+            list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s'));
+        }
+    } else {
+        list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time));
+    }
+    // generate hour <select>
+    if ($display_hours) {
+        $_html_hours = '';
+        $_extra = '';
+        $_name = $field_array ? ($field_array . '[' . $prefix . 'Hour]') : ($prefix . 'Hour');
+        if ($all_extra) {
+            $_extra .= ' ' . $all_extra;
+        }
+        if ($hour_extra) {
+            $_extra .= ' ' . $hour_extra;
+        }
+        $_html_hours = '<select name="' . $_name . '"';
+        if ($hour_id !== null || $all_id !== null) {
+            $_html_hours .= ' id="' .
+                            smarty_function_escape_special_chars(
+                                $hour_id !== null ? ($hour_id ? $hour_id : $_name) :
+                                    ($all_id ? ($all_id . $_name) : $_name)
+                            ) . '"';
+        }
+        if ($hour_size) {
+            $_html_hours .= ' size="' . $hour_size . '"';
+        }
+        $_html_hours .= $_extra . $extra_attrs . '>' . $option_separator;
+        if (isset($hour_empty) || isset($all_empty)) {
+            $_html_hours .= '<option value="">' . (isset($hour_empty) ? $hour_empty : $all_empty) . '</option>' .
+                            $option_separator;
+        }
+        $start = $use_24_hours ? 0 : 1;
+        $end = $use_24_hours ? 23 : 12;
+        for ($i = $start; $i <= $end; $i++) {
+            $_val = sprintf('%02d', $i);
+            $_text = $hour_format === '%02d' ? $_val : sprintf($hour_format, $i);
+            $_value = $hour_value_format === '%02d' ? $_val : sprintf($hour_value_format, $i);
+            if (!$use_24_hours) {
+                $_hour12 = $_hour == 0 ? 12 : ($_hour <= 12 ? $_hour : $_hour - 12);
+            }
+            $selected = $_hour !== null ? ($use_24_hours ? $_hour == $_val : $_hour12 == $_val) : null;
+            $_html_hours .= '<option value="' . $_value . '"' . ($selected ? ' selected="selected"' : '') . '>' .
+                            $_text . '</option>' . $option_separator;
+        }
+        $_html_hours .= '</select>';
+    }
+    // generate minute <select>
+    if ($display_minutes) {
+        $_html_minutes = '';
+        $_extra = '';
+        $_name = $field_array ? ($field_array . '[' . $prefix . 'Minute]') : ($prefix . 'Minute');
+        if ($all_extra) {
+            $_extra .= ' ' . $all_extra;
+        }
+        if ($minute_extra) {
+            $_extra .= ' ' . $minute_extra;
+        }
+        $_html_minutes = '<select name="' . $_name . '"';
+        if ($minute_id !== null || $all_id !== null) {
+            $_html_minutes .= ' id="' . smarty_function_escape_special_chars(
+                    $minute_id !== null ?
+                        ($minute_id ? $minute_id : $_name) :
+                        ($all_id ? ($all_id . $_name) :
+                            $_name)
+                ) . '"';
+        }
+        if ($minute_size) {
+            $_html_minutes .= ' size="' . $minute_size . '"';
+        }
+        $_html_minutes .= $_extra . $extra_attrs . '>' . $option_separator;
+        if (isset($minute_empty) || isset($all_empty)) {
+            $_html_minutes .= '<option value="">' . (isset($minute_empty) ? $minute_empty : $all_empty) . '</option>' .
+                              $option_separator;
+        }
+        $selected = $_minute !== null ? ($_minute - $_minute % $minute_interval) : null;
+        for ($i = 0; $i <= 59; $i += $minute_interval) {
+            $_val = sprintf('%02d', $i);
+            $_text = $minute_format === '%02d' ? $_val : sprintf($minute_format, $i);
+            $_value = $minute_value_format === '%02d' ? $_val : sprintf($minute_value_format, $i);
+            $_html_minutes .= '<option value="' . $_value . '"' . ($selected === $i ? ' selected="selected"' : '') .
+                              '>' . $_text . '</option>' . $option_separator;
+        }
+        $_html_minutes .= '</select>';
+    }
+    // generate second <select>
+    if ($display_seconds) {
+        $_html_seconds = '';
+        $_extra = '';
+        $_name = $field_array ? ($field_array . '[' . $prefix . 'Second]') : ($prefix . 'Second');
+        if ($all_extra) {
+            $_extra .= ' ' . $all_extra;
+        }
+        if ($second_extra) {
+            $_extra .= ' ' . $second_extra;
+        }
+        $_html_seconds = '<select name="' . $_name . '"';
+        if ($second_id !== null || $all_id !== null) {
+            $_html_seconds .= ' id="' . smarty_function_escape_special_chars(
+                    $second_id !== null ?
+                        ($second_id ? $second_id : $_name) :
+                        ($all_id ? ($all_id . $_name) :
+                            $_name)
+                ) . '"';
+        }
+        if ($second_size) {
+            $_html_seconds .= ' size="' . $second_size . '"';
+        }
+        $_html_seconds .= $_extra . $extra_attrs . '>' . $option_separator;
+        if (isset($second_empty) || isset($all_empty)) {
+            $_html_seconds .= '<option value="">' . (isset($second_empty) ? $second_empty : $all_empty) . '</option>' .
+                              $option_separator;
+        }
+        $selected = $_second !== null ? ($_second - $_second % $second_interval) : null;
+        for ($i = 0; $i <= 59; $i += $second_interval) {
+            $_val = sprintf('%02d', $i);
+            $_text = $second_format === '%02d' ? $_val : sprintf($second_format, $i);
+            $_value = $second_value_format === '%02d' ? $_val : sprintf($second_value_format, $i);
+            $_html_seconds .= '<option value="' . $_value . '"' . ($selected === $i ? ' selected="selected"' : '') .
+                              '>' . $_text . '</option>' . $option_separator;
+        }
+        $_html_seconds .= '</select>';
+    }
+    // generate meridian <select>
+    if ($display_meridian && !$use_24_hours) {
+        $_html_meridian = '';
+        $_extra = '';
+        $_name = $field_array ? ($field_array . '[' . $prefix . 'Meridian]') : ($prefix . 'Meridian');
+        if ($all_extra) {
+            $_extra .= ' ' . $all_extra;
+        }
+        if ($meridian_extra) {
+            $_extra .= ' ' . $meridian_extra;
+        }
+        $_html_meridian = '<select name="' . $_name . '"';
+        if ($meridian_id !== null || $all_id !== null) {
+            $_html_meridian .= ' id="' . smarty_function_escape_special_chars(
+                    $meridian_id !== null ?
+                        ($meridian_id ? $meridian_id :
+                            $_name) :
+                        ($all_id ? ($all_id . $_name) :
+                            $_name)
+                ) . '"';
+        }
+        if ($meridian_size) {
+            $_html_meridian .= ' size="' . $meridian_size . '"';
+        }
+        $_html_meridian .= $_extra . $extra_attrs . '>' . $option_separator;
+        if (isset($meridian_empty) || isset($all_empty)) {
+            $_html_meridian .= '<option value="">' . (isset($meridian_empty) ? $meridian_empty : $all_empty) .
+                               '</option>' . $option_separator;
+        }
+        $_html_meridian .= '<option value="am"' . ($_hour > 0 && $_hour < 12 ? ' selected="selected"' : '') .
+                           '>AM</option>' . $option_separator . '<option value="pm"' .
+                           ($_hour < 12 ? '' : ' selected="selected"') . '>PM</option>' . $option_separator .
+                           '</select>';
+    }
+    $_html = '';
+    foreach (array(
+        '_html_hours',
+        '_html_minutes',
+        '_html_seconds',
+        '_html_meridian'
+    ) as $k) {
+        if (isset($$k)) {
+            if ($_html) {
+                $_html .= $field_separator;
+            }
+            $_html .= $$k;
+        }
+    }
+    return $_html;
+}
diff --git a/plugins/function.html_table.php b/plugins/function.html_table.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae61e83dc79d7f1691831cffd55c596fba13801e
--- /dev/null
+++ b/plugins/function.html_table.php
@@ -0,0 +1,164 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsFunction
+ */
+/**
+ * Smarty {html_table} function plugin
+ * Type:     function
+ * Name:     html_table
+ * Date:     Feb 17, 2003
+ * Purpose:  make an html table from an array of data
+ * Params:
+ *
+ * - loop       - array to loop through
+ * - cols       - number of columns, comma separated list of column names
+ *                or array of column names
+ * - rows       - number of rows
+ * - table_attr - table attributes
+ * - th_attr    - table heading attributes (arrays are cycled)
+ * - tr_attr    - table row attributes (arrays are cycled)
+ * - td_attr    - table cell attributes (arrays are cycled)
+ * - trailpad   - value to pad trailing cells with
+ * - caption    - text for caption element
+ * - vdir       - vertical direction (default: "down", means top-to-bottom)
+ * - hdir       - horizontal direction (default: "right", means left-to-right)
+ * - inner      - inner loop (default "cols": print $loop line by line,
+ *                $loop will be printed column by column otherwise)
+ *
+ * Examples:
+ *
+ * {table loop=$data}
+ * {table loop=$data cols=4 tr_attr='"bgcolor=red"'}
+ * {table loop=$data cols="first,second,third" tr_attr=$colors}
+ *
+ * @author  Monte Ohrt <monte at ohrt dot com>
+ * @author  credit to Messju Mohr <messju at lammfellpuschen dot de>
+ * @author  credit to boots <boots dot smarty at yahoo dot com>
+ * @version 1.1
+ * @link    http://www.smarty.net/manual/en/language.function.html.table.php {html_table}
+ *           (Smarty online manual)
+ *
+ * @param array $params parameters
+ *
+ * @return string
+ */
+function smarty_function_html_table($params)
+{
+    $table_attr = 'border="1"';
+    $tr_attr = '';
+    $th_attr = '';
+    $td_attr = '';
+    $cols = $cols_count = 3;
+    $rows = 3;
+    $trailpad = '&nbsp;';
+    $vdir = 'down';
+    $hdir = 'right';
+    $inner = 'cols';
+    $caption = '';
+    $loop = null;
+    if (!isset($params[ 'loop' ])) {
+        trigger_error("html_table: missing 'loop' parameter", E_USER_WARNING);
+        return;
+    }
+    foreach ($params as $_key => $_value) {
+        switch ($_key) {
+            case 'loop':
+                $$_key = (array)$_value;
+                break;
+            case 'cols':
+                if (is_array($_value) && !empty($_value)) {
+                    $cols = $_value;
+                    $cols_count = count($_value);
+                } elseif (!is_numeric($_value) && is_string($_value) && !empty($_value)) {
+                    $cols = explode(',', $_value);
+                    $cols_count = count($cols);
+                } elseif (!empty($_value)) {
+                    $cols_count = (int)$_value;
+                } else {
+                    $cols_count = $cols;
+                }
+                break;
+            case 'rows':
+                $$_key = (int)$_value;
+                break;
+            case 'table_attr':
+            case 'trailpad':
+            case 'hdir':
+            case 'vdir':
+            case 'inner':
+            case 'caption':
+                $$_key = (string)$_value;
+                break;
+            case 'tr_attr':
+            case 'td_attr':
+            case 'th_attr':
+                $$_key = $_value;
+                break;
+        }
+    }
+    $loop_count = count($loop);
+    if (empty($params[ 'rows' ])) {
+        /* no rows specified */
+        $rows = ceil($loop_count / $cols_count);
+    } elseif (empty($params[ 'cols' ])) {
+        if (!empty($params[ 'rows' ])) {
+            /* no cols specified, but rows */
+            $cols_count = ceil($loop_count / $rows);
+        }
+    }
+    $output = "<table $table_attr>\n";
+    if (!empty($caption)) {
+        $output .= '<caption>' . $caption . "</caption>\n";
+    }
+    if (is_array($cols)) {
+        $cols = ($hdir === 'right') ? $cols : array_reverse($cols);
+        $output .= "<thead><tr>\n";
+        for ($r = 0; $r < $cols_count; $r++) {
+            $output .= '<th' . smarty_function_html_table_cycle('th', $th_attr, $r) . '>';
+            $output .= $cols[ $r ];
+            $output .= "</th>\n";
+        }
+        $output .= "</tr></thead>\n";
+    }
+    $output .= "<tbody>\n";
+    for ($r = 0; $r < $rows; $r++) {
+        $output .= "<tr" . smarty_function_html_table_cycle('tr', $tr_attr, $r) . ">\n";
+        $rx = ($vdir === 'down') ? $r * $cols_count : ($rows - 1 - $r) * $cols_count;
+        for ($c = 0; $c < $cols_count; $c++) {
+            $x = ($hdir === 'right') ? $rx + $c : $rx + $cols_count - 1 - $c;
+            if ($inner !== 'cols') {
+                /* shuffle x to loop over rows*/
+                $x = floor($x / $cols_count) + ($x % $cols_count) * $rows;
+            }
+            if ($x < $loop_count) {
+                $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">" . $loop[ $x ] . "</td>\n";
+            } else {
+                $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">$trailpad</td>\n";
+            }
+        }
+        $output .= "</tr>\n";
+    }
+    $output .= "</tbody>\n";
+    $output .= "</table>\n";
+    return $output;
+}
+
+/**
+ * @param $name
+ * @param $var
+ * @param $no
+ *
+ * @return string
+ */
+function smarty_function_html_table_cycle($name, $var, $no)
+{
+    if (!is_array($var)) {
+        $ret = $var;
+    } else {
+        $ret = $var[ $no % count($var) ];
+    }
+    return ($ret) ? ' ' . $ret : '';
+}
diff --git a/plugins/function.mailto.php b/plugins/function.mailto.php
new file mode 100644
index 0000000000000000000000000000000000000000..27351df8269827e1c70a0c01a98599a3d7b098f6
--- /dev/null
+++ b/plugins/function.mailto.php
@@ -0,0 +1,137 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsFunction
+ */
+/**
+ * Smarty {mailto} function plugin
+ * Type:     function
+ * Name:     mailto
+ * Date:     May 21, 2002
+ * Purpose:  automate mailto address link creation, and optionally encode them.
+ * Params:
+ *
+ * - address    - (required) - e-mail address
+ * - text       - (optional) - text to display, default is address
+ * - encode     - (optional) - can be one of:
+ *                             * none : no encoding (default)
+ *                             * javascript : encode with javascript
+ *                             * javascript_charcode : encode with javascript charcode
+ *                             * hex : encode with hexadecimal (no javascript)
+ * - cc         - (optional) - address(es) to carbon copy
+ * - bcc        - (optional) - address(es) to blind carbon copy
+ * - subject    - (optional) - e-mail subject
+ * - newsgroups - (optional) - newsgroup(s) to post to
+ * - followupto - (optional) - address(es) to follow up to
+ * - extra      - (optional) - extra tags for the href link
+ *
+ * Examples:
+ *
+ * {mailto address="me@domain.com"}
+ * {mailto address="me@domain.com" encode="javascript"}
+ * {mailto address="me@domain.com" encode="hex"}
+ * {mailto address="me@domain.com" subject="Hello to you!"}
+ * {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"}
+ * {mailto address="me@domain.com" extra='class="mailto"'}
+ *
+ * @link    http://www.smarty.net/manual/en/language.function.mailto.php {mailto}
+ *           (Smarty online manual)
+ * @version 1.2
+ * @author  Monte Ohrt <monte at ohrt dot com>
+ * @author  credits to Jason Sweat (added cc, bcc and subject functionality)
+ *
+ * @param array $params parameters
+ *
+ * @return string
+ */
+function smarty_function_mailto($params)
+{
+    static $_allowed_encoding =
+        array('javascript' => true, 'javascript_charcode' => true, 'hex' => true, 'none' => true);
+    $extra = '';
+    if (empty($params[ 'address' ])) {
+        trigger_error("mailto: missing 'address' parameter", E_USER_WARNING);
+        return;
+    } else {
+        $address = $params[ 'address' ];
+    }
+    $text = $address;
+    // netscape and mozilla do not decode %40 (@) in BCC field (bug?)
+    // so, don't encode it.
+    $search = array('%40', '%2C');
+    $replace = array('@', ',');
+    $mail_parms = array();
+    foreach ($params as $var => $value) {
+        switch ($var) {
+            case 'cc':
+            case 'bcc':
+            case 'followupto':
+                if (!empty($value)) {
+                    $mail_parms[] = $var . '=' . str_replace($search, $replace, rawurlencode($value));
+                }
+                break;
+            case 'subject':
+            case 'newsgroups':
+                $mail_parms[] = $var . '=' . rawurlencode($value);
+                break;
+            case 'extra':
+            case 'text':
+                $$var = $value;
+            // no break
+            default:
+        }
+    }
+    if ($mail_parms) {
+        $address .= '?' . join('&', $mail_parms);
+    }
+    $encode = (empty($params[ 'encode' ])) ? 'none' : $params[ 'encode' ];
+    if (!isset($_allowed_encoding[ $encode ])) {
+        trigger_error(
+            "mailto: 'encode' parameter must be none, javascript, javascript_charcode or hex",
+            E_USER_WARNING
+        );
+        return;
+    }
+    // FIXME: (rodneyrehm) document.write() excues me what? 1998 has passed!
+    if ($encode === 'javascript') {
+        $string = 'document.write(\'<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>\');';
+        $js_encode = '';
+        for ($x = 0, $_length = strlen($string); $x < $_length; $x++) {
+            $js_encode .= '%' . bin2hex($string[ $x ]);
+        }
+        return '<script type="text/javascript">eval(unescape(\'' . $js_encode . '\'))</script>';
+    } elseif ($encode === 'javascript_charcode') {
+        $string = '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>';
+        for ($x = 0, $y = strlen($string); $x < $y; $x++) {
+            $ord[] = ord($string[ $x ]);
+        }
+        $_ret = "<script type=\"text/javascript\" language=\"javascript\">\n" . "{document.write(String.fromCharCode(" .
+                implode(',', $ord) . "))" . "}\n" . "</script>\n";
+        return $_ret;
+    } elseif ($encode === 'hex') {
+        preg_match('!^(.*)(\?.*)$!', $address, $match);
+        if (!empty($match[ 2 ])) {
+            trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.", E_USER_WARNING);
+            return;
+        }
+        $address_encode = '';
+        for ($x = 0, $_length = strlen($address); $x < $_length; $x++) {
+            if (preg_match('!\w!' . Smarty::$_UTF8_MODIFIER, $address[ $x ])) {
+                $address_encode .= '%' . bin2hex($address[ $x ]);
+            } else {
+                $address_encode .= $address[ $x ];
+            }
+        }
+        $text_encode = '';
+        for ($x = 0, $_length = strlen($text); $x < $_length; $x++) {
+            $text_encode .= '&#x' . bin2hex($text[ $x ]) . ';';
+        }
+        $mailto = "&#109;&#97;&#105;&#108;&#116;&#111;&#58;";
+        return '<a href="' . $mailto . $address_encode . '" ' . $extra . '>' . $text_encode . '</a>';
+    } else {
+        // no encoding
+        return '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>';
+    }
+}
diff --git a/plugins/function.math.php b/plugins/function.math.php
new file mode 100644
index 0000000000000000000000000000000000000000..7348d96494c9dbdbc86eb05ffc3cb4d51b2c122d
--- /dev/null
+++ b/plugins/function.math.php
@@ -0,0 +1,112 @@
+<?php
+/**
+ * Smarty plugin
+ * This plugin is only for Smarty2 BC
+ *
+ * @package    Smarty
+ * @subpackage PluginsFunction
+ */
+/**
+ * Smarty {math} function plugin
+ * Type:     function
+ * Name:     math
+ * Purpose:  handle math computations in template
+ *
+ * @link   http://www.smarty.net/manual/en/language.function.math.php {math}
+ *           (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ *
+ * @param array                    $params   parameters
+ * @param Smarty_Internal_Template $template template object
+ *
+ * @return string|null
+ */
+function smarty_function_math($params, $template)
+{
+    static $_allowed_funcs =
+        array(
+            'int'   => true,
+            'abs'   => true,
+            'ceil'  => true,
+            'cos'   => true,
+            'exp'   => true,
+            'floor' => true,
+            'log'   => true,
+            'log10' => true,
+            'max'   => true,
+            'min'   => true,
+            'pi'    => true,
+            'pow'   => true,
+            'rand'  => true,
+            'round' => true,
+            'sin'   => true,
+            'sqrt'  => true,
+            'srand' => true,
+            'tan'   => true
+        );
+    // be sure equation parameter is present
+    if (empty($params[ 'equation' ])) {
+        trigger_error("math: missing equation parameter", E_USER_WARNING);
+        return;
+    }
+    $equation = $params[ 'equation' ];
+    // make sure parenthesis are balanced
+    if (substr_count($equation, '(') !== substr_count($equation, ')')) {
+        trigger_error("math: unbalanced parenthesis", E_USER_WARNING);
+        return;
+    }
+    // disallow backticks
+    if (strpos($equation, '`') !== false) {
+        trigger_error("math: backtick character not allowed in equation", E_USER_WARNING);
+        return;
+    }
+    // also disallow dollar signs
+    if (strpos($equation, '$') !== false) {
+        trigger_error("math: dollar signs not allowed in equation", E_USER_WARNING);
+        return;
+    }
+    foreach ($params as $key => $val) {
+        if ($key !== 'equation' && $key !== 'format' && $key !== 'assign') {
+            // make sure value is not empty
+            if (strlen($val) === 0) {
+                trigger_error("math: parameter '{$key}' is empty", E_USER_WARNING);
+                return;
+            }
+            if (!is_numeric($val)) {
+                trigger_error("math: parameter '{$key}' is not numeric", E_USER_WARNING);
+                return;
+            }
+        }
+    }
+    // match all vars in equation, make sure all are passed
+    preg_match_all('!(?:0x[a-fA-F0-9]+)|([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)!', $equation, $match);
+    foreach ($match[ 1 ] as $curr_var) {
+        if ($curr_var && !isset($params[ $curr_var ]) && !isset($_allowed_funcs[ $curr_var ])) {
+            trigger_error(
+                "math: function call '{$curr_var}' not allowed, or missing parameter '{$curr_var}'",
+                E_USER_WARNING
+            );
+            return;
+        }
+    }
+    foreach ($params as $key => $val) {
+        if ($key !== 'equation' && $key !== 'format' && $key !== 'assign') {
+            $equation = preg_replace("/\b$key\b/", " \$params['$key'] ", $equation);
+        }
+    }
+    $smarty_math_result = null;
+    eval("\$smarty_math_result = " . $equation . ";");
+    if (empty($params[ 'format' ])) {
+        if (empty($params[ 'assign' ])) {
+            return $smarty_math_result;
+        } else {
+            $template->assign($params[ 'assign' ], $smarty_math_result);
+        }
+    } else {
+        if (empty($params[ 'assign' ])) {
+            printf($params[ 'format' ], $smarty_math_result);
+        } else {
+            $template->assign($params[ 'assign' ], sprintf($params[ 'format' ], $smarty_math_result));
+        }
+    }
+}
diff --git a/plugins/modifier.capitalize.php b/plugins/modifier.capitalize.php
new file mode 100644
index 0000000000000000000000000000000000000000..c5fc400a6f5dc5582ecabe0d6abe019394e85ab8
--- /dev/null
+++ b/plugins/modifier.capitalize.php
@@ -0,0 +1,145 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifier
+ */
+/**
+ * Smarty capitalize modifier plugin
+ * Type:     modifier
+ * Name:     capitalize
+ * Purpose:  capitalize words in the string
+ * {@internal {$string|capitalize:true:true} is the fastest option for MBString enabled systems }}
+ *
+ * @param string  $string    string to capitalize
+ * @param boolean $uc_digits also capitalize "x123" to "X123"
+ * @param boolean $lc_rest   capitalize first letters, lowercase all following letters "aAa" to "Aaa"
+ *
+ * @return string capitalized string
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author Rodney Rehm
+ */
+function smarty_modifier_capitalize($string, $uc_digits = false, $lc_rest = false)
+{
+    if (Smarty::$_MBSTRING) {
+        if ($lc_rest) {
+            // uppercase (including hyphenated words)
+            $upper_string = mb_convert_case($string, MB_CASE_TITLE, Smarty::$_CHARSET);
+        } else {
+            // uppercase word breaks
+            $upper_string = preg_replace_callback(
+                "!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER,
+                'smarty_mod_cap_mbconvert_cb',
+                $string
+            );
+        }
+        // check uc_digits case
+        if (!$uc_digits) {
+            if (preg_match_all(
+                "!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER,
+                $string,
+                $matches,
+                PREG_OFFSET_CAPTURE
+            )
+            ) {
+                foreach ($matches[ 1 ] as $match) {
+                    $upper_string =
+                        substr_replace(
+                            $upper_string,
+                            mb_strtolower($match[ 0 ], Smarty::$_CHARSET),
+                            $match[ 1 ],
+                            strlen($match[ 0 ])
+                        );
+                }
+            }
+        }
+        $upper_string =
+            preg_replace_callback(
+                "!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER,
+                'smarty_mod_cap_mbconvert2_cb',
+                $upper_string
+            );
+        return $upper_string;
+    }
+    // lowercase first
+    if ($lc_rest) {
+        $string = strtolower($string);
+    }
+    // uppercase (including hyphenated words)
+    $upper_string =
+        preg_replace_callback(
+            "!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER,
+            'smarty_mod_cap_ucfirst_cb',
+            $string
+        );
+    // check uc_digits case
+    if (!$uc_digits) {
+        if (preg_match_all(
+            "!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER,
+            $string,
+            $matches,
+            PREG_OFFSET_CAPTURE
+        )
+        ) {
+            foreach ($matches[ 1 ] as $match) {
+                $upper_string =
+                    substr_replace($upper_string, strtolower($match[ 0 ]), $match[ 1 ], strlen($match[ 0 ]));
+            }
+        }
+    }
+    $upper_string = preg_replace_callback(
+        "!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER,
+        'smarty_mod_cap_ucfirst2_cb',
+        $upper_string
+    );
+    return $upper_string;
+}
+
+/**
+ *
+ * Bug: create_function() use exhausts memory when used in long loops
+ * Fix: use declared functions for callbacks instead of using create_function()
+ * Note: This can be fixed using anonymous functions instead, but that requires PHP >= 5.3
+ *
+ * @author Kyle Renfrow
+ */
+/**
+ * @param $matches
+ *
+ * @return string
+ */
+function smarty_mod_cap_mbconvert_cb($matches)
+{
+    return stripslashes($matches[ 1 ]) . mb_convert_case(stripslashes($matches[ 2 ]), MB_CASE_UPPER, Smarty::$_CHARSET);
+}
+
+/**
+ * @param $matches
+ *
+ * @return string
+ */
+function smarty_mod_cap_mbconvert2_cb($matches)
+{
+    return stripslashes($matches[ 1 ]) . mb_convert_case(stripslashes($matches[ 3 ]), MB_CASE_UPPER, Smarty::$_CHARSET);
+}
+
+/**
+ * @param $matches
+ *
+ * @return string
+ */
+function smarty_mod_cap_ucfirst_cb($matches)
+{
+    return stripslashes($matches[ 1 ]) . ucfirst(stripslashes($matches[ 2 ]));
+}
+
+/**
+ * @param $matches
+ *
+ * @return string
+ */
+function smarty_mod_cap_ucfirst2_cb($matches)
+{
+    return stripslashes($matches[ 1 ]) . ucfirst(stripslashes($matches[ 3 ]));
+}
diff --git a/plugins/modifier.date_format.php b/plugins/modifier.date_format.php
new file mode 100644
index 0000000000000000000000000000000000000000..c8e88c5c91b684538dd052d87bd2636628266c46
--- /dev/null
+++ b/plugins/modifier.date_format.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifier
+ */
+/**
+ * Smarty date_format modifier plugin
+ * Type:     modifier
+ * Name:     date_format
+ * Purpose:  format datestamps via strftime
+ * Input:
+ *          - string: input date string
+ *          - format: strftime format for output
+ *          - default_date: default date if $string is empty
+ *
+ * @link   http://www.smarty.net/manual/en/language.modifier.date.format.php date_format (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ *
+ * @param string $string       input date string
+ * @param string $format       strftime format for output
+ * @param string $default_date default date if $string is empty
+ * @param string $formatter    either 'strftime' or 'auto'
+ *
+ * @return string |void
+ * @uses   smarty_make_timestamp()
+ */
+function smarty_modifier_date_format($string, $format = null, $default_date = '', $formatter = 'auto')
+{
+    if ($format === null) {
+        $format = Smarty::$_DATE_FORMAT;
+    }
+    /**
+     * require_once the {@link shared.make_timestamp.php} plugin
+     */
+    static $is_loaded = false;
+    if (!$is_loaded) {
+        if (!is_callable('smarty_make_timestamp')) {
+            include_once SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php';
+        }
+        $is_loaded = true;
+    }
+    if (!empty($string) && $string !== '0000-00-00' && $string !== '0000-00-00 00:00:00') {
+        $timestamp = smarty_make_timestamp($string);
+    } elseif (!empty($default_date)) {
+        $timestamp = smarty_make_timestamp($default_date);
+    } else {
+        return;
+    }
+    if ($formatter === 'strftime' || ($formatter === 'auto' && strpos($format, '%') !== false)) {
+        if (Smarty::$_IS_WINDOWS) {
+            $_win_from = array(
+                '%D',
+                '%h',
+                '%n',
+                '%r',
+                '%R',
+                '%t',
+                '%T'
+            );
+            $_win_to = array(
+                '%m/%d/%y',
+                '%b',
+                "\n",
+                '%I:%M:%S %p',
+                '%H:%M',
+                "\t",
+                '%H:%M:%S'
+            );
+            if (strpos($format, '%e') !== false) {
+                $_win_from[] = '%e';
+                $_win_to[] = sprintf('%\' 2d', date('j', $timestamp));
+            }
+            if (strpos($format, '%l') !== false) {
+                $_win_from[] = '%l';
+                $_win_to[] = sprintf('%\' 2d', date('h', $timestamp));
+            }
+            $format = str_replace($_win_from, $_win_to, $format);
+        }
+        return strftime($format, $timestamp);
+    } else {
+        return date($format, $timestamp);
+    }
+}
diff --git a/plugins/modifier.debug_print_var.php b/plugins/modifier.debug_print_var.php
new file mode 100644
index 0000000000000000000000000000000000000000..78397d0177de950afeddfd7dcea17ec9fd1ce94e
--- /dev/null
+++ b/plugins/modifier.debug_print_var.php
@@ -0,0 +1,103 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage Debug
+ */
+/**
+ * Smarty debug_print_var modifier plugin
+ * Type:     modifier
+ * Name:     debug_print_var
+ * Purpose:  formats variable contents for display in the console
+ *
+ * @author Monte Ohrt <monte at ohrt dot com>
+ *
+ * @param array|object $var     variable to be formatted
+ * @param int          $max     maximum recursion depth if $var is an array or object
+ * @param int          $length  maximum string length if $var is a string
+ * @param int          $depth   actual recursion depth
+ * @param array        $objects processed objects in actual depth to prevent recursive object processing
+ *
+ * @return string
+ */
+function smarty_modifier_debug_print_var($var, $max = 10, $length = 40, $depth = 0, $objects = array())
+{
+    $_replace = array("\n" => '\n', "\r" => '\r', "\t" => '\t');
+    switch (gettype($var)) {
+        case 'array':
+            $results = '<b>Array (' . count($var) . ')</b>';
+            if ($depth === $max) {
+                break;
+            }
+            foreach ($var as $curr_key => $curr_val) {
+                $results .= '<br>' . str_repeat('&nbsp;', $depth * 2) . '<b>' . strtr($curr_key, $_replace) .
+                            '</b> =&gt; ' .
+                            smarty_modifier_debug_print_var($curr_val, $max, $length, ++$depth, $objects);
+                $depth--;
+            }
+            break;
+        case 'object':
+            $object_vars = get_object_vars($var);
+            $results = '<b>' . get_class($var) . ' Object (' . count($object_vars) . ')</b>';
+            if (in_array($var, $objects)) {
+                $results .= ' called recursive';
+                break;
+            }
+            if ($depth === $max) {
+                break;
+            }
+            $objects[] = $var;
+            foreach ($object_vars as $curr_key => $curr_val) {
+                $results .= '<br>' . str_repeat('&nbsp;', $depth * 2) . '<b> -&gt;' . strtr($curr_key, $_replace) .
+                            '</b> = ' . smarty_modifier_debug_print_var($curr_val, $max, $length, ++$depth, $objects);
+                $depth--;
+            }
+            break;
+        case 'boolean':
+        case 'NULL':
+        case 'resource':
+            if (true === $var) {
+                $results = 'true';
+            } elseif (false === $var) {
+                $results = 'false';
+            } elseif (null === $var) {
+                $results = 'null';
+            } else {
+                $results = htmlspecialchars((string)$var);
+            }
+            $results = '<i>' . $results . '</i>';
+            break;
+        case 'integer':
+        case 'float':
+            $results = htmlspecialchars((string)$var);
+            break;
+        case 'string':
+            $results = strtr($var, $_replace);
+            if (Smarty::$_MBSTRING) {
+                if (mb_strlen($var, Smarty::$_CHARSET) > $length) {
+                    $results = mb_substr($var, 0, $length - 3, Smarty::$_CHARSET) . '...';
+                }
+            } else {
+                if (isset($var[ $length ])) {
+                    $results = substr($var, 0, $length - 3) . '...';
+                }
+            }
+            $results = htmlspecialchars('"' . $results . '"', ENT_QUOTES, Smarty::$_CHARSET);
+            break;
+        case 'unknown type':
+        default:
+            $results = strtr((string)$var, $_replace);
+            if (Smarty::$_MBSTRING) {
+                if (mb_strlen($results, Smarty::$_CHARSET) > $length) {
+                    $results = mb_substr($results, 0, $length - 3, Smarty::$_CHARSET) . '...';
+                }
+            } else {
+                if (strlen($results) > $length) {
+                    $results = substr($results, 0, $length - 3) . '...';
+                }
+            }
+            $results = htmlspecialchars($results, ENT_QUOTES, Smarty::$_CHARSET);
+    }
+    return $results;
+}
diff --git a/plugins/modifier.escape.php b/plugins/modifier.escape.php
new file mode 100644
index 0000000000000000000000000000000000000000..150901c7c7d8bcc4e1c4f4f7a4b176be7e87979d
--- /dev/null
+++ b/plugins/modifier.escape.php
@@ -0,0 +1,255 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifier
+ */
+/**
+ * Smarty escape modifier plugin
+ * Type:     modifier
+ * Name:     escape
+ * Purpose:  escape string for output
+ *
+ * @link   http://www.smarty.net/docs/en/language.modifier.escape
+ * @author Monte Ohrt <monte at ohrt dot com>
+ *
+ * @param string  $string        input string
+ * @param string  $esc_type      escape type
+ * @param string  $char_set      character set, used for htmlspecialchars() or htmlentities()
+ * @param boolean $double_encode encode already encoded entitites again, used for htmlspecialchars() or htmlentities()
+ *
+ * @return string escaped input string
+ */
+function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $double_encode = true)
+{
+    static $_double_encode = null;
+    static $is_loaded_1 = false;
+    static $is_loaded_2 = false;
+    if ($_double_encode === null) {
+        $_double_encode = version_compare(PHP_VERSION, '5.2.3', '>=');
+    }
+    if (!$char_set) {
+        $char_set = Smarty::$_CHARSET;
+    }
+    switch ($esc_type) {
+        case 'html':
+            if ($_double_encode) {
+                // php >=5.3.2 - go native
+                return htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode);
+            } else {
+                if ($double_encode) {
+                    // php <5.2.3 - only handle double encoding
+                    return htmlspecialchars($string, ENT_QUOTES, $char_set);
+                } else {
+                    // php <5.2.3 - prevent double encoding
+                    $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
+                    $string = htmlspecialchars($string, ENT_QUOTES, $char_set);
+                    $string = str_replace(
+                        array(
+                            '%%%SMARTY_START%%%',
+                            '%%%SMARTY_END%%%'
+                        ),
+                        array(
+                            '&',
+                            ';'
+                        ),
+                        $string
+                    );
+                    return $string;
+                }
+            }
+        // no break
+        case 'htmlall':
+            if (Smarty::$_MBSTRING) {
+                // mb_convert_encoding ignores htmlspecialchars()
+                if ($_double_encode) {
+                    // php >=5.3.2 - go native
+                    $string = htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode);
+                } else {
+                    if ($double_encode) {
+                        // php <5.2.3 - only handle double encoding
+                        $string = htmlspecialchars($string, ENT_QUOTES, $char_set);
+                    } else {
+                        // php <5.2.3 - prevent double encoding
+                        $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
+                        $string = htmlspecialchars($string, ENT_QUOTES, $char_set);
+                        $string =
+                            str_replace(
+                                array(
+                                    '%%%SMARTY_START%%%',
+                                    '%%%SMARTY_END%%%'
+                                ),
+                                array(
+                                    '&',
+                                    ';'
+                                ),
+                                $string
+                            );
+                        return $string;
+                    }
+                }
+                // htmlentities() won't convert everything, so use mb_convert_encoding
+                return mb_convert_encoding($string, 'HTML-ENTITIES', $char_set);
+            }
+            // no MBString fallback
+            if ($_double_encode) {
+                return htmlentities($string, ENT_QUOTES, $char_set, $double_encode);
+            } else {
+                if ($double_encode) {
+                    return htmlentities($string, ENT_QUOTES, $char_set);
+                } else {
+                    $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
+                    $string = htmlentities($string, ENT_QUOTES, $char_set);
+                    $string = str_replace(
+                        array(
+                            '%%%SMARTY_START%%%',
+                            '%%%SMARTY_END%%%'
+                        ),
+                        array(
+                            '&',
+                            ';'
+                        ),
+                        $string
+                    );
+                    return $string;
+                }
+            }
+        // no break
+        case 'url':
+            return rawurlencode($string);
+        case 'urlpathinfo':
+            return str_replace('%2F', '/', rawurlencode($string));
+        case 'quotes':
+            // escape unescaped single quotes
+            return preg_replace("%(?<!\\\\)'%", "\\'", $string);
+        case 'hex':
+            // escape every byte into hex
+            // Note that the UTF-8 encoded character ä will be represented as %c3%a4
+            $return = '';
+            $_length = strlen($string);
+            for ($x = 0; $x < $_length; $x++) {
+                $return .= '%' . bin2hex($string[ $x ]);
+            }
+            return $return;
+        case 'hexentity':
+            $return = '';
+            if (Smarty::$_MBSTRING) {
+                if (!$is_loaded_1) {
+                    if (!is_callable('smarty_mb_to_unicode')) {
+                        include_once SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php';
+                    }
+                    $is_loaded_1 = true;
+                }
+                $return = '';
+                foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) {
+                    $return .= '&#x' . strtoupper(dechex($unicode)) . ';';
+                }
+                return $return;
+            }
+            // no MBString fallback
+            $_length = strlen($string);
+            for ($x = 0; $x < $_length; $x++) {
+                $return .= '&#x' . bin2hex($string[ $x ]) . ';';
+            }
+            return $return;
+        case 'decentity':
+            $return = '';
+            if (Smarty::$_MBSTRING) {
+                if (!$is_loaded_1) {
+                    if (!is_callable('smarty_mb_to_unicode')) {
+                        include_once SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php';
+                    }
+                    $is_loaded_1 = true;
+                }
+                $return = '';
+                foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) {
+                    $return .= '&#' . $unicode . ';';
+                }
+                return $return;
+            }
+            // no MBString fallback
+            $_length = strlen($string);
+            for ($x = 0; $x < $_length; $x++) {
+                $return .= '&#' . ord($string[ $x ]) . ';';
+            }
+            return $return;
+        case 'javascript':
+            // escape quotes and backslashes, newlines, etc.
+            return strtr(
+                $string,
+                array(
+                    '\\' => '\\\\',
+                    "'"  => "\\'",
+                    '"'  => '\\"',
+                    "\r" => '\\r',
+                    "\n" => '\\n',
+                    '</' => '<\/'
+                )
+            );
+        case 'mail':
+            if (Smarty::$_MBSTRING) {
+                if (!$is_loaded_2) {
+                    if (!is_callable('smarty_mb_str_replace')) {
+                        include_once SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php';
+                    }
+                    $is_loaded_2 = true;
+                }
+                return smarty_mb_str_replace(
+                    array(
+                        '@',
+                        '.'
+                    ),
+                    array(
+                        ' [AT] ',
+                        ' [DOT] '
+                    ),
+                    $string
+                );
+            }
+            // no MBString fallback
+            return str_replace(
+                array(
+                    '@',
+                    '.'
+                ),
+                array(
+                    ' [AT] ',
+                    ' [DOT] '
+                ),
+                $string
+            );
+        case 'nonstd':
+            // escape non-standard chars, such as ms document quotes
+            $return = '';
+            if (Smarty::$_MBSTRING) {
+                if (!$is_loaded_1) {
+                    if (!is_callable('smarty_mb_to_unicode')) {
+                        include_once SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php';
+                    }
+                    $is_loaded_1 = true;
+                }
+                foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) {
+                    if ($unicode >= 126) {
+                        $return .= '&#' . $unicode . ';';
+                    } else {
+                        $return .= chr($unicode);
+                    }
+                }
+                return $return;
+            }
+            $_length = strlen($string);
+            for ($_i = 0; $_i < $_length; $_i++) {
+                $_ord = ord(substr($string, $_i, 1));
+                // non-standard char, escape it
+                if ($_ord >= 126) {
+                    $return .= '&#' . $_ord . ';';
+                } else {
+                    $return .= substr($string, $_i, 1);
+                }
+            }
+            return $return;
+        default:
+            return $string;
+    }
+}
diff --git a/plugins/modifier.mb_wordwrap.php b/plugins/modifier.mb_wordwrap.php
new file mode 100644
index 0000000000000000000000000000000000000000..1cd625b644c77b1d452b36b89a1d313b6a5a89d3
--- /dev/null
+++ b/plugins/modifier.mb_wordwrap.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifier
+ */
+/**
+ * Smarty wordwrap modifier plugin
+ * Type:     modifier
+ * Name:     mb_wordwrap
+ * Purpose:  Wrap a string to a given number of characters
+ *
+ * @link   http://php.net/manual/en/function.wordwrap.php for similarity
+ *
+ * @param string  $str   the string to wrap
+ * @param int     $width the width of the output
+ * @param string  $break the character used to break the line
+ * @param boolean $cut   ignored parameter, just for the sake of
+ *
+ * @return string  wrapped string
+ * @author Rodney Rehm
+ */
+function smarty_modifier_mb_wordwrap($str, $width = 75, $break = "\n", $cut = false)
+{
+    // break words into tokens using white space as a delimiter
+    $tokens = preg_split('!(\s)!S' . Smarty::$_UTF8_MODIFIER, $str, -1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE);
+    $length = 0;
+    $t = '';
+    $_previous = false;
+    $_space = false;
+    foreach ($tokens as $_token) {
+        $token_length = mb_strlen($_token, Smarty::$_CHARSET);
+        $_tokens = array($_token);
+        if ($token_length > $width) {
+            if ($cut) {
+                $_tokens = preg_split(
+                    '!(.{' . $width . '})!S' . Smarty::$_UTF8_MODIFIER,
+                    $_token,
+                    -1,
+                    PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE
+                );
+            }
+        }
+        foreach ($_tokens as $token) {
+            $_space = !!preg_match('!^\s$!S' . Smarty::$_UTF8_MODIFIER, $token);
+            $token_length = mb_strlen($token, Smarty::$_CHARSET);
+            $length += $token_length;
+            if ($length > $width) {
+                // remove space before inserted break
+                if ($_previous) {
+                    $t = mb_substr($t, 0, -1, Smarty::$_CHARSET);
+                }
+                if (!$_space) {
+                    // add the break before the token
+                    if (!empty($t)) {
+                        $t .= $break;
+                    }
+                    $length = $token_length;
+                }
+            } elseif ($token === "\n") {
+                // hard break must reset counters
+                $length = 0;
+            }
+            $_previous = $_space;
+            // add the token
+            $t .= $token;
+        }
+    }
+    return $t;
+}
diff --git a/plugins/modifier.regex_replace.php b/plugins/modifier.regex_replace.php
new file mode 100644
index 0000000000000000000000000000000000000000..7eb5506954f04743a3d99d0415baf9158f4ce81b
--- /dev/null
+++ b/plugins/modifier.regex_replace.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifier
+ */
+/**
+ * Smarty regex_replace modifier plugin
+ * Type:     modifier
+ * Name:     regex_replace
+ * Purpose:  regular expression search/replace
+ *
+ * @link   http://smarty.php.net/manual/en/language.modifier.regex.replace.php
+ *          regex_replace (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ *
+ * @param string       $string  input string
+ * @param string|array $search  regular expression(s) to search for
+ * @param string|array $replace string(s) that should be replaced
+ * @param int          $limit   the maximum number of replacements
+ *
+ * @return string
+ */
+function smarty_modifier_regex_replace($string, $search, $replace, $limit = -1)
+{
+    if (is_array($search)) {
+        foreach ($search as $idx => $s) {
+            $search[ $idx ] = _smarty_regex_replace_check($s);
+        }
+    } else {
+        $search = _smarty_regex_replace_check($search);
+    }
+    return preg_replace($search, $replace, $string, $limit);
+}
+
+/**
+ * @param  string $search string(s) that should be replaced
+ *
+ * @return string
+ * @ignore
+ */
+function _smarty_regex_replace_check($search)
+{
+    // null-byte injection detection
+    // anything behind the first null-byte is ignored
+    if (($pos = strpos($search, "\0")) !== false) {
+        $search = substr($search, 0, $pos);
+    }
+    // remove eval-modifier from $search
+    if (preg_match('!([a-zA-Z\s]+)$!s', $search, $match) && (strpos($match[ 1 ], 'e') !== false)) {
+        $search = substr($search, 0, -strlen($match[ 1 ])) . preg_replace('![e\s]+!', '', $match[ 1 ]);
+    }
+    return $search;
+}
diff --git a/plugins/modifier.replace.php b/plugins/modifier.replace.php
new file mode 100644
index 0000000000000000000000000000000000000000..a98f5a4a6f7f1f45cfc5be6790640bb0af811d9c
--- /dev/null
+++ b/plugins/modifier.replace.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifier
+ */
+/**
+ * Smarty replace modifier plugin
+ * Type:     modifier
+ * Name:     replace
+ * Purpose:  simple search/replace
+ *
+ * @link   http://smarty.php.net/manual/en/language.modifier.replace.php replace (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author Uwe Tews
+ *
+ * @param string $string  input string
+ * @param string $search  text to search for
+ * @param string $replace replacement text
+ *
+ * @return string
+ */
+function smarty_modifier_replace($string, $search, $replace)
+{
+    static $is_loaded = false;
+    if (Smarty::$_MBSTRING) {
+        if (!$is_loaded) {
+            if (!is_callable('smarty_mb_str_replace')) {
+                include_once SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php';
+            }
+            $is_loaded = true;
+        }
+        return smarty_mb_str_replace($search, $replace, $string);
+    }
+    return str_replace($search, $replace, $string);
+}
diff --git a/plugins/modifier.spacify.php b/plugins/modifier.spacify.php
new file mode 100644
index 0000000000000000000000000000000000000000..98efd4b300f544518c1b5815935012d5c19d0cb5
--- /dev/null
+++ b/plugins/modifier.spacify.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifier
+ */
+/**
+ * Smarty spacify modifier plugin
+ * Type:     modifier
+ * Name:     spacify
+ * Purpose:  add spaces between characters in a string
+ *
+ * @link   http://smarty.php.net/manual/en/language.modifier.spacify.php spacify (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ *
+ * @param string $string       input string
+ * @param string $spacify_char string to insert between characters.
+ *
+ * @return string
+ */
+function smarty_modifier_spacify($string, $spacify_char = ' ')
+{
+    // well… what about charsets besides latin and UTF-8?
+    return implode($spacify_char, preg_split('//' . Smarty::$_UTF8_MODIFIER, $string, -1, PREG_SPLIT_NO_EMPTY));
+}
diff --git a/plugins/modifier.truncate.php b/plugins/modifier.truncate.php
new file mode 100644
index 0000000000000000000000000000000000000000..bb881bf6e5ac4f75a4bee978a6d3fec183dc9273
--- /dev/null
+++ b/plugins/modifier.truncate.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifier
+ */
+/**
+ * Smarty truncate modifier plugin
+ * Type:     modifier
+ * Name:     truncate
+ * Purpose:  Truncate a string to a certain length if necessary,
+ *               optionally splitting in the middle of a word, and
+ *               appending the $etc string or inserting $etc into the middle.
+ *
+ * @link   http://smarty.php.net/manual/en/language.modifier.truncate.php truncate (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ *
+ * @param string  $string      input string
+ * @param integer $length      length of truncated text
+ * @param string  $etc         end string
+ * @param boolean $break_words truncate at word boundary
+ * @param boolean $middle      truncate in the middle of text
+ *
+ * @return string truncated string
+ */
+function smarty_modifier_truncate($string, $length = 80, $etc = '...', $break_words = false, $middle = false)
+{
+    if ($length === 0) {
+        return '';
+    }
+    if (Smarty::$_MBSTRING) {
+        if (mb_strlen($string, Smarty::$_CHARSET) > $length) {
+            $length -= min($length, mb_strlen($etc, Smarty::$_CHARSET));
+            if (!$break_words && !$middle) {
+                $string = preg_replace(
+                    '/\s+?(\S+)?$/' . Smarty::$_UTF8_MODIFIER,
+                    '',
+                    mb_substr($string, 0, $length + 1, Smarty::$_CHARSET)
+                );
+            }
+            if (!$middle) {
+                return mb_substr($string, 0, $length, Smarty::$_CHARSET) . $etc;
+            }
+            return mb_substr($string, 0, $length / 2, Smarty::$_CHARSET) . $etc .
+                   mb_substr($string, -$length / 2, $length, Smarty::$_CHARSET);
+        }
+        return $string;
+    }
+    // no MBString fallback
+    if (isset($string[ $length ])) {
+        $length -= min($length, strlen($etc));
+        if (!$break_words && !$middle) {
+            $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length + 1));
+        }
+        if (!$middle) {
+            return substr($string, 0, $length) . $etc;
+        }
+        return substr($string, 0, $length / 2) . $etc . substr($string, -$length / 2);
+    }
+    return $string;
+}
diff --git a/plugins/modifiercompiler.cat.php b/plugins/modifiercompiler.cat.php
new file mode 100644
index 0000000000000000000000000000000000000000..21d0e662422fd1b0c85a2ca1adfcac6e23b9cf98
--- /dev/null
+++ b/plugins/modifiercompiler.cat.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+/**
+ * Smarty cat modifier plugin
+ * Type:     modifier
+ * Name:     cat
+ * Date:     Feb 24, 2003
+ * Purpose:  catenate a value to a variable
+ * Input:    string to catenate
+ * Example:  {$var|cat:"foo"}
+ *
+ * @link   http://smarty.php.net/manual/en/language.modifier.cat.php cat
+ *           (Smarty online manual)
+ * @author Uwe Tews
+ *
+ * @param array $params parameters
+ *
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_cat($params)
+{
+    return '(' . implode(').(', $params) . ')';
+}
diff --git a/plugins/modifiercompiler.count_characters.php b/plugins/modifiercompiler.count_characters.php
new file mode 100644
index 0000000000000000000000000000000000000000..6c44278afab9f25aeabc6e8556cb9be41456b2a5
--- /dev/null
+++ b/plugins/modifiercompiler.count_characters.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+/**
+ * Smarty count_characters modifier plugin
+ * Type:     modifier
+ * Name:     count_characters
+ * Purpose:  count the number of characters in a text
+ *
+ * @link   http://www.smarty.net/manual/en/language.modifier.count.characters.php count_characters (Smarty online
+ *         manual)
+ * @author Uwe Tews
+ *
+ * @param array $params parameters
+ *
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_count_characters($params)
+{
+    if (!isset($params[ 1 ]) || $params[ 1 ] !== 'true') {
+        return 'preg_match_all(\'/[^\s]/' . Smarty::$_UTF8_MODIFIER . '\',' . $params[ 0 ] . ', $tmp)';
+    }
+    if (Smarty::$_MBSTRING) {
+        return 'mb_strlen(' . $params[ 0 ] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')';
+    }
+    // no MBString fallback
+    return 'strlen(' . $params[ 0 ] . ')';
+}
diff --git a/plugins/modifiercompiler.count_paragraphs.php b/plugins/modifiercompiler.count_paragraphs.php
new file mode 100644
index 0000000000000000000000000000000000000000..e214a56f0d544ca6020c531c3ac8a673f25894b2
--- /dev/null
+++ b/plugins/modifiercompiler.count_paragraphs.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+/**
+ * Smarty count_paragraphs modifier plugin
+ * Type:     modifier
+ * Name:     count_paragraphs
+ * Purpose:  count the number of paragraphs in a text
+ *
+ * @link   http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php
+ *          count_paragraphs (Smarty online manual)
+ * @author Uwe Tews
+ *
+ * @param array $params parameters
+ *
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_count_paragraphs($params)
+{
+    // count \r or \n characters
+    return '(preg_match_all(\'#[\r\n]+#\', ' . $params[ 0 ] . ', $tmp)+1)';
+}
diff --git a/plugins/modifiercompiler.count_sentences.php b/plugins/modifiercompiler.count_sentences.php
new file mode 100644
index 0000000000000000000000000000000000000000..027745635d4c91668dc75159b5a7ebc594b7bd78
--- /dev/null
+++ b/plugins/modifiercompiler.count_sentences.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+/**
+ * Smarty count_sentences modifier plugin
+ * Type:     modifier
+ * Name:     count_sentences
+ * Purpose:  count the number of sentences in a text
+ *
+ * @link   http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php
+ *          count_sentences (Smarty online manual)
+ * @author Uwe Tews
+ *
+ * @param array $params parameters
+ *
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_count_sentences($params)
+{
+    // find periods, question marks, exclamation marks with a word before but not after.
+    return 'preg_match_all("#\w[\.\?\!](\W|$)#S' . Smarty::$_UTF8_MODIFIER . '", ' . $params[ 0 ] . ', $tmp)';
+}
diff --git a/plugins/modifiercompiler.count_words.php b/plugins/modifiercompiler.count_words.php
new file mode 100644
index 0000000000000000000000000000000000000000..6d889da5cb11c1efcb38326999c5edbbdc3f9d2e
--- /dev/null
+++ b/plugins/modifiercompiler.count_words.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+/**
+ * Smarty count_words modifier plugin
+ * Type:     modifier
+ * Name:     count_words
+ * Purpose:  count the number of words in a text
+ *
+ * @link   http://www.smarty.net/manual/en/language.modifier.count.words.php count_words (Smarty online manual)
+ * @author Uwe Tews
+ *
+ * @param array $params parameters
+ *
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_count_words($params)
+{
+    if (Smarty::$_MBSTRING) {
+        // return 'preg_match_all(\'#[\w\pL]+#' . Smarty::$_UTF8_MODIFIER . '\', ' . $params[0] . ', $tmp)';
+        // expression taken from http://de.php.net/manual/en/function.str-word-count.php#85592
+        return 'preg_match_all(\'/\p{L}[\p{L}\p{Mn}\p{Pd}\\\'\x{2019}]*/' . Smarty::$_UTF8_MODIFIER . '\', ' .
+               $params[ 0 ] . ', $tmp)';
+    }
+    // no MBString fallback
+    return 'str_word_count(' . $params[ 0 ] . ')';
+}
diff --git a/plugins/modifiercompiler.default.php b/plugins/modifiercompiler.default.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae886c4b2211df208d5e1f143dfc634e23e932b4
--- /dev/null
+++ b/plugins/modifiercompiler.default.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+/**
+ * Smarty default modifier plugin
+ * Type:     modifier
+ * Name:     default
+ * Purpose:  designate default value for empty variables
+ *
+ * @link   http://www.smarty.net/manual/en/language.modifier.default.php default (Smarty online manual)
+ * @author Uwe Tews
+ *
+ * @param array $params parameters
+ *
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_default($params)
+{
+    $output = $params[ 0 ];
+    if (!isset($params[ 1 ])) {
+        $params[ 1 ] = "''";
+    }
+    array_shift($params);
+    foreach ($params as $param) {
+        $output = '(($tmp = @' . $output . ')===null||$tmp===\'\' ? ' . $param . ' : $tmp)';
+    }
+    return $output;
+}
diff --git a/plugins/modifiercompiler.escape.php b/plugins/modifiercompiler.escape.php
new file mode 100644
index 0000000000000000000000000000000000000000..e0763adcebc3419d94ce1646ab6b3b2203180a11
--- /dev/null
+++ b/plugins/modifiercompiler.escape.php
@@ -0,0 +1,112 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+/**
+ * Smarty escape modifier plugin
+ * Type:     modifier
+ * Name:     escape
+ * Purpose:  escape string for output
+ *
+ * @link   http://www.smarty.net/docsv2/en/language.modifier.escape count_characters (Smarty online manual)
+ * @author Rodney Rehm
+ *
+ * @param array                                $params parameters
+ * @param Smarty_Internal_TemplateCompilerBase $compiler
+ *
+ * @return string with compiled code
+ * @throws \SmartyException
+ */
+function smarty_modifiercompiler_escape($params, Smarty_Internal_TemplateCompilerBase $compiler)
+{
+    static $_double_encode = null;
+    static $is_loaded = false;
+    $compiler->template->_checkPlugins(
+        array(
+            array(
+                'function' => 'smarty_literal_compiler_param',
+                'file'     => SMARTY_PLUGINS_DIR . 'shared.literal_compiler_param.php'
+            )
+        )
+    );
+    if ($_double_encode === null) {
+        $_double_encode = version_compare(PHP_VERSION, '5.2.3', '>=');
+    }
+    try {
+        $esc_type = smarty_literal_compiler_param($params, 1, 'html');
+        $char_set = smarty_literal_compiler_param($params, 2, Smarty::$_CHARSET);
+        $double_encode = smarty_literal_compiler_param($params, 3, true);
+        if (!$char_set) {
+            $char_set = Smarty::$_CHARSET;
+        }
+        switch ($esc_type) {
+            case 'html':
+                if ($_double_encode) {
+                    return 'htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ', ' .
+                           var_export($double_encode, true) . ')';
+                } elseif ($double_encode) {
+                    return 'htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ')';
+                } else {
+                    // fall back to modifier.escape.php
+                }
+            // no break
+            case 'htmlall':
+                if (Smarty::$_MBSTRING) {
+                    if ($_double_encode) {
+                        // php >=5.2.3 - go native
+                        return 'mb_convert_encoding(htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' .
+                               var_export($char_set, true) . ', ' . var_export($double_encode, true) .
+                               '), "HTML-ENTITIES", ' . var_export($char_set, true) . ')';
+                    } elseif ($double_encode) {
+                        // php <5.2.3 - only handle double encoding
+                        return 'mb_convert_encoding(htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' .
+                               var_export($char_set, true) . '), "HTML-ENTITIES", ' . var_export($char_set, true) . ')';
+                    } else {
+                        // fall back to modifier.escape.php
+                    }
+                }
+                // no MBString fallback
+                if ($_double_encode) {
+                    // php >=5.2.3 - go native
+                    return 'htmlentities(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ', ' .
+                           var_export($double_encode, true) . ')';
+                } elseif ($double_encode) {
+                    // php <5.2.3 - only handle double encoding
+                    return 'htmlentities(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ')';
+                } else {
+                    // fall back to modifier.escape.php
+                }
+            // no break
+            case 'url':
+                return 'rawurlencode(' . $params[ 0 ] . ')';
+            case 'urlpathinfo':
+                return 'str_replace("%2F", "/", rawurlencode(' . $params[ 0 ] . '))';
+            case 'quotes':
+                // escape unescaped single quotes
+                return 'preg_replace("%(?<!\\\\\\\\)\'%", "\\\'",' . $params[ 0 ] . ')';
+            case 'javascript':
+                // escape quotes and backslashes, newlines, etc.
+                return 'strtr(' .
+                       $params[ 0 ] .
+                       ', array("\\\\" => "\\\\\\\\", "\'" => "\\\\\'", "\"" => "\\\\\"", "\\r" => "\\\\r", "\\n" => "\\\n", "</" => "<\/" ))';
+        }
+    } catch (SmartyException $e) {
+        // pass through to regular plugin fallback
+    }
+    // could not optimize |escape call, so fallback to regular plugin
+    if ($compiler->template->caching && ($compiler->tag_nocache | $compiler->nocache)) {
+        $compiler->required_plugins[ 'nocache' ][ 'escape' ][ 'modifier' ][ 'file' ] =
+            SMARTY_PLUGINS_DIR . 'modifier.escape.php';
+        $compiler->required_plugins[ 'nocache' ][ 'escape' ][ 'modifier' ][ 'function' ] =
+            'smarty_modifier_escape';
+    } else {
+        $compiler->required_plugins[ 'compiled' ][ 'escape' ][ 'modifier' ][ 'file' ] =
+            SMARTY_PLUGINS_DIR . 'modifier.escape.php';
+        $compiler->required_plugins[ 'compiled' ][ 'escape' ][ 'modifier' ][ 'function' ] =
+            'smarty_modifier_escape';
+    }
+    return 'smarty_modifier_escape(' . join(', ', $params) . ')';
+}
diff --git a/plugins/modifiercompiler.from_charset.php b/plugins/modifiercompiler.from_charset.php
new file mode 100644
index 0000000000000000000000000000000000000000..acce7784b937efbe727e5ad67f721cd143963052
--- /dev/null
+++ b/plugins/modifiercompiler.from_charset.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+/**
+ * Smarty from_charset modifier plugin
+ * Type:     modifier
+ * Name:     from_charset
+ * Purpose:  convert character encoding from $charset to internal encoding
+ *
+ * @author Rodney Rehm
+ *
+ * @param array $params parameters
+ *
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_from_charset($params)
+{
+    if (!Smarty::$_MBSTRING) {
+        // FIXME: (rodneyrehm) shouldn't this throw an error?
+        return $params[ 0 ];
+    }
+    if (!isset($params[ 1 ])) {
+        $params[ 1 ] = '"ISO-8859-1"';
+    }
+    return 'mb_convert_encoding(' . $params[ 0 ] . ', "' . addslashes(Smarty::$_CHARSET) . '", ' . $params[ 1 ] . ')';
+}
diff --git a/plugins/modifiercompiler.indent.php b/plugins/modifiercompiler.indent.php
new file mode 100644
index 0000000000000000000000000000000000000000..2088ad6a83b0252fc3678ed178b9691c3efe3f59
--- /dev/null
+++ b/plugins/modifiercompiler.indent.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+/**
+ * Smarty indent modifier plugin
+ * Type:     modifier
+ * Name:     indent
+ * Purpose:  indent lines of text
+ *
+ * @link   http://www.smarty.net/manual/en/language.modifier.indent.php indent (Smarty online manual)
+ * @author Uwe Tews
+ *
+ * @param array $params parameters
+ *
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_indent($params)
+{
+    if (!isset($params[ 1 ])) {
+        $params[ 1 ] = 4;
+    }
+    if (!isset($params[ 2 ])) {
+        $params[ 2 ] = "' '";
+    }
+    return 'preg_replace(\'!^!m\',str_repeat(' . $params[ 2 ] . ',' . $params[ 1 ] . '),' . $params[ 0 ] . ')';
+}
diff --git a/plugins/modifiercompiler.lower.php b/plugins/modifiercompiler.lower.php
new file mode 100644
index 0000000000000000000000000000000000000000..0d899a002844d0e21314becd149440d5df1c8fb0
--- /dev/null
+++ b/plugins/modifiercompiler.lower.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+/**
+ * Smarty lower modifier plugin
+ * Type:     modifier
+ * Name:     lower
+ * Purpose:  convert string to lowercase
+ *
+ * @link   http://www.smarty.net/manual/en/language.modifier.lower.php lower (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author Uwe Tews
+ *
+ * @param array $params parameters
+ *
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_lower($params)
+{
+    if (Smarty::$_MBSTRING) {
+        return 'mb_strtolower(' . $params[ 0 ] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')';
+    }
+    // no MBString fallback
+    return 'strtolower(' . $params[ 0 ] . ')';
+}
diff --git a/plugins/modifiercompiler.noprint.php b/plugins/modifiercompiler.noprint.php
new file mode 100644
index 0000000000000000000000000000000000000000..1275190e073a8eeec79b3e6a27585fa884380521
--- /dev/null
+++ b/plugins/modifiercompiler.noprint.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+/**
+ * Smarty noprint modifier plugin
+ * Type:     modifier
+ * Name:     noprint
+ * Purpose:  return an empty string
+ *
+ * @author Uwe Tews
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_noprint()
+{
+    return "''";
+}
diff --git a/plugins/modifiercompiler.string_format.php b/plugins/modifiercompiler.string_format.php
new file mode 100644
index 0000000000000000000000000000000000000000..6630943117c9ddfbdf7c2dd91ad0d1c15bae6194
--- /dev/null
+++ b/plugins/modifiercompiler.string_format.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+/**
+ * Smarty string_format modifier plugin
+ * Type:     modifier
+ * Name:     string_format
+ * Purpose:  format strings via sprintf
+ *
+ * @link   http://www.smarty.net/manual/en/language.modifier.string.format.php string_format (Smarty online manual)
+ * @author Uwe Tews
+ *
+ * @param array $params parameters
+ *
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_string_format($params)
+{
+    return 'sprintf(' . $params[ 1 ] . ',' . $params[ 0 ] . ')';
+}
diff --git a/plugins/modifiercompiler.strip.php b/plugins/modifiercompiler.strip.php
new file mode 100644
index 0000000000000000000000000000000000000000..04ea332c5286bc4aa426e09014a0782f7b667816
--- /dev/null
+++ b/plugins/modifiercompiler.strip.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+/**
+ * Smarty strip modifier plugin
+ * Type:     modifier
+ * Name:     strip
+ * Purpose:  Replace all repeated spaces, newlines, tabs
+ *              with a single space or supplied replacement string.
+ * Example:  {$var|strip} {$var|strip:"&nbsp;"}
+ * Date:     September 25th, 2002
+ *
+ * @link   http://www.smarty.net/manual/en/language.modifier.strip.php strip (Smarty online manual)
+ * @author Uwe Tews
+ *
+ * @param array $params parameters
+ *
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_strip($params)
+{
+    if (!isset($params[ 1 ])) {
+        $params[ 1 ] = "' '";
+    }
+    return "preg_replace('!\s+!" . Smarty::$_UTF8_MODIFIER . "', {$params[1]},{$params[0]})";
+}
diff --git a/plugins/modifiercompiler.strip_tags.php b/plugins/modifiercompiler.strip_tags.php
new file mode 100644
index 0000000000000000000000000000000000000000..1bca1a28e860edae2b221e0cdee4e78ce43aef1d
--- /dev/null
+++ b/plugins/modifiercompiler.strip_tags.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+/**
+ * Smarty strip_tags modifier plugin
+ * Type:     modifier
+ * Name:     strip_tags
+ * Purpose:  strip html tags from text
+ *
+ * @link   http://www.smarty.net/docs/en/language.modifier.strip.tags.tpl strip_tags (Smarty online manual)
+ * @author Uwe Tews
+ *
+ * @param array $params parameters
+ *
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_strip_tags($params)
+{
+    if (!isset($params[ 1 ]) || $params[ 1 ] === true || trim($params[ 1 ], '"') === 'true') {
+        return "preg_replace('!<[^>]*?>!', ' ', {$params[0]})";
+    } else {
+        return 'strip_tags(' . $params[ 0 ] . ')';
+    }
+}
diff --git a/plugins/modifiercompiler.to_charset.php b/plugins/modifiercompiler.to_charset.php
new file mode 100644
index 0000000000000000000000000000000000000000..d652eab1b3fa977e6438428c89681083927af66b
--- /dev/null
+++ b/plugins/modifiercompiler.to_charset.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+/**
+ * Smarty to_charset modifier plugin
+ * Type:     modifier
+ * Name:     to_charset
+ * Purpose:  convert character encoding from internal encoding to $charset
+ *
+ * @author Rodney Rehm
+ *
+ * @param array $params parameters
+ *
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_to_charset($params)
+{
+    if (!Smarty::$_MBSTRING) {
+        // FIXME: (rodneyrehm) shouldn't this throw an error?
+        return $params[ 0 ];
+    }
+    if (!isset($params[ 1 ])) {
+        $params[ 1 ] = '"ISO-8859-1"';
+    }
+    return 'mb_convert_encoding(' . $params[ 0 ] . ', ' . $params[ 1 ] . ', "' . addslashes(Smarty::$_CHARSET) . '")';
+}
diff --git a/plugins/modifiercompiler.unescape.php b/plugins/modifiercompiler.unescape.php
new file mode 100644
index 0000000000000000000000000000000000000000..05beb81f5c9999dc7a061782794060540fbc636e
--- /dev/null
+++ b/plugins/modifiercompiler.unescape.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+/**
+ * Smarty unescape modifier plugin
+ * Type:     modifier
+ * Name:     unescape
+ * Purpose:  unescape html entities
+ *
+ * @author Rodney Rehm
+ *
+ * @param array $params parameters
+ *
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_unescape($params)
+{
+    if (!isset($params[ 1 ])) {
+        $params[ 1 ] = 'html';
+    }
+    if (!isset($params[ 2 ])) {
+        $params[ 2 ] = '\'' . addslashes(Smarty::$_CHARSET) . '\'';
+    } else {
+        $params[ 2 ] = "'{$params[ 2 ]}'";
+    }
+    switch (trim($params[ 1 ], '"\'')) {
+        case 'entity':
+        case 'htmlall':
+            if (Smarty::$_MBSTRING) {
+                return 'mb_convert_encoding(' . $params[ 0 ] . ', ' . $params[ 2 ] . ', \'HTML-ENTITIES\')';
+            }
+            return 'html_entity_decode(' . $params[ 0 ] . ', ENT_NOQUOTES, ' . $params[ 2 ] . ')';
+        case 'html':
+            return 'htmlspecialchars_decode(' . $params[ 0 ] . ', ENT_QUOTES)';
+        case 'url':
+            return 'rawurldecode(' . $params[ 0 ] . ')';
+        default:
+            return $params[ 0 ];
+    }
+}
diff --git a/plugins/modifiercompiler.upper.php b/plugins/modifiercompiler.upper.php
new file mode 100644
index 0000000000000000000000000000000000000000..ea4e95b7a459d7fbb0b5e18232e5c02bd7d62133
--- /dev/null
+++ b/plugins/modifiercompiler.upper.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+/**
+ * Smarty upper modifier plugin
+ * Type:     modifier
+ * Name:     lower
+ * Purpose:  convert string to uppercase
+ *
+ * @link   http://smarty.php.net/manual/en/language.modifier.upper.php lower (Smarty online manual)
+ * @author Uwe Tews
+ *
+ * @param array $params parameters
+ *
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_upper($params)
+{
+    if (Smarty::$_MBSTRING) {
+        return 'mb_strtoupper(' . $params[ 0 ] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')';
+    }
+    // no MBString fallback
+    return 'strtoupper(' . $params[ 0 ] . ')';
+}
diff --git a/plugins/modifiercompiler.wordwrap.php b/plugins/modifiercompiler.wordwrap.php
new file mode 100644
index 0000000000000000000000000000000000000000..8565f140e7bc5ab4f9862a4b47a879c54195d624
--- /dev/null
+++ b/plugins/modifiercompiler.wordwrap.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+/**
+ * Smarty wordwrap modifier plugin
+ * Type:     modifier
+ * Name:     wordwrap
+ * Purpose:  wrap a string of text at a given length
+ *
+ * @link   http://smarty.php.net/manual/en/language.modifier.wordwrap.php wordwrap (Smarty online manual)
+ * @author Uwe Tews
+ *
+ * @param array                                 $params parameters
+ * @param \Smarty_Internal_TemplateCompilerBase $compiler
+ *
+ * @return string with compiled code
+ * @throws \SmartyException
+ */
+function smarty_modifiercompiler_wordwrap($params, Smarty_Internal_TemplateCompilerBase $compiler)
+{
+    if (!isset($params[ 1 ])) {
+        $params[ 1 ] = 80;
+    }
+    if (!isset($params[ 2 ])) {
+        $params[ 2 ] = '"\n"';
+    }
+    if (!isset($params[ 3 ])) {
+        $params[ 3 ] = 'false';
+    }
+    $function = 'wordwrap';
+    if (Smarty::$_MBSTRING) {
+        $function = $compiler->getPlugin('mb_wordwrap', 'modifier');
+    }
+    return $function . '(' . $params[ 0 ] . ',' . $params[ 1 ] . ',' . $params[ 2 ] . ',' . $params[ 3 ] . ')';
+}
diff --git a/plugins/outputfilter.trimwhitespace.php b/plugins/outputfilter.trimwhitespace.php
new file mode 100644
index 0000000000000000000000000000000000000000..7e4503a1cf566f1d3587523ff1b0f4ef7403c17a
--- /dev/null
+++ b/plugins/outputfilter.trimwhitespace.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsFilter
+ */
+/**
+ * Smarty trimwhitespace outputfilter plugin
+ * Trim unnecessary whitespace from HTML markup.
+ *
+ * @author Rodney Rehm
+ *
+ * @param string $source input string
+ *
+ * @return string filtered output
+ * @todo   substr_replace() is not overloaded by mbstring.func_overload - so this function might fail!
+ */
+function smarty_outputfilter_trimwhitespace($source)
+{
+    $store = array();
+    $_store = 0;
+    $_offset = 0;
+    // Unify Line-Breaks to \n
+    $source = preg_replace('/\015\012|\015|\012/', "\n", $source);
+    // capture Internet Explorer and KnockoutJS Conditional Comments
+    if (preg_match_all(
+        '#<!--((\[[^\]]+\]>.*?<!\[[^\]]+\])|(\s*/?ko\s+.+))-->#is',
+        $source,
+        $matches,
+        PREG_OFFSET_CAPTURE | PREG_SET_ORDER
+    )
+    ) {
+        foreach ($matches as $match) {
+            $store[] = $match[ 0 ][ 0 ];
+            $_length = strlen($match[ 0 ][ 0 ]);
+            $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@';
+            $source = substr_replace($source, $replace, $match[ 0 ][ 1 ] - $_offset, $_length);
+            $_offset += $_length - strlen($replace);
+            $_store++;
+        }
+    }
+    // Strip all HTML-Comments
+    // yes, even the ones in <script> - see http://stackoverflow.com/a/808850/515124
+    $source = preg_replace('#<!--.*?-->#ms', '', $source);
+    // capture html elements not to be messed with
+    $_offset = 0;
+    if (preg_match_all(
+        '#(<script[^>]*>.*?</script[^>]*>)|(<textarea[^>]*>.*?</textarea[^>]*>)|(<pre[^>]*>.*?</pre[^>]*>)#is',
+        $source,
+        $matches,
+        PREG_OFFSET_CAPTURE | PREG_SET_ORDER
+    )
+    ) {
+        foreach ($matches as $match) {
+            $store[] = $match[ 0 ][ 0 ];
+            $_length = strlen($match[ 0 ][ 0 ]);
+            $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@';
+            $source = substr_replace($source, $replace, $match[ 0 ][ 1 ] - $_offset, $_length);
+            $_offset += $_length - strlen($replace);
+            $_store++;
+        }
+    }
+    $expressions = array(// replace multiple spaces between tags by a single space
+                         // can't remove them entirely, becaue that might break poorly implemented CSS display:inline-block elements
+                         '#(:SMARTY@!@|>)\s+(?=@!@SMARTY:|<)#s'                                    => '\1 \2',
+                         // remove spaces between attributes (but not in attribute values!)
+                         '#(([a-z0-9]\s*=\s*("[^"]*?")|(\'[^\']*?\'))|<[a-z0-9_]+)\s+([a-z/>])#is' => '\1 \5',
+                         // note: for some very weird reason trim() seems to remove spaces inside attributes.
+                         // maybe a \0 byte or something is interfering?
+                         '#^\s+<#Ss'                                                               => '<',
+                         '#>\s+$#Ss'                                                               => '>',
+    );
+    $source = preg_replace(array_keys($expressions), array_values($expressions), $source);
+    // note: for some very weird reason trim() seems to remove spaces inside attributes.
+    // maybe a \0 byte or something is interfering?
+    // $source = trim( $source );
+    $_offset = 0;
+    if (preg_match_all('#@!@SMARTY:([0-9]+):SMARTY@!@#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {
+        foreach ($matches as $match) {
+            $_length = strlen($match[ 0 ][ 0 ]);
+            $replace = $store[ $match[ 1 ][ 0 ] ];
+            $source = substr_replace($source, $replace, $match[ 0 ][ 1 ] + $_offset, $_length);
+            $_offset += strlen($replace) - $_length;
+            $_store++;
+        }
+    }
+    return $source;
+}
diff --git a/plugins/shared.escape_special_chars.php b/plugins/shared.escape_special_chars.php
new file mode 100644
index 0000000000000000000000000000000000000000..6b18d3eec300ec478c52d283a87fb54a06fc4728
--- /dev/null
+++ b/plugins/shared.escape_special_chars.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Smarty shared plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsShared
+ */
+/**
+ * escape_special_chars common function
+ * Function: smarty_function_escape_special_chars
+ * Purpose:  used by other smarty functions to escape
+ *           special chars except for already escaped ones
+ *
+ * @author Monte Ohrt <monte at ohrt dot com>
+ *
+ * @param string $string text that should by escaped
+ *
+ * @return string
+ */
+function smarty_function_escape_special_chars($string)
+{
+    if (!is_array($string)) {
+        if (version_compare(PHP_VERSION, '5.2.3', '>=')) {
+            $string = htmlspecialchars($string, ENT_COMPAT, Smarty::$_CHARSET, false);
+        } else {
+            $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
+            $string = htmlspecialchars($string);
+            $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string);
+        }
+    }
+    return $string;
+}
diff --git a/plugins/shared.literal_compiler_param.php b/plugins/shared.literal_compiler_param.php
new file mode 100644
index 0000000000000000000000000000000000000000..65caf03c829cd9608be8fe7df482b58a3220063e
--- /dev/null
+++ b/plugins/shared.literal_compiler_param.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsShared
+ */
+/**
+ * evaluate compiler parameter
+ *
+ * @param array   $params  parameter array as given to the compiler function
+ * @param integer $index   array index of the parameter to convert
+ * @param mixed   $default value to be returned if the parameter is not present
+ *
+ * @return mixed evaluated value of parameter or $default
+ * @throws SmartyException if parameter is not a literal (but an expression, variable, …)
+ * @author Rodney Rehm
+ */
+function smarty_literal_compiler_param($params, $index, $default = null)
+{
+    // not set, go default
+    if (!isset($params[ $index ])) {
+        return $default;
+    }
+    // test if param is a literal
+    if (!preg_match('/^([\'"]?)[a-zA-Z0-9-]+(\\1)$/', $params[ $index ])) {
+        throw new SmartyException(
+            '$param[' . $index .
+            '] is not a literal and is thus not evaluatable at compile time'
+        );
+    }
+    $t = null;
+    eval("\$t = " . $params[ $index ] . ";");
+    return $t;
+}
diff --git a/plugins/shared.make_timestamp.php b/plugins/shared.make_timestamp.php
new file mode 100644
index 0000000000000000000000000000000000000000..9626dc68e487d9d170c08e76dd0236d81bdc5e7a
--- /dev/null
+++ b/plugins/shared.make_timestamp.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Smarty shared plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsShared
+ */
+/**
+ * Function: smarty_make_timestamp
+ * Purpose:  used by other smarty functions to make a timestamp from a string.
+ *
+ * @author Monte Ohrt <monte at ohrt dot com>
+ *
+ * @param DateTime|int|string $string date object, timestamp or string that can be converted using strtotime()
+ *
+ * @return int
+ */
+function smarty_make_timestamp($string)
+{
+    if (empty($string)) {
+        // use "now":
+        return time();
+    } elseif ($string instanceof DateTime
+              || (interface_exists('DateTimeInterface', false) && $string instanceof DateTimeInterface)
+    ) {
+        return (int)$string->format('U'); // PHP 5.2 BC
+    } elseif (strlen($string) === 14 && ctype_digit($string)) {
+        // it is mysql timestamp format of YYYYMMDDHHMMSS?
+        return mktime(
+            substr($string, 8, 2),
+            substr($string, 10, 2),
+            substr($string, 12, 2),
+            substr($string, 4, 2),
+            substr($string, 6, 2),
+            substr($string, 0, 4)
+        );
+    } elseif (is_numeric($string)) {
+        // it is a numeric string, we handle it as timestamp
+        return (int)$string;
+    } else {
+        // strtotime should handle it
+        $time = strtotime($string);
+        if ($time === -1 || $time === false) {
+            // strtotime() was not able to parse $string, use "now":
+            return time();
+        }
+        return $time;
+    }
+}
diff --git a/plugins/shared.mb_str_replace.php b/plugins/shared.mb_str_replace.php
new file mode 100644
index 0000000000000000000000000000000000000000..206cf9ea6bceed58ab11dbf666f94f0474a5a15a
--- /dev/null
+++ b/plugins/shared.mb_str_replace.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Smarty shared plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsShared
+ */
+if (!function_exists('smarty_mb_str_replace')) {
+    /**
+     * Multibyte string replace
+     *
+     * @param string|string[] $search  the string to be searched
+     * @param string|string[] $replace the replacement string
+     * @param string          $subject the source string
+     * @param int             &$count  number of matches found
+     *
+     * @return string replaced string
+     * @author Rodney Rehm
+     */
+    function smarty_mb_str_replace($search, $replace, $subject, &$count = 0)
+    {
+        if (!is_array($search) && is_array($replace)) {
+            return false;
+        }
+        if (is_array($subject)) {
+            // call mb_replace for each single string in $subject
+            foreach ($subject as &$string) {
+                $string = smarty_mb_str_replace($search, $replace, $string, $c);
+                $count += $c;
+            }
+        } elseif (is_array($search)) {
+            if (!is_array($replace)) {
+                foreach ($search as &$string) {
+                    $subject = smarty_mb_str_replace($string, $replace, $subject, $c);
+                    $count += $c;
+                }
+            } else {
+                $n = max(count($search), count($replace));
+                while ($n--) {
+                    $subject = smarty_mb_str_replace(current($search), current($replace), $subject, $c);
+                    $count += $c;
+                    next($search);
+                    next($replace);
+                }
+            }
+        } else {
+            $parts = mb_split(preg_quote($search), $subject);
+            $count = count($parts) - 1;
+            $subject = implode($replace, $parts);
+        }
+        return $subject;
+    }
+}
diff --git a/plugins/shared.mb_unicode.php b/plugins/shared.mb_unicode.php
new file mode 100644
index 0000000000000000000000000000000000000000..7d12065069bf568b4f1fc501788fcc8d21ba6cb3
--- /dev/null
+++ b/plugins/shared.mb_unicode.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Smarty shared plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsShared
+ */
+/**
+ * convert characters to their decimal unicode equivalents
+ *
+ * @link   http://www.ibm.com/developerworks/library/os-php-unicode/index.html#listing3 for inspiration
+ *
+ * @param string $string   characters to calculate unicode of
+ * @param string $encoding encoding of $string, if null mb_internal_encoding() is used
+ *
+ * @return array sequence of unicodes
+ * @author Rodney Rehm
+ */
+function smarty_mb_to_unicode($string, $encoding = null)
+{
+    if ($encoding) {
+        $expanded = mb_convert_encoding($string, 'UTF-32BE', $encoding);
+    } else {
+        $expanded = mb_convert_encoding($string, 'UTF-32BE');
+    }
+    return unpack('N*', $expanded);
+}
+
+/**
+ * convert unicodes to the character of given encoding
+ *
+ * @link   http://www.ibm.com/developerworks/library/os-php-unicode/index.html#listing3 for inspiration
+ *
+ * @param integer|array $unicode  single unicode or list of unicodes to convert
+ * @param string        $encoding encoding of returned string, if null mb_internal_encoding() is used
+ *
+ * @return string unicode as character sequence in given $encoding
+ * @author Rodney Rehm
+ */
+function smarty_mb_from_unicode($unicode, $encoding = null)
+{
+    $t = '';
+    if (!$encoding) {
+        $encoding = mb_internal_encoding();
+    }
+    foreach ((array)$unicode as $utf32be) {
+        $character = pack('N*', $utf32be);
+        $t .= mb_convert_encoding($character, $encoding, 'UTF-32BE');
+    }
+    return $t;
+}
diff --git a/plugins/variablefilter.htmlspecialchars.php b/plugins/variablefilter.htmlspecialchars.php
new file mode 100644
index 0000000000000000000000000000000000000000..3c85295db6900583c27673e4573ce9834415782c
--- /dev/null
+++ b/plugins/variablefilter.htmlspecialchars.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsFilter
+ */
+/**
+ * Smarty htmlspecialchars variablefilter plugin
+ *
+ * @param string                    $source input string
+ * @param \Smarty_Internal_Template $template
+ *
+ * @return string filtered output
+ */
+function smarty_variablefilter_htmlspecialchars($source, Smarty_Internal_Template $template)
+{
+    return htmlspecialchars($source, ENT_QUOTES, Smarty::$_CHARSET);
+}
diff --git a/prueba_sujeto.php b/prueba_sujeto.php
new file mode 100644
index 0000000000000000000000000000000000000000..aa78711d15937c54135457903d992126611fc062
--- /dev/null
+++ b/prueba_sujeto.php
@@ -0,0 +1,57 @@
+<?php session_start(); 
+require_once("funciones.php");
+require('include.php');
+/*
+* Archivo de control. Realizar una prueba
+* Inicio del caso de uso: REALIZAR UNA PRUEBA
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+
+	$id_admin=$_GET["variable"];
+	$id_prueba = $_GET['id_prueba'];
+	$accion = $_GET['accion'];
+
+	$html=new Smarty;
+
+	// Barra
+	barra();
+	// Fin de barra
+
+	//Si hemos salido borramos la �ltima prueba creada
+	if ($accion==1 && $id_prueba != ""){
+		$sql="DELETE FROM `PRUEBAS_SUJETOS` WHERE `id_prueba_sujeto`='$id_prueba'";
+		if ($conex->query($sql)){
+			$mensaje ="Prueba anterior borrada correctamente";
+		}else{
+			$mensaje ="Error al borrar la prueba";
+		}
+	}
+
+	// Valores para el formulario:
+		// Tipo de ensayos
+		// Nombre
+		// Apellidos
+		// Edad
+		// Sexo
+
+	//Necesitamos tipos de ensayos 
+	$x=0;
+	$result = $conex->query("SELECT tipo FROM `ENSAYOS`"); 
+	while ($row = $result->fetch_assoc()){
+		$entrada[$x]=$row['tipo'];
+		$x++;
+	}
+	// asignamos variable a template
+	$html->assign("ensayos",$entrada);
+
+
+	$html->assign("id_admin",$id_admin);
+	$html->assign("mensaje",$mensaje);
+
+
+	$html->display("prueba_sujeto.tpl");
+
+}
+else	@header('location:index.php');
+
+?>		
diff --git a/prueba_sujeto_val.php b/prueba_sujeto_val.php
new file mode 100644
index 0000000000000000000000000000000000000000..d4826a257e9a3ad1c4dbd07c220ccdc72198cbc2
--- /dev/null
+++ b/prueba_sujeto_val.php
@@ -0,0 +1,97 @@
+<?php session_start(); 
+require_once("funciones.php");
+require('include.php');
+/*
+* Archivo de control. Realizar una prueba a un paciente
+* Caso de uso: REALIZAR UNA PRUEBA
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+
+	
+	$html=new Smarty;
+
+
+	// Barra
+	barra();
+	// Fin de barra
+
+	$id_admin=	$_GET["variable"]; 
+	$ensayo= 	$_POST['ensayo'];
+	$edad=		$_POST['edad'];
+	$sexo=		$_POST['sexo'];
+	$simetria=	$_POST['simetria'];
+	$anotaciones_sujeto=$_POST['anotaciones_sujeto'];
+	$anotaciones_prueba=$_POST['anotaciones_prueba'];
+
+
+	// recuperamos el id_ensayo con el ensayo
+	$result = $conex->query("SELECT id_ensayo, coloc_sensores, duracion, repeticiones FROM `ENSAYOS` WHERE `tipo` = '$ensayo'"); 
+	$row = $result->fetch_assoc();
+	$id_ensayo=$row['id_ensayo'];
+	$coloc_sensores=nl2br($row['coloc_sensores']);
+	$duracion=$row['duracion'];
+	$repeticiones=$row['repeticiones'];
+	if ($duracion == 15) $getESP = 'A';
+	if ($duracion == 30) $getESP = 'B';
+	if ($duracion == 45) $getESP = 'C';
+	if ($duracion == 60) $getESP = 'D';
+	if ($duracion == 75) $getESP = 'E';
+	if ($duracion == 90) $getESP = 'F';
+
+	//Creamos el nuevo sujeto en la tabla de sujetos y obtenemos el id que se le asigna (contamos con que el id es AUTO_INCREMENT)
+	if($anotaciones_sujeto == ""){
+		$sql = "INSERT INTO `SUJETOS` (`sexo`, `edad`, `anotaciones`)
+					VALUES ('$sexo', '$edad', NULL)";
+	}else{
+		$sql = "INSERT INTO `SUJETOS` (`sexo`, `edad`, `anotaciones`)
+					VALUES ('$sexo', '$edad', '$anotaciones_sujeto')";
+	}
+
+	if($conex->query($sql)){
+		$result = $conex->query("SELECT MAX(`id_sujeto`) AS id FROM SUJETOS");
+		$row = $result->fetch_assoc();
+		$id_sujeto=$row['id'];
+		//Hacemos el insert en la tabla de las pruebas de un paciente
+		if($simetria == "" && $anotaciones_prueba == ""){//Simetria y anotaciones vacias
+			$sql = "INSERT INTO `PRUEBAS_SUJETOS` (`id_ensayo`,  `fecha`, `simetria`, `anotaciones`, `id_sujeto`)
+						VALUES ('$id_ensayo', NOW(), NULL, NULL, '$id_sujeto')";
+		}elseif ($simetria != "" && $anotaciones_prueba == ""){//Anotaciones vacias
+			$sql = "INSERT INTO `PRUEBAS_SUJETOS` (`id_ensayo`,  `fecha`, `simetria`, `anotaciones`, `id_sujeto`)
+						VALUES ('$id_ensayo', NOW(), '$simetria', NULL, '$id_sujeto')";
+		}elseif ($simetria == "" && $anotaciones_prueba != ""){//Simetria vac�a
+			$sql = "INSERT INTO `PRUEBAS_SUJETOS` (`id_ensayo`,  `fecha`, `simetria`, `anotaciones`, `id_sujeto`)
+						VALUES ('$id_ensayo', NOW(), NULL, '$anotaciones_prueba', '$id_sujeto')";
+		}else{//Ning�n campo vac�o
+			$sql = "INSERT INTO `PRUEBAS_SUJETOS` (`id_ensayo`,  `fecha`, `simetria`, `anotaciones`, `id_sujeto`)
+						VALUES ('$id_ensayo', NOW(), '$simetria', '$anotaciones_prueba' ,'$id_sujeto')";
+		}
+		if (!$conex->query($sql))
+			{
+				$mensaje.="Error: \n". $conex->error. "DNI: $id_sujeto";
+			}
+		else {
+			$mensaje.= "Actualizada prueba ";
+			$result = $conex->query("SELECT max(`id_prueba_sujeto`) as num FROM `PRUEBAS_SUJETOS` WHERE `id_sujeto`= '$id_sujeto'");
+			$row = $result->fetch_assoc();
+			$id_prueba = $row["num"];
+		}
+	}else $mensaje=$$id_admin .", ".$ensayo.", ".	$edad.", ".	$sexo.", ".	$simetria.", ".	$anotaciones_sujeto.", ".	$anotaciones_prueba	;
+
+	$imagen = imagen('media/images/ensayo/',$ensayo); // Aqu� ejecutamos la funci�n para obtener la imagen y en caso de no existir poner una alternativa (por definir)
+			
+	$html->assign("imagen",$imagen);
+	$html->assign("id_sujeto",$id_sujeto);
+	$html->assign("segundos",$duracion);
+	$html->assign("coloc_sensores",$coloc_sensores);
+	$html->assign("get",$getESP);
+	$html->assign("repeticiones",$repeticiones);
+	$html->assign("ensayo",$ensayo);
+	$html->assign("id_admin",$id_admin);
+	$html->assign("id_prueba",$id_prueba);
+	$html->assign("mensaje",$mensaje);	
+	$html->display("prueba_sujeto_val.tpl");		
+
+}
+else	@header('location:index.php');
+
+?>		
diff --git a/result.php b/result.php
new file mode 100644
index 0000000000000000000000000000000000000000..6232f22cd5561bdb5d69110fadb846bef9536194
--- /dev/null
+++ b/result.php
@@ -0,0 +1,72 @@
+<?php session_start(); 
+require('include.php');
+require_once("funciones.php");
+/*
+* Archivo de control. Página de inicio donde se muestra un listado de los pacientes
+* Caso de uso: VER DATOS DE UN PACIENTE
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+
+	$id_admin=$_GET["variable"];
+	$accion=$_GET["accion"]; 
+
+	$html=new Smarty;
+
+	barra();
+	$mensaje="";
+
+	
+	if($accion == 1){//eliminar un paciente
+		$id_paciente = $_GET["id"];
+		$sql="DELETE FROM `PACIENTES` WHERE `dni_paciente`='$id_paciente'";
+		if ($conex->query($sql)){
+			$mensaje ="";
+		}else{
+			$mensaje ="Error al borrar el paciente";
+		}
+	}
+
+	$sql="SELECT `dni_paciente`, `nombre`, `apellidos`, `sexo`, `edad`, `anotaciones`
+			FROM PACIENTES
+	 ";
+	$result=$conex->query($sql);
+
+	$x = 0;
+	// rellenamos array con tabla obtenida
+	while ($row = $result->fetch_assoc()){
+		$date = date_create(date("d-m-Y"))->diff(date_create($row['edad']));
+		if($date->y != 0){
+				$date = $date->y . " a&ntildeos";
+		}elseif($date->m != 0){
+			$date = $date->m . " meses";
+		}else{
+			$date = $date->d . " d&iacuteas";
+		}
+		$entrada[$x]=[
+			$row['dni_paciente'],
+			$row['nombre'],
+			$row['apellidos'],
+			$row['sexo'],
+			$date,
+			$row['anotaciones'],
+			$row['edad'],
+					];
+		$x++;
+	}
+
+
+	$html->assign("id_admin",$id_admin);
+	$html->assign("entrada",$entrada);
+	$html->assign("mensaje",$mensaje);
+
+	// inicamos template
+	if($mensaje=="" ){
+		$html->display("result.tpl");
+	}else{
+		$html->display("pac_reg.tpl");
+	}
+	
+}
+
+else	@header('location:index.php');
+?>		
diff --git a/sysplugins/smarty_cacheresource.php b/sysplugins/smarty_cacheresource.php
new file mode 100644
index 0000000000000000000000000000000000000000..91e9f39246adf1840b830a7ebb4e1334293e0ce9
--- /dev/null
+++ b/sysplugins/smarty_cacheresource.php
@@ -0,0 +1,219 @@
+<?php
+/**
+ * Smarty Internal Plugin
+ *
+ * @package    Smarty
+ * @subpackage Cacher
+ */
+
+/**
+ * Cache Handler API
+ *
+ * @package    Smarty
+ * @subpackage Cacher
+ * @author     Rodney Rehm
+ */
+abstract class Smarty_CacheResource
+{
+    /**
+     * resource types provided by the core
+     *
+     * @var array
+     */
+    protected static $sysplugins = array('file' => 'smarty_internal_cacheresource_file.php',);
+
+    /**
+     * populate Cached Object with meta data from Resource
+     *
+     * @param \Smarty_Template_Cached  $cached    cached object
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @return void
+     */
+    abstract public function populate(\Smarty_Template_Cached $cached, Smarty_Internal_Template $_template);
+
+    /**
+     * populate Cached Object with timestamp and exists from Resource
+     *
+     * @param Smarty_Template_Cached $cached
+     *
+     * @return void
+     */
+    abstract public function populateTimestamp(Smarty_Template_Cached $cached);
+
+    /**
+     * Read the cached template and process header
+     *
+     * @param Smarty_Internal_Template $_template template object
+     * @param Smarty_Template_Cached   $cached    cached object
+     * @param boolean                  $update    flag if called because cache update
+     *
+     * @return boolean true or false if the cached content does not exist
+     */
+    abstract public function process(
+        Smarty_Internal_Template $_template,
+        Smarty_Template_Cached $cached = null,
+        $update = false
+    );
+
+    /**
+     * Write the rendered template output to cache
+     *
+     * @param Smarty_Internal_Template $_template template object
+     * @param string                   $content   content to cache
+     *
+     * @return boolean success
+     */
+    abstract public function writeCachedContent(Smarty_Internal_Template $_template, $content);
+
+    /**
+     * Read cached template from cache
+     *
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @return string  content
+     */
+    abstract public function readCachedContent(Smarty_Internal_Template $_template);
+
+    /**
+     * Return cached content
+     *
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @return null|string
+     */
+    public function getCachedContent(Smarty_Internal_Template $_template)
+    {
+        if ($_template->cached->handler->process($_template)) {
+            ob_start();
+            $unifunc = $_template->cached->unifunc;
+            $unifunc($_template);
+            return ob_get_clean();
+        }
+        return null;
+    }
+
+    /**
+     * Empty cache
+     *
+     * @param Smarty  $smarty   Smarty object
+     * @param integer $exp_time expiration time (number of seconds, not timestamp)
+     *
+     * @return integer number of cache files deleted
+     */
+    abstract public function clearAll(Smarty $smarty, $exp_time = null);
+
+    /**
+     * Empty cache for a specific template
+     *
+     * @param Smarty  $smarty        Smarty object
+     * @param string  $resource_name template name
+     * @param string  $cache_id      cache id
+     * @param string  $compile_id    compile id
+     * @param integer $exp_time      expiration time (number of seconds, not timestamp)
+     *
+     * @return integer number of cache files deleted
+     */
+    abstract public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time);
+
+    /**
+     * @param Smarty                 $smarty
+     * @param Smarty_Template_Cached $cached
+     *
+     * @return bool|null
+     */
+    public function locked(Smarty $smarty, Smarty_Template_Cached $cached)
+    {
+        // theoretically locking_timeout should be checked against time_limit (max_execution_time)
+        $start = microtime(true);
+        $hadLock = null;
+        while ($this->hasLock($smarty, $cached)) {
+            $hadLock = true;
+            if (microtime(true) - $start > $smarty->locking_timeout) {
+                // abort waiting for lock release
+                return false;
+            }
+            sleep(1);
+        }
+        return $hadLock;
+    }
+
+    /**
+     * Check is cache is locked for this template
+     *
+     * @param Smarty                 $smarty
+     * @param Smarty_Template_Cached $cached
+     *
+     * @return bool
+     */
+    public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached)
+    {
+        // check if lock exists
+        return false;
+    }
+
+    /**
+     * Lock cache for this template
+     *
+     * @param Smarty                 $smarty
+     * @param Smarty_Template_Cached $cached
+     *
+     * @return bool
+     */
+    public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached)
+    {
+        // create lock
+        return true;
+    }
+
+    /**
+     * Unlock cache for this template
+     *
+     * @param Smarty                 $smarty
+     * @param Smarty_Template_Cached $cached
+     *
+     * @return bool
+     */
+    public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached)
+    {
+        // release lock
+        return true;
+    }
+
+    /**
+     * Load Cache Resource Handler
+     *
+     * @param Smarty $smarty Smarty object
+     * @param string $type   name of the cache resource
+     *
+     * @throws SmartyException
+     * @return Smarty_CacheResource Cache Resource Handler
+     */
+    public static function load(Smarty $smarty, $type = null)
+    {
+        if (!isset($type)) {
+            $type = $smarty->caching_type;
+        }
+        // try smarty's cache
+        if (isset($smarty->_cache[ 'cacheresource_handlers' ][ $type ])) {
+            return $smarty->_cache[ 'cacheresource_handlers' ][ $type ];
+        }
+        // try registered resource
+        if (isset($smarty->registered_cache_resources[ $type ])) {
+            // do not cache these instances as they may vary from instance to instance
+            return $smarty->_cache[ 'cacheresource_handlers' ][ $type ] = $smarty->registered_cache_resources[ $type ];
+        }
+        // try sysplugins dir
+        if (isset(self::$sysplugins[ $type ])) {
+            $cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($type);
+            return $smarty->_cache[ 'cacheresource_handlers' ][ $type ] = new $cache_resource_class();
+        }
+        // try plugins dir
+        $cache_resource_class = 'Smarty_CacheResource_' . ucfirst($type);
+        if ($smarty->loadPlugin($cache_resource_class)) {
+            return $smarty->_cache[ 'cacheresource_handlers' ][ $type ] = new $cache_resource_class();
+        }
+        // give up
+        throw new SmartyException("Unable to load cache resource '{$type}'");
+    }
+}
diff --git a/sysplugins/smarty_cacheresource_custom.php b/sysplugins/smarty_cacheresource_custom.php
new file mode 100644
index 0000000000000000000000000000000000000000..68ad112891a232cbb27dadd9e7397760f6009fc1
--- /dev/null
+++ b/sysplugins/smarty_cacheresource_custom.php
@@ -0,0 +1,297 @@
+<?php
+/**
+ * Smarty Internal Plugin
+ *
+ * @package    Smarty
+ * @subpackage Cacher
+ */
+
+/**
+ * Cache Handler API
+ *
+ * @package    Smarty
+ * @subpackage Cacher
+ * @author     Rodney Rehm
+ */
+abstract class Smarty_CacheResource_Custom extends Smarty_CacheResource
+{
+    /**
+     * fetch cached content and its modification time from data source
+     *
+     * @param string  $id         unique cache content identifier
+     * @param string  $name       template name
+     * @param string  $cache_id   cache id
+     * @param string  $compile_id compile id
+     * @param string  $content    cached content
+     * @param integer $mtime      cache modification timestamp (epoch)
+     *
+     * @return void
+     */
+    abstract protected function fetch($id, $name, $cache_id, $compile_id, &$content, &$mtime);
+
+    /**
+     * Fetch cached content's modification timestamp from data source
+     * {@internal implementing this method is optional.
+     *  Only implement it if modification times can be accessed faster than loading the complete cached content.}}
+     *
+     * @param string $id         unique cache content identifier
+     * @param string $name       template name
+     * @param string $cache_id   cache id
+     * @param string $compile_id compile id
+     *
+     * @return integer|boolean timestamp (epoch) the template was modified, or false if not found
+     */
+    protected function fetchTimestamp($id, $name, $cache_id, $compile_id)
+    {
+        return false;
+    }
+
+    /**
+     * Save content to cache
+     *
+     * @param string       $id         unique cache content identifier
+     * @param string       $name       template name
+     * @param string       $cache_id   cache id
+     * @param string       $compile_id compile id
+     * @param integer|null $exp_time   seconds till expiration or null
+     * @param string       $content    content to cache
+     *
+     * @return boolean      success
+     */
+    abstract protected function save($id, $name, $cache_id, $compile_id, $exp_time, $content);
+
+    /**
+     * Delete content from cache
+     *
+     * @param string|null  $name       template name
+     * @param string|null  $cache_id   cache id
+     * @param string|null  $compile_id compile id
+     * @param integer|null $exp_time   seconds till expiration time in seconds or null
+     *
+     * @return integer      number of deleted caches
+     */
+    abstract protected function delete($name, $cache_id, $compile_id, $exp_time);
+
+    /**
+     * populate Cached Object with meta data from Resource
+     *
+     * @param Smarty_Template_Cached   $cached    cached object
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @return void
+     */
+    public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template)
+    {
+        $_cache_id = isset($cached->cache_id) ? preg_replace('![^\w\|]+!', '_', $cached->cache_id) : null;
+        $_compile_id = isset($cached->compile_id) ? preg_replace('![^\w]+!', '_', $cached->compile_id) : null;
+        $path = $cached->source->uid . $_cache_id . $_compile_id;
+        $cached->filepath = sha1($path);
+        if ($_template->smarty->cache_locking) {
+            $cached->lock_id = sha1('lock.' . $path);
+        }
+        $this->populateTimestamp($cached);
+    }
+
+    /**
+     * populate Cached Object with timestamp and exists from Resource
+     *
+     * @param Smarty_Template_Cached $cached
+     *
+     * @return void
+     */
+    public function populateTimestamp(Smarty_Template_Cached $cached)
+    {
+        $mtime =
+            $this->fetchTimestamp($cached->filepath, $cached->source->name, $cached->cache_id, $cached->compile_id);
+        if ($mtime !== null) {
+            $cached->timestamp = $mtime;
+            $cached->exists = !!$cached->timestamp;
+            return;
+        }
+        $timestamp = null;
+        $this->fetch(
+            $cached->filepath,
+            $cached->source->name,
+            $cached->cache_id,
+            $cached->compile_id,
+            $cached->content,
+            $timestamp
+        );
+        $cached->timestamp = isset($timestamp) ? $timestamp : false;
+        $cached->exists = !!$cached->timestamp;
+    }
+
+    /**
+     * Read the cached template and process the header
+     *
+     * @param \Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template
+     * @param Smarty_Template_Cached    $cached      cached object
+     * @param boolean                   $update      flag if called because cache update
+     *
+     * @return boolean                 true or false if the cached content does not exist
+     */
+    public function process(
+        Smarty_Internal_Template $_smarty_tpl,
+        Smarty_Template_Cached $cached = null,
+        $update = false
+    ) {
+        if (!$cached) {
+            $cached = $_smarty_tpl->cached;
+        }
+        $content = $cached->content ? $cached->content : null;
+        $timestamp = $cached->timestamp ? $cached->timestamp : null;
+        if ($content === null || !$timestamp) {
+            $this->fetch(
+                $_smarty_tpl->cached->filepath,
+                $_smarty_tpl->source->name,
+                $_smarty_tpl->cache_id,
+                $_smarty_tpl->compile_id,
+                $content,
+                $timestamp
+            );
+        }
+        if (isset($content)) {
+            eval('?>' . $content);
+            $cached->content = null;
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Write the rendered template output to cache
+     *
+     * @param Smarty_Internal_Template $_template template object
+     * @param string                   $content   content to cache
+     *
+     * @return boolean                  success
+     */
+    public function writeCachedContent(Smarty_Internal_Template $_template, $content)
+    {
+        return $this->save(
+            $_template->cached->filepath,
+            $_template->source->name,
+            $_template->cache_id,
+            $_template->compile_id,
+            $_template->cache_lifetime,
+            $content
+        );
+    }
+
+    /**
+     * Read cached template from cache
+     *
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @return string|boolean  content
+     */
+    public function readCachedContent(Smarty_Internal_Template $_template)
+    {
+        $content = $_template->cached->content ? $_template->cached->content : null;
+        $timestamp = null;
+        if ($content === null) {
+            $timestamp = null;
+            $this->fetch(
+                $_template->cached->filepath,
+                $_template->source->name,
+                $_template->cache_id,
+                $_template->compile_id,
+                $content,
+                $timestamp
+            );
+        }
+        if (isset($content)) {
+            return $content;
+        }
+        return false;
+    }
+
+    /**
+     * Empty cache
+     *
+     * @param Smarty  $smarty   Smarty object
+     * @param integer $exp_time expiration time (number of seconds, not timestamp)
+     *
+     * @return integer number of cache files deleted
+     */
+    public function clearAll(Smarty $smarty, $exp_time = null)
+    {
+        return $this->delete(null, null, null, $exp_time);
+    }
+
+    /**
+     * Empty cache for a specific template
+     *
+     * @param Smarty  $smarty        Smarty object
+     * @param string  $resource_name template name
+     * @param string  $cache_id      cache id
+     * @param string  $compile_id    compile id
+     * @param integer $exp_time      expiration time (number of seconds, not timestamp)
+     *
+     * @return int number of cache files deleted
+     * @throws \SmartyException
+     */
+    public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time)
+    {
+        $cache_name = null;
+        if (isset($resource_name)) {
+            $source = Smarty_Template_Source::load(null, $smarty, $resource_name);
+            if ($source->exists) {
+                $cache_name = $source->name;
+            } else {
+                return 0;
+            }
+        }
+        return $this->delete($cache_name, $cache_id, $compile_id, $exp_time);
+    }
+
+    /**
+     * Check is cache is locked for this template
+     *
+     * @param Smarty                 $smarty Smarty object
+     * @param Smarty_Template_Cached $cached cached object
+     *
+     * @return boolean               true or false if cache is locked
+     */
+    public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached)
+    {
+        $id = $cached->lock_id;
+        $name = $cached->source->name . '.lock';
+        $mtime = $this->fetchTimestamp($id, $name, $cached->cache_id, $cached->compile_id);
+        if ($mtime === null) {
+            $this->fetch($id, $name, $cached->cache_id, $cached->compile_id, $content, $mtime);
+        }
+        return $mtime && ($t = time()) - $mtime < $smarty->locking_timeout;
+    }
+
+    /**
+     * Lock cache for this template
+     *
+     * @param Smarty                 $smarty Smarty object
+     * @param Smarty_Template_Cached $cached cached object
+     *
+     * @return bool|void
+     */
+    public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached)
+    {
+        $cached->is_locked = true;
+        $id = $cached->lock_id;
+        $name = $cached->source->name . '.lock';
+        $this->save($id, $name, $cached->cache_id, $cached->compile_id, $smarty->locking_timeout, '');
+    }
+
+    /**
+     * Unlock cache for this template
+     *
+     * @param Smarty                 $smarty Smarty object
+     * @param Smarty_Template_Cached $cached cached object
+     *
+     * @return bool|void
+     */
+    public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached)
+    {
+        $cached->is_locked = false;
+        $name = $cached->source->name . '.lock';
+        $this->delete($name, $cached->cache_id, $cached->compile_id, null);
+    }
+}
diff --git a/sysplugins/smarty_cacheresource_keyvaluestore.php b/sysplugins/smarty_cacheresource_keyvaluestore.php
new file mode 100644
index 0000000000000000000000000000000000000000..59bf1d4a8d0275223628bb2c2bd0440392fa928a
--- /dev/null
+++ b/sysplugins/smarty_cacheresource_keyvaluestore.php
@@ -0,0 +1,538 @@
+<?php
+/**
+ * Smarty Internal Plugin
+ *
+ * @package    Smarty
+ * @subpackage Cacher
+ */
+
+/**
+ * Smarty Cache Handler Base for Key/Value Storage Implementations
+ * This class implements the functionality required to use simple key/value stores
+ * for hierarchical cache groups. key/value stores like memcache or APC do not support
+ * wildcards in keys, therefore a cache group cannot be cleared like "a|*" - which
+ * is no problem to filesystem and RDBMS implementations.
+ * This implementation is based on the concept of invalidation. While one specific cache
+ * can be identified and cleared, any range of caches cannot be identified. For this reason
+ * each level of the cache group hierarchy can have its own value in the store. These values
+ * are nothing but microtimes, telling us when a particular cache group was cleared for the
+ * last time. These keys are evaluated for every cache read to determine if the cache has
+ * been invalidated since it was created and should hence be treated as inexistent.
+ * Although deep hierarchies are possible, they are not recommended. Try to keep your
+ * cache groups as shallow as possible. Anything up 3-5 parents should be ok. So
+ * »a|b|c« is a good depth where »a|b|c|d|e|f|g|h|i|j|k« isn't. Try to join correlating
+ * cache groups: if your cache groups look somewhat like »a|b|$page|$items|$whatever«
+ * consider using »a|b|c|$page-$items-$whatever« instead.
+ *
+ * @package    Smarty
+ * @subpackage Cacher
+ * @author     Rodney Rehm
+ */
+abstract class Smarty_CacheResource_KeyValueStore extends Smarty_CacheResource
+{
+    /**
+     * cache for contents
+     *
+     * @var array
+     */
+    protected $contents = array();
+
+    /**
+     * cache for timestamps
+     *
+     * @var array
+     */
+    protected $timestamps = array();
+
+    /**
+     * populate Cached Object with meta data from Resource
+     *
+     * @param Smarty_Template_Cached   $cached    cached object
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @return void
+     */
+    public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template)
+    {
+        $cached->filepath = $_template->source->uid . '#' . $this->sanitize($cached->source->resource) . '#' .
+                            $this->sanitize($cached->cache_id) . '#' . $this->sanitize($cached->compile_id);
+        $this->populateTimestamp($cached);
+    }
+
+    /**
+     * populate Cached Object with timestamp and exists from Resource
+     *
+     * @param Smarty_Template_Cached $cached cached object
+     *
+     * @return void
+     */
+    public function populateTimestamp(Smarty_Template_Cached $cached)
+    {
+        if (!$this->fetch(
+            $cached->filepath,
+            $cached->source->name,
+            $cached->cache_id,
+            $cached->compile_id,
+            $content,
+            $timestamp,
+            $cached->source->uid
+        )
+        ) {
+            return;
+        }
+        $cached->content = $content;
+        $cached->timestamp = (int)$timestamp;
+        $cached->exists = !!$cached->timestamp;
+    }
+
+    /**
+     * Read the cached template and process the header
+     *
+     * @param \Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template
+     * @param Smarty_Template_Cached    $cached      cached object
+     * @param boolean                   $update      flag if called because cache update
+     *
+     * @return boolean                 true or false if the cached content does not exist
+     */
+    public function process(
+        Smarty_Internal_Template $_smarty_tpl,
+        Smarty_Template_Cached $cached = null,
+        $update = false
+    ) {
+        if (!$cached) {
+            $cached = $_smarty_tpl->cached;
+        }
+        $content = $cached->content ? $cached->content : null;
+        $timestamp = $cached->timestamp ? $cached->timestamp : null;
+        if ($content === null || !$timestamp) {
+            if (!$this->fetch(
+                $_smarty_tpl->cached->filepath,
+                $_smarty_tpl->source->name,
+                $_smarty_tpl->cache_id,
+                $_smarty_tpl->compile_id,
+                $content,
+                $timestamp,
+                $_smarty_tpl->source->uid
+            )
+            ) {
+                return false;
+            }
+        }
+        if (isset($content)) {
+            eval('?>' . $content);
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Write the rendered template output to cache
+     *
+     * @param Smarty_Internal_Template $_template template object
+     * @param string                   $content   content to cache
+     *
+     * @return boolean                  success
+     */
+    public function writeCachedContent(Smarty_Internal_Template $_template, $content)
+    {
+        $this->addMetaTimestamp($content);
+        return $this->write(array($_template->cached->filepath => $content), $_template->cache_lifetime);
+    }
+
+    /**
+     * Read cached template from cache
+     *
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @return string|false  content
+     */
+    public function readCachedContent(Smarty_Internal_Template $_template)
+    {
+        $content = $_template->cached->content ? $_template->cached->content : null;
+        $timestamp = null;
+        if ($content === null) {
+            if (!$this->fetch(
+                $_template->cached->filepath,
+                $_template->source->name,
+                $_template->cache_id,
+                $_template->compile_id,
+                $content,
+                $timestamp,
+                $_template->source->uid
+            )
+            ) {
+                return false;
+            }
+        }
+        if (isset($content)) {
+            return $content;
+        }
+        return false;
+    }
+
+    /**
+     * Empty cache
+     * {@internal the $exp_time argument is ignored altogether }}
+     *
+     * @param Smarty  $smarty   Smarty object
+     * @param integer $exp_time expiration time [being ignored]
+     *
+     * @return integer number of cache files deleted [always -1]
+     * @uses   purge() to clear the whole store
+     * @uses   invalidate() to mark everything outdated if purge() is inapplicable
+     */
+    public function clearAll(Smarty $smarty, $exp_time = null)
+    {
+        if (!$this->purge()) {
+            $this->invalidate(null);
+        }
+        return -1;
+    }
+
+    /**
+     * Empty cache for a specific template
+     * {@internal the $exp_time argument is ignored altogether}}
+     *
+     * @param Smarty  $smarty        Smarty object
+     * @param string  $resource_name template name
+     * @param string  $cache_id      cache id
+     * @param string  $compile_id    compile id
+     * @param integer $exp_time      expiration time [being ignored]
+     *
+     * @return int number of cache files deleted [always -1]
+     * @throws \SmartyException
+     * @uses   buildCachedFilepath() to generate the CacheID
+     * @uses   invalidate() to mark CacheIDs parent chain as outdated
+     * @uses   delete() to remove CacheID from cache
+     */
+    public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time)
+    {
+        $uid = $this->getTemplateUid($smarty, $resource_name);
+        $cid = $uid . '#' . $this->sanitize($resource_name) . '#' . $this->sanitize($cache_id) . '#' .
+               $this->sanitize($compile_id);
+        $this->delete(array($cid));
+        $this->invalidate($cid, $resource_name, $cache_id, $compile_id, $uid);
+        return -1;
+    }
+
+    /**
+     * Get template's unique ID
+     *
+     * @param Smarty $smarty        Smarty object
+     * @param string $resource_name template name
+     *
+     * @return string filepath of cache file
+     * @throws \SmartyException
+     */
+    protected function getTemplateUid(Smarty $smarty, $resource_name)
+    {
+        if (isset($resource_name)) {
+            $source = Smarty_Template_Source::load(null, $smarty, $resource_name);
+            if ($source->exists) {
+                return $source->uid;
+            }
+        }
+        return '';
+    }
+
+    /**
+     * Sanitize CacheID components
+     *
+     * @param string $string CacheID component to sanitize
+     *
+     * @return string sanitized CacheID component
+     */
+    protected function sanitize($string)
+    {
+        $string = trim($string, '|');
+        if (!$string) {
+            return '';
+        }
+        return preg_replace('#[^\w\|]+#S', '_', $string);
+    }
+
+    /**
+     * Fetch and prepare a cache object.
+     *
+     * @param string  $cid           CacheID to fetch
+     * @param string  $resource_name template name
+     * @param string  $cache_id      cache id
+     * @param string  $compile_id    compile id
+     * @param string  $content       cached content
+     * @param integer &$timestamp    cached timestamp (epoch)
+     * @param string  $resource_uid  resource's uid
+     *
+     * @return boolean success
+     */
+    protected function fetch(
+        $cid,
+        $resource_name = null,
+        $cache_id = null,
+        $compile_id = null,
+        &$content = null,
+        &$timestamp = null,
+        $resource_uid = null
+    ) {
+        $t = $this->read(array($cid));
+        $content = !empty($t[ $cid ]) ? $t[ $cid ] : null;
+        $timestamp = null;
+        if ($content && ($timestamp = $this->getMetaTimestamp($content))) {
+            $invalidated =
+                $this->getLatestInvalidationTimestamp($cid, $resource_name, $cache_id, $compile_id, $resource_uid);
+            if ($invalidated > $timestamp) {
+                $timestamp = null;
+                $content = null;
+            }
+        }
+        return !!$content;
+    }
+
+    /**
+     * Add current microtime to the beginning of $cache_content
+     * {@internal the header uses 8 Bytes, the first 4 Bytes are the seconds, the second 4 Bytes are the microseconds}}
+     *
+     * @param string &$content the content to be cached
+     */
+    protected function addMetaTimestamp(&$content)
+    {
+        $mt = explode(' ', microtime());
+        $ts = pack('NN', $mt[ 1 ], (int)($mt[ 0 ] * 100000000));
+        $content = $ts . $content;
+    }
+
+    /**
+     * Extract the timestamp the $content was cached
+     *
+     * @param string &$content the cached content
+     *
+     * @return float  the microtime the content was cached
+     */
+    protected function getMetaTimestamp(&$content)
+    {
+        extract(unpack('N1s/N1m/a*content', $content));
+        /**
+         * @var  int $s
+         * @var  int $m
+         */
+        return $s + ($m / 100000000);
+    }
+
+    /**
+     * Invalidate CacheID
+     *
+     * @param string $cid           CacheID
+     * @param string $resource_name template name
+     * @param string $cache_id      cache id
+     * @param string $compile_id    compile id
+     * @param string $resource_uid  source's uid
+     *
+     * @return void
+     */
+    protected function invalidate(
+        $cid = null,
+        $resource_name = null,
+        $cache_id = null,
+        $compile_id = null,
+        $resource_uid = null
+    ) {
+        $now = microtime(true);
+        $key = null;
+        // invalidate everything
+        if (!$resource_name && !$cache_id && !$compile_id) {
+            $key = 'IVK#ALL';
+        } // invalidate all caches by template
+        else {
+            if ($resource_name && !$cache_id && !$compile_id) {
+                $key = 'IVK#TEMPLATE#' . $resource_uid . '#' . $this->sanitize($resource_name);
+            } // invalidate all caches by cache group
+            else {
+                if (!$resource_name && $cache_id && !$compile_id) {
+                    $key = 'IVK#CACHE#' . $this->sanitize($cache_id);
+                } // invalidate all caches by compile id
+                else {
+                    if (!$resource_name && !$cache_id && $compile_id) {
+                        $key = 'IVK#COMPILE#' . $this->sanitize($compile_id);
+                    } // invalidate by combination
+                    else {
+                        $key = 'IVK#CID#' . $cid;
+                    }
+                }
+            }
+        }
+        $this->write(array($key => $now));
+    }
+
+    /**
+     * Determine the latest timestamp known to the invalidation chain
+     *
+     * @param string $cid           CacheID to determine latest invalidation timestamp of
+     * @param string $resource_name template name
+     * @param string $cache_id      cache id
+     * @param string $compile_id    compile id
+     * @param string $resource_uid  source's filepath
+     *
+     * @return float  the microtime the CacheID was invalidated
+     */
+    protected function getLatestInvalidationTimestamp(
+        $cid,
+        $resource_name = null,
+        $cache_id = null,
+        $compile_id = null,
+        $resource_uid = null
+    ) {
+        // abort if there is no CacheID
+        if (false && !$cid) {
+            return 0;
+        }
+        // abort if there are no InvalidationKeys to check
+        if (!($_cid = $this->listInvalidationKeys($cid, $resource_name, $cache_id, $compile_id, $resource_uid))) {
+            return 0;
+        }
+        // there are no InValidationKeys
+        if (!($values = $this->read($_cid))) {
+            return 0;
+        }
+        // make sure we're dealing with floats
+        $values = array_map('floatval', $values);
+        return max($values);
+    }
+
+    /**
+     * Translate a CacheID into the list of applicable InvalidationKeys.
+     * Splits 'some|chain|into|an|array' into array( '#clearAll#', 'some', 'some|chain', 'some|chain|into', ... )
+     *
+     * @param string $cid           CacheID to translate
+     * @param string $resource_name template name
+     * @param string $cache_id      cache id
+     * @param string $compile_id    compile id
+     * @param string $resource_uid  source's filepath
+     *
+     * @return array  list of InvalidationKeys
+     * @uses   $invalidationKeyPrefix to prepend to each InvalidationKey
+     */
+    protected function listInvalidationKeys(
+        $cid,
+        $resource_name = null,
+        $cache_id = null,
+        $compile_id = null,
+        $resource_uid = null
+    ) {
+        $t = array('IVK#ALL');
+        $_name = $_compile = '#';
+        if ($resource_name) {
+            $_name .= $resource_uid . '#' . $this->sanitize($resource_name);
+            $t[] = 'IVK#TEMPLATE' . $_name;
+        }
+        if ($compile_id) {
+            $_compile .= $this->sanitize($compile_id);
+            $t[] = 'IVK#COMPILE' . $_compile;
+        }
+        $_name .= '#';
+        $cid = trim($cache_id, '|');
+        if (!$cid) {
+            return $t;
+        }
+        $i = 0;
+        while (true) {
+            // determine next delimiter position
+            $i = strpos($cid, '|', $i);
+            // add complete CacheID if there are no more delimiters
+            if ($i === false) {
+                $t[] = 'IVK#CACHE#' . $cid;
+                $t[] = 'IVK#CID' . $_name . $cid . $_compile;
+                $t[] = 'IVK#CID' . $_name . $_compile;
+                break;
+            }
+            $part = substr($cid, 0, $i);
+            // add slice to list
+            $t[] = 'IVK#CACHE#' . $part;
+            $t[] = 'IVK#CID' . $_name . $part . $_compile;
+            // skip past delimiter position
+            $i++;
+        }
+        return $t;
+    }
+
+    /**
+     * Check is cache is locked for this template
+     *
+     * @param Smarty                 $smarty Smarty object
+     * @param Smarty_Template_Cached $cached cached object
+     *
+     * @return boolean               true or false if cache is locked
+     */
+    public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached)
+    {
+        $key = 'LOCK#' . $cached->filepath;
+        $data = $this->read(array($key));
+        return $data && time() - $data[ $key ] < $smarty->locking_timeout;
+    }
+
+    /**
+     * Lock cache for this template
+     *
+     * @param Smarty                 $smarty Smarty object
+     * @param Smarty_Template_Cached $cached cached object
+     *
+     * @return bool|void
+     */
+    public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached)
+    {
+        $cached->is_locked = true;
+        $key = 'LOCK#' . $cached->filepath;
+        $this->write(array($key => time()), $smarty->locking_timeout);
+    }
+
+    /**
+     * Unlock cache for this template
+     *
+     * @param Smarty                 $smarty Smarty object
+     * @param Smarty_Template_Cached $cached cached object
+     *
+     * @return bool|void
+     */
+    public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached)
+    {
+        $cached->is_locked = false;
+        $key = 'LOCK#' . $cached->filepath;
+        $this->delete(array($key));
+    }
+
+    /**
+     * Read values for a set of keys from cache
+     *
+     * @param array $keys list of keys to fetch
+     *
+     * @return array list of values with the given keys used as indexes
+     */
+    abstract protected function read(array $keys);
+
+    /**
+     * Save values for a set of keys to cache
+     *
+     * @param array $keys   list of values to save
+     * @param int   $expire expiration time
+     *
+     * @return boolean true on success, false on failure
+     */
+    abstract protected function write(array $keys, $expire = null);
+
+    /**
+     * Remove values from cache
+     *
+     * @param array $keys list of keys to delete
+     *
+     * @return boolean true on success, false on failure
+     */
+    abstract protected function delete(array $keys);
+
+    /**
+     * Remove *all* values from cache
+     *
+     * @return boolean true on success, false on failure
+     */
+    protected function purge()
+    {
+        return false;
+    }
+}
diff --git a/sysplugins/smarty_data.php b/sysplugins/smarty_data.php
new file mode 100644
index 0000000000000000000000000000000000000000..2545ed3a853ee574f0eac46733ff3657f8b1846b
--- /dev/null
+++ b/sysplugins/smarty_data.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * Smarty Plugin Data
+ * This file contains the data object
+ *
+ * @package    Smarty
+ * @subpackage Template
+ * @author     Uwe Tews
+ */
+
+/**
+ * class for the Smarty data object
+ * The Smarty data object will hold Smarty variables in the current scope
+ *
+ * @package    Smarty
+ * @subpackage Template
+ */
+class Smarty_Data extends Smarty_Internal_Data
+{
+    /**
+     * Counter
+     *
+     * @var int
+     */
+    public static $count = 0;
+
+    /**
+     * Data block name
+     *
+     * @var string
+     */
+    public $dataObjectName = '';
+
+    /**
+     * Smarty object
+     *
+     * @var Smarty
+     */
+    public $smarty = null;
+
+    /**
+     * create Smarty data object
+     *
+     * @param Smarty|array                    $_parent parent template
+     * @param Smarty|Smarty_Internal_Template $smarty  global smarty instance
+     * @param string                          $name    optional data block name
+     *
+     * @throws SmartyException
+     */
+    public function __construct($_parent = null, $smarty = null, $name = null)
+    {
+        parent::__construct();
+        self::$count++;
+        $this->dataObjectName = 'Data_object ' . (isset($name) ? "'{$name}'" : self::$count);
+        $this->smarty = $smarty;
+        if (is_object($_parent)) {
+            // when object set up back pointer
+            $this->parent = $_parent;
+        } elseif (is_array($_parent)) {
+            // set up variable values
+            foreach ($_parent as $_key => $_val) {
+                $this->tpl_vars[ $_key ] = new Smarty_Variable($_val);
+            }
+        } elseif ($_parent !== null) {
+            throw new SmartyException('Wrong type for template variables');
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_block.php b/sysplugins/smarty_internal_block.php
new file mode 100644
index 0000000000000000000000000000000000000000..9956d642ba0662a567f9c4615950ba36f630235c
--- /dev/null
+++ b/sysplugins/smarty_internal_block.php
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * Smarty {block} tag class
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Block
+{
+    /**
+     * Block name
+     *
+     * @var string
+     */
+    public $name = '';
+
+    /**
+     * Hide attribute
+     *
+     * @var bool
+     */
+    public $hide = false;
+
+    /**
+     * Append attribute
+     *
+     * @var bool
+     */
+    public $append = false;
+
+    /**
+     * prepend attribute
+     *
+     * @var bool
+     */
+    public $prepend = false;
+
+    /**
+     * Block calls $smarty.block.child
+     *
+     * @var bool
+     */
+    public $callsChild = false;
+
+    /**
+     * Inheritance child block
+     *
+     * @var Smarty_Internal_Block|null
+     */
+    public $child = null;
+
+    /**
+     * Inheritance calling parent block
+     *
+     * @var Smarty_Internal_Block|null
+     */
+    public $parent = null;
+
+    /**
+     * Inheritance Template index
+     *
+     * @var int
+     */
+    public $tplIndex = 0;
+
+    /**
+     * Smarty_Internal_Block constructor.
+     * - if outer level {block} of child template ($state === 1) save it as child root block
+     * - otherwise process inheritance and render
+     *
+     * @param string   $name     block name
+     * @param int|null $tplIndex index of outer level {block} if nested
+     */
+    public function __construct($name, $tplIndex)
+    {
+        $this->name = $name;
+        $this->tplIndex = $tplIndex;
+    }
+
+    /**
+     * Compiled block code overloaded by {block} class
+     *
+     * @param \Smarty_Internal_Template $tpl
+     */
+    public function callBlock(Smarty_Internal_Template $tpl)
+    {
+    }
+}
diff --git a/sysplugins/smarty_internal_cacheresource_file.php b/sysplugins/smarty_internal_cacheresource_file.php
new file mode 100644
index 0000000000000000000000000000000000000000..61618449da16bb9f59fbdc15c7a41de66fa7aff2
--- /dev/null
+++ b/sysplugins/smarty_internal_cacheresource_file.php
@@ -0,0 +1,239 @@
+<?php
+/**
+ * Smarty Internal Plugin CacheResource File
+ *
+ * @package    Smarty
+ * @subpackage Cacher
+ * @author     Uwe Tews
+ * @author     Rodney Rehm
+ */
+
+/**
+ * This class does contain all necessary methods for the HTML cache on file system
+ * Implements the file system as resource for the HTML cache Version ussing nocache inserts.
+ *
+ * @package    Smarty
+ * @subpackage Cacher
+ */
+class Smarty_Internal_CacheResource_File extends Smarty_CacheResource
+{
+    /**
+     * populate Cached Object with meta data from Resource
+     *
+     * @param Smarty_Template_Cached   $cached    cached object
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @return void
+     */
+    public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template)
+    {
+        $source = &$_template->source;
+        $smarty = &$_template->smarty;
+        $_compile_dir_sep = $smarty->use_sub_dirs ? DIRECTORY_SEPARATOR : '^';
+        $_filepath = sha1($source->uid . $smarty->_joined_template_dir);
+        $cached->filepath = $smarty->getCacheDir();
+        if (isset($_template->cache_id)) {
+            $cached->filepath .= preg_replace(
+                                     array(
+                                         '![^\w|]+!',
+                                         '![|]+!'
+                                     ),
+                                     array(
+                                         '_',
+                                         $_compile_dir_sep
+                                     ),
+                                     $_template->cache_id
+                                 ) . $_compile_dir_sep;
+        }
+        if (isset($_template->compile_id)) {
+            $cached->filepath .= preg_replace('![^\w]+!', '_', $_template->compile_id) . $_compile_dir_sep;
+        }
+        // if use_sub_dirs, break file into directories
+        if ($smarty->use_sub_dirs) {
+            $cached->filepath .= $_filepath[ 0 ] . $_filepath[ 1 ] . DIRECTORY_SEPARATOR . $_filepath[ 2 ] .
+                                 $_filepath[ 3 ] .
+                                 DIRECTORY_SEPARATOR .
+                                 $_filepath[ 4 ] . $_filepath[ 5 ] . DIRECTORY_SEPARATOR;
+        }
+        $cached->filepath .= $_filepath;
+        $basename = $source->handler->getBasename($source);
+        if (!empty($basename)) {
+            $cached->filepath .= '.' . $basename;
+        }
+        if ($smarty->cache_locking) {
+            $cached->lock_id = $cached->filepath . '.lock';
+        }
+        $cached->filepath .= '.php';
+        $cached->timestamp = $cached->exists = is_file($cached->filepath);
+        if ($cached->exists) {
+            $cached->timestamp = filemtime($cached->filepath);
+        }
+    }
+
+    /**
+     * populate Cached Object with timestamp and exists from Resource
+     *
+     * @param Smarty_Template_Cached $cached cached object
+     *
+     * @return void
+     */
+    public function populateTimestamp(Smarty_Template_Cached $cached)
+    {
+        $cached->timestamp = $cached->exists = is_file($cached->filepath);
+        if ($cached->exists) {
+            $cached->timestamp = filemtime($cached->filepath);
+        }
+    }
+
+    /**
+     * Read the cached template and process its header
+     *
+     * @param \Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template
+     * @param Smarty_Template_Cached    $cached      cached object
+     * @param bool                      $update      flag if called because cache update
+     *
+     * @return boolean true or false if the cached content does not exist
+     */
+    public function process(
+        Smarty_Internal_Template $_smarty_tpl,
+        Smarty_Template_Cached $cached = null,
+        $update = false
+    ) {
+        $_smarty_tpl->cached->valid = false;
+        if ($update && defined('HHVM_VERSION')) {
+            eval('?>' . file_get_contents($_smarty_tpl->cached->filepath));
+            return true;
+        } else {
+            return @include $_smarty_tpl->cached->filepath;
+        }
+    }
+
+    /**
+     * Write the rendered template output to cache
+     *
+     * @param Smarty_Internal_Template $_template template object
+     * @param string                   $content   content to cache
+     *
+     * @return bool success
+     * @throws \SmartyException
+     */
+    public function writeCachedContent(Smarty_Internal_Template $_template, $content)
+    {
+        if ($_template->smarty->ext->_writeFile->writeFile(
+                $_template->cached->filepath,
+                $content,
+                $_template->smarty
+            ) === true
+        ) {
+            if (function_exists('opcache_invalidate')
+                && (!function_exists('ini_get') || strlen(ini_get('opcache.restrict_api'))) < 1
+            ) {
+                opcache_invalidate($_template->cached->filepath, true);
+            } elseif (function_exists('apc_compile_file')) {
+                apc_compile_file($_template->cached->filepath);
+            }
+            $cached = $_template->cached;
+            $cached->timestamp = $cached->exists = is_file($cached->filepath);
+            if ($cached->exists) {
+                $cached->timestamp = filemtime($cached->filepath);
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Read cached template from cache
+     *
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @return string  content
+     */
+    public function readCachedContent(Smarty_Internal_Template $_template)
+    {
+        if (is_file($_template->cached->filepath)) {
+            return file_get_contents($_template->cached->filepath);
+        }
+        return false;
+    }
+
+    /**
+     * Empty cache
+     *
+     * @param Smarty  $smarty
+     * @param integer $exp_time expiration time (number of seconds, not timestamp)
+     *
+     * @return integer number of cache files deleted
+     */
+    public function clearAll(Smarty $smarty, $exp_time = null)
+    {
+        return $smarty->ext->_cacheResourceFile->clear($smarty, null, null, null, $exp_time);
+    }
+
+    /**
+     * Empty cache for a specific template
+     *
+     * @param Smarty  $smarty
+     * @param string  $resource_name template name
+     * @param string  $cache_id      cache id
+     * @param string  $compile_id    compile id
+     * @param integer $exp_time      expiration time (number of seconds, not timestamp)
+     *
+     * @return integer number of cache files deleted
+     */
+    public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time)
+    {
+        return $smarty->ext->_cacheResourceFile->clear($smarty, $resource_name, $cache_id, $compile_id, $exp_time);
+    }
+
+    /**
+     * Check is cache is locked for this template
+     *
+     * @param Smarty                 $smarty Smarty object
+     * @param Smarty_Template_Cached $cached cached object
+     *
+     * @return boolean true or false if cache is locked
+     */
+    public function hasLock(Smarty $smarty, Smarty_Template_Cached $cached)
+    {
+        if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
+            clearstatcache(true, $cached->lock_id);
+        } else {
+            clearstatcache();
+        }
+        if (is_file($cached->lock_id)) {
+            $t = filemtime($cached->lock_id);
+            return $t && (time() - $t < $smarty->locking_timeout);
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Lock cache for this template
+     *
+     * @param Smarty                 $smarty Smarty object
+     * @param Smarty_Template_Cached $cached cached object
+     *
+     * @return bool|void
+     */
+    public function acquireLock(Smarty $smarty, Smarty_Template_Cached $cached)
+    {
+        $cached->is_locked = true;
+        touch($cached->lock_id);
+    }
+
+    /**
+     * Unlock cache for this template
+     *
+     * @param Smarty                 $smarty Smarty object
+     * @param Smarty_Template_Cached $cached cached object
+     *
+     * @return bool|void
+     */
+    public function releaseLock(Smarty $smarty, Smarty_Template_Cached $cached)
+    {
+        $cached->is_locked = false;
+        @unlink($cached->lock_id);
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_append.php b/sysplugins/smarty_internal_compile_append.php
new file mode 100644
index 0000000000000000000000000000000000000000..1a9befbf6c65e4c6303d33930fa8bdd47bafee5d
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_append.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Append
+ * Compiles the {append} tag
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Append Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Append extends Smarty_Internal_Compile_Assign
+{
+    /**
+     * Compiles code for the {append} tag
+     *
+     * @param array                                 $args      array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler  compiler object
+     * @param array                                 $parameter array with compilation parameter
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+    {
+        // the following must be assigned at runtime because it will be overwritten in parent class
+        $this->required_attributes = array('var', 'value');
+        $this->shorttag_order = array('var', 'value');
+        $this->optional_attributes = array('scope', 'index');
+        $this->mapCache = array();
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        // map to compile assign attributes
+        if (isset($_attr[ 'index' ])) {
+            $_params[ 'smarty_internal_index' ] = '[' . $_attr[ 'index' ] . ']';
+            unset($_attr[ 'index' ]);
+        } else {
+            $_params[ 'smarty_internal_index' ] = '[]';
+        }
+        $_new_attr = array();
+        foreach ($_attr as $key => $value) {
+            $_new_attr[] = array($key => $value);
+        }
+        // call compile assign
+        return parent::compile($_new_attr, $compiler, $_params);
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_assign.php b/sysplugins/smarty_internal_compile_assign.php
new file mode 100644
index 0000000000000000000000000000000000000000..1f0ab9b7d48fdfad32943672743898044c691be5
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_assign.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Assign
+ * Compiles the {assign} tag
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Assign Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Assign extends Smarty_Internal_CompileBase
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $option_flags = array('nocache', 'noscope');
+
+    /**
+     * Valid scope names
+     *
+     * @var array
+     */
+    public $valid_scopes = array(
+        'local'    => Smarty::SCOPE_LOCAL, 'parent' => Smarty::SCOPE_PARENT,
+        'root'     => Smarty::SCOPE_ROOT, 'global' => Smarty::SCOPE_GLOBAL,
+        'tpl_root' => Smarty::SCOPE_TPL_ROOT, 'smarty' => Smarty::SCOPE_SMARTY
+    );
+
+    /**
+     * Compiles code for the {assign} tag
+     *
+     * @param array                                 $args      array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler  compiler object
+     * @param array                                 $parameter array with compilation parameter
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+    {
+        // the following must be assigned at runtime because it will be overwritten in Smarty_Internal_Compile_Append
+        $this->required_attributes = array('var', 'value');
+        $this->shorttag_order = array('var', 'value');
+        $this->optional_attributes = array('scope');
+        $this->mapCache = array();
+        $_nocache = false;
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        // nocache ?
+        if ($_var = $compiler->getId($_attr[ 'var' ])) {
+            $_var = "'{$_var}'";
+        } else {
+            $_var = $_attr[ 'var' ];
+        }
+        if ($compiler->tag_nocache || $compiler->nocache) {
+            $_nocache = true;
+            // create nocache var to make it know for further compiling
+            $compiler->setNocacheInVariable($_attr[ 'var' ]);
+        }
+        // scope setup
+        if ($_attr[ 'noscope' ]) {
+            $_scope = -1;
+        } else {
+            $_scope = $compiler->convertScope($_attr, $this->valid_scopes);
+        }
+        // optional parameter
+        $_params = '';
+        if ($_nocache || $_scope) {
+            $_params .= ' ,' . var_export($_nocache, true);
+        }
+        if ($_scope) {
+            $_params .= ' ,' . $_scope;
+        }
+        if (isset($parameter[ 'smarty_internal_index' ])) {
+            $output =
+                "<?php \$_tmp_array = isset(\$_smarty_tpl->tpl_vars[{$_var}]) ? \$_smarty_tpl->tpl_vars[{$_var}]->value : array();\n";
+            $output .= "if (!(is_array(\$_tmp_array) || \$_tmp_array instanceof ArrayAccess)) {\n";
+            $output .= "settype(\$_tmp_array, 'array');\n";
+            $output .= "}\n";
+            $output .= "\$_tmp_array{$parameter['smarty_internal_index']} = {$_attr['value']};\n";
+            $output .= "\$_smarty_tpl->_assignInScope({$_var}, \$_tmp_array{$_params});?>";
+        } else {
+            $output = "<?php \$_smarty_tpl->_assignInScope({$_var}, {$_attr['value']}{$_params});?>";
+        }
+        return $output;
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_block.php b/sysplugins/smarty_internal_compile_block.php
new file mode 100644
index 0000000000000000000000000000000000000000..8ff15d8e5bc7b0b3dabf57da3455b0b5ffb3e718
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_block.php
@@ -0,0 +1,189 @@
+<?php
+/**
+ * This file is part of Smarty.
+ *
+ * (c) 2015 Uwe Tews
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Smarty Internal Plugin Compile Block Class
+ *
+ * @author Uwe Tews <uwe.tews@googlemail.com>
+ */
+class Smarty_Internal_Compile_Block extends Smarty_Internal_Compile_Shared_Inheritance
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $required_attributes = array('name');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $shorttag_order = array('name');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $option_flags = array('hide', 'nocache');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $optional_attributes = array('assign');
+
+    /**
+     * Compiles code for the {block} tag
+     *
+     * @param array                                 $args      array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler  compiler object
+     * @param array                                 $parameter array with compilation parameter
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+    {
+        if (!isset($compiler->_cache[ 'blockNesting' ])) {
+            $compiler->_cache[ 'blockNesting' ] = 0;
+        }
+        if ($compiler->_cache[ 'blockNesting' ] === 0) {
+            // make sure that inheritance gets initialized in template code
+            $this->registerInit($compiler);
+            $this->option_flags = array('hide', 'nocache', 'append', 'prepend');
+        } else {
+            $this->option_flags = array('hide', 'nocache');
+        }
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        ++$compiler->_cache[ 'blockNesting' ];
+        $_className = 'Block_' . preg_replace('![^\w]+!', '_', uniqid(mt_rand(), true));
+        $compiler->_cache[ 'blockName' ][ $compiler->_cache[ 'blockNesting' ] ] = $_attr[ 'name' ];
+        $compiler->_cache[ 'blockClass' ][ $compiler->_cache[ 'blockNesting' ] ] = $_className;
+        $compiler->_cache[ 'blockParams' ][ $compiler->_cache[ 'blockNesting' ] ] = array();
+        $compiler->_cache[ 'blockParams' ][ 1 ][ 'subBlocks' ][ trim($_attr[ 'name' ], '"\'') ][] = $_className;
+        $this->openTag(
+            $compiler,
+            'block',
+            array(
+                $_attr, $compiler->nocache, $compiler->parser->current_buffer,
+                $compiler->template->compiled->has_nocache_code,
+                $compiler->template->caching
+            )
+        );
+        $compiler->saveRequiredPlugins(true);
+        $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
+        $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
+        $compiler->template->compiled->has_nocache_code = false;
+        $compiler->suppressNocacheProcessing = true;
+    }
+}
+
+/**
+ * Smarty Internal Plugin Compile BlockClose Class
+ */
+class Smarty_Internal_Compile_Blockclose extends Smarty_Internal_Compile_Shared_Inheritance
+{
+    /**
+     * Compiles code for the {/block} tag
+     *
+     * @param array                                 $args      array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler  compiler object
+     * @param array                                 $parameter array with compilation parameter
+     *
+     * @return bool true
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+    {
+        list($_attr, $_nocache, $_buffer, $_has_nocache_code, $_caching) = $this->closeTag($compiler, array('block'));
+        // init block parameter
+        $_block = $compiler->_cache[ 'blockParams' ][ $compiler->_cache[ 'blockNesting' ] ];
+        unset($compiler->_cache[ 'blockParams' ][ $compiler->_cache[ 'blockNesting' ] ]);
+        $_name = $_attr[ 'name' ];
+        $_assign = isset($_attr[ 'assign' ]) ? $_attr[ 'assign' ] : null;
+        unset($_attr[ 'assign' ], $_attr[ 'name' ]);
+        foreach ($_attr as $name => $stat) {
+            if ((is_bool($stat) && $stat !== false) || (!is_bool($stat) && $stat !== 'false')) {
+                $_block[ $name ] = 'true';
+            }
+        }
+        $_className = $compiler->_cache[ 'blockClass' ][ $compiler->_cache[ 'blockNesting' ] ];
+        // get compiled block code
+        $_functionCode = $compiler->parser->current_buffer;
+        // setup buffer for template function code
+        $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
+        $output = "<?php\n";
+        $output .= "/* {block {$_name}} */\n";
+        $output .= "class {$_className} extends Smarty_Internal_Block\n";
+        $output .= "{\n";
+        foreach ($_block as $property => $value) {
+            $output .= "public \${$property} = " . var_export($value, true) . ";\n";
+        }
+        $output .= "public function callBlock(Smarty_Internal_Template \$_smarty_tpl) {\n";
+        $output .= $compiler->compileRequiredPlugins();
+        $compiler->restoreRequiredPlugins();
+        if ($compiler->template->compiled->has_nocache_code) {
+            $output .= "\$_smarty_tpl->cached->hashes['{$compiler->template->compiled->nocache_hash}'] = true;\n";
+        }
+        if (isset($_assign)) {
+            $output .= "ob_start();\n";
+        }
+        $output .= "?>\n";
+        $compiler->parser->current_buffer->append_subtree(
+            $compiler->parser,
+            new Smarty_Internal_ParseTree_Tag(
+                $compiler->parser,
+                $output
+            )
+        );
+        $compiler->parser->current_buffer->append_subtree($compiler->parser, $_functionCode);
+        $output = "<?php\n";
+        if (isset($_assign)) {
+            $output .= "\$_smarty_tpl->assign({$_assign}, ob_get_clean());\n";
+        }
+        $output .= "}\n";
+        $output .= "}\n";
+        $output .= "/* {/block {$_name}} */\n\n";
+        $output .= "?>\n";
+        $compiler->parser->current_buffer->append_subtree(
+            $compiler->parser,
+            new Smarty_Internal_ParseTree_Tag(
+                $compiler->parser,
+                $output
+            )
+        );
+        $compiler->blockOrFunctionCode .= $compiler->parser->current_buffer->to_smarty_php($compiler->parser);
+        $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
+        // restore old status
+        $compiler->template->compiled->has_nocache_code = $_has_nocache_code;
+        $compiler->tag_nocache = $compiler->nocache;
+        $compiler->nocache = $_nocache;
+        $compiler->parser->current_buffer = $_buffer;
+        $output = "<?php \n";
+        if ($compiler->_cache[ 'blockNesting' ] === 1) {
+            $output .= "\$_smarty_tpl->inheritance->instanceBlock(\$_smarty_tpl, '$_className', $_name);\n";
+        } else {
+            $output .= "\$_smarty_tpl->inheritance->instanceBlock(\$_smarty_tpl, '$_className', $_name, \$this->tplIndex);\n";
+        }
+        $output .= "?>\n";
+        --$compiler->_cache[ 'blockNesting' ];
+        if ($compiler->_cache[ 'blockNesting' ] === 0) {
+            unset($compiler->_cache[ 'blockNesting' ]);
+        }
+        $compiler->has_code = true;
+        $compiler->suppressNocacheProcessing = true;
+        return $output;
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_block_child.php b/sysplugins/smarty_internal_compile_block_child.php
new file mode 100644
index 0000000000000000000000000000000000000000..588d18628adc56ed4b74836971d9650ca510f6d0
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_block_child.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * This file is part of Smarty.
+ *
+ * (c) 2015 Uwe Tews
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Smarty Internal Plugin Compile Block Child Class
+ *
+ * @author Uwe Tews <uwe.tews@googlemail.com>
+ */
+class Smarty_Internal_Compile_Block_Child extends Smarty_Internal_Compile_Child
+{
+    /**
+     * Tag name
+     *
+     * @var string
+     */
+    public $tag = 'block_child';
+}
diff --git a/sysplugins/smarty_internal_compile_block_parent.php b/sysplugins/smarty_internal_compile_block_parent.php
new file mode 100644
index 0000000000000000000000000000000000000000..97f11ca43a3a0a811505cfd867ef46a165015770
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_block_parent.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * This file is part of Smarty.
+ *
+ * (c) 2015 Uwe Tews
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Smarty Internal Plugin Compile Block Parent Class
+ *
+ * @author Uwe Tews <uwe.tews@googlemail.com>
+ */
+class Smarty_Internal_Compile_Block_Parent extends Smarty_Internal_Compile_Child
+{
+    /**
+     * Tag name
+     *
+     * @var string
+     */
+    public $tag = 'block_parent';
+
+    /**
+     * Block type
+     *
+     * @var string
+     */
+    public $blockType = 'Parent';
+}
diff --git a/sysplugins/smarty_internal_compile_break.php b/sysplugins/smarty_internal_compile_break.php
new file mode 100644
index 0000000000000000000000000000000000000000..1ee8d75d7eef13717c2c4db6bb264ac1edc016a3
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_break.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Break
+ * Compiles the {break} tag
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Break Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Break extends Smarty_Internal_CompileBase
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $optional_attributes = array('levels');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $shorttag_order = array('levels');
+
+    /**
+     * Tag name may be overloaded by Smarty_Internal_Compile_Continue
+     *
+     * @var string
+     */
+    public $tag = 'break';
+
+    /**
+     * Compiles code for the {break} tag
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        list($levels, $foreachLevels) = $this->checkLevels($args, $compiler);
+        $output = "<?php ";
+        if ($foreachLevels > 0 && $this->tag === 'continue') {
+            $foreachLevels--;
+        }
+        if ($foreachLevels > 0) {
+            /* @var Smarty_Internal_Compile_Foreach $foreachCompiler */
+            $foreachCompiler = $compiler->getTagCompiler('foreach');
+            $output .= $foreachCompiler->compileRestore($foreachLevels);
+        }
+        $output .= "{$this->tag} {$levels};?>";
+        return $output;
+    }
+
+    /**
+     * check attributes and return array of break and foreach levels
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return array
+     * @throws \SmartyCompilerException
+     */
+    public function checkLevels($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        static $_is_loopy = array('for' => true, 'foreach' => true, 'while' => true, 'section' => true);
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        if ($_attr[ 'nocache' ] === true) {
+            $compiler->trigger_template_error('nocache option not allowed', null, true);
+        }
+        if (isset($_attr[ 'levels' ])) {
+            if (!is_numeric($_attr[ 'levels' ])) {
+                $compiler->trigger_template_error('level attribute must be a numeric constant', null, true);
+            }
+            $levels = $_attr[ 'levels' ];
+        } else {
+            $levels = 1;
+        }
+        $level_count = $levels;
+        $stack_count = count($compiler->_tag_stack) - 1;
+        $foreachLevels = 0;
+        $lastTag = '';
+        while ($level_count > 0 && $stack_count >= 0) {
+            if (isset($_is_loopy[ $compiler->_tag_stack[ $stack_count ][ 0 ] ])) {
+                $lastTag = $compiler->_tag_stack[ $stack_count ][ 0 ];
+                if ($level_count === 0) {
+                    break;
+                }
+                $level_count--;
+                if ($compiler->_tag_stack[ $stack_count ][ 0 ] === 'foreach') {
+                    $foreachLevels++;
+                }
+            }
+            $stack_count--;
+        }
+        if ($level_count !== 0) {
+            $compiler->trigger_template_error("cannot {$this->tag} {$levels} level(s)", null, true);
+        }
+        if ($lastTag === 'foreach' && $this->tag === 'break' && $foreachLevels > 0) {
+            $foreachLevels--;
+        }
+        return array($levels, $foreachLevels);
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_call.php b/sysplugins/smarty_internal_compile_call.php
new file mode 100644
index 0000000000000000000000000000000000000000..445cabc60d01ef00ea0ef7f74b0a8393abfb2b64
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_call.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Function_Call
+ * Compiles the calls of user defined tags defined by {function}
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Function_Call Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Call extends Smarty_Internal_CompileBase
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $required_attributes = array('name');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $shorttag_order = array('name');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $optional_attributes = array('_any');
+
+    /**
+     * Compiles the calls of user defined tags defined by {function}
+     *
+     * @param array  $args     array with attributes from parser
+     * @param object $compiler compiler object
+     *
+     * @return string compiled code
+     */
+    public function compile($args, $compiler)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        // save possible attributes
+        if (isset($_attr[ 'assign' ])) {
+            // output will be stored in a smarty variable instead of being displayed
+            $_assign = $_attr[ 'assign' ];
+        }
+        //$_name = trim($_attr['name'], "''");
+        $_name = $_attr[ 'name' ];
+        unset($_attr[ 'name' ], $_attr[ 'assign' ], $_attr[ 'nocache' ]);
+        // set flag (compiled code of {function} must be included in cache file
+        if (!$compiler->template->caching || $compiler->nocache || $compiler->tag_nocache) {
+            $_nocache = 'true';
+        } else {
+            $_nocache = 'false';
+        }
+        $_paramsArray = array();
+        foreach ($_attr as $_key => $_value) {
+            if (is_int($_key)) {
+                $_paramsArray[] = "$_key=>$_value";
+            } else {
+                $_paramsArray[] = "'$_key'=>$_value";
+            }
+        }
+        $_params = 'array(' . implode(',', $_paramsArray) . ')';
+        //$compiler->suppressNocacheProcessing = true;
+        // was there an assign attribute
+        if (isset($_assign)) {
+            $_output =
+                "<?php ob_start();\n\$_smarty_tpl->smarty->ext->_tplFunction->callTemplateFunction(\$_smarty_tpl, {$_name}, {$_params}, {$_nocache});\n\$_smarty_tpl->assign({$_assign}, ob_get_clean());?>\n";
+        } else {
+            $_output =
+                "<?php \$_smarty_tpl->smarty->ext->_tplFunction->callTemplateFunction(\$_smarty_tpl, {$_name}, {$_params}, {$_nocache});?>\n";
+        }
+        return $_output;
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_capture.php b/sysplugins/smarty_internal_compile_capture.php
new file mode 100644
index 0000000000000000000000000000000000000000..a4ffbc9ea7abbcd1e2353a6d607bc1bd7f312421
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_capture.php
@@ -0,0 +1,105 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Capture
+ * Compiles the {capture} tag
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Capture Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Capture extends Smarty_Internal_CompileBase
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $shorttag_order = array('name');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $optional_attributes = array('name', 'assign', 'append');
+
+    /**
+     * Compiles code for the {$smarty.capture.xxx}
+     *
+     * @param array                                 $args      array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler  compiler object
+     * @param array                                 $parameter array with compilation parameter
+     *
+     * @return string compiled code
+     */
+    public static function compileSpecialVariable(
+        $args,
+        Smarty_Internal_TemplateCompilerBase $compiler,
+        $parameter = null
+    ) {
+        return '$_smarty_tpl->smarty->ext->_capture->getBuffer($_smarty_tpl' .
+               (isset($parameter[ 1 ]) ? ", {$parameter[ 1 ]})" : ')');
+    }
+
+    /**
+     * Compiles code for the {capture} tag
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     * @param null                                  $parameter
+     *
+     * @return string compiled code
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter = null)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args, $parameter, 'capture');
+        $buffer = isset($_attr[ 'name' ]) ? $_attr[ 'name' ] : "'default'";
+        $assign = isset($_attr[ 'assign' ]) ? $_attr[ 'assign' ] : 'null';
+        $append = isset($_attr[ 'append' ]) ? $_attr[ 'append' ] : 'null';
+        $compiler->_cache[ 'capture_stack' ][] = array($compiler->nocache);
+        // maybe nocache because of nocache variables
+        $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
+        $_output = "<?php \$_smarty_tpl->smarty->ext->_capture->open(\$_smarty_tpl, $buffer, $assign, $append);?>";
+        return $_output;
+    }
+}
+
+/**
+ * Smarty Internal Plugin Compile Captureclose Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_CaptureClose extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for the {/capture} tag
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     * @param null                                  $parameter
+     *
+     * @return string compiled code
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args, $parameter, '/capture');
+        // must endblock be nocache?
+        if ($compiler->nocache) {
+            $compiler->tag_nocache = true;
+        }
+        list($compiler->nocache) = array_pop($compiler->_cache[ 'capture_stack' ]);
+        return "<?php \$_smarty_tpl->smarty->ext->_capture->close(\$_smarty_tpl);?>";
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_child.php b/sysplugins/smarty_internal_compile_child.php
new file mode 100644
index 0000000000000000000000000000000000000000..f728c18bf7e70c00cd83efff1feab468a84e731f
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_child.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * This file is part of Smarty.
+ *
+ * (c) 2015 Uwe Tews
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Smarty Internal Plugin Compile Child Class
+ *
+ * @author Uwe Tews <uwe.tews@googlemail.com>
+ */
+class Smarty_Internal_Compile_Child extends Smarty_Internal_CompileBase
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $optional_attributes = array('assign');
+
+    /**
+     * Tag name
+     *
+     * @var string
+     */
+    public $tag = 'child';
+
+    /**
+     * Block type
+     *
+     * @var string
+     */
+    public $blockType = 'Child';
+
+    /**
+     * Compiles code for the {child} tag
+     *
+     * @param array                                 $args      array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler  compiler object
+     * @param array                                 $parameter array with compilation parameter
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        $tag = isset($parameter[ 0 ]) ? "'{$parameter[0]}'" : "'{{$this->tag}}'";
+        if (!isset($compiler->_cache[ 'blockNesting' ])) {
+            $compiler->trigger_template_error(
+                "{$tag} used outside {block} tags ",
+                $compiler->parser->lex->taglineno
+            );
+        }
+        $compiler->has_code = true;
+        $compiler->suppressNocacheProcessing = true;
+        if ($this->blockType === 'Child') {
+            $compiler->_cache[ 'blockParams' ][ $compiler->_cache[ 'blockNesting' ] ][ 'callsChild' ] = 'true';
+        }
+        $_assign = isset($_attr[ 'assign' ]) ? $_attr[ 'assign' ] : null;
+        $output = "<?php \n";
+        if (isset($_assign)) {
+            $output .= "ob_start();\n";
+        }
+        $output .= '$_smarty_tpl->inheritance->call' . $this->blockType . '($_smarty_tpl, $this' .
+                   ($this->blockType === 'Child' ? '' : ", {$tag}") . ");\n";
+        if (isset($_assign)) {
+            $output .= "\$_smarty_tpl->assign({$_assign}, ob_get_clean());\n";
+        }
+        $output .= "?>\n";
+        return $output;
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_config_load.php b/sysplugins/smarty_internal_compile_config_load.php
new file mode 100644
index 0000000000000000000000000000000000000000..8fe64ee10f088a870367cb0fd57e65404657783e
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_config_load.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Config Load
+ * Compiles the {config load} tag
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Config Load Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Config_Load extends Smarty_Internal_CompileBase
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $required_attributes = array('file');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $shorttag_order = array('file', 'section');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $optional_attributes = array('section', 'scope');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $option_flags = array('nocache', 'noscope');
+
+    /**
+     * Valid scope names
+     *
+     * @var array
+     */
+    public $valid_scopes = array(
+        'local'  => Smarty::SCOPE_LOCAL, 'parent' => Smarty::SCOPE_PARENT,
+        'root'   => Smarty::SCOPE_ROOT, 'tpl_root' => Smarty::SCOPE_TPL_ROOT,
+        'smarty' => Smarty::SCOPE_SMARTY, 'global' => Smarty::SCOPE_SMARTY
+    );
+
+    /**
+     * Compiles code for the {config_load} tag
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        if ($_attr[ 'nocache' ] === true) {
+            $compiler->trigger_template_error('nocache option not allowed', null, true);
+        }
+        // save possible attributes
+        $conf_file = $_attr[ 'file' ];
+        if (isset($_attr[ 'section' ])) {
+            $section = $_attr[ 'section' ];
+        } else {
+            $section = 'null';
+        }
+        // scope setup
+        if ($_attr[ 'noscope' ]) {
+            $_scope = -1;
+        } else {
+            $_scope = $compiler->convertScope($_attr, $this->valid_scopes);
+        }
+        // create config object
+        $_output =
+            "<?php\n\$_smarty_tpl->smarty->ext->configLoad->_loadConfigFile(\$_smarty_tpl, {$conf_file}, {$section}, {$_scope});\n?>\n";
+        return $_output;
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_continue.php b/sysplugins/smarty_internal_compile_continue.php
new file mode 100644
index 0000000000000000000000000000000000000000..e545728ee8c5311fa432538113f5cefd86e79fc8
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_continue.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Continue
+ * Compiles the {continue} tag
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Continue Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Continue extends Smarty_Internal_Compile_Break
+{
+    /**
+     * Tag name
+     *
+     * @var string
+     */
+    public $tag = 'continue';
+}
diff --git a/sysplugins/smarty_internal_compile_debug.php b/sysplugins/smarty_internal_compile_debug.php
new file mode 100644
index 0000000000000000000000000000000000000000..7994166890483d5e3a668d7240bd5a33dbe9c752
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_debug.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Debug
+ * Compiles the {debug} tag.
+ * It opens a window the the Smarty Debugging Console.
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Debug Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Debug extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for the {debug} tag
+     *
+     * @param array  $args     array with attributes from parser
+     * @param object $compiler compiler object
+     *
+     * @return string compiled code
+     */
+    public function compile($args, $compiler)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        // compile always as nocache
+        $compiler->tag_nocache = true;
+        // display debug template
+        $_output =
+            "<?php \$_smarty_debug = new Smarty_Internal_Debug;\n \$_smarty_debug->display_debug(\$_smarty_tpl);\n";
+        $_output .= "unset(\$_smarty_debug);\n?>";
+        return $_output;
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_eval.php b/sysplugins/smarty_internal_compile_eval.php
new file mode 100644
index 0000000000000000000000000000000000000000..8e0174e3ebca4751be0a3934e5567e8be4020b0a
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_eval.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Eval
+ * Compiles the {eval} tag.
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Eval Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Eval extends Smarty_Internal_CompileBase
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $required_attributes = array('var');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $optional_attributes = array('assign');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $shorttag_order = array('var', 'assign');
+
+    /**
+     * Compiles code for the {eval} tag
+     *
+     * @param array  $args     array with attributes from parser
+     * @param object $compiler compiler object
+     *
+     * @return string compiled code
+     */
+    public function compile($args, $compiler)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        if (isset($_attr[ 'assign' ])) {
+            // output will be stored in a smarty variable instead of being displayed
+            $_assign = $_attr[ 'assign' ];
+        }
+        // create template object
+        $_output =
+            "\$_template = new {$compiler->smarty->template_class}('eval:'.{$_attr[ 'var' ]}, \$_smarty_tpl->smarty, \$_smarty_tpl);";
+        //was there an assign attribute?
+        if (isset($_assign)) {
+            $_output .= "\$_smarty_tpl->assign($_assign,\$_template->fetch());";
+        } else {
+            $_output .= 'echo $_template->fetch();';
+        }
+        return "<?php $_output ?>";
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_extends.php b/sysplugins/smarty_internal_compile_extends.php
new file mode 100644
index 0000000000000000000000000000000000000000..d72d2b76f0476913f0614467e9bea613d9fbb095
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_extends.php
@@ -0,0 +1,158 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile extend
+ * Compiles the {extends} tag
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile extend Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Extends extends Smarty_Internal_Compile_Shared_Inheritance
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $required_attributes = array('file');
+
+    /**
+     * Array of names of optional attribute required by tag
+     * use array('_any') if there is no restriction of attributes names
+     *
+     * @var array
+     */
+    public $optional_attributes = array('extends_resource');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $shorttag_order = array('file');
+
+    /**
+     * Compiles code for the {extends} tag extends: resource
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     * @throws \SmartyException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        if ($_attr[ 'nocache' ] === true) {
+            $compiler->trigger_template_error('nocache option not allowed', $compiler->parser->lex->line - 1);
+        }
+        if (strpos($_attr[ 'file' ], '$_tmp') !== false) {
+            $compiler->trigger_template_error('illegal value for file attribute', $compiler->parser->lex->line - 1);
+        }
+        // add code to initialize inheritance
+        $this->registerInit($compiler, true);
+        $file = trim($_attr[ 'file' ], '\'"');
+        if (strlen($file) > 8 && substr($file, 0, 8) === 'extends:') {
+            // generate code for each template
+            $files = array_reverse(explode('|', substr($file, 8)));
+            $i = 0;
+            foreach ($files as $file) {
+                if ($file[ 0 ] === '"') {
+                    $file = trim($file, '".');
+                } else {
+                    $file = "'{$file}'";
+                }
+                $i++;
+                if ($i === count($files) && isset($_attr[ 'extends_resource' ])) {
+                    $this->compileEndChild($compiler);
+                }
+                $this->compileInclude($compiler, $file);
+            }
+            if (!isset($_attr[ 'extends_resource' ])) {
+                $this->compileEndChild($compiler);
+            }
+        } else {
+            $this->compileEndChild($compiler, $_attr[ 'file' ]);
+        }
+        $compiler->has_code = false;
+        return '';
+    }
+
+    /**
+     * Add code for inheritance endChild() method to end of template
+     *
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler
+     * @param null|string                           $template optional inheritance parent template
+     *
+     * @throws \SmartyCompilerException
+     * @throws \SmartyException
+     */
+    private function compileEndChild(Smarty_Internal_TemplateCompilerBase $compiler, $template = null)
+    {
+        $inlineUids = '';
+        if (isset($template) && $compiler->smarty->merge_compiled_includes) {
+            $code = $compiler->compileTag('include', array($template, array('scope' => 'parent')));
+            if (preg_match('/([,][\s]*[\'][a-z0-9]+[\'][,][\s]*[\']content.*[\'])[)]/', $code, $match)) {
+                $inlineUids = $match[ 1 ];
+            }
+        }
+        $compiler->parser->template_postfix[] = new Smarty_Internal_ParseTree_Tag(
+            $compiler->parser,
+            '<?php $_smarty_tpl->inheritance->endChild($_smarty_tpl' .
+            (isset($template) ?
+                ", {$template}{$inlineUids}" :
+                '') . ");\n?>"
+        );
+    }
+
+    /**
+     * Add code for including subtemplate to end of template
+     *
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler
+     * @param string                                $template subtemplate name
+     *
+     * @throws \SmartyCompilerException
+     * @throws \SmartyException
+     */
+    private function compileInclude(Smarty_Internal_TemplateCompilerBase $compiler, $template)
+    {
+        $compiler->parser->template_postfix[] = new Smarty_Internal_ParseTree_Tag(
+            $compiler->parser,
+            $compiler->compileTag(
+                'include',
+                array(
+                    $template,
+                    array('scope' => 'parent')
+                )
+            )
+        );
+    }
+
+    /**
+     * Create source code for {extends} from source components array
+     *
+     * @param \Smarty_Internal_Template $template
+     *
+     * @return string
+     */
+    public static function extendsSourceArrayCode(Smarty_Internal_Template $template)
+    {
+        $resources = array();
+        foreach ($template->source->components as $source) {
+            $resources[] = $source->resource;
+        }
+        return $template->smarty->left_delimiter . 'extends file=\'extends:' . join('|', $resources) .
+               '\' extends_resource=true' . $template->smarty->right_delimiter;
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_for.php b/sysplugins/smarty_internal_compile_for.php
new file mode 100644
index 0000000000000000000000000000000000000000..3f113e56d58c00e7ffa6f7f2f2ee3cc81da97168
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_for.php
@@ -0,0 +1,164 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile For
+ * Compiles the {for} {forelse} {/for} tags
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile For Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_For extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for the {for} tag
+     * Smarty 3 does implement two different syntax's:
+     * - {for $var in $array}
+     * For looping over arrays or iterators
+     * - {for $x=0; $x<$y; $x++}
+     * For general loops
+     * The parser is generating different sets of attribute by which this compiler can
+     * determine which syntax is used.
+     *
+     * @param array  $args      array with attributes from parser
+     * @param object $compiler  compiler object
+     * @param array  $parameter array with compilation parameter
+     *
+     * @return string compiled code
+     */
+    public function compile($args, $compiler, $parameter)
+    {
+        $compiler->loopNesting++;
+        if ($parameter === 0) {
+            $this->required_attributes = array('start', 'to');
+            $this->optional_attributes = array('max', 'step');
+        } else {
+            $this->required_attributes = array('start', 'ifexp', 'var', 'step');
+            $this->optional_attributes = array();
+        }
+        $this->mapCache = array();
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        $output = "<?php\n";
+        if ($parameter === 1) {
+            foreach ($_attr[ 'start' ] as $_statement) {
+                if (is_array($_statement[ 'var' ])) {
+                    $var = $_statement[ 'var' ][ 'var' ];
+                    $index = $_statement[ 'var' ][ 'smarty_internal_index' ];
+                } else {
+                    $var = $_statement[ 'var' ];
+                    $index = '';
+                }
+                $output .= "\$_smarty_tpl->tpl_vars[$var] = new Smarty_Variable(null, \$_smarty_tpl->isRenderingCache);\n";
+                $output .= "\$_smarty_tpl->tpl_vars[$var]->value{$index} = {$_statement['value']};\n";
+            }
+            if (is_array($_attr[ 'var' ])) {
+                $var = $_attr[ 'var' ][ 'var' ];
+                $index = $_attr[ 'var' ][ 'smarty_internal_index' ];
+            } else {
+                $var = $_attr[ 'var' ];
+                $index = '';
+            }
+            $output .= "if ($_attr[ifexp]) {\nfor (\$_foo=true;$_attr[ifexp]; \$_smarty_tpl->tpl_vars[$var]->value{$index}$_attr[step]) {\n";
+        } else {
+            $_statement = $_attr[ 'start' ];
+            if (is_array($_statement[ 'var' ])) {
+                $var = $_statement[ 'var' ][ 'var' ];
+                $index = $_statement[ 'var' ][ 'smarty_internal_index' ];
+            } else {
+                $var = $_statement[ 'var' ];
+                $index = '';
+            }
+            $output .= "\$_smarty_tpl->tpl_vars[$var] = new Smarty_Variable(null, \$_smarty_tpl->isRenderingCache);";
+            if (isset($_attr[ 'step' ])) {
+                $output .= "\$_smarty_tpl->tpl_vars[$var]->step = $_attr[step];";
+            } else {
+                $output .= "\$_smarty_tpl->tpl_vars[$var]->step = 1;";
+            }
+            if (isset($_attr[ 'max' ])) {
+                $output .= "\$_smarty_tpl->tpl_vars[$var]->total = (int) min(ceil((\$_smarty_tpl->tpl_vars[$var]->step > 0 ? $_attr[to]+1 - ($_statement[value]) : $_statement[value]-($_attr[to])+1)/abs(\$_smarty_tpl->tpl_vars[$var]->step)),$_attr[max]);\n";
+            } else {
+                $output .= "\$_smarty_tpl->tpl_vars[$var]->total = (int) ceil((\$_smarty_tpl->tpl_vars[$var]->step > 0 ? $_attr[to]+1 - ($_statement[value]) : $_statement[value]-($_attr[to])+1)/abs(\$_smarty_tpl->tpl_vars[$var]->step));\n";
+            }
+            $output .= "if (\$_smarty_tpl->tpl_vars[$var]->total > 0) {\n";
+            $output .= "for (\$_smarty_tpl->tpl_vars[$var]->value{$index} = $_statement[value], \$_smarty_tpl->tpl_vars[$var]->iteration = 1;\$_smarty_tpl->tpl_vars[$var]->iteration <= \$_smarty_tpl->tpl_vars[$var]->total;\$_smarty_tpl->tpl_vars[$var]->value{$index} += \$_smarty_tpl->tpl_vars[$var]->step, \$_smarty_tpl->tpl_vars[$var]->iteration++) {\n";
+            $output .= "\$_smarty_tpl->tpl_vars[$var]->first = \$_smarty_tpl->tpl_vars[$var]->iteration === 1;";
+            $output .= "\$_smarty_tpl->tpl_vars[$var]->last = \$_smarty_tpl->tpl_vars[$var]->iteration === \$_smarty_tpl->tpl_vars[$var]->total;";
+        }
+        $output .= '?>';
+        $this->openTag($compiler, 'for', array('for', $compiler->nocache));
+        // maybe nocache because of nocache variables
+        $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
+        // return compiled code
+        return $output;
+    }
+}
+
+/**
+ * Smarty Internal Plugin Compile Forelse Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Forelse extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for the {forelse} tag
+     *
+     * @param array  $args      array with attributes from parser
+     * @param object $compiler  compiler object
+     * @param array  $parameter array with compilation parameter
+     *
+     * @return string compiled code
+     */
+    public function compile($args, $compiler, $parameter)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        list($openTag, $nocache) = $this->closeTag($compiler, array('for'));
+        $this->openTag($compiler, 'forelse', array('forelse', $nocache));
+        return "<?php }} else { ?>";
+    }
+}
+
+/**
+ * Smarty Internal Plugin Compile Forclose Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Forclose extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for the {/for} tag
+     *
+     * @param array  $args      array with attributes from parser
+     * @param object $compiler  compiler object
+     * @param array  $parameter array with compilation parameter
+     *
+     * @return string compiled code
+     */
+    public function compile($args, $compiler, $parameter)
+    {
+        $compiler->loopNesting--;
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        // must endblock be nocache?
+        if ($compiler->nocache) {
+            $compiler->tag_nocache = true;
+        }
+        list($openTag, $compiler->nocache) = $this->closeTag($compiler, array('for', 'forelse'));
+        $output = "<?php }\n";
+        if ($openTag !== 'forelse') {
+            $output .= "}\n";
+        }
+        $output .= "?>";
+        return $output;
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_foreach.php b/sysplugins/smarty_internal_compile_foreach.php
new file mode 100644
index 0000000000000000000000000000000000000000..a68da5409f3630c2596e5e0c0ad672d7bc27ca93
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_foreach.php
@@ -0,0 +1,343 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Foreach
+ * Compiles the {foreach} {foreachelse} {/foreach} tags
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Foreach Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Foreach extends Smarty_Internal_Compile_Private_ForeachSection
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $required_attributes = array('from', 'item');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $optional_attributes = array('name', 'key', 'properties');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $shorttag_order = array('from', 'item', 'key', 'name');
+
+    /**
+     * counter
+     *
+     * @var int
+     */
+    public $counter = 0;
+
+    /**
+     * Name of this tag
+     *
+     * @var string
+     */
+    public $tagName = 'foreach';
+
+    /**
+     * Valid properties of $smarty.foreach.name.xxx variable
+     *
+     * @var array
+     */
+    public $nameProperties = array('first', 'last', 'index', 'iteration', 'show', 'total');
+
+    /**
+     * Valid properties of $item@xxx variable
+     *
+     * @var array
+     */
+    public $itemProperties = array('first', 'last', 'index', 'iteration', 'show', 'total', 'key');
+
+    /**
+     * Flag if tag had name attribute
+     *
+     * @var bool
+     */
+    public $isNamed = false;
+
+    /**
+     * Compiles code for the {foreach} tag
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     * @throws \SmartyException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        $compiler->loopNesting++;
+        // init
+        $this->isNamed = false;
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        $from = $_attr[ 'from' ];
+        $item = $compiler->getId($_attr[ 'item' ]);
+        if ($item === false) {
+            $item = $compiler->getVariableName($_attr[ 'item' ]);
+        }
+        $key = $name = null;
+        $attributes = array('item' => $item);
+        if (isset($_attr[ 'key' ])) {
+            $key = $compiler->getId($_attr[ 'key' ]);
+            if ($key === false) {
+                $key = $compiler->getVariableName($_attr[ 'key' ]);
+            }
+            $attributes[ 'key' ] = $key;
+        }
+        if (isset($_attr[ 'name' ])) {
+            $this->isNamed = true;
+            $name = $attributes[ 'name' ] = $compiler->getId($_attr[ 'name' ]);
+        }
+        foreach ($attributes as $a => $v) {
+            if ($v === false) {
+                $compiler->trigger_template_error("'{$a}' attribute/variable has illegal value", null, true);
+            }
+        }
+        $fromName = $compiler->getVariableName($_attr[ 'from' ]);
+        if ($fromName) {
+            foreach (array('item', 'key') as $a) {
+                if (isset($attributes[ $a ]) && $attributes[ $a ] === $fromName) {
+                    $compiler->trigger_template_error(
+                        "'{$a}' and 'from' may not have same variable name '{$fromName}'",
+                        null,
+                        true
+                    );
+                }
+            }
+        }
+        $itemVar = "\$_smarty_tpl->tpl_vars['{$item}']";
+        $local = '$__foreach_' . $attributes[ 'item' ] . '_' . $this->counter++ . '_';
+        // search for used tag attributes
+        $itemAttr = array();
+        $namedAttr = array();
+        $this->scanForProperties($attributes, $compiler);
+        if (!empty($this->matchResults[ 'item' ])) {
+            $itemAttr = $this->matchResults[ 'item' ];
+        }
+        if (!empty($this->matchResults[ 'named' ])) {
+            $namedAttr = $this->matchResults[ 'named' ];
+        }
+        if (isset($_attr[ 'properties' ]) && preg_match_all('/[\'](.*?)[\']/', $_attr[ 'properties' ], $match)) {
+            foreach ($match[ 1 ] as $prop) {
+                if (in_array($prop, $this->itemProperties)) {
+                    $itemAttr[ $prop ] = true;
+                } else {
+                    $compiler->trigger_template_error("Invalid property '{$prop}'", null, true);
+                }
+            }
+            if ($this->isNamed) {
+                foreach ($match[ 1 ] as $prop) {
+                    if (in_array($prop, $this->nameProperties)) {
+                        $nameAttr[ $prop ] = true;
+                    } else {
+                        $compiler->trigger_template_error("Invalid property '{$prop}'", null, true);
+                    }
+                }
+            }
+        }
+        if (isset($itemAttr[ 'first' ])) {
+            $itemAttr[ 'index' ] = true;
+        }
+        if (isset($namedAttr[ 'first' ])) {
+            $namedAttr[ 'index' ] = true;
+        }
+        if (isset($namedAttr[ 'last' ])) {
+            $namedAttr[ 'iteration' ] = true;
+            $namedAttr[ 'total' ] = true;
+        }
+        if (isset($itemAttr[ 'last' ])) {
+            $itemAttr[ 'iteration' ] = true;
+            $itemAttr[ 'total' ] = true;
+        }
+        if (isset($namedAttr[ 'show' ])) {
+            $namedAttr[ 'total' ] = true;
+        }
+        if (isset($itemAttr[ 'show' ])) {
+            $itemAttr[ 'total' ] = true;
+        }
+        $keyTerm = '';
+        if (isset($attributes[ 'key' ])) {
+            $keyTerm = "\$_smarty_tpl->tpl_vars['{$key}']->value => ";
+        }
+        if (isset($itemAttr[ 'key' ])) {
+            $keyTerm = "{$itemVar}->key => ";
+        }
+        if ($this->isNamed) {
+            $foreachVar = "\$_smarty_tpl->tpl_vars['__smarty_foreach_{$attributes['name']}']";
+        }
+        $needTotal = isset($itemAttr[ 'total' ]);
+        // Register tag
+        $this->openTag(
+            $compiler,
+            'foreach',
+            array('foreach', $compiler->nocache, $local, $itemVar, empty($itemAttr) ? 1 : 2)
+        );
+        // maybe nocache because of nocache variables
+        $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
+        // generate output code
+        $output = "<?php\n";
+        $output .= "\$_from = \$_smarty_tpl->smarty->ext->_foreach->init(\$_smarty_tpl, $from, " .
+                   var_export($item, true);
+        if ($name || $needTotal || $key) {
+            $output .= ', ' . var_export($needTotal, true);
+        }
+        if ($name || $key) {
+            $output .= ', ' . var_export($key, true);
+        }
+        if ($name) {
+            $output .= ', ' . var_export($name, true) . ', ' . var_export($namedAttr, true);
+        }
+        $output .= ");\n";
+        if (isset($itemAttr[ 'show' ])) {
+            $output .= "{$itemVar}->show = ({$itemVar}->total > 0);\n";
+        }
+        if (isset($itemAttr[ 'iteration' ])) {
+            $output .= "{$itemVar}->iteration = 0;\n";
+        }
+        if (isset($itemAttr[ 'index' ])) {
+            $output .= "{$itemVar}->index = -1;\n";
+        }
+	    $output .= "{$itemVar}->do_else = true;\n";
+        $output .= "if (\$_from !== null) foreach (\$_from as {$keyTerm}{$itemVar}->value) {\n";
+	    $output .= "{$itemVar}->do_else = false;\n";
+        if (isset($attributes[ 'key' ]) && isset($itemAttr[ 'key' ])) {
+            $output .= "\$_smarty_tpl->tpl_vars['{$key}']->value = {$itemVar}->key;\n";
+        }
+        if (isset($itemAttr[ 'iteration' ])) {
+            $output .= "{$itemVar}->iteration++;\n";
+        }
+        if (isset($itemAttr[ 'index' ])) {
+            $output .= "{$itemVar}->index++;\n";
+        }
+        if (isset($itemAttr[ 'first' ])) {
+            $output .= "{$itemVar}->first = !{$itemVar}->index;\n";
+        }
+        if (isset($itemAttr[ 'last' ])) {
+            $output .= "{$itemVar}->last = {$itemVar}->iteration === {$itemVar}->total;\n";
+        }
+        if (isset($foreachVar)) {
+            if (isset($namedAttr[ 'iteration' ])) {
+                $output .= "{$foreachVar}->value['iteration']++;\n";
+            }
+            if (isset($namedAttr[ 'index' ])) {
+                $output .= "{$foreachVar}->value['index']++;\n";
+            }
+            if (isset($namedAttr[ 'first' ])) {
+                $output .= "{$foreachVar}->value['first'] = !{$foreachVar}->value['index'];\n";
+            }
+            if (isset($namedAttr[ 'last' ])) {
+                $output .= "{$foreachVar}->value['last'] = {$foreachVar}->value['iteration'] === {$foreachVar}->value['total'];\n";
+            }
+        }
+        if (!empty($itemAttr)) {
+            $output .= "{$local}saved = {$itemVar};\n";
+        }
+        $output .= '?>';
+        return $output;
+    }
+
+    /**
+     * Compiles code for to restore saved template variables
+     *
+     * @param int $levels number of levels to restore
+     *
+     * @return string compiled code
+     */
+    public function compileRestore($levels)
+    {
+        return "\$_smarty_tpl->smarty->ext->_foreach->restore(\$_smarty_tpl, {$levels});";
+    }
+}
+
+/**
+ * Smarty Internal Plugin Compile Foreachelse Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Foreachelse extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for the {foreachelse} tag
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return string compiled code
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        list($openTag, $nocache, $local, $itemVar, $restore) = $this->closeTag($compiler, array('foreach'));
+        $this->openTag($compiler, 'foreachelse', array('foreachelse', $nocache, $local, $itemVar, 0));
+        $output = "<?php\n";
+        if ($restore === 2) {
+            $output .= "{$itemVar} = {$local}saved;\n";
+        }
+        $output .= "}\nif ({$itemVar}->do_else) {\n?>";
+        return $output;
+    }
+}
+
+/**
+ * Smarty Internal Plugin Compile Foreachclose Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Foreachclose extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for the {/foreach} tag
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        $compiler->loopNesting--;
+        // must endblock be nocache?
+        if ($compiler->nocache) {
+            $compiler->tag_nocache = true;
+        }
+        list(
+            $openTag, $compiler->nocache, $local, $itemVar, $restore
+            ) = $this->closeTag($compiler, array('foreach', 'foreachelse'));
+        $output = "<?php\n";
+        if ($restore === 2) {
+            $output .= "{$itemVar} = {$local}saved;\n";
+        }
+        $output .= "}\n";
+        /* @var Smarty_Internal_Compile_Foreach $foreachCompiler */
+        $foreachCompiler = $compiler->getTagCompiler('foreach');
+        $output .= $foreachCompiler->compileRestore(1);
+        $output .= "?>";
+        return $output;
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_function.php b/sysplugins/smarty_internal_compile_function.php
new file mode 100644
index 0000000000000000000000000000000000000000..6e408ca724cc2c3ba0777b454d2759b00de20eab
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_function.php
@@ -0,0 +1,231 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Function
+ * Compiles the {function} {/function} tags
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Function Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Function extends Smarty_Internal_CompileBase
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $required_attributes = array('name');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $shorttag_order = array('name');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $optional_attributes = array('_any');
+
+    /**
+     * Compiles code for the {function} tag
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return bool true
+     * @throws \SmartyCompilerException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        if ($_attr[ 'nocache' ] === true) {
+            $compiler->trigger_template_error('nocache option not allowed', null, true);
+        }
+        unset($_attr[ 'nocache' ]);
+        $_name = trim($_attr[ 'name' ], '\'"');
+        $compiler->parent_compiler->tpl_function[ $_name ] = array();
+        $save = array(
+            $_attr, $compiler->parser->current_buffer, $compiler->template->compiled->has_nocache_code,
+            $compiler->template->caching
+        );
+        $this->openTag($compiler, 'function', $save);
+        // Init temporary context
+        $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
+        $compiler->template->compiled->has_nocache_code = false;
+        $compiler->saveRequiredPlugins(true);
+        return true;
+    }
+}
+
+/**
+ * Smarty Internal Plugin Compile Functionclose Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Functionclose extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiler object
+     *
+     * @var object
+     */
+    private $compiler = null;
+
+    /**
+     * Compiles code for the {/function} tag
+     *
+     * @param array                                        $args     array with attributes from parser
+     * @param object|\Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return bool true
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        $this->compiler = $compiler;
+        $saved_data = $this->closeTag($compiler, array('function'));
+        $_attr = $saved_data[ 0 ];
+        $_name = trim($_attr[ 'name' ], '\'"');
+        $compiler->parent_compiler->tpl_function[ $_name ][ 'compiled_filepath' ] =
+            $compiler->parent_compiler->template->compiled->filepath;
+        $compiler->parent_compiler->tpl_function[ $_name ][ 'uid' ] = $compiler->template->source->uid;
+        $_parameter = $_attr;
+        unset($_parameter[ 'name' ]);
+        // default parameter
+        $_paramsArray = array();
+        foreach ($_parameter as $_key => $_value) {
+            if (is_int($_key)) {
+                $_paramsArray[] = "$_key=>$_value";
+            } else {
+                $_paramsArray[] = "'$_key'=>$_value";
+            }
+        }
+        if (!empty($_paramsArray)) {
+            $_params = 'array(' . implode(',', $_paramsArray) . ')';
+            $_paramsCode = "\$params = array_merge($_params, \$params);\n";
+        } else {
+            $_paramsCode = '';
+        }
+        $_functionCode = $compiler->parser->current_buffer;
+        // setup buffer for template function code
+        $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
+        $_funcName = "smarty_template_function_{$_name}_{$compiler->template->compiled->nocache_hash}";
+        $_funcNameCaching = $_funcName . '_nocache';
+        if ($compiler->template->compiled->has_nocache_code) {
+            $compiler->parent_compiler->tpl_function[ $_name ][ 'call_name_caching' ] = $_funcNameCaching;
+            $output = "<?php\n";
+            $output .= "/* {$_funcNameCaching} */\n";
+            $output .= "if (!function_exists('{$_funcNameCaching}')) {\n";
+            $output .= "function {$_funcNameCaching} (Smarty_Internal_Template \$_smarty_tpl,\$params) {\n";
+            $output .= "ob_start();\n";
+            $output .= $compiler->compileRequiredPlugins();
+            $output .= "\$_smarty_tpl->compiled->has_nocache_code = true;\n";
+            $output .= $_paramsCode;
+            $output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value, \$_smarty_tpl->isRenderingCache);\n}\n";
+            $output .= "\$params = var_export(\$params, true);\n";
+            $output .= "echo \"/*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/<?php ";
+            $output .= "\\\$_smarty_tpl->smarty->ext->_tplFunction->saveTemplateVariables(\\\$_smarty_tpl, '{$_name}');\nforeach (\$params as \\\$key => \\\$value) {\n\\\$_smarty_tpl->tpl_vars[\\\$key] = new Smarty_Variable(\\\$value, \\\$_smarty_tpl->isRenderingCache);\n}\n?>";
+            $output .= "/*/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\";?>";
+            $compiler->parser->current_buffer->append_subtree(
+                $compiler->parser,
+                new Smarty_Internal_ParseTree_Tag(
+                    $compiler->parser,
+                    $output
+                )
+            );
+            $compiler->parser->current_buffer->append_subtree($compiler->parser, $_functionCode);
+            $output = "<?php echo \"/*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/<?php ";
+            $output .= "\\\$_smarty_tpl->smarty->ext->_tplFunction->restoreTemplateVariables(\\\$_smarty_tpl, '{$_name}');?>\n";
+            $output .= "/*/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\";\n?>";
+            $output .= "<?php echo str_replace('{$compiler->template->compiled->nocache_hash}', \$_smarty_tpl->compiled->nocache_hash, ob_get_clean());\n";
+            $output .= "}\n}\n";
+            $output .= "/*/ {$_funcName}_nocache */\n\n";
+            $output .= "?>\n";
+            $compiler->parser->current_buffer->append_subtree(
+                $compiler->parser,
+                new Smarty_Internal_ParseTree_Tag(
+                    $compiler->parser,
+                    $output
+                )
+            );
+            $_functionCode = new Smarty_Internal_ParseTree_Tag(
+                $compiler->parser,
+                preg_replace_callback(
+                    "/((<\?php )?echo '\/\*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%\*\/([\S\s]*?)\/\*\/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%\*\/';(\?>\n)?)/",
+                    array($this, 'removeNocache'),
+                    $_functionCode->to_smarty_php($compiler->parser)
+                )
+            );
+        }
+        $compiler->parent_compiler->tpl_function[ $_name ][ 'call_name' ] = $_funcName;
+        $output = "<?php\n";
+        $output .= "/* {$_funcName} */\n";
+        $output .= "if (!function_exists('{$_funcName}')) {\n";
+        $output .= "function {$_funcName}(Smarty_Internal_Template \$_smarty_tpl,\$params) {\n";
+        $output .= $_paramsCode;
+        $output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value, \$_smarty_tpl->isRenderingCache);\n}\n";
+        $output .= $compiler->compileCheckPlugins(array_merge($compiler->required_plugins[ 'compiled' ],
+            $compiler->required_plugins[ 'nocache' ]));
+        $output .= "?>\n";
+        $compiler->parser->current_buffer->append_subtree(
+            $compiler->parser,
+            new Smarty_Internal_ParseTree_Tag(
+                $compiler->parser,
+                $output
+            )
+        );
+        $compiler->parser->current_buffer->append_subtree($compiler->parser, $_functionCode);
+        $output = "<?php\n}}\n";
+        $output .= "/*/ {$_funcName} */\n\n";
+        $output .= "?>\n";
+        $compiler->parser->current_buffer->append_subtree(
+            $compiler->parser,
+            new Smarty_Internal_ParseTree_Tag(
+                $compiler->parser,
+                $output
+            )
+        );
+        $compiler->parent_compiler->blockOrFunctionCode .= $compiler->parser->current_buffer->to_smarty_php($compiler->parser);
+        // restore old buffer
+        $compiler->parser->current_buffer = $saved_data[ 1 ];
+        // restore old status
+        $compiler->restoreRequiredPlugins();
+        $compiler->template->compiled->has_nocache_code = $saved_data[ 2 ];
+        $compiler->template->caching = $saved_data[ 3 ];
+        return true;
+    }
+
+    /**
+     * Remove nocache code
+     *
+     * @param $match
+     *
+     * @return string
+     */
+    public function removeNocache($match)
+    {
+        $code =
+            preg_replace(
+                "/((<\?php )?echo '\/\*%%SmartyNocache:{$this->compiler->template->compiled->nocache_hash}%%\*\/)|(\/\*\/%%SmartyNocache:{$this->compiler->template->compiled->nocache_hash}%%\*\/';(\?>\n)?)/",
+                '',
+                $match[ 0 ]
+            );
+        $code = str_replace(array('\\\'', '\\\\\''), array('\'', '\\\''), $code);
+        return $code;
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_if.php b/sysplugins/smarty_internal_compile_if.php
new file mode 100644
index 0000000000000000000000000000000000000000..df3dc3fad1123fbe9966063d741094d58520e1a5
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_if.php
@@ -0,0 +1,207 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile If
+ * Compiles the {if} {else} {elseif} {/if} tags
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile If Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_If extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for the {if} tag
+     *
+     * @param array                                 $args      array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler  compiler object
+     * @param array                                 $parameter array with compilation parameter
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        $this->openTag($compiler, 'if', array(1, $compiler->nocache));
+        // must whole block be nocache ?
+        $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
+        if (!isset($parameter[ 'if condition' ])) {
+            $compiler->trigger_template_error('missing if condition', null, true);
+        }
+        if (is_array($parameter[ 'if condition' ])) {
+            if (is_array($parameter[ 'if condition' ][ 'var' ])) {
+                $var = $parameter[ 'if condition' ][ 'var' ][ 'var' ];
+            } else {
+                $var = $parameter[ 'if condition' ][ 'var' ];
+            }
+            if ($compiler->nocache) {
+                // create nocache var to make it know for further compiling
+                $compiler->setNocacheInVariable($var);
+            }
+            $prefixVar = $compiler->getNewPrefixVariable();
+            $_output = "<?php {$prefixVar} = {$parameter[ 'if condition' ][ 'value' ]};?>\n";
+            $assignAttr = array();
+            $assignAttr[][ 'value' ] = $prefixVar;
+            $assignCompiler = new Smarty_Internal_Compile_Assign();
+            if (is_array($parameter[ 'if condition' ][ 'var' ])) {
+                $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ][ 'var' ];
+                $_output .= $assignCompiler->compile(
+                    $assignAttr,
+                    $compiler,
+                    array('smarty_internal_index' => $parameter[ 'if condition' ][ 'var' ][ 'smarty_internal_index' ])
+                );
+            } else {
+                $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ];
+                $_output .= $assignCompiler->compile($assignAttr, $compiler, array());
+            }
+            $_output .= "<?php if ({$prefixVar}) {?>";
+            return $_output;
+        } else {
+            return "<?php if ({$parameter['if condition']}) {?>";
+        }
+    }
+}
+
+/**
+ * Smarty Internal Plugin Compile Else Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Else extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for the {else} tag
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return string compiled code
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        list($nesting, $compiler->tag_nocache) = $this->closeTag($compiler, array('if', 'elseif'));
+        $this->openTag($compiler, 'else', array($nesting, $compiler->tag_nocache));
+        return '<?php } else { ?>';
+    }
+}
+
+/**
+ * Smarty Internal Plugin Compile ElseIf Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Elseif extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for the {elseif} tag
+     *
+     * @param array                                 $args      array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler  compiler object
+     * @param array                                 $parameter array with compilation parameter
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        list($nesting, $compiler->tag_nocache) = $this->closeTag($compiler, array('if', 'elseif'));
+        if (!isset($parameter[ 'if condition' ])) {
+            $compiler->trigger_template_error('missing elseif condition', null, true);
+        }
+        $assignCode = '';
+        $var = '';
+        if (is_array($parameter[ 'if condition' ])) {
+            $condition_by_assign = true;
+            if (is_array($parameter[ 'if condition' ][ 'var' ])) {
+                $var = $parameter[ 'if condition' ][ 'var' ][ 'var' ];
+            } else {
+                $var = $parameter[ 'if condition' ][ 'var' ];
+            }
+            if ($compiler->nocache) {
+                // create nocache var to make it know for further compiling
+                $compiler->setNocacheInVariable($var);
+            }
+            $prefixVar = $compiler->getNewPrefixVariable();
+            $assignCode = "<?php {$prefixVar} = {$parameter[ 'if condition' ][ 'value' ]};?>\n";
+            $assignCompiler = new Smarty_Internal_Compile_Assign();
+            $assignAttr = array();
+            $assignAttr[][ 'value' ] = $prefixVar;
+            if (is_array($parameter[ 'if condition' ][ 'var' ])) {
+                $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ][ 'var' ];
+                $assignCode .= $assignCompiler->compile(
+                    $assignAttr,
+                    $compiler,
+                    array('smarty_internal_index' => $parameter[ 'if condition' ][ 'var' ][ 'smarty_internal_index' ])
+                );
+            } else {
+                $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ];
+                $assignCode .= $assignCompiler->compile($assignAttr, $compiler, array());
+            }
+        } else {
+            $condition_by_assign = false;
+        }
+        $prefixCode = $compiler->getPrefixCode();
+        if (empty($prefixCode)) {
+            if ($condition_by_assign) {
+                $this->openTag($compiler, 'elseif', array($nesting + 1, $compiler->tag_nocache));
+                $_output = $compiler->appendCode("<?php } else {\n?>", $assignCode);
+                return $compiler->appendCode($_output, "<?php if ({$prefixVar}) {?>");
+            } else {
+                $this->openTag($compiler, 'elseif', array($nesting, $compiler->tag_nocache));
+                return "<?php } elseif ({$parameter['if condition']}) {?>";
+            }
+        } else {
+            $_output = $compiler->appendCode("<?php } else {\n?>", $prefixCode);
+            $this->openTag($compiler, 'elseif', array($nesting + 1, $compiler->tag_nocache));
+            if ($condition_by_assign) {
+                $_output = $compiler->appendCode($_output, $assignCode);
+                return $compiler->appendCode($_output, "<?php if ({$prefixVar}) {?>");
+            } else {
+                return $compiler->appendCode($_output, "<?php if ({$parameter['if condition']}) {?>");
+            }
+        }
+    }
+}
+
+/**
+ * Smarty Internal Plugin Compile Ifclose Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Ifclose extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for the {/if} tag
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return string compiled code
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        // must endblock be nocache?
+        if ($compiler->nocache) {
+            $compiler->tag_nocache = true;
+        }
+        list($nesting, $compiler->nocache) = $this->closeTag($compiler, array('if', 'else', 'elseif'));
+        $tmp = '';
+        for ($i = 0; $i < $nesting; $i++) {
+            $tmp .= '}';
+        }
+        return "<?php {$tmp}?>";
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_include.php b/sysplugins/smarty_internal_compile_include.php
new file mode 100644
index 0000000000000000000000000000000000000000..716c91d49b751daadad86c947a94ed1cdf0eb6c8
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_include.php
@@ -0,0 +1,347 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Include
+ * Compiles the {include} tag
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Include Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
+{
+    /**
+     * caching mode to create nocache code but no cache file
+     */
+    const CACHING_NOCACHE_CODE = 9999;
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $required_attributes = array('file');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $shorttag_order = array('file');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $option_flags = array('nocache', 'inline', 'caching');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $optional_attributes = array('_any');
+
+    /**
+     * Valid scope names
+     *
+     * @var array
+     */
+    public $valid_scopes = array(
+        'parent' => Smarty::SCOPE_PARENT, 'root' => Smarty::SCOPE_ROOT,
+        'global' => Smarty::SCOPE_GLOBAL, 'tpl_root' => Smarty::SCOPE_TPL_ROOT,
+        'smarty' => Smarty::SCOPE_SMARTY
+    );
+
+    /**
+     * Compiles code for the {include} tag
+     *
+     * @param array                                  $args     array with attributes from parser
+     * @param Smarty_Internal_SmartyTemplateCompiler $compiler compiler object
+     *
+     * @return string
+     * @throws \Exception
+     * @throws \SmartyCompilerException
+     * @throws \SmartyException
+     */
+    public function compile($args, Smarty_Internal_SmartyTemplateCompiler $compiler)
+    {
+        $uid = $t_hash = null;
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        $fullResourceName = $source_resource = $_attr[ 'file' ];
+        $variable_template = false;
+        $cache_tpl = false;
+        // parse resource_name
+        if (preg_match('/^([\'"])(([A-Za-z0-9_\-]{2,})[:])?(([^$()]+)|(.+))\1$/', $source_resource, $match)) {
+            $type = !empty($match[ 3 ]) ? $match[ 3 ] : $compiler->template->smarty->default_resource_type;
+            $name = !empty($match[ 5 ]) ? $match[ 5 ] : $match[ 6 ];
+            $handler = Smarty_Resource::load($compiler->smarty, $type);
+            if ($handler->recompiled || $handler->uncompiled) {
+                $variable_template = true;
+            }
+            if (!$variable_template) {
+                if ($type !== 'string') {
+                    $fullResourceName = "{$type}:{$name}";
+                    $compiled = $compiler->parent_compiler->template->compiled;
+                    if (isset($compiled->includes[ $fullResourceName ])) {
+                        $compiled->includes[ $fullResourceName ]++;
+                        $cache_tpl = true;
+                    } else {
+                        if ("{$compiler->template->source->type}:{$compiler->template->source->name}" ==
+                            $fullResourceName
+                        ) {
+                            // recursive call of current template
+                            $compiled->includes[ $fullResourceName ] = 2;
+                            $cache_tpl = true;
+                        } else {
+                            $compiled->includes[ $fullResourceName ] = 1;
+                        }
+                    }
+                    $fullResourceName = $match[ 1 ] . $fullResourceName . $match[ 1 ];
+                }
+            }
+            if (empty($match[ 5 ])) {
+                $variable_template = true;
+            }
+        } else {
+            $variable_template = true;
+        }
+        // scope setup
+        $_scope = $compiler->convertScope($_attr, $this->valid_scopes);
+        // set flag to cache subtemplate object when called within loop or template name is variable.
+        if ($cache_tpl || $variable_template || $compiler->loopNesting > 0) {
+            $_cache_tpl = 'true';
+        } else {
+            $_cache_tpl = 'false';
+        }
+        // assume caching is off
+        $_caching = Smarty::CACHING_OFF;
+        $call_nocache = $compiler->tag_nocache || $compiler->nocache;
+        // caching was on and {include} is not in nocache mode
+        if ($compiler->template->caching && !$compiler->nocache && !$compiler->tag_nocache) {
+            $_caching = self::CACHING_NOCACHE_CODE;
+        }
+        // flag if included template code should be merged into caller
+        $merge_compiled_includes = ($compiler->smarty->merge_compiled_includes || $_attr[ 'inline' ] === true) &&
+                                   !$compiler->template->source->handler->recompiled;
+        if ($merge_compiled_includes) {
+            // variable template name ?
+            if ($variable_template) {
+                $merge_compiled_includes = false;
+            }
+            // variable compile_id?
+            if (isset($_attr[ 'compile_id' ]) && $compiler->isVariable($_attr[ 'compile_id' ])) {
+                $merge_compiled_includes = false;
+            }
+        }
+        /*
+        * if the {include} tag provides individual parameter for caching or compile_id
+        * the subtemplate must not be included into the common cache file and is treated like
+        * a call in nocache mode.
+        *
+        */
+        if ($_attr[ 'nocache' ] !== true && $_attr[ 'caching' ]) {
+            $_caching = $_new_caching = (int)$_attr[ 'caching' ];
+            $call_nocache = true;
+        } else {
+            $_new_caching = Smarty::CACHING_LIFETIME_CURRENT;
+        }
+        if (isset($_attr[ 'cache_lifetime' ])) {
+            $_cache_lifetime = $_attr[ 'cache_lifetime' ];
+            $call_nocache = true;
+            $_caching = $_new_caching;
+        } else {
+            $_cache_lifetime = '$_smarty_tpl->cache_lifetime';
+        }
+        if (isset($_attr[ 'cache_id' ])) {
+            $_cache_id = $_attr[ 'cache_id' ];
+            $call_nocache = true;
+            $_caching = $_new_caching;
+        } else {
+            $_cache_id = '$_smarty_tpl->cache_id';
+        }
+        if (isset($_attr[ 'compile_id' ])) {
+            $_compile_id = $_attr[ 'compile_id' ];
+        } else {
+            $_compile_id = '$_smarty_tpl->compile_id';
+        }
+        // if subtemplate will be called in nocache mode do not merge
+        if ($compiler->template->caching && $call_nocache) {
+            $merge_compiled_includes = false;
+        }
+        // assign attribute
+        if (isset($_attr[ 'assign' ])) {
+            // output will be stored in a smarty variable instead of being displayed
+            if ($_assign = $compiler->getId($_attr[ 'assign' ])) {
+                $_assign = "'{$_assign}'";
+                if ($compiler->tag_nocache || $compiler->nocache || $call_nocache) {
+                    // create nocache var to make it know for further compiling
+                    $compiler->setNocacheInVariable($_attr[ 'assign' ]);
+                }
+            } else {
+                $_assign = $_attr[ 'assign' ];
+            }
+        }
+        $has_compiled_template = false;
+        if ($merge_compiled_includes) {
+            $c_id = isset($_attr[ 'compile_id' ]) ? $_attr[ 'compile_id' ] : $compiler->template->compile_id;
+            // we must observe different compile_id and caching
+            $t_hash = sha1($c_id . ($_caching ? '--caching' : '--nocaching'));
+            $compiler->smarty->allow_ambiguous_resources = true;
+            /* @var Smarty_Internal_Template $tpl */
+            $tpl = new $compiler->smarty->template_class(
+                trim($fullResourceName, '"\''),
+                $compiler->smarty,
+                $compiler->template,
+                $compiler->template->cache_id,
+                $c_id,
+                $_caching
+            );
+            $uid = $tpl->source->type . $tpl->source->uid;
+            if (!isset($compiler->parent_compiler->mergedSubTemplatesData[ $uid ][ $t_hash ])) {
+                $has_compiled_template = $this->compileInlineTemplate($compiler, $tpl, $t_hash);
+            } else {
+                $has_compiled_template = true;
+            }
+            unset($tpl);
+        }
+        // delete {include} standard attributes
+        unset($_attr[ 'file' ], $_attr[ 'assign' ], $_attr[ 'cache_id' ], $_attr[ 'compile_id' ], $_attr[ 'cache_lifetime' ], $_attr[ 'nocache' ], $_attr[ 'caching' ], $_attr[ 'scope' ], $_attr[ 'inline' ]);
+        // remaining attributes must be assigned as smarty variable
+        $_vars = 'array()';
+        if (!empty($_attr)) {
+            $_pairs = array();
+            // create variables
+            foreach ($_attr as $key => $value) {
+                $_pairs[] = "'$key'=>$value";
+            }
+            $_vars = 'array(' . join(',', $_pairs) . ')';
+        }
+        $update_compile_id = $compiler->template->caching && !$compiler->tag_nocache && !$compiler->nocache &&
+                             $_compile_id !== '$_smarty_tpl->compile_id';
+        if ($has_compiled_template && !$call_nocache) {
+            $_output = "<?php\n";
+            if ($update_compile_id) {
+                $_output .= $compiler->makeNocacheCode("\$_compile_id_save[] = \$_smarty_tpl->compile_id;\n\$_smarty_tpl->compile_id = {$_compile_id};\n");
+            }
+            if (!empty($_attr) && $_caching === 9999 && $compiler->template->caching) {
+                $_vars_nc = "foreach ($_vars as \$ik => \$iv) {\n";
+                $_vars_nc .= "\$_smarty_tpl->tpl_vars[\$ik] =  new Smarty_Variable(\$iv);\n";
+                $_vars_nc .= "}\n";
+                $_output .= substr($compiler->processNocacheCode('<?php ' . $_vars_nc . "?>\n", true), 6, -3);
+            }
+            if (isset($_assign)) {
+                $_output .= "ob_start();\n";
+            }
+            $_output .= "\$_smarty_tpl->_subTemplateRender({$fullResourceName}, {$_cache_id}, {$_compile_id}, {$_caching}, {$_cache_lifetime}, {$_vars}, {$_scope}, {$_cache_tpl}, '{$compiler->parent_compiler->mergedSubTemplatesData[$uid][$t_hash]['uid']}', '{$compiler->parent_compiler->mergedSubTemplatesData[$uid][$t_hash]['func']}');\n";
+            if (isset($_assign)) {
+                $_output .= "\$_smarty_tpl->assign({$_assign}, ob_get_clean());\n";
+            }
+            if ($update_compile_id) {
+                $_output .= $compiler->makeNocacheCode("\$_smarty_tpl->compile_id = array_pop(\$_compile_id_save);\n");
+            }
+            $_output .= "?>";
+            return $_output;
+        }
+        if ($call_nocache) {
+            $compiler->tag_nocache = true;
+        }
+        $_output = "<?php ";
+        if ($update_compile_id) {
+            $_output .= "\$_compile_id_save[] = \$_smarty_tpl->compile_id;\n\$_smarty_tpl->compile_id = {$_compile_id};\n";
+        }
+        // was there an assign attribute
+        if (isset($_assign)) {
+            $_output .= "ob_start();\n";
+        }
+        $_output .= "\$_smarty_tpl->_subTemplateRender({$fullResourceName}, $_cache_id, $_compile_id, $_caching, $_cache_lifetime, $_vars, $_scope, {$_cache_tpl});\n";
+        if (isset($_assign)) {
+            $_output .= "\$_smarty_tpl->assign({$_assign}, ob_get_clean());\n";
+        }
+        if ($update_compile_id) {
+            $_output .= "\$_smarty_tpl->compile_id = array_pop(\$_compile_id_save);\n";
+        }
+        $_output .= "?>";
+        return $_output;
+    }
+
+    /**
+     * Compile inline sub template
+     *
+     * @param \Smarty_Internal_SmartyTemplateCompiler $compiler
+     * @param \Smarty_Internal_Template               $tpl
+     * @param string                                  $t_hash
+     *
+     * @return bool
+     * @throws \Exception
+     * @throws \SmartyException
+     */
+    public function compileInlineTemplate(
+        Smarty_Internal_SmartyTemplateCompiler $compiler,
+        Smarty_Internal_Template $tpl,
+        $t_hash
+    ) {
+        $uid = $tpl->source->type . $tpl->source->uid;
+        if (!($tpl->source->handler->uncompiled) && $tpl->source->exists) {
+            $compiler->parent_compiler->mergedSubTemplatesData[ $uid ][ $t_hash ][ 'uid' ] = $tpl->source->uid;
+            if (isset($compiler->template->inheritance)) {
+                $tpl->inheritance = clone $compiler->template->inheritance;
+            }
+            $tpl->compiled = new Smarty_Template_Compiled();
+            $tpl->compiled->nocache_hash = $compiler->parent_compiler->template->compiled->nocache_hash;
+            $tpl->loadCompiler();
+            // save unique function name
+            $compiler->parent_compiler->mergedSubTemplatesData[ $uid ][ $t_hash ][ 'func' ] =
+            $tpl->compiled->unifunc = 'content_' . str_replace(array('.', ','), '_', uniqid('', true));
+            // make sure whole chain gets compiled
+            $tpl->mustCompile = true;
+            $compiler->parent_compiler->mergedSubTemplatesData[ $uid ][ $t_hash ][ 'nocache_hash' ] =
+                $tpl->compiled->nocache_hash;
+            if ($tpl->source->type === 'file') {
+                $sourceInfo = $tpl->source->filepath;
+            } else {
+                $basename = $tpl->source->handler->getBasename($tpl->source);
+                $sourceInfo = $tpl->source->type . ':' .
+                              ($basename ? $basename : $tpl->source->name);
+            }
+            // get compiled code
+            $compiled_code = "<?php\n\n";
+            $compiled_code .= "/* Start inline template \"{$sourceInfo}\" =============================*/\n";
+            $compiled_code .= "function {$tpl->compiled->unifunc} (Smarty_Internal_Template \$_smarty_tpl) {\n";
+            $compiled_code .= "?>\n" . $tpl->compiler->compileTemplateSource($tpl, null, $compiler->parent_compiler);
+            $compiled_code .= "<?php\n";
+            $compiled_code .= "}\n?>\n";
+            $compiled_code .= $tpl->compiler->postFilter($tpl->compiler->blockOrFunctionCode);
+            $compiled_code .= "<?php\n\n";
+            $compiled_code .= "/* End inline template \"{$sourceInfo}\" =============================*/\n";
+            $compiled_code .= '?>';
+            unset($tpl->compiler);
+            if ($tpl->compiled->has_nocache_code) {
+                // replace nocache_hash
+                $compiled_code =
+                    str_replace(
+                        "{$tpl->compiled->nocache_hash}",
+                        $compiler->template->compiled->nocache_hash,
+                        $compiled_code
+                    );
+                $compiler->template->compiled->has_nocache_code = true;
+            }
+            $compiler->parent_compiler->mergedSubTemplatesCode[ $tpl->compiled->unifunc ] = $compiled_code;
+            return true;
+        } else {
+            return false;
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_include_php.php b/sysplugins/smarty_internal_compile_include_php.php
new file mode 100644
index 0000000000000000000000000000000000000000..1b0fdaad3ce34672c113bd65c41331a2b9a56cb0
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_include_php.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Include PHP
+ * Compiles the {include_php} tag
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Insert Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Include_Php extends Smarty_Internal_CompileBase
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $required_attributes = array('file');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $shorttag_order = array('file');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $optional_attributes = array('once', 'assign');
+
+    /**
+     * Compiles code for the {include_php} tag
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return string
+     * @throws \SmartyCompilerException
+     * @throws \SmartyException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        if (!($compiler->smarty instanceof SmartyBC)) {
+            throw new SmartyException("{include_php} is deprecated, use SmartyBC class to enable");
+        }
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        /**
+         *
+         *
+         * @var Smarty_Internal_Template $_smarty_tpl
+         * used in evaluated code
+         */
+        $_smarty_tpl = $compiler->template;
+        $_filepath = false;
+        $_file = null;
+        eval('$_file = @' . $_attr[ 'file' ] . ';');
+        if (!isset($compiler->smarty->security_policy) && file_exists($_file)) {
+            $_filepath = $compiler->smarty->_realpath($_file, true);
+        } else {
+            if (isset($compiler->smarty->security_policy)) {
+                $_dir = $compiler->smarty->security_policy->trusted_dir;
+            } else {
+                $_dir = $compiler->smarty->trusted_dir;
+            }
+            if (!empty($_dir)) {
+                foreach ((array)$_dir as $_script_dir) {
+                    $_path = $compiler->smarty->_realpath($_script_dir . DIRECTORY_SEPARATOR . $_file, true);
+                    if (file_exists($_path)) {
+                        $_filepath = $_path;
+                        break;
+                    }
+                }
+            }
+        }
+        if ($_filepath === false) {
+            $compiler->trigger_template_error("{include_php} file '{$_file}' is not readable", null, true);
+        }
+        if (isset($compiler->smarty->security_policy)) {
+            $compiler->smarty->security_policy->isTrustedPHPDir($_filepath);
+        }
+        if (isset($_attr[ 'assign' ])) {
+            // output will be stored in a smarty variable instead of being displayed
+            $_assign = $_attr[ 'assign' ];
+        }
+        $_once = '_once';
+        if (isset($_attr[ 'once' ])) {
+            if ($_attr[ 'once' ] === 'false') {
+                $_once = '';
+            }
+        }
+        if (isset($_assign)) {
+            return "<?php ob_start();\ninclude{$_once} ('{$_filepath}');\n\$_smarty_tpl->assign({$_assign},ob_get_clean());\n?>";
+        } else {
+            return "<?php include{$_once} ('{$_filepath}');?>\n";
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_insert.php b/sysplugins/smarty_internal_compile_insert.php
new file mode 100644
index 0000000000000000000000000000000000000000..4bdc3952e4139dd4c17a05d14ee3b89ffb0fbe87
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_insert.php
@@ -0,0 +1,157 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Insert
+ * Compiles the {insert} tag
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Insert Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $required_attributes = array('name');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $shorttag_order = array('name');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $optional_attributes = array('_any');
+
+    /**
+     * Compiles code for the {insert} tag
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     * @throws \SmartyException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        $nocacheParam = $compiler->template->caching && ($compiler->tag_nocache || $compiler->nocache);
+        if (!$nocacheParam) {
+            // do not compile as nocache code
+            $compiler->suppressNocacheProcessing = true;
+        }
+        $compiler->tag_nocache = true;
+        $_smarty_tpl = $compiler->template;
+        $_name = null;
+        $_script = null;
+        $_output = '<?php ';
+        // save possible attributes
+        eval('$_name = @' . $_attr[ 'name' ] . ';');
+        if (isset($_attr[ 'assign' ])) {
+            // output will be stored in a smarty variable instead of being displayed
+            $_assign = $_attr[ 'assign' ];
+            // create variable to make sure that the compiler knows about its nocache status
+            $var = trim($_attr[ 'assign' ], '\'');
+            if (isset($compiler->template->tpl_vars[ $var ])) {
+                $compiler->template->tpl_vars[ $var ]->nocache = true;
+            } else {
+                $compiler->template->tpl_vars[ $var ] = new Smarty_Variable(null, true);
+            }
+        }
+        if (isset($_attr[ 'script' ])) {
+            // script which must be included
+            $_function = "smarty_insert_{$_name}";
+            $_smarty_tpl = $compiler->template;
+            $_filepath = false;
+            eval('$_script = @' . $_attr[ 'script' ] . ';');
+            if (!isset($compiler->smarty->security_policy) && file_exists($_script)) {
+                $_filepath = $_script;
+            } else {
+                if (isset($compiler->smarty->security_policy)) {
+                    $_dir = $compiler->smarty->security_policy->trusted_dir;
+                } else {
+                    $_dir = $compiler->smarty instanceof SmartyBC ? $compiler->smarty->trusted_dir : null;
+                }
+                if (!empty($_dir)) {
+                    foreach ((array)$_dir as $_script_dir) {
+                        $_script_dir = rtrim($_script_dir, '/\\') . DIRECTORY_SEPARATOR;
+                        if (file_exists($_script_dir . $_script)) {
+                            $_filepath = $_script_dir . $_script;
+                            break;
+                        }
+                    }
+                }
+            }
+            if ($_filepath === false) {
+                $compiler->trigger_template_error("{insert} missing script file '{$_script}'", null, true);
+            }
+            // code for script file loading
+            $_output .= "require_once '{$_filepath}' ;";
+            include_once $_filepath;
+            if (!is_callable($_function)) {
+                $compiler->trigger_template_error(
+                    " {insert} function '{$_function}' is not callable in script file '{$_script}'",
+                    null,
+                    true
+                );
+            }
+        } else {
+            $_filepath = 'null';
+            $_function = "insert_{$_name}";
+            // function in PHP script ?
+            if (!is_callable($_function)) {
+                // try plugin
+                if (!$_function = $compiler->getPlugin($_name, 'insert')) {
+                    $compiler->trigger_template_error(
+                        "{insert} no function or plugin found for '{$_name}'",
+                        null,
+                        true
+                    );
+                }
+            }
+        }
+        // delete {insert} standard attributes
+        unset($_attr[ 'name' ], $_attr[ 'assign' ], $_attr[ 'script' ], $_attr[ 'nocache' ]);
+        // convert attributes into parameter array string
+        $_paramsArray = array();
+        foreach ($_attr as $_key => $_value) {
+            $_paramsArray[] = "'$_key' => $_value";
+        }
+        $_params = 'array(' . implode(", ", $_paramsArray) . ')';
+        // call insert
+        if (isset($_assign)) {
+            if ($_smarty_tpl->caching && !$nocacheParam) {
+                $_output .= "echo Smarty_Internal_Nocache_Insert::compile ('{$_function}',{$_params}, \$_smarty_tpl, '{$_filepath}',{$_assign});?>";
+            } else {
+                $_output .= "\$_smarty_tpl->assign({$_assign} , {$_function} ({$_params},\$_smarty_tpl), true);?>";
+            }
+        } else {
+            if ($_smarty_tpl->caching && !$nocacheParam) {
+                $_output .= "echo Smarty_Internal_Nocache_Insert::compile ('{$_function}',{$_params}, \$_smarty_tpl, '{$_filepath}');?>";
+            } else {
+                $_output .= "echo {$_function}({$_params},\$_smarty_tpl);?>";
+            }
+        }
+        $compiler->template->compiled->has_nocache_code = true;
+        return $_output;
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_ldelim.php b/sysplugins/smarty_internal_compile_ldelim.php
new file mode 100644
index 0000000000000000000000000000000000000000..5493d4eccf4cd7021d126321bbe6fffb4349d8d2
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_ldelim.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Ldelim
+ * Compiles the {ldelim} tag
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Ldelim Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Ldelim extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for the {ldelim} tag
+     * This tag does output the left delimiter
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        $_attr = $this->getAttributes($compiler, $args);
+        if ($_attr[ 'nocache' ] === true) {
+            $compiler->trigger_template_error('nocache option not allowed', null, true);
+        }
+        return $compiler->smarty->left_delimiter;
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_make_nocache.php b/sysplugins/smarty_internal_compile_make_nocache.php
new file mode 100644
index 0000000000000000000000000000000000000000..8a34ccd0a510b70991f52d688e94d1d9a113f70c
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_make_nocache.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Make_Nocache
+ * Compiles the {make_nocache} tag
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Make_Nocache Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Make_Nocache extends Smarty_Internal_CompileBase
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $option_flags = array();
+
+    /**
+     * Array of names of required attribute required by tag
+     *
+     * @var array
+     */
+    public $required_attributes = array('var');
+
+    /**
+     * Shorttag attribute order defined by its names
+     *
+     * @var array
+     */
+    public $shorttag_order = array('var');
+
+    /**
+     * Compiles code for the {make_nocache} tag
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return string compiled code
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        if ($compiler->template->caching) {
+            $output = "<?php \$_smarty_tpl->smarty->ext->_make_nocache->save(\$_smarty_tpl, {$_attr[ 'var' ]});\n?>\n";
+            $compiler->template->compiled->has_nocache_code = true;
+            $compiler->suppressNocacheProcessing = true;
+            return $output;
+        } else {
+            return true;
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_nocache.php b/sysplugins/smarty_internal_compile_nocache.php
new file mode 100644
index 0000000000000000000000000000000000000000..12f64ed2e7ba44886a3cbce2cf856482cc9d0b28
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_nocache.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Nocache
+ * Compiles the {nocache} {/nocache} tags.
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Nocache Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Nocache extends Smarty_Internal_CompileBase
+{
+    /**
+     * Array of names of valid option flags
+     *
+     * @var array
+     */
+    public $option_flags = array();
+
+    /**
+     * Compiles code for the {nocache} tag
+     * This tag does not generate compiled output. It only sets a compiler flag.
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return bool
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        $_attr = $this->getAttributes($compiler, $args);
+        $this->openTag($compiler, 'nocache', array($compiler->nocache));
+        // enter nocache mode
+        $compiler->nocache = true;
+        // this tag does not return compiled code
+        $compiler->has_code = false;
+        return true;
+    }
+}
+
+/**
+ * Smarty Internal Plugin Compile Nocacheclose Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Nocacheclose extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for the {/nocache} tag
+     * This tag does not generate compiled output. It only sets a compiler flag.
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return bool
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        $_attr = $this->getAttributes($compiler, $args);
+        // leave nocache mode
+        list($compiler->nocache) = $this->closeTag($compiler, array('nocache'));
+        // this tag does not return compiled code
+        $compiler->has_code = false;
+        return true;
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_parent.php b/sysplugins/smarty_internal_compile_parent.php
new file mode 100644
index 0000000000000000000000000000000000000000..ff23edf73c751e700928d715345afaf975caff7c
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_parent.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * This file is part of Smarty.
+ *
+ * (c) 2015 Uwe Tews
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Smarty Internal Plugin Compile Parent Class
+ *
+ * @author Uwe Tews <uwe.tews@googlemail.com>
+ */
+class Smarty_Internal_Compile_Parent extends Smarty_Internal_Compile_Child
+{
+    /**
+     * Tag name
+     *
+     * @var string
+     */
+    public $tag = 'parent';
+
+    /**
+     * Block type
+     *
+     * @var string
+     */
+    public $blockType = 'Parent';
+}
diff --git a/sysplugins/smarty_internal_compile_private_block_plugin.php b/sysplugins/smarty_internal_compile_private_block_plugin.php
new file mode 100644
index 0000000000000000000000000000000000000000..199a296c8c05ab780a4434e56c43e70ab48497e0
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_private_block_plugin.php
@@ -0,0 +1,124 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Block Plugin
+ * Compiles code for the execution of block plugin
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Block Plugin Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Private_Block_Plugin extends Smarty_Internal_CompileBase
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $optional_attributes = array('_any');
+
+    /**
+     * nesting level
+     *
+     * @var int
+     */
+    public $nesting = 0;
+
+    /**
+     * Compiles code for the execution of block plugin
+     *
+     * @param array                                 $args      array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler  compiler object
+     * @param array                                 $parameter array with compilation parameter
+     * @param string                                $tag       name of block plugin
+     * @param string                                $function  PHP function name
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     * @throws \SmartyException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter, $tag, $function = null)
+    {
+        if (!isset($tag[ 5 ]) || substr($tag, -5) !== 'close') {
+            // opening tag of block plugin
+            // check and get attributes
+            $_attr = $this->getAttributes($compiler, $args);
+            $this->nesting++;
+            unset($_attr[ 'nocache' ]);
+            list($callback, $_paramsArray, $callable) = $this->setup($compiler, $_attr, $tag, $function);
+            $_params = 'array(' . implode(',', $_paramsArray) . ')';
+            // compile code
+            $output = "<?php ";
+            if (is_array($callback)) {
+                $output .= "\$_block_plugin{$this->nesting} = isset({$callback[0]}) ? {$callback[0]} : null;\n";
+                $callback = "\$_block_plugin{$this->nesting}{$callback[1]}";
+            }
+            if (isset($callable)) {
+                $output .= "if (!is_callable({$callable})) {\nthrow new SmartyException('block tag \'{$tag}\' not callable or registered');\n}\n";
+            }
+            $output .= "\$_smarty_tpl->smarty->_cache['_tag_stack'][] = array('{$tag}', {$_params});\n";
+            $output .= "\$_block_repeat=true;\necho {$callback}({$_params}, null, \$_smarty_tpl, \$_block_repeat);\nwhile (\$_block_repeat) {\nob_start();?>";
+            $this->openTag($compiler, $tag, array($_params, $compiler->nocache, $callback));
+            // maybe nocache because of nocache variables or nocache plugin
+            $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
+        } else {
+            // must endblock be nocache?
+            if ($compiler->nocache) {
+                $compiler->tag_nocache = true;
+            }
+            // closing tag of block plugin, restore nocache
+            list($_params, $compiler->nocache, $callback) = $this->closeTag($compiler, substr($tag, 0, -5));
+            // compile code
+            if (!isset($parameter[ 'modifier_list' ])) {
+                $mod_pre = $mod_post = $mod_content = '';
+                $mod_content2 = 'ob_get_clean()';
+            } else {
+                $mod_content2 = "\$_block_content{$this->nesting}";
+                $mod_content = "\$_block_content{$this->nesting} = ob_get_clean();\n";
+                $mod_pre = "ob_start();\n";
+                $mod_post = 'echo ' . $compiler->compileTag(
+                        'private_modifier',
+                        array(),
+                        array(
+                            'modifierlist' => $parameter[ 'modifier_list' ],
+                            'value'        => 'ob_get_clean()'
+                        )
+                    ) . ";\n";
+            }
+            $output =
+                "<?php {$mod_content}\$_block_repeat=false;\n{$mod_pre}echo {$callback}({$_params}, {$mod_content2}, \$_smarty_tpl, \$_block_repeat);\n{$mod_post}}\n";
+            $output .= 'array_pop($_smarty_tpl->smarty->_cache[\'_tag_stack\']);?>';
+        }
+        return $output;
+    }
+
+    /**
+     * Setup callback and parameter array
+     *
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler
+     * @param array                                 $_attr attributes
+     * @param string                                $tag
+     * @param string                                $function
+     *
+     * @return array
+     */
+    public function setup(Smarty_Internal_TemplateCompilerBase $compiler, $_attr, $tag, $function)
+    {
+        $_paramsArray = array();
+        foreach ($_attr as $_key => $_value) {
+            if (is_int($_key)) {
+                $_paramsArray[] = "$_key=>$_value";
+            } else {
+                $_paramsArray[] = "'$_key'=>$_value";
+            }
+        }
+        return array($function, $_paramsArray, null);
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_private_foreachsection.php b/sysplugins/smarty_internal_compile_private_foreachsection.php
new file mode 100644
index 0000000000000000000000000000000000000000..d3aab24bb08d3617a54bb8e68f3296cc05f264c7
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_private_foreachsection.php
@@ -0,0 +1,228 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile ForeachSection
+ * Shared methods for {foreach} {section} tags
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile ForeachSection Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Private_ForeachSection extends Smarty_Internal_CompileBase
+{
+    /**
+     * Name of this tag
+     *
+     * @var string
+     */
+    public $tagName = '';
+
+    /**
+     * Valid properties of $smarty.xxx variable
+     *
+     * @var array
+     */
+    public $nameProperties = array();
+
+    /**
+     * {section} tag has no item properties
+     *
+     * @var array
+     */
+    public $itemProperties = null;
+
+    /**
+     * {section} tag has always name attribute
+     *
+     * @var bool
+     */
+    public $isNamed = true;
+
+    /**
+     * @var array
+     */
+    public $matchResults = array();
+
+    /**
+     * Preg search pattern
+     *
+     * @var string
+     */
+    private $propertyPreg = '';
+
+    /**
+     * Offsets in preg match result
+     *
+     * @var array
+     */
+    private $resultOffsets = array();
+
+    /**
+     * Start offset
+     *
+     * @var int
+     */
+    private $startOffset = 0;
+
+    /**
+     * Scan sources for used tag attributes
+     *
+     * @param array                                 $attributes
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler
+     *
+     * @throws \SmartyException
+     */
+    public function scanForProperties($attributes, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        $this->propertyPreg = '~(';
+        $this->startOffset = 1;
+        $this->resultOffsets = array();
+        $this->matchResults = array('named' => array(), 'item' => array());
+        if (isset($attributes[ 'name' ])) {
+            $this->buildPropertyPreg(true, $attributes);
+        }
+        if (isset($this->itemProperties)) {
+            if ($this->isNamed) {
+                $this->propertyPreg .= '|';
+            }
+            $this->buildPropertyPreg(false, $attributes);
+        }
+        $this->propertyPreg .= ')\W~i';
+        // Template source
+        $this->matchTemplateSource($compiler);
+        // Parent template source
+        $this->matchParentTemplateSource($compiler);
+        // {block} source
+        $this->matchBlockSource($compiler);
+    }
+
+    /**
+     * Build property preg string
+     *
+     * @param bool  $named
+     * @param array $attributes
+     */
+    public function buildPropertyPreg($named, $attributes)
+    {
+        if ($named) {
+            $this->resultOffsets[ 'named' ] = $this->startOffset = $this->startOffset + 3;
+            $this->propertyPreg .= "(([\$]smarty[.]{$this->tagName}[.]" .
+                                   ($this->tagName === 'section' ? "|[\[]\s*" : '') .
+                                   "){$attributes['name']}[.](";
+            $properties = $this->nameProperties;
+        } else {
+            $this->resultOffsets[ 'item' ] = $this->startOffset = $this->startOffset + 2;
+            $this->propertyPreg .= "([\$]{$attributes['item']}[@](";
+            $properties = $this->itemProperties;
+        }
+        $propName = reset($properties);
+        while ($propName) {
+            $this->propertyPreg .= "{$propName}";
+            $propName = next($properties);
+            if ($propName) {
+                $this->propertyPreg .= '|';
+            }
+        }
+        $this->propertyPreg .= '))';
+    }
+
+    /**
+     * Find matches in source string
+     *
+     * @param string $source
+     */
+    public function matchProperty($source)
+    {
+        preg_match_all($this->propertyPreg, $source, $match);
+        foreach ($this->resultOffsets as $key => $offset) {
+            foreach ($match[ $offset ] as $m) {
+                if (!empty($m)) {
+                    $this->matchResults[ $key ][ strtolower($m) ] = true;
+                }
+            }
+        }
+    }
+
+    /**
+     * Find matches in template source
+     *
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler
+     */
+    public function matchTemplateSource(Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        $this->matchProperty($compiler->parser->lex->data);
+    }
+
+    /**
+     * Find matches in all parent template source
+     *
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler
+     *
+     * @throws \SmartyException
+     */
+    public function matchParentTemplateSource(Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        // search parent compiler template source
+        $nextCompiler = $compiler;
+        while ($nextCompiler !== $nextCompiler->parent_compiler) {
+            $nextCompiler = $nextCompiler->parent_compiler;
+            if ($compiler !== $nextCompiler) {
+                // get template source
+                $_content = $nextCompiler->template->source->getContent();
+                if ($_content !== '') {
+                    // run pre filter if required
+                    if ((isset($nextCompiler->smarty->autoload_filters[ 'pre' ]) ||
+                         isset($nextCompiler->smarty->registered_filters[ 'pre' ]))
+                    ) {
+                        $_content = $nextCompiler->smarty->ext->_filterHandler->runFilter(
+                            'pre',
+                            $_content,
+                            $nextCompiler->template
+                        );
+                    }
+                    $this->matchProperty($_content);
+                }
+            }
+        }
+    }
+
+    /**
+     * Find matches in {block} tag source
+     *
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler
+     */
+    public function matchBlockSource(Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+    }
+
+    /**
+     * Compiles code for the {$smarty.foreach.xxx} or {$smarty.section.xxx}tag
+     *
+     * @param array                                 $args      array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler  compiler object
+     * @param array                                 $parameter array with compilation parameter
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     */
+    public function compileSpecialVariable($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+    {
+        $tag = strtolower(trim($parameter[ 0 ], '"\''));
+        $name = isset($parameter[ 1 ]) ? $compiler->getId($parameter[ 1 ]) : false;
+        if (!$name) {
+            $compiler->trigger_template_error("missing or illegal \$smarty.{$tag} name attribute", null, true);
+        }
+        $property = isset($parameter[ 2 ]) ? strtolower($compiler->getId($parameter[ 2 ])) : false;
+        if (!$property || !in_array($property, $this->nameProperties)) {
+            $compiler->trigger_template_error("missing or illegal \$smarty.{$tag} property attribute", null, true);
+        }
+        $tagVar = "'__smarty_{$tag}_{$name}'";
+        return "(isset(\$_smarty_tpl->tpl_vars[{$tagVar}]->value['{$property}']) ? \$_smarty_tpl->tpl_vars[{$tagVar}]->value['{$property}'] : null)";
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_private_function_plugin.php b/sysplugins/smarty_internal_compile_private_function_plugin.php
new file mode 100644
index 0000000000000000000000000000000000000000..055823423e45ae6c77f2b88299244dffc2b1a8fb
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_private_function_plugin.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Function Plugin
+ * Compiles code for the execution of function plugin
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Function Plugin Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Private_Function_Plugin extends Smarty_Internal_CompileBase
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $required_attributes = array();
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $optional_attributes = array('_any');
+
+    /**
+     * Compiles code for the execution of function plugin
+     *
+     * @param array                                 $args      array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler  compiler object
+     * @param array                                 $parameter array with compilation parameter
+     * @param string                                $tag       name of function plugin
+     * @param string                                $function  PHP function name
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     * @throws \SmartyException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter, $tag, $function)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        unset($_attr[ 'nocache' ]);
+        // convert attributes into parameter array string
+        $_paramsArray = array();
+        foreach ($_attr as $_key => $_value) {
+            if (is_int($_key)) {
+                $_paramsArray[] = "$_key=>$_value";
+            } else {
+                $_paramsArray[] = "'$_key'=>$_value";
+            }
+        }
+        $_params = 'array(' . implode(',', $_paramsArray) . ')';
+        // compile code
+        $output = "{$function}({$_params},\$_smarty_tpl)";
+        if (!empty($parameter[ 'modifierlist' ])) {
+            $output = $compiler->compileTag(
+                'private_modifier',
+                array(),
+                array(
+                    'modifierlist' => $parameter[ 'modifierlist' ],
+                    'value'        => $output
+                )
+            );
+        }
+        $output = "<?php echo {$output};?>\n";
+        return $output;
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_private_modifier.php b/sysplugins/smarty_internal_compile_private_modifier.php
new file mode 100644
index 0000000000000000000000000000000000000000..72773fff8c6efe0e1aeb1ba6663b7532632b7b0d
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_private_modifier.php
@@ -0,0 +1,158 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Modifier
+ * Compiles code for modifier execution
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Modifier Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Private_Modifier extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for modifier execution
+     *
+     * @param array                                 $args      array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler  compiler object
+     * @param array                                 $parameter array with compilation parameter
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     * @throws \SmartyException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        $output = $parameter[ 'value' ];
+        // loop over list of modifiers
+        foreach ($parameter[ 'modifierlist' ] as $single_modifier) {
+            /* @var string $modifier */
+            $modifier = $single_modifier[ 0 ];
+            $single_modifier[ 0 ] = $output;
+            $params = implode(',', $single_modifier);
+            // check if we know already the type of modifier
+            if (isset($compiler->known_modifier_type[ $modifier ])) {
+                $modifier_types = array($compiler->known_modifier_type[ $modifier ]);
+            } else {
+                $modifier_types = array(1, 2, 3, 4, 5, 6);
+            }
+            foreach ($modifier_types as $type) {
+                switch ($type) {
+                    case 1:
+                        // registered modifier
+                        if (isset($compiler->smarty->registered_plugins[ Smarty::PLUGIN_MODIFIER ][ $modifier ])) {
+                            if (is_callable($compiler->smarty->registered_plugins[ Smarty::PLUGIN_MODIFIER ][ $modifier ][ 0 ])) {
+                                $output =
+                                    sprintf(
+                                        'call_user_func_array($_smarty_tpl->registered_plugins[ \'%s\' ][ %s ][ 0 ], array( %s ))',
+                                        Smarty::PLUGIN_MODIFIER,
+                                        var_export($modifier, true),
+                                        $params
+                                    );
+                                $compiler->known_modifier_type[ $modifier ] = $type;
+                                break 2;
+                            }
+                        }
+                        break;
+                    case 2:
+                        // registered modifier compiler
+                        if (isset($compiler->smarty->registered_plugins[ Smarty::PLUGIN_MODIFIERCOMPILER ][ $modifier ][ 0 ])) {
+                            $output =
+                                call_user_func(
+                                    $compiler->smarty->registered_plugins[ Smarty::PLUGIN_MODIFIERCOMPILER ][ $modifier ][ 0 ],
+                                    $single_modifier,
+                                    $compiler->smarty
+                                );
+                            $compiler->known_modifier_type[ $modifier ] = $type;
+                            break 2;
+                        }
+                        break;
+                    case 3:
+                        // modifiercompiler plugin
+                        if ($compiler->smarty->loadPlugin('smarty_modifiercompiler_' . $modifier)) {
+                            // check if modifier allowed
+                            if (!is_object($compiler->smarty->security_policy)
+                                || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)
+                            ) {
+                                $plugin = 'smarty_modifiercompiler_' . $modifier;
+                                $output = $plugin($single_modifier, $compiler);
+                            }
+                            $compiler->known_modifier_type[ $modifier ] = $type;
+                            break 2;
+                        }
+                        break;
+                    case 4:
+                        // modifier plugin
+                        if ($function = $compiler->getPlugin($modifier, Smarty::PLUGIN_MODIFIER)) {
+                            // check if modifier allowed
+                            if (!is_object($compiler->smarty->security_policy)
+                                || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)
+                            ) {
+                                $output = "{$function}({$params})";
+                            }
+                            $compiler->known_modifier_type[ $modifier ] = $type;
+                            break 2;
+                        }
+                        break;
+                    case 5:
+                        // PHP function
+                        if (is_callable($modifier)) {
+                            // check if modifier allowed
+                            if (!is_object($compiler->smarty->security_policy)
+                                || $compiler->smarty->security_policy->isTrustedPhpModifier($modifier, $compiler)
+                            ) {
+                                $output = "{$modifier}({$params})";
+                            }
+                            $compiler->known_modifier_type[ $modifier ] = $type;
+                            break 2;
+                        }
+                        break;
+                    case 6:
+                        // default plugin handler
+                        if (isset($compiler->default_handler_plugins[ Smarty::PLUGIN_MODIFIER ][ $modifier ])
+                            || (is_callable($compiler->smarty->default_plugin_handler_func)
+                                && $compiler->getPluginFromDefaultHandler($modifier, Smarty::PLUGIN_MODIFIER))
+                        ) {
+                            $function = $compiler->default_handler_plugins[ Smarty::PLUGIN_MODIFIER ][ $modifier ][ 0 ];
+                            // check if modifier allowed
+                            if (!is_object($compiler->smarty->security_policy)
+                                || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)
+                            ) {
+                                if (!is_array($function)) {
+                                    $output = "{$function}({$params})";
+                                } else {
+                                    if (is_object($function[ 0 ])) {
+                                        $output = $function[ 0 ] . '->' . $function[ 1 ] . '(' . $params . ')';
+                                    } else {
+                                        $output = $function[ 0 ] . '::' . $function[ 1 ] . '(' . $params . ')';
+                                    }
+                                }
+                            }
+                            if (isset($compiler->required_plugins[ 'nocache' ][ $modifier ][ Smarty::PLUGIN_MODIFIER ][ 'file' ])
+                                ||
+                                isset($compiler->required_plugins[ 'compiled' ][ $modifier ][ Smarty::PLUGIN_MODIFIER ][ 'file' ])
+                            ) {
+                                // was a plugin
+                                $compiler->known_modifier_type[ $modifier ] = 4;
+                            } else {
+                                $compiler->known_modifier_type[ $modifier ] = $type;
+                            }
+                            break 2;
+                        }
+                }
+            }
+            if (!isset($compiler->known_modifier_type[ $modifier ])) {
+                $compiler->trigger_template_error("unknown modifier '{$modifier}'", null, true);
+            }
+        }
+        return $output;
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_private_object_block_function.php b/sysplugins/smarty_internal_compile_private_object_block_function.php
new file mode 100644
index 0000000000000000000000000000000000000000..baac51b285ad0ac0fb1baf287ee78ca93e6f695d
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_private_object_block_function.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Object Block Function
+ * Compiles code for registered objects as block function
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Object Block Function Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Private_Object_Block_Function extends Smarty_Internal_Compile_Private_Block_Plugin
+{
+    /**
+     * Setup callback and parameter array
+     *
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler
+     * @param array                                 $_attr attributes
+     * @param string                                $tag
+     * @param string                                $method
+     *
+     * @return array
+     */
+    public function setup(Smarty_Internal_TemplateCompilerBase $compiler, $_attr, $tag, $method)
+    {
+        $_paramsArray = array();
+        foreach ($_attr as $_key => $_value) {
+            if (is_int($_key)) {
+                $_paramsArray[] = "$_key=>$_value";
+            } else {
+                $_paramsArray[] = "'$_key'=>$_value";
+            }
+        }
+        $callback = array("\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]", "->{$method}");
+        return array($callback, $_paramsArray, "array(\$_block_plugin{$this->nesting}, '{$method}')");
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_private_object_function.php b/sysplugins/smarty_internal_compile_private_object_function.php
new file mode 100644
index 0000000000000000000000000000000000000000..2a763c6e3fc66bb816be92918253aadf7c589965
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_private_object_function.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Object Function
+ * Compiles code for registered objects as function
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Object Function Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Private_Object_Function extends Smarty_Internal_CompileBase
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $optional_attributes = array('_any');
+
+    /**
+     * Compiles code for the execution of function plugin
+     *
+     * @param array                                 $args      array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler  compiler object
+     * @param array                                 $parameter array with compilation parameter
+     * @param string                                $tag       name of function
+     * @param string                                $method    name of method to call
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     * @throws \SmartyException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter, $tag, $method)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        unset($_attr[ 'nocache' ]);
+        $_assign = null;
+        if (isset($_attr[ 'assign' ])) {
+            $_assign = $_attr[ 'assign' ];
+            unset($_attr[ 'assign' ]);
+        }
+        // method or property ?
+        if (is_callable(array($compiler->smarty->registered_objects[ $tag ][ 0 ], $method))) {
+            // convert attributes into parameter array string
+            if ($compiler->smarty->registered_objects[ $tag ][ 2 ]) {
+                $_paramsArray = array();
+                foreach ($_attr as $_key => $_value) {
+                    if (is_int($_key)) {
+                        $_paramsArray[] = "$_key=>$_value";
+                    } else {
+                        $_paramsArray[] = "'$_key'=>$_value";
+                    }
+                }
+                $_params = 'array(' . implode(',', $_paramsArray) . ')';
+                $output = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}({$_params},\$_smarty_tpl)";
+            } else {
+                $_params = implode(',', $_attr);
+                $output = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}({$_params})";
+            }
+        } else {
+            // object property
+            $output = "\$_smarty_tpl->smarty->registered_objects['{$tag}'][0]->{$method}";
+        }
+        if (!empty($parameter[ 'modifierlist' ])) {
+            $output = $compiler->compileTag(
+                'private_modifier',
+                array(),
+                array('modifierlist' => $parameter[ 'modifierlist' ], 'value' => $output)
+            );
+        }
+        if (empty($_assign)) {
+            return "<?php echo {$output};?>\n";
+        } else {
+            return "<?php \$_smarty_tpl->assign({$_assign},{$output});?>\n";
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_private_php.php b/sysplugins/smarty_internal_compile_private_php.php
new file mode 100644
index 0000000000000000000000000000000000000000..ff48c6fbce7c1524f3dccd7b474dc076ad9028ce
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_private_php.php
@@ -0,0 +1,253 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile PHP Expression
+ * Compiles any tag which will output an expression or variable
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile PHP Expression Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Private_Php extends Smarty_Internal_CompileBase
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $required_attributes = array('code', 'type');
+
+    /**
+     * Compiles code for generating output from any expression
+     *
+     * @param array                                 $args      array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler  compiler object
+     * @param array                                 $parameter array with compilation parameter
+     *
+     * @return string
+     * @throws \SmartyException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        $compiler->has_code = false;
+        if ($_attr[ 'type' ] === 'xml') {
+            $compiler->tag_nocache = true;
+            $output = addcslashes($_attr[ 'code' ], "'\\");
+            $compiler->parser->current_buffer->append_subtree(
+                $compiler->parser,
+                new Smarty_Internal_ParseTree_Tag(
+                    $compiler->parser,
+                    $compiler->processNocacheCode(
+                        "<?php echo '{$output}';?>\n",
+                        true
+                    )
+                )
+            );
+            return '';
+        }
+        if ($_attr[ 'type' ] !== 'tag') {
+            if ($compiler->php_handling === Smarty::PHP_REMOVE) {
+                return '';
+            } elseif ($compiler->php_handling === Smarty::PHP_QUOTE) {
+                $output =
+                    preg_replace_callback(
+                        '#(<\?(?:php|=)?)|(<%)|(<script\s+language\s*=\s*["\']?\s*php\s*["\']?\s*>)|(\?>)|(%>)|(<\/script>)#i',
+                        array($this, 'quote'),
+                        $_attr[ 'code' ]
+                    );
+                $compiler->parser->current_buffer->append_subtree(
+                    $compiler->parser,
+                    new Smarty_Internal_ParseTree_Text($output)
+                );
+                return '';
+            } elseif ($compiler->php_handling === Smarty::PHP_PASSTHRU || $_attr[ 'type' ] === 'unmatched') {
+                $compiler->tag_nocache = true;
+                $output = addcslashes($_attr[ 'code' ], "'\\");
+                $compiler->parser->current_buffer->append_subtree(
+                    $compiler->parser,
+                    new Smarty_Internal_ParseTree_Tag(
+                        $compiler->parser,
+                        $compiler->processNocacheCode(
+                            "<?php echo '{$output}';?>\n",
+                            true
+                        )
+                    )
+                );
+                return '';
+            } elseif ($compiler->php_handling === Smarty::PHP_ALLOW) {
+                if (!($compiler->smarty instanceof SmartyBC)) {
+                    $compiler->trigger_template_error(
+                        '$smarty->php_handling PHP_ALLOW not allowed. Use SmartyBC to enable it',
+                        null,
+                        true
+                    );
+                }
+                $compiler->has_code = true;
+                return $_attr[ 'code' ];
+            } else {
+                $compiler->trigger_template_error('Illegal $smarty->php_handling value', null, true);
+            }
+        } else {
+            $compiler->has_code = true;
+            if (!($compiler->smarty instanceof SmartyBC)) {
+                $compiler->trigger_template_error(
+                    '{php}{/php} tags not allowed. Use SmartyBC to enable them',
+                    null,
+                    true
+                );
+            }
+            $ldel = preg_quote($compiler->smarty->left_delimiter, '#');
+            $rdel = preg_quote($compiler->smarty->right_delimiter, '#');
+            preg_match("#^({$ldel}php\\s*)((.)*?)({$rdel})#", $_attr[ 'code' ], $match);
+            if (!empty($match[ 2 ])) {
+                if ('nocache' === trim($match[ 2 ])) {
+                    $compiler->tag_nocache = true;
+                } else {
+                    $compiler->trigger_template_error("illegal value of option flag '{$match[2]}'", null, true);
+                }
+            }
+            return preg_replace(
+                array("#^{$ldel}\\s*php\\s*(.)*?{$rdel}#", "#{$ldel}\\s*/\\s*php\\s*{$rdel}$#"),
+                array('<?php ', '?>'),
+                $_attr[ 'code' ]
+            );
+        }
+    }
+
+    /**
+     * Lexer code for PHP tags
+     *
+     * This code has been moved from lexer here fo easier debugging and maintenance
+     *
+     * @param Smarty_Internal_Templatelexer $lex
+     *
+     * @throws \SmartyCompilerException
+     */
+    public function parsePhp(Smarty_Internal_Templatelexer $lex)
+    {
+        $lex->token = Smarty_Internal_Templateparser::TP_PHP;
+        $close = 0;
+        $lex->taglineno = $lex->line;
+        $closeTag = '?>';
+        if (strpos($lex->value, '<?xml') === 0) {
+            $lex->is_xml = true;
+            $lex->phpType = 'xml';
+            return;
+        } elseif (strpos($lex->value, '<?') === 0) {
+            $lex->phpType = 'php';
+        } elseif (strpos($lex->value, '<%') === 0) {
+            $lex->phpType = 'asp';
+            $closeTag = '%>';
+        } elseif (strpos($lex->value, '%>') === 0) {
+            $lex->phpType = 'unmatched';
+        } elseif (strpos($lex->value, '?>') === 0) {
+            if ($lex->is_xml) {
+                $lex->is_xml = false;
+                $lex->phpType = 'xml';
+                return;
+            }
+            $lex->phpType = 'unmatched';
+        } elseif (strpos($lex->value, '<s') === 0) {
+            $lex->phpType = 'script';
+            $closeTag = '</script>';
+        } elseif (strpos($lex->value, $lex->smarty->left_delimiter) === 0) {
+            if ($lex->isAutoLiteral()) {
+                $lex->token = Smarty_Internal_Templateparser::TP_TEXT;
+                return;
+            }
+            $closeTag = "{$lex->smarty->left_delimiter}/php{$lex->smarty->right_delimiter}";
+            if ($lex->value === $closeTag) {
+                $lex->compiler->trigger_template_error("unexpected closing tag '{$closeTag}'");
+            }
+            $lex->phpType = 'tag';
+        }
+        if ($lex->phpType === 'unmatched') {
+            return;
+        }
+        if (($lex->phpType === 'php' || $lex->phpType === 'asp')
+            &&
+            ($lex->compiler->php_handling === Smarty::PHP_PASSTHRU ||
+             $lex->compiler->php_handling === Smarty::PHP_QUOTE)
+        ) {
+            return;
+        }
+        $start = $lex->counter + strlen($lex->value);
+        $body = true;
+        if (preg_match('~' . preg_quote($closeTag, '~') . '~i', $lex->data, $match, PREG_OFFSET_CAPTURE, $start)) {
+            $close = $match[ 0 ][ 1 ];
+        } else {
+            $lex->compiler->trigger_template_error("missing closing tag '{$closeTag}'");
+        }
+        while ($body) {
+            if (preg_match(
+                '~([/][*])|([/][/][^\n]*)|(\'[^\'\\\\]*(?:\\.[^\'\\\\]*)*\')|("[^"\\\\]*(?:\\.[^"\\\\]*)*")~',
+                $lex->data,
+                $match,
+                PREG_OFFSET_CAPTURE,
+                $start
+            )
+            ) {
+                $value = $match[ 0 ][ 0 ];
+                $from = $pos = $match[ 0 ][ 1 ];
+                if ($pos > $close) {
+                    $body = false;
+                } else {
+                    $start = $pos + strlen($value);
+                    $phpCommentStart = $value === '/*';
+                    if ($phpCommentStart) {
+                        $phpCommentEnd = preg_match('~([*][/])~', $lex->data, $match, PREG_OFFSET_CAPTURE, $start);
+                        if ($phpCommentEnd) {
+                            $pos2 = $match[ 0 ][ 1 ];
+                            $start = $pos2 + strlen($match[ 0 ][ 0 ]);
+                        }
+                    }
+                    while ($close > $pos && $close < $start) {
+                        if (preg_match(
+                            '~' . preg_quote($closeTag, '~') . '~i',
+                            $lex->data,
+                            $match,
+                            PREG_OFFSET_CAPTURE,
+                            $from
+                        )
+                        ) {
+                            $close = $match[ 0 ][ 1 ];
+                            $from = $close + strlen($match[ 0 ][ 0 ]);
+                        } else {
+                            $lex->compiler->trigger_template_error("missing closing tag '{$closeTag}'");
+                        }
+                    }
+                    if ($phpCommentStart && (!$phpCommentEnd || $pos2 > $close)) {
+                        $lex->taglineno = $lex->line + substr_count(substr($lex->data, $lex->counter, $start), "\n");
+                        $lex->compiler->trigger_template_error("missing PHP comment closing tag '*/'");
+                    }
+                }
+            } else {
+                $body = false;
+            }
+        }
+        $lex->value = substr($lex->data, $lex->counter, $close + strlen($closeTag) - $lex->counter);
+    }
+
+    /*
+     * Call back function for $php_handling = PHP_QUOTE
+     *
+     */
+    /**
+     * @param $match
+     *
+     * @return string
+     */
+    private function quote($match)
+    {
+        return htmlspecialchars($match[ 0 ], ENT_QUOTES);
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_private_print_expression.php b/sysplugins/smarty_internal_compile_private_print_expression.php
new file mode 100644
index 0000000000000000000000000000000000000000..23cae8aefde7c077229ae7afd7dce418aec49271
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_private_print_expression.php
@@ -0,0 +1,161 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Print Expression
+ * Compiles any tag which will output an expression or variable
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Print Expression Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Private_Print_Expression extends Smarty_Internal_CompileBase
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $optional_attributes = array('assign');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $option_flags = array('nocache', 'nofilter');
+
+    /**
+     * Compiles code for generating output from any expression
+     *
+     * @param array                                 $args      array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler  compiler object
+     * @param array                                 $parameter array with compilation parameter
+     *
+     * @return string
+     * @throws \SmartyException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        $output = $parameter[ 'value' ];
+        // tag modifier
+        if (!empty($parameter[ 'modifierlist' ])) {
+            $output = $compiler->compileTag(
+                'private_modifier',
+                array(),
+                array(
+                    'modifierlist' => $parameter[ 'modifierlist' ],
+                    'value'        => $output
+                )
+            );
+        }
+        if (isset($_attr[ 'assign' ])) {
+            // assign output to variable
+            return "<?php \$_smarty_tpl->assign({$_attr['assign']},{$output});?>";
+        } else {
+            // display value
+            if (!$_attr[ 'nofilter' ]) {
+                // default modifier
+                if (!empty($compiler->smarty->default_modifiers)) {
+                    if (empty($compiler->default_modifier_list)) {
+                        $modifierlist = array();
+                        foreach ($compiler->smarty->default_modifiers as $key => $single_default_modifier) {
+                            preg_match_all(
+                                '/(\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'|"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|:|[^:]+)/',
+                                $single_default_modifier,
+                                $mod_array
+                            );
+                            for ($i = 0, $count = count($mod_array[ 0 ]); $i < $count; $i++) {
+                                if ($mod_array[ 0 ][ $i ] !== ':') {
+                                    $modifierlist[ $key ][] = $mod_array[ 0 ][ $i ];
+                                }
+                            }
+                        }
+                        $compiler->default_modifier_list = $modifierlist;
+                    }
+                    $output = $compiler->compileTag(
+                        'private_modifier',
+                        array(),
+                        array(
+                            'modifierlist' => $compiler->default_modifier_list,
+                            'value'        => $output
+                        )
+                    );
+                }
+                // autoescape html
+                if ($compiler->template->smarty->escape_html) {
+                    $output = "htmlspecialchars({$output}, ENT_QUOTES, '" . addslashes(Smarty::$_CHARSET) . "')";
+                }
+                // loop over registered filters
+                if (!empty($compiler->template->smarty->registered_filters[ Smarty::FILTER_VARIABLE ])) {
+                    foreach ($compiler->template->smarty->registered_filters[ Smarty::FILTER_VARIABLE ] as $key =>
+                        $function) {
+                        if (!is_array($function)) {
+                            $output = "{$function}({$output},\$_smarty_tpl)";
+                        } elseif (is_object($function[ 0 ])) {
+                            $output =
+                                "\$_smarty_tpl->smarty->registered_filters[Smarty::FILTER_VARIABLE]['{$key}'][0]->{$function[1]}({$output},\$_smarty_tpl)";
+                        } else {
+                            $output = "{$function[0]}::{$function[1]}({$output},\$_smarty_tpl)";
+                        }
+                    }
+                }
+                // auto loaded filters
+                if (isset($compiler->smarty->autoload_filters[ Smarty::FILTER_VARIABLE ])) {
+                    foreach ((array)$compiler->template->smarty->autoload_filters[ Smarty::FILTER_VARIABLE ] as $name) {
+                        $result = $this->compile_variable_filter($compiler, $name, $output);
+                        if ($result !== false) {
+                            $output = $result;
+                        } else {
+                            // not found, throw exception
+                            throw new SmartyException("Unable to load variable filter '{$name}'");
+                        }
+                    }
+                }
+                foreach ($compiler->variable_filters as $filter) {
+                    if (count($filter) === 1
+                        && ($result = $this->compile_variable_filter($compiler, $filter[ 0 ], $output)) !== false
+                    ) {
+                        $output = $result;
+                    } else {
+                        $output = $compiler->compileTag(
+                            'private_modifier',
+                            array(),
+                            array('modifierlist' => array($filter), 'value' => $output)
+                        );
+                    }
+                }
+            }
+            $output = "<?php echo {$output};?>\n";
+        }
+        return $output;
+    }
+
+    /**
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     * @param string                                $name     name of variable filter
+     * @param string                                $output   embedded output
+     *
+     * @return string
+     * @throws \SmartyException
+     */
+    private function compile_variable_filter(Smarty_Internal_TemplateCompilerBase $compiler, $name, $output)
+    {
+        $function = $compiler->getPlugin($name, 'variablefilter');
+        if ($function) {
+            return "{$function}({$output},\$_smarty_tpl)";
+        } else {
+            // not found
+            return false;
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_private_registered_block.php b/sysplugins/smarty_internal_compile_private_registered_block.php
new file mode 100644
index 0000000000000000000000000000000000000000..0f818d1b37624867863ba9f96cbd1e7540cc2ad2
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_private_registered_block.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Registered Block
+ * Compiles code for the execution of a registered block function
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Registered Block Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Private_Registered_Block extends Smarty_Internal_Compile_Private_Block_Plugin
+{
+    /**
+     * Setup callback, parameter array and nocache mode
+     *
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler
+     * @param array                                 $_attr attributes
+     * @param string                                $tag
+     * @param null                                  $function
+     *
+     * @return array
+     */
+    public function setup(Smarty_Internal_TemplateCompilerBase $compiler, $_attr, $tag, $function)
+    {
+        if (isset($compiler->smarty->registered_plugins[ Smarty::PLUGIN_BLOCK ][ $tag ])) {
+            $tag_info = $compiler->smarty->registered_plugins[ Smarty::PLUGIN_BLOCK ][ $tag ];
+            $callback = $tag_info[ 0 ];
+            if (is_array($callback)) {
+                if (is_object($callback[ 0 ])) {
+                    $callable = "array(\$_block_plugin{$this->nesting}, '{$callback[1]}')";
+                    $callback =
+                        array("\$_smarty_tpl->smarty->registered_plugins['block']['{$tag}'][0][0]", "->{$callback[1]}");
+                } else {
+                    $callable = "array(\$_block_plugin{$this->nesting}, '{$callback[1]}')";
+                    $callback =
+                        array("\$_smarty_tpl->smarty->registered_plugins['block']['{$tag}'][0][0]", "::{$callback[1]}");
+                }
+            } else {
+                $callable = "\$_block_plugin{$this->nesting}";
+                $callback = array("\$_smarty_tpl->smarty->registered_plugins['block']['{$tag}'][0]", '');
+            }
+        } else {
+            $tag_info = $compiler->default_handler_plugins[ Smarty::PLUGIN_BLOCK ][ $tag ];
+            $callback = $tag_info[ 0 ];
+            if (is_array($callback)) {
+                $callable = "array('{$callback[0]}', '{$callback[1]}')";
+                $callback = "{$callback[1]}::{$callback[1]}";
+            } else {
+                $callable = null;
+            }
+        }
+        $compiler->tag_nocache = !$tag_info[ 1 ] | $compiler->tag_nocache;
+        $_paramsArray = array();
+        foreach ($_attr as $_key => $_value) {
+            if (is_int($_key)) {
+                $_paramsArray[] = "$_key=>$_value";
+            } elseif ($compiler->template->caching && in_array($_key, $tag_info[ 2 ])) {
+                $_value = str_replace('\'', "^#^", $_value);
+                $_paramsArray[] = "'$_key'=>^#^.var_export($_value,true).^#^";
+            } else {
+                $_paramsArray[] = "'$_key'=>$_value";
+            }
+        }
+        return array($callback, $_paramsArray, $callable);
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_private_registered_function.php b/sysplugins/smarty_internal_compile_private_registered_function.php
new file mode 100644
index 0000000000000000000000000000000000000000..2591107d230c18e368d2c16ce74e4bfb806ad8f2
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_private_registered_function.php
@@ -0,0 +1,91 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Registered Function
+ * Compiles code for the execution of a registered function
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Registered Function Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Private_Registered_Function extends Smarty_Internal_CompileBase
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $optional_attributes = array('_any');
+
+    /**
+     * Compiles code for the execution of a registered function
+     *
+     * @param array                                 $args      array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler  compiler object
+     * @param array                                 $parameter array with compilation parameter
+     * @param string                                $tag       name of function
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     * @throws \SmartyException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter, $tag)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        unset($_attr[ 'nocache' ]);
+        if (isset($compiler->smarty->registered_plugins[ Smarty::PLUGIN_FUNCTION ][ $tag ])) {
+            $tag_info = $compiler->smarty->registered_plugins[ Smarty::PLUGIN_FUNCTION ][ $tag ];
+            $is_registered = true;
+        } else {
+            $tag_info = $compiler->default_handler_plugins[ Smarty::PLUGIN_FUNCTION ][ $tag ];
+            $is_registered = false;
+        }
+        // not cacheable?
+        $compiler->tag_nocache = $compiler->tag_nocache || !$tag_info[ 1 ];
+        // convert attributes into parameter array string
+        $_paramsArray = array();
+        foreach ($_attr as $_key => $_value) {
+            if (is_int($_key)) {
+                $_paramsArray[] = "$_key=>$_value";
+            } elseif ($compiler->template->caching && in_array($_key, $tag_info[ 2 ])) {
+                $_value = str_replace('\'', "^#^", $_value);
+                $_paramsArray[] = "'$_key'=>^#^.var_export($_value,true).^#^";
+            } else {
+                $_paramsArray[] = "'$_key'=>$_value";
+            }
+        }
+        $_params = 'array(' . implode(',', $_paramsArray) . ')';
+        // compile code
+        if ($is_registered) {
+            $output =
+                "call_user_func_array( \$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_FUNCTION]['{$tag}'][0], array( {$_params},\$_smarty_tpl ) )";
+        } else {
+            $function = $tag_info[ 0 ];
+            if (!is_array($function)) {
+                $output = "{$function}({$_params},\$_smarty_tpl)";
+            } else {
+                $output = "{$function[0]}::{$function[1]}({$_params},\$_smarty_tpl)";
+            }
+        }
+        if (!empty($parameter[ 'modifierlist' ])) {
+            $output = $compiler->compileTag(
+                'private_modifier',
+                array(),
+                array(
+                    'modifierlist' => $parameter[ 'modifierlist' ],
+                    'value'        => $output
+                )
+            );
+        }
+        $output = "<?php echo {$output};?>\n";
+        return $output;
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_private_special_variable.php b/sysplugins/smarty_internal_compile_private_special_variable.php
new file mode 100644
index 0000000000000000000000000000000000000000..de7d4a224ae9c3b015c154bbe3f8a1ca7d073cd9
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_private_special_variable.php
@@ -0,0 +1,126 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Special Smarty Variable
+ * Compiles the special $smarty variables
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile special Smarty Variable Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for the special $smarty variables
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     * @param                                       $parameter
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+    {
+        $_index = preg_split("/\]\[/", substr($parameter, 1, strlen($parameter) - 2));
+        $variable = strtolower($compiler->getId($_index[ 0 ]));
+        if ($variable === false) {
+            $compiler->trigger_template_error("special \$Smarty variable name index can not be variable", null, true);
+        }
+        if (!isset($compiler->smarty->security_policy)
+            || $compiler->smarty->security_policy->isTrustedSpecialSmartyVar($variable, $compiler)
+        ) {
+            switch ($variable) {
+                case 'foreach':
+                case 'section':
+                    if (!isset(Smarty_Internal_TemplateCompilerBase::$_tag_objects[ $variable ])) {
+                        $class = 'Smarty_Internal_Compile_' . ucfirst($variable);
+                        Smarty_Internal_TemplateCompilerBase::$_tag_objects[ $variable ] = new $class;
+                    }
+                    return Smarty_Internal_TemplateCompilerBase::$_tag_objects[ $variable ]->compileSpecialVariable(
+                        array(),
+                        $compiler,
+                        $_index
+                    );
+                case 'capture':
+                    if (class_exists('Smarty_Internal_Compile_Capture')) {
+                        return Smarty_Internal_Compile_Capture::compileSpecialVariable(array(), $compiler, $_index);
+                    }
+                    return '';
+                case 'now':
+                    return 'time()';
+                case 'cookies':
+                    if (isset($compiler->smarty->security_policy)
+                        && !$compiler->smarty->security_policy->allow_super_globals
+                    ) {
+                        $compiler->trigger_template_error("(secure mode) super globals not permitted");
+                        break;
+                    }
+                    $compiled_ref = '$_COOKIE';
+                    break;
+                case 'get':
+                case 'post':
+                case 'env':
+                case 'server':
+                case 'session':
+                case 'request':
+                    if (isset($compiler->smarty->security_policy)
+                        && !$compiler->smarty->security_policy->allow_super_globals
+                    ) {
+                        $compiler->trigger_template_error("(secure mode) super globals not permitted");
+                        break;
+                    }
+                    $compiled_ref = '$_' . strtoupper($variable);
+                    break;
+                case 'template':
+                    return 'basename($_smarty_tpl->source->filepath)';
+                case 'template_object':
+                    return '$_smarty_tpl';
+                case 'current_dir':
+                    return 'dirname($_smarty_tpl->source->filepath)';
+                case 'version':
+                    return "Smarty::SMARTY_VERSION";
+                case 'const':
+                    if (isset($compiler->smarty->security_policy)
+                        && !$compiler->smarty->security_policy->allow_constants
+                    ) {
+                        $compiler->trigger_template_error("(secure mode) constants not permitted");
+                        break;
+                    }
+                    if (strpos($_index[ 1 ], '$') === false && strpos($_index[ 1 ], '\'') === false) {
+                        return "(defined('{$_index[1]}') ? constant('{$_index[1]}') : null)";
+                    } else {
+                        return "(defined({$_index[1]}) ? constant({$_index[1]}) : null)";
+                    }
+                // no break
+                case 'config':
+                    if (isset($_index[ 2 ])) {
+                        return "(is_array(\$tmp = \$_smarty_tpl->smarty->ext->configload->_getConfigVariable(\$_smarty_tpl, $_index[1])) ? \$tmp[$_index[2]] : null)";
+                    } else {
+                        return "\$_smarty_tpl->smarty->ext->configload->_getConfigVariable(\$_smarty_tpl, $_index[1])";
+                    }
+                // no break
+                case 'ldelim':
+                    return "\$_smarty_tpl->smarty->left_delimiter";
+                case 'rdelim':
+                    return "\$_smarty_tpl->smarty->right_delimiter";
+                default:
+                    $compiler->trigger_template_error('$smarty.' . trim($_index[ 0 ], "'") . ' is not defined');
+                    break;
+            }
+            if (isset($_index[ 1 ])) {
+                array_shift($_index);
+                foreach ($_index as $_ind) {
+                    $compiled_ref = $compiled_ref . "[$_ind]";
+                }
+            }
+            return $compiled_ref;
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_rdelim.php b/sysplugins/smarty_internal_compile_rdelim.php
new file mode 100644
index 0000000000000000000000000000000000000000..1cc340c180df728e55cfe99962e4d799bafe1097
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_rdelim.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Rdelim
+ * Compiles the {rdelim} tag
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Rdelim Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Rdelim extends Smarty_Internal_Compile_Ldelim
+{
+    /**
+     * Compiles code for the {rdelim} tag
+     * This tag does output the right delimiter.
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        parent::compile($args, $compiler);
+        return $compiler->smarty->right_delimiter;
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_section.php b/sysplugins/smarty_internal_compile_section.php
new file mode 100644
index 0000000000000000000000000000000000000000..0dee208203206455eb1e9f9b42ccaafec9e72dfc
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_section.php
@@ -0,0 +1,462 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Section
+ * Compiles the {section} {sectionelse} {/section} tags
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Section Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Section extends Smarty_Internal_Compile_Private_ForeachSection
+{
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $required_attributes = array('name', 'loop');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $shorttag_order = array('name', 'loop');
+
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $optional_attributes = array('start', 'step', 'max', 'show', 'properties');
+
+    /**
+     * counter
+     *
+     * @var int
+     */
+    public $counter = 0;
+
+    /**
+     * Name of this tag
+     *
+     * @var string
+     */
+    public $tagName = 'section';
+
+    /**
+     * Valid properties of $smarty.section.name.xxx variable
+     *
+     * @var array
+     */
+    public $nameProperties = array(
+        'first', 'last', 'index', 'iteration', 'show', 'total', 'rownum', 'index_prev',
+        'index_next', 'loop'
+    );
+
+    /**
+     * {section} tag has no item properties
+     *
+     * @var array
+     */
+    public $itemProperties = null;
+
+    /**
+     * {section} tag has always name attribute
+     *
+     * @var bool
+     */
+    public $isNamed = true;
+
+    /**
+     * Compiles code for the {section} tag
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     * @throws \SmartyException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        $compiler->loopNesting++;
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        $attributes = array('name' => $compiler->getId($_attr[ 'name' ]));
+        unset($_attr[ 'name' ]);
+        foreach ($attributes as $a => $v) {
+            if ($v === false) {
+                $compiler->trigger_template_error("'{$a}' attribute/variable has illegal value", null, true);
+            }
+        }
+        $local = "\$__section_{$attributes['name']}_" . $this->counter++ . '_';
+        $sectionVar = "\$_smarty_tpl->tpl_vars['__smarty_section_{$attributes['name']}']";
+        $this->openTag($compiler, 'section', array('section', $compiler->nocache, $local, $sectionVar));
+        // maybe nocache because of nocache variables
+        $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
+        $initLocal = array();
+        $initNamedProperty = array();
+        $initFor = array();
+        $incFor = array();
+        $cmpFor = array();
+        $propValue = array(
+            'index'     => "{$sectionVar}->value['index']", 'show' => 'true', 'step' => 1,
+            'iteration' => "{$local}iteration",
+        );
+        $propType = array('index' => 2, 'iteration' => 2, 'show' => 0, 'step' => 0,);
+        // search for used tag attributes
+        $this->scanForProperties($attributes, $compiler);
+        if (!empty($this->matchResults[ 'named' ])) {
+            $namedAttr = $this->matchResults[ 'named' ];
+        }
+        if (isset($_attr[ 'properties' ]) && preg_match_all("/['](.*?)[']/", $_attr[ 'properties' ], $match)) {
+            foreach ($match[ 1 ] as $prop) {
+                if (in_array($prop, $this->nameProperties)) {
+                    $namedAttr[ $prop ] = true;
+                } else {
+                    $compiler->trigger_template_error("Invalid property '{$prop}'", null, true);
+                }
+            }
+        }
+        $namedAttr[ 'index' ] = true;
+        $output = "<?php\n";
+        foreach ($_attr as $attr_name => $attr_value) {
+            switch ($attr_name) {
+                case 'loop':
+                    if (is_numeric($attr_value)) {
+                        $v = (int)$attr_value;
+                        $t = 0;
+                    } else {
+                        $v = "(is_array(@\$_loop=$attr_value) ? count(\$_loop) : max(0, (int) \$_loop))";
+                        $t = 1;
+                    }
+                    if ($t === 1) {
+                        $initLocal[ 'loop' ] = $v;
+                        $v = "{$local}loop";
+                    }
+                    break;
+                case 'show':
+                    if (is_bool($attr_value)) {
+                        $v = $attr_value ? 'true' : 'false';
+                        $t = 0;
+                    } else {
+                        $v = "(bool) $attr_value";
+                        $t = 3;
+                    }
+                    break;
+                case 'step':
+                    if (is_numeric($attr_value)) {
+                        $v = (int)$attr_value;
+                        $v = ($v === 0) ? 1 : $v;
+                        $t = 0;
+                        break;
+                    }
+                    $initLocal[ 'step' ] = "((int)@$attr_value) === 0 ? 1 : (int)@$attr_value";
+                    $v = "{$local}step";
+                    $t = 2;
+                    break;
+                case 'max':
+                case 'start':
+                    if (is_numeric($attr_value)) {
+                        $v = (int)$attr_value;
+                        $t = 0;
+                        break;
+                    }
+                    $v = "(int)@$attr_value";
+                    $t = 3;
+                    break;
+            }
+            if ($t === 3 && $compiler->getId($attr_value)) {
+                $t = 1;
+            }
+            $propValue[ $attr_name ] = $v;
+            $propType[ $attr_name ] = $t;
+        }
+        if (isset($namedAttr[ 'step' ])) {
+            $initNamedProperty[ 'step' ] = $propValue[ 'step' ];
+        }
+        if (isset($namedAttr[ 'iteration' ])) {
+            $propValue[ 'iteration' ] = "{$sectionVar}->value['iteration']";
+        }
+        $incFor[ 'iteration' ] = "{$propValue['iteration']}++";
+        $initFor[ 'iteration' ] = "{$propValue['iteration']} = 1";
+        if ($propType[ 'step' ] === 0) {
+            if ($propValue[ 'step' ] === 1) {
+                $incFor[ 'index' ] = "{$sectionVar}->value['index']++";
+            } elseif ($propValue[ 'step' ] > 1) {
+                $incFor[ 'index' ] = "{$sectionVar}->value['index'] += {$propValue['step']}";
+            } else {
+                $incFor[ 'index' ] = "{$sectionVar}->value['index'] -= " . -$propValue[ 'step' ];
+            }
+        } else {
+            $incFor[ 'index' ] = "{$sectionVar}->value['index'] += {$propValue['step']}";
+        }
+        if (!isset($propValue[ 'max' ])) {
+            $propValue[ 'max' ] = $propValue[ 'loop' ];
+            $propType[ 'max' ] = $propType[ 'loop' ];
+        } elseif ($propType[ 'max' ] !== 0) {
+            $propValue[ 'max' ] = "{$propValue['max']} < 0 ? {$propValue['loop']} : {$propValue['max']}";
+            $propType[ 'max' ] = 1;
+        } else {
+            if ($propValue[ 'max' ] < 0) {
+                $propValue[ 'max' ] = $propValue[ 'loop' ];
+                $propType[ 'max' ] = $propType[ 'loop' ];
+            }
+        }
+        if (!isset($propValue[ 'start' ])) {
+            $start_code =
+                array(1 => "{$propValue['step']} > 0 ? ", 2 => '0', 3 => ' : ', 4 => $propValue[ 'loop' ], 5 => ' - 1');
+            if ($propType[ 'loop' ] === 0) {
+                $start_code[ 5 ] = '';
+                $start_code[ 4 ] = $propValue[ 'loop' ] - 1;
+            }
+            if ($propType[ 'step' ] === 0) {
+                if ($propValue[ 'step' ] > 0) {
+                    $start_code = array(1 => '0');
+                    $propType[ 'start' ] = 0;
+                } else {
+                    $start_code[ 1 ] = $start_code[ 2 ] = $start_code[ 3 ] = '';
+                    $propType[ 'start' ] = $propType[ 'loop' ];
+                }
+            } else {
+                $propType[ 'start' ] = 1;
+            }
+            $propValue[ 'start' ] = join('', $start_code);
+        } else {
+            $start_code =
+                array(
+                    1  => "{$propValue['start']} < 0 ? ", 2 => 'max(', 3 => "{$propValue['step']} > 0 ? ", 4 => '0',
+                    5  => ' : ', 6 => '-1', 7 => ', ', 8 => "{$propValue['start']} + {$propValue['loop']}", 10 => ')',
+                    11 => ' : ', 12 => 'min(', 13 => $propValue[ 'start' ], 14 => ', ',
+                    15 => "{$propValue['step']} > 0 ? ", 16 => $propValue[ 'loop' ], 17 => ' : ',
+                    18 => $propType[ 'loop' ] === 0 ? $propValue[ 'loop' ] - 1 : "{$propValue['loop']} - 1",
+                    19 => ')'
+                );
+            if ($propType[ 'step' ] === 0) {
+                $start_code[ 3 ] = $start_code[ 5 ] = $start_code[ 15 ] = $start_code[ 17 ] = '';
+                if ($propValue[ 'step' ] > 0) {
+                    $start_code[ 6 ] = $start_code[ 18 ] = '';
+                } else {
+                    $start_code[ 4 ] = $start_code[ 16 ] = '';
+                }
+            }
+            if ($propType[ 'start' ] === 0) {
+                if ($propType[ 'loop' ] === 0) {
+                    $start_code[ 8 ] = $propValue[ 'start' ] + $propValue[ 'loop' ];
+                }
+                $propType[ 'start' ] = $propType[ 'step' ] + $propType[ 'loop' ];
+                $start_code[ 1 ] = '';
+                if ($propValue[ 'start' ] < 0) {
+                    for ($i = 11; $i <= 19; $i++) {
+                        $start_code[ $i ] = '';
+                    }
+                    if ($propType[ 'start' ] === 0) {
+                        $start_code = array(
+                            max(
+                                $propValue[ 'step' ] > 0 ? 0 : -1,
+                                $propValue[ 'start' ] + $propValue[ 'loop' ]
+                            )
+                        );
+                    }
+                } else {
+                    for ($i = 1; $i <= 11; $i++) {
+                        $start_code[ $i ] = '';
+                    }
+                    if ($propType[ 'start' ] === 0) {
+                        $start_code =
+                            array(
+                                min(
+                                    $propValue[ 'step' ] > 0 ? $propValue[ 'loop' ] : $propValue[ 'loop' ] - 1,
+                                    $propValue[ 'start' ]
+                                )
+                            );
+                    }
+                }
+            }
+            $propValue[ 'start' ] = join('', $start_code);
+        }
+        if ($propType[ 'start' ] !== 0) {
+            $initLocal[ 'start' ] = $propValue[ 'start' ];
+            $propValue[ 'start' ] = "{$local}start";
+        }
+        $initFor[ 'index' ] = "{$sectionVar}->value['index'] = {$propValue['start']}";
+        if (!isset($_attr[ 'start' ]) && !isset($_attr[ 'step' ]) && !isset($_attr[ 'max' ])) {
+            $propValue[ 'total' ] = $propValue[ 'loop' ];
+            $propType[ 'total' ] = $propType[ 'loop' ];
+        } else {
+            $propType[ 'total' ] =
+                $propType[ 'start' ] + $propType[ 'loop' ] + $propType[ 'step' ] + $propType[ 'max' ];
+            if ($propType[ 'total' ] === 0) {
+                $propValue[ 'total' ] =
+                    min(
+                        ceil(
+                            ($propValue[ 'step' ] > 0 ? $propValue[ 'loop' ] - $propValue[ 'start' ] :
+                                (int)$propValue[ 'start' ] + 1) / abs($propValue[ 'step' ])
+                        ),
+                        $propValue[ 'max' ]
+                    );
+            } else {
+                $total_code = array(
+                    1  => 'min(', 2 => 'ceil(', 3 => '(', 4 => "{$propValue['step']} > 0 ? ",
+                    5  => $propValue[ 'loop' ], 6 => ' - ', 7 => $propValue[ 'start' ], 8 => ' : ',
+                    9  => $propValue[ 'start' ], 10 => '+ 1', 11 => ')', 12 => '/ ', 13 => 'abs(',
+                    14 => $propValue[ 'step' ], 15 => ')', 16 => ')', 17 => ", {$propValue['max']})",
+                );
+                if (!isset($propValue[ 'max' ])) {
+                    $total_code[ 1 ] = $total_code[ 17 ] = '';
+                }
+                if ($propType[ 'loop' ] + $propType[ 'start' ] === 0) {
+                    $total_code[ 5 ] = $propValue[ 'loop' ] - $propValue[ 'start' ];
+                    $total_code[ 6 ] = $total_code[ 7 ] = '';
+                }
+                if ($propType[ 'start' ] === 0) {
+                    $total_code[ 9 ] = (int)$propValue[ 'start' ] + 1;
+                    $total_code[ 10 ] = '';
+                }
+                if ($propType[ 'step' ] === 0) {
+                    $total_code[ 13 ] = $total_code[ 15 ] = '';
+                    if ($propValue[ 'step' ] === 1 || $propValue[ 'step' ] === -1) {
+                        $total_code[ 2 ] = $total_code[ 12 ] = $total_code[ 14 ] = $total_code[ 16 ] = '';
+                    } elseif ($propValue[ 'step' ] < 0) {
+                        $total_code[ 14 ] = -$propValue[ 'step' ];
+                    }
+                    $total_code[ 4 ] = '';
+                    if ($propValue[ 'step' ] > 0) {
+                        $total_code[ 8 ] = $total_code[ 9 ] = $total_code[ 10 ] = '';
+                    } else {
+                        $total_code[ 5 ] = $total_code[ 6 ] = $total_code[ 7 ] = $total_code[ 8 ] = '';
+                    }
+                }
+                $propValue[ 'total' ] = join('', $total_code);
+            }
+        }
+        if (isset($namedAttr[ 'loop' ])) {
+            $initNamedProperty[ 'loop' ] = "'loop' => {$propValue['loop']}";
+        }
+        if (isset($namedAttr[ 'total' ])) {
+            $initNamedProperty[ 'total' ] = "'total' => {$propValue['total']}";
+            if ($propType[ 'total' ] > 0) {
+                $propValue[ 'total' ] = "{$sectionVar}->value['total']";
+            }
+        } elseif ($propType[ 'total' ] > 0) {
+            $initLocal[ 'total' ] = $propValue[ 'total' ];
+            $propValue[ 'total' ] = "{$local}total";
+        }
+        $cmpFor[ 'iteration' ] = "{$propValue['iteration']} <= {$propValue['total']}";
+        foreach ($initLocal as $key => $code) {
+            $output .= "{$local}{$key} = {$code};\n";
+        }
+        $_vars = 'array(' . join(', ', $initNamedProperty) . ')';
+        $output .= "{$sectionVar} = new Smarty_Variable({$_vars});\n";
+        $cond_code = "{$propValue['total']} !== 0";
+        if ($propType[ 'total' ] === 0) {
+            if ($propValue[ 'total' ] === 0) {
+                $cond_code = 'false';
+            } else {
+                $cond_code = 'true';
+            }
+        }
+        if ($propType[ 'show' ] > 0) {
+            $output .= "{$local}show = {$propValue['show']} ? {$cond_code} : false;\n";
+            $output .= "if ({$local}show) {\n";
+        } elseif ($propValue[ 'show' ] === 'true') {
+            $output .= "if ({$cond_code}) {\n";
+        } else {
+            $output .= "if (false) {\n";
+        }
+        $jinit = join(', ', $initFor);
+        $jcmp = join(', ', $cmpFor);
+        $jinc = join(', ', $incFor);
+        $output .= "for ({$jinit}; {$jcmp}; {$jinc}){\n";
+        if (isset($namedAttr[ 'rownum' ])) {
+            $output .= "{$sectionVar}->value['rownum'] = {$propValue['iteration']};\n";
+        }
+        if (isset($namedAttr[ 'index_prev' ])) {
+            $output .= "{$sectionVar}->value['index_prev'] = {$propValue['index']} - {$propValue['step']};\n";
+        }
+        if (isset($namedAttr[ 'index_next' ])) {
+            $output .= "{$sectionVar}->value['index_next'] = {$propValue['index']} + {$propValue['step']};\n";
+        }
+        if (isset($namedAttr[ 'first' ])) {
+            $output .= "{$sectionVar}->value['first'] = ({$propValue['iteration']} === 1);\n";
+        }
+        if (isset($namedAttr[ 'last' ])) {
+            $output .= "{$sectionVar}->value['last'] = ({$propValue['iteration']} === {$propValue['total']});\n";
+        }
+        $output .= '?>';
+        return $output;
+    }
+}
+
+/**
+ * Smarty Internal Plugin Compile Sectionelse Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Sectionelse extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for the {sectionelse} tag
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return string compiled code
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        list($openTag, $nocache, $local, $sectionVar) = $this->closeTag($compiler, array('section'));
+        $this->openTag($compiler, 'sectionelse', array('sectionelse', $nocache, $local, $sectionVar));
+        return "<?php }} else {\n ?>";
+    }
+}
+
+/**
+ * Smarty Internal Plugin Compile Sectionclose Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Sectionclose extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for the {/section} tag
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return string compiled code
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        $compiler->loopNesting--;
+        // must endblock be nocache?
+        if ($compiler->nocache) {
+            $compiler->tag_nocache = true;
+        }
+        list($openTag, $compiler->nocache, $local, $sectionVar) =
+            $this->closeTag($compiler, array('section', 'sectionelse'));
+        $output = "<?php\n";
+        if ($openTag === 'sectionelse') {
+            $output .= "}\n";
+        } else {
+            $output .= "}\n}\n";
+        }
+        $output .= '?>';
+        return $output;
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_setfilter.php b/sysplugins/smarty_internal_compile_setfilter.php
new file mode 100644
index 0000000000000000000000000000000000000000..70e2e2f9fff0e82d96263e35db3a7608fe4df8ad
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_setfilter.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Setfilter
+ * Compiles code for setfilter tag
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Setfilter Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Setfilter extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for setfilter tag
+     *
+     * @param array                                 $args      array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler  compiler object
+     * @param array                                 $parameter array with compilation parameter
+     *
+     * @return string compiled code
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+    {
+        $compiler->variable_filter_stack[] = $compiler->variable_filters;
+        $compiler->variable_filters = $parameter[ 'modifier_list' ];
+        // this tag does not return compiled code
+        $compiler->has_code = false;
+        return true;
+    }
+}
+
+/**
+ * Smarty Internal Plugin Compile Setfilterclose Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Setfilterclose extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for the {/setfilter} tag
+     * This tag does not generate compiled output. It resets variable filter.
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return string compiled code
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        $_attr = $this->getAttributes($compiler, $args);
+        // reset variable filter to previous state
+        if (count($compiler->variable_filter_stack)) {
+            $compiler->variable_filters = array_pop($compiler->variable_filter_stack);
+        } else {
+            $compiler->variable_filters = array();
+        }
+        // this tag does not return compiled code
+        $compiler->has_code = false;
+        return true;
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_shared_inheritance.php b/sysplugins/smarty_internal_compile_shared_inheritance.php
new file mode 100644
index 0000000000000000000000000000000000000000..d90262e604c7d7ea5d4b5f35cebddd165da292db
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_shared_inheritance.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile Shared Inheritance
+ * Shared methods for {extends} and {block} tags
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Shared Inheritance Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Shared_Inheritance extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compile inheritance initialization code as prefix
+     *
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler
+     * @param bool|false                            $initChildSequence if true force child template
+     */
+    public static function postCompile(Smarty_Internal_TemplateCompilerBase $compiler, $initChildSequence = false)
+    {
+        $compiler->prefixCompiledCode .= "<?php \$_smarty_tpl->_loadInheritance();\n\$_smarty_tpl->inheritance->init(\$_smarty_tpl, " .
+                                         var_export($initChildSequence, true) . ");\n?>\n";
+    }
+
+    /**
+     * Register post compile callback to compile inheritance initialization code
+     *
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler
+     * @param bool|false                            $initChildSequence if true force child template
+     */
+    public function registerInit(Smarty_Internal_TemplateCompilerBase $compiler, $initChildSequence = false)
+    {
+        if ($initChildSequence || !isset($compiler->_cache[ 'inheritanceInit' ])) {
+            $compiler->registerPostCompileCallback(
+                array('Smarty_Internal_Compile_Shared_Inheritance', 'postCompile'),
+                array($initChildSequence),
+                'inheritanceInit',
+                $initChildSequence
+            );
+            $compiler->_cache[ 'inheritanceInit' ] = true;
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_compile_while.php b/sysplugins/smarty_internal_compile_while.php
new file mode 100644
index 0000000000000000000000000000000000000000..5aa3a733015edffb6a0f380d7d4e613801a175cc
--- /dev/null
+++ b/sysplugins/smarty_internal_compile_while.php
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Smarty Internal Plugin Compile While
+ * Compiles the {while} tag
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile While Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_While extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for the {while} tag
+     *
+     * @param array                                 $args      array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler  compiler object
+     * @param array                                 $parameter array with compilation parameter
+     *
+     * @return string compiled code
+     * @throws \SmartyCompilerException
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+    {
+        $compiler->loopNesting++;
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        $this->openTag($compiler, 'while', $compiler->nocache);
+        if (!array_key_exists('if condition', $parameter)) {
+            $compiler->trigger_template_error('missing while condition', null, true);
+        }
+        // maybe nocache because of nocache variables
+        $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
+        if (is_array($parameter[ 'if condition' ])) {
+            if ($compiler->nocache) {
+                // create nocache var to make it know for further compiling
+                if (is_array($parameter[ 'if condition' ][ 'var' ])) {
+                    $var = $parameter[ 'if condition' ][ 'var' ][ 'var' ];
+                } else {
+                    $var = $parameter[ 'if condition' ][ 'var' ];
+                }
+                $compiler->setNocacheInVariable($var);
+            }
+            $prefixVar = $compiler->getNewPrefixVariable();
+            $assignCompiler = new Smarty_Internal_Compile_Assign();
+            $assignAttr = array();
+            $assignAttr[][ 'value' ] = $prefixVar;
+            if (is_array($parameter[ 'if condition' ][ 'var' ])) {
+                $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ][ 'var' ];
+                $_output = "<?php while ({$prefixVar} = {$parameter[ 'if condition' ][ 'value' ]}) {?>";
+                $_output .= $assignCompiler->compile(
+                    $assignAttr,
+                    $compiler,
+                    array('smarty_internal_index' => $parameter[ 'if condition' ][ 'var' ][ 'smarty_internal_index' ])
+                );
+            } else {
+                $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ];
+                $_output = "<?php while ({$prefixVar} = {$parameter[ 'if condition' ][ 'value' ]}) {?>";
+                $_output .= $assignCompiler->compile($assignAttr, $compiler, array());
+            }
+            return $_output;
+        } else {
+            return "<?php\n while ({$parameter['if condition']}) {?>";
+        }
+    }
+}
+
+/**
+ * Smarty Internal Plugin Compile Whileclose Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Whileclose extends Smarty_Internal_CompileBase
+{
+    /**
+     * Compiles code for the {/while} tag
+     *
+     * @param array                                 $args     array with attributes from parser
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+     *
+     * @return string compiled code
+     */
+    public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        $compiler->loopNesting--;
+        // must endblock be nocache?
+        if ($compiler->nocache) {
+            $compiler->tag_nocache = true;
+        }
+        $compiler->nocache = $this->closeTag($compiler, array('while'));
+        return "<?php }?>\n";
+    }
+}
diff --git a/sysplugins/smarty_internal_compilebase.php b/sysplugins/smarty_internal_compilebase.php
new file mode 100644
index 0000000000000000000000000000000000000000..2a32e43731722b280129c00c0675c8ae814d27ef
--- /dev/null
+++ b/sysplugins/smarty_internal_compilebase.php
@@ -0,0 +1,203 @@
+<?php
+/**
+ * Smarty Internal Plugin CompileBase
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * This class does extend all internal compile plugins
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+abstract class Smarty_Internal_CompileBase
+{
+    /**
+     * Array of names of required attribute required by tag
+     *
+     * @var array
+     */
+    public $required_attributes = array();
+
+    /**
+     * Array of names of optional attribute required by tag
+     * use array('_any') if there is no restriction of attributes names
+     *
+     * @var array
+     */
+    public $optional_attributes = array();
+
+    /**
+     * Shorttag attribute order defined by its names
+     *
+     * @var array
+     */
+    public $shorttag_order = array();
+
+    /**
+     * Array of names of valid option flags
+     *
+     * @var array
+     */
+    public $option_flags = array('nocache');
+
+    /**
+     * Mapping array for boolean option value
+     *
+     * @var array
+     */
+    public $optionMap = array(1 => true, 0 => false, 'true' => true, 'false' => false);
+
+    /**
+     * Mapping array with attributes as key
+     *
+     * @var array
+     */
+    public $mapCache = array();
+
+    /**
+     * This function checks if the attributes passed are valid
+     * The attributes passed for the tag to compile are checked against the list of required and
+     * optional attributes. Required attributes must be present. Optional attributes are check against
+     * the corresponding list. The keyword '_any' specifies that any attribute will be accepted
+     * as valid
+     *
+     * @param object $compiler   compiler object
+     * @param array  $attributes attributes applied to the tag
+     *
+     * @return array  of mapped attributes for further processing
+     */
+    public function getAttributes($compiler, $attributes)
+    {
+        $_indexed_attr = array();
+        if (!isset($this->mapCache[ 'option' ])) {
+            $this->mapCache[ 'option' ] = array_fill_keys($this->option_flags, true);
+        }
+        foreach ($attributes as $key => $mixed) {
+            // shorthand ?
+            if (!is_array($mixed)) {
+                // option flag ?
+                if (isset($this->mapCache[ 'option' ][ trim($mixed, '\'"') ])) {
+                    $_indexed_attr[ trim($mixed, '\'"') ] = true;
+                    // shorthand attribute ?
+                } elseif (isset($this->shorttag_order[ $key ])) {
+                    $_indexed_attr[ $this->shorttag_order[ $key ] ] = $mixed;
+                } else {
+                    // too many shorthands
+                    $compiler->trigger_template_error('too many shorthand attributes', null, true);
+                }
+                // named attribute
+            } else {
+                foreach ($mixed as $k => $v) {
+                    // option flag?
+                    if (isset($this->mapCache[ 'option' ][ $k ])) {
+                        if (is_bool($v)) {
+                            $_indexed_attr[ $k ] = $v;
+                        } else {
+                            if (is_string($v)) {
+                                $v = trim($v, '\'" ');
+                            }
+                            if (isset($this->optionMap[ $v ])) {
+                                $_indexed_attr[ $k ] = $this->optionMap[ $v ];
+                            } else {
+                                $compiler->trigger_template_error(
+                                    "illegal value '" . var_export($v, true) .
+                                    "' for option flag '{$k}'",
+                                    null,
+                                    true
+                                );
+                            }
+                        }
+                        // must be named attribute
+                    } else {
+                        $_indexed_attr[ $k ] = $v;
+                    }
+                }
+            }
+        }
+        // check if all required attributes present
+        foreach ($this->required_attributes as $attr) {
+            if (!isset($_indexed_attr[ $attr ])) {
+                $compiler->trigger_template_error("missing '{$attr}' attribute", null, true);
+            }
+        }
+        // check for not allowed attributes
+        if ($this->optional_attributes !== array('_any')) {
+            if (!isset($this->mapCache[ 'all' ])) {
+                $this->mapCache[ 'all' ] =
+                    array_fill_keys(
+                        array_merge(
+                            $this->required_attributes,
+                            $this->optional_attributes,
+                            $this->option_flags
+                        ),
+                        true
+                    );
+            }
+            foreach ($_indexed_attr as $key => $dummy) {
+                if (!isset($this->mapCache[ 'all' ][ $key ]) && $key !== 0) {
+                    $compiler->trigger_template_error("unexpected '{$key}' attribute", null, true);
+                }
+            }
+        }
+        // default 'false' for all option flags not set
+        foreach ($this->option_flags as $flag) {
+            if (!isset($_indexed_attr[ $flag ])) {
+                $_indexed_attr[ $flag ] = false;
+            }
+        }
+        if (isset($_indexed_attr[ 'nocache' ]) && $_indexed_attr[ 'nocache' ]) {
+            $compiler->tag_nocache = true;
+        }
+        return $_indexed_attr;
+    }
+
+    /**
+     * Push opening tag name on stack
+     * Optionally additional data can be saved on stack
+     *
+     * @param object $compiler compiler object
+     * @param string $openTag  the opening tag's name
+     * @param mixed  $data     optional data saved
+     */
+    public function openTag($compiler, $openTag, $data = null)
+    {
+        array_push($compiler->_tag_stack, array($openTag, $data));
+    }
+
+    /**
+     * Pop closing tag
+     * Raise an error if this stack-top doesn't match with expected opening tags
+     *
+     * @param object       $compiler    compiler object
+     * @param array|string $expectedTag the expected opening tag names
+     *
+     * @return mixed        any type the opening tag's name or saved data
+     */
+    public function closeTag($compiler, $expectedTag)
+    {
+        if (count($compiler->_tag_stack) > 0) {
+            // get stacked info
+            list($_openTag, $_data) = array_pop($compiler->_tag_stack);
+            // open tag must match with the expected ones
+            if (in_array($_openTag, (array)$expectedTag)) {
+                if (is_null($_data)) {
+                    // return opening tag
+                    return $_openTag;
+                } else {
+                    // return restored data
+                    return $_data;
+                }
+            }
+            // wrong nesting of tags
+            $compiler->trigger_template_error("unclosed '{$compiler->smarty->left_delimiter}{$_openTag}{$compiler->smarty->right_delimiter}' tag");
+            return;
+        }
+        // wrong nesting of tags
+        $compiler->trigger_template_error('unexpected closing tag', null, true);
+        return;
+    }
+}
diff --git a/sysplugins/smarty_internal_config_file_compiler.php b/sysplugins/smarty_internal_config_file_compiler.php
new file mode 100644
index 0000000000000000000000000000000000000000..90c5dcefacdfd195bb5192355c18c0b01f4b8533
--- /dev/null
+++ b/sysplugins/smarty_internal_config_file_compiler.php
@@ -0,0 +1,209 @@
+<?php
+/**
+ * Smarty Internal Plugin Config File Compiler
+ * This is the config file compiler class. It calls the lexer and parser to
+ * perform the compiling.
+ *
+ * @package    Smarty
+ * @subpackage Config
+ * @author     Uwe Tews
+ */
+
+/**
+ * Main config file compiler class
+ *
+ * @package    Smarty
+ * @subpackage Config
+ */
+class Smarty_Internal_Config_File_Compiler
+{
+    /**
+     * Lexer class name
+     *
+     * @var string
+     */
+    public $lexer_class;
+
+    /**
+     * Parser class name
+     *
+     * @var string
+     */
+    public $parser_class;
+
+    /**
+     * Lexer object
+     *
+     * @var object
+     */
+    public $lex;
+
+    /**
+     * Parser object
+     *
+     * @var object
+     */
+    public $parser;
+
+    /**
+     * Smarty object
+     *
+     * @var Smarty object
+     */
+    public $smarty;
+
+    /**
+     * Smarty object
+     *
+     * @var Smarty_Internal_Template object
+     */
+    public $template;
+
+    /**
+     * Compiled config data sections and variables
+     *
+     * @var array
+     */
+    public $config_data = array();
+
+    /**
+     * compiled config data must always be written
+     *
+     * @var bool
+     */
+    public $write_compiled_code = true;
+
+    /**
+     * Initialize compiler
+     *
+     * @param string $lexer_class  class name
+     * @param string $parser_class class name
+     * @param Smarty $smarty       global instance
+     */
+    public function __construct($lexer_class, $parser_class, Smarty $smarty)
+    {
+        $this->smarty = $smarty;
+        // get required plugins
+        $this->lexer_class = $lexer_class;
+        $this->parser_class = $parser_class;
+        $this->smarty = $smarty;
+        $this->config_data[ 'sections' ] = array();
+        $this->config_data[ 'vars' ] = array();
+    }
+
+    /**
+     * Method to compile Smarty config source.
+     *
+     * @param Smarty_Internal_Template $template
+     *
+     * @return bool true if compiling succeeded, false if it failed
+     * @throws \SmartyException
+     */
+    public function compileTemplate(Smarty_Internal_Template $template)
+    {
+        $this->template = $template;
+        $this->template->compiled->file_dependency[ $this->template->source->uid ] =
+            array(
+                $this->template->source->filepath,
+                $this->template->source->getTimeStamp(),
+                $this->template->source->type
+            );
+        if ($this->smarty->debugging) {
+            if (!isset($this->smarty->_debug)) {
+                $this->smarty->_debug = new Smarty_Internal_Debug();
+            }
+            $this->smarty->_debug->start_compile($this->template);
+        }
+        // init the lexer/parser to compile the config file
+        /* @var Smarty_Internal_ConfigFileLexer $this->lex */
+        $this->lex = new $this->lexer_class(
+            str_replace(
+                array(
+                    "\r\n",
+                    "\r"
+                ),
+                "\n",
+                $template->source->getContent()
+            ) . "\n",
+            $this
+        );
+        /* @var Smarty_Internal_ConfigFileParser $this->parser */
+        $this->parser = new $this->parser_class($this->lex, $this);
+        if (function_exists('mb_internal_encoding')
+            && function_exists('ini_get')
+            && ((int)ini_get('mbstring.func_overload')) & 2
+        ) {
+            $mbEncoding = mb_internal_encoding();
+            mb_internal_encoding('ASCII');
+        } else {
+            $mbEncoding = null;
+        }
+        if ($this->smarty->_parserdebug) {
+            $this->parser->PrintTrace();
+        }
+        // get tokens from lexer and parse them
+        while ($this->lex->yylex()) {
+            if ($this->smarty->_parserdebug) {
+                echo "<br>Parsing  {$this->parser->yyTokenName[$this->lex->token]} Token {$this->lex->value} Line {$this->lex->line} \n";
+            }
+            $this->parser->doParse($this->lex->token, $this->lex->value);
+        }
+        // finish parsing process
+        $this->parser->doParse(0, 0);
+        if ($mbEncoding) {
+            mb_internal_encoding($mbEncoding);
+        }
+        if ($this->smarty->debugging) {
+            $this->smarty->_debug->end_compile($this->template);
+        }
+        // template header code
+        $template_header =
+            "<?php /* Smarty version " . Smarty::SMARTY_VERSION . ", created on " . strftime("%Y-%m-%d %H:%M:%S") .
+            "\n";
+        $template_header .= "         compiled from '{$this->template->source->filepath}' */ ?>\n";
+        $code = '<?php $_smarty_tpl->smarty->ext->configLoad->_loadConfigVars($_smarty_tpl, ' .
+                var_export($this->config_data, true) . '); ?>';
+        return $template_header . $this->template->smarty->ext->_codeFrame->create($this->template, $code);
+    }
+
+    /**
+     * display compiler error messages without dying
+     * If parameter $args is empty it is a parser detected syntax error.
+     * In this case the parser is called to obtain information about expected tokens.
+     * If parameter $args contains a string this is used as error message
+     *
+     * @param string $args individual error message or null
+     *
+     * @throws SmartyCompilerException
+     */
+    public function trigger_config_file_error($args = null)
+    {
+        // get config source line which has error
+        $line = $this->lex->line;
+        if (isset($args)) {
+            // $line--;
+        }
+        $match = preg_split("/\n/", $this->lex->data);
+        $error_text =
+            "Syntax error in config file '{$this->template->source->filepath}' on line {$line} '{$match[$line - 1]}' ";
+        if (isset($args)) {
+            // individual error message
+            $error_text .= $args;
+        } else {
+            // expected token from parser
+            foreach ($this->parser->yy_get_expected_tokens($this->parser->yymajor) as $token) {
+                $exp_token = $this->parser->yyTokenName[ $token ];
+                if (isset($this->lex->smarty_token_names[ $exp_token ])) {
+                    // token type from lexer
+                    $expect[] = '"' . $this->lex->smarty_token_names[ $exp_token ] . '"';
+                } else {
+                    // otherwise internal token name
+                    $expect[] = $this->parser->yyTokenName[ $token ];
+                }
+            }
+            // output parser error message
+            $error_text .= ' - Unexpected "' . $this->lex->value . '", expected one of: ' . implode(' , ', $expect);
+        }
+        throw new SmartyCompilerException($error_text);
+    }
+}
diff --git a/sysplugins/smarty_internal_configfilelexer.php b/sysplugins/smarty_internal_configfilelexer.php
new file mode 100644
index 0000000000000000000000000000000000000000..afb3efcb03e110d9bb9b799aa16f0dcd8924b270
--- /dev/null
+++ b/sysplugins/smarty_internal_configfilelexer.php
@@ -0,0 +1,739 @@
+<?php
+/**
+ * Smarty Internal Plugin Configfilelexer
+ *
+ * This is the lexer to break the config file source into tokens
+ *
+ * @package    Smarty
+ * @subpackage Config
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty_Internal_Configfilelexer
+ *
+ * This is the config file lexer.
+ * It is generated from the smarty_internal_configfilelexer.plex file
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Configfilelexer
+{
+    const START              = 1;
+    const VALUE              = 2;
+    const NAKED_STRING_VALUE = 3;
+    const COMMENT            = 4;
+    const SECTION            = 5;
+    const TRIPPLE            = 6;
+
+    /**
+     * Source
+     *
+     * @var string
+     */
+    public $data;
+
+    /**
+     * Source length
+     *
+     * @var int
+     */
+    public $dataLength = null;
+
+    /**
+     * byte counter
+     *
+     * @var int
+     */
+    public $counter;
+
+    /**
+     * token number
+     *
+     * @var int
+     */
+    public $token;
+
+    /**
+     * token value
+     *
+     * @var string
+     */
+    public $value;
+
+    /**
+     * current line
+     *
+     * @var int
+     */
+    public $line;
+
+    /**
+     * state number
+     *
+     * @var int
+     */
+    public $state = 1;
+
+    /**
+     * Smarty object
+     *
+     * @var Smarty
+     */
+    public $smarty = null;
+
+    /**
+     * trace file
+     *
+     * @var resource
+     */
+    public $yyTraceFILE;
+
+    /**
+     * trace prompt
+     *
+     * @var string
+     */
+    public $yyTracePrompt;
+
+    /**
+     * state names
+     *
+     * @var array
+     */
+    public $state_name = array(
+        1 => 'START', 2 => 'VALUE', 3 => 'NAKED_STRING_VALUE', 4 => 'COMMENT', 5 => 'SECTION', 6 => 'TRIPPLE'
+    );
+
+    /**
+     * token names
+     *
+     * @var array
+     */
+    public $smarty_token_names = array(        // Text for parser error messages
+    );
+
+    /**
+     * compiler object
+     *
+     * @var Smarty_Internal_Config_File_Compiler
+     */
+    private $compiler = null;
+
+    /**
+     * copy of config_booleanize
+     *
+     * @var bool
+     */
+    private $configBooleanize = false;
+
+    /**
+     * storage for assembled token patterns
+     *
+     * @var string
+     */
+    private $yy_global_pattern1 = null;
+
+    private $yy_global_pattern2 = null;
+
+    private $yy_global_pattern3 = null;
+
+    private $yy_global_pattern4 = null;
+
+    private $yy_global_pattern5 = null;
+
+    private $yy_global_pattern6 = null;
+
+    private $_yy_state          = 1;
+
+    private $_yy_stack          = array();
+
+    /**
+     * constructor
+     *
+     * @param   string                             $data template source
+     * @param Smarty_Internal_Config_File_Compiler $compiler
+     */
+    public function __construct($data, Smarty_Internal_Config_File_Compiler $compiler)
+    {
+        $this->data = $data . "\n"; //now all lines are \n-terminated
+        $this->dataLength = strlen($data);
+        $this->counter = 0;
+        if (preg_match('/^\xEF\xBB\xBF/', $this->data, $match)) {
+            $this->counter += strlen($match[ 0 ]);
+        }
+        $this->line = 1;
+        $this->compiler = $compiler;
+        $this->smarty = $compiler->smarty;
+        $this->configBooleanize = $this->smarty->config_booleanize;
+    }
+
+    public function replace($input)
+    {
+        return $input;
+    } // end function
+
+    public function PrintTrace()
+    {
+        $this->yyTraceFILE = fopen('php://output', 'w');
+        $this->yyTracePrompt = '<br>';
+    }
+
+    public function yylex()
+    {
+        return $this->{'yylex' . $this->_yy_state}();
+    }
+
+    public function yypushstate($state)
+    {
+        if ($this->yyTraceFILE) {
+            fprintf(
+                $this->yyTraceFILE,
+                "%sState push %s\n",
+                $this->yyTracePrompt,
+                isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state
+            );
+        }
+        array_push($this->_yy_stack, $this->_yy_state);
+        $this->_yy_state = $state;
+        if ($this->yyTraceFILE) {
+            fprintf(
+                $this->yyTraceFILE,
+                "%snew State %s\n",
+                $this->yyTracePrompt,
+                isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state
+            );
+        }
+    }
+
+    public function yypopstate()
+    {
+        if ($this->yyTraceFILE) {
+            fprintf(
+                $this->yyTraceFILE,
+                "%sState pop %s\n",
+                $this->yyTracePrompt,
+                isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state
+            );
+        }
+        $this->_yy_state = array_pop($this->_yy_stack);
+        if ($this->yyTraceFILE) {
+            fprintf(
+                $this->yyTraceFILE,
+                "%snew State %s\n",
+                $this->yyTracePrompt,
+                isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state
+            );
+        }
+    }
+
+    public function yybegin($state)
+    {
+        $this->_yy_state = $state;
+        if ($this->yyTraceFILE) {
+            fprintf(
+                $this->yyTraceFILE,
+                "%sState set %s\n",
+                $this->yyTracePrompt,
+                isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state
+            );
+        }
+    }
+
+    public function yylex1()
+    {
+        if (!isset($this->yy_global_pattern1)) {
+            $this->yy_global_pattern1 =
+                $this->replace("/\G(#|;)|\G(\\[)|\G(\\])|\G(=)|\G([ \t\r]+)|\G(\n)|\G([0-9]*[a-zA-Z_]\\w*)|\G([\S\s])/isS");
+        }
+        if (!isset($this->dataLength)) {
+            $this->dataLength = strlen($this->data);
+        }
+        if ($this->counter >= $this->dataLength) {
+            return false; // end of input
+        }
+        do {
+            if (preg_match($this->yy_global_pattern1, $this->data, $yymatches, 0, $this->counter)) {
+                if (!isset($yymatches[ 0 ][ 1 ])) {
+                    $yymatches = preg_grep("/(.|\s)+/", $yymatches);
+                } else {
+                    $yymatches = array_filter($yymatches);
+                }
+                if (empty($yymatches)) {
+                    throw new Exception('Error: lexing failed because a rule matched' .
+                                        ' an empty string.  Input "' . substr(
+                                            $this->data,
+                                            $this->counter,
+                                            5
+                                        ) . '... state START');
+                }
+                next($yymatches); // skip global match
+                $this->token = key($yymatches); // token number
+                $this->value = current($yymatches); // token value
+                $r = $this->{'yy_r1_' . $this->token}();
+                if ($r === null) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    // accept this token
+                    return true;
+                } elseif ($r === true) {
+                    // we have changed state
+                    // process this token in the new state
+                    return $this->yylex();
+                } elseif ($r === false) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    if ($this->counter >= $this->dataLength) {
+                        return false; // end of input
+                    }
+                    // skip this token
+                    continue;
+                }
+            } else {
+                throw new Exception('Unexpected input at line' . $this->line .
+                                    ': ' . $this->data[ $this->counter ]);
+            }
+            break;
+        } while (true);
+    }
+
+    public function yy_r1_1()
+    {
+        $this->token = Smarty_Internal_Configfileparser::TPC_COMMENTSTART;
+        $this->yypushstate(self::COMMENT);
+    }
+
+    public function yy_r1_2()
+    {
+        $this->token = Smarty_Internal_Configfileparser::TPC_OPENB;
+        $this->yypushstate(self::SECTION);
+    }
+
+    public function yy_r1_3()
+    {
+        $this->token = Smarty_Internal_Configfileparser::TPC_CLOSEB;
+    }
+
+    public function yy_r1_4()
+    {
+        $this->token = Smarty_Internal_Configfileparser::TPC_EQUAL;
+        $this->yypushstate(self::VALUE);
+    } // end function
+
+    public function yy_r1_5()
+    {
+        return false;
+    }
+
+    public function yy_r1_6()
+    {
+        $this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE;
+    }
+
+    public function yy_r1_7()
+    {
+        $this->token = Smarty_Internal_Configfileparser::TPC_ID;
+    }
+
+    public function yy_r1_8()
+    {
+        $this->token = Smarty_Internal_Configfileparser::TPC_OTHER;
+    }
+
+    public function yylex2()
+    {
+        if (!isset($this->yy_global_pattern2)) {
+            $this->yy_global_pattern2 =
+                $this->replace("/\G([ \t\r]+)|\G(\\d+\\.\\d+(?=[ \t\r]*[\n#;]))|\G(\\d+(?=[ \t\r]*[\n#;]))|\G(\"\"\")|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*'(?=[ \t\r]*[\n#;]))|\G(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"(?=[ \t\r]*[\n#;]))|\G([a-zA-Z]+(?=[ \t\r]*[\n#;]))|\G([^\n]+?(?=[ \t\r]*\n))|\G(\n)/isS");
+        }
+        if (!isset($this->dataLength)) {
+            $this->dataLength = strlen($this->data);
+        }
+        if ($this->counter >= $this->dataLength) {
+            return false; // end of input
+        }
+        do {
+            if (preg_match($this->yy_global_pattern2, $this->data, $yymatches, 0, $this->counter)) {
+                if (!isset($yymatches[ 0 ][ 1 ])) {
+                    $yymatches = preg_grep("/(.|\s)+/", $yymatches);
+                } else {
+                    $yymatches = array_filter($yymatches);
+                }
+                if (empty($yymatches)) {
+                    throw new Exception('Error: lexing failed because a rule matched' .
+                                        ' an empty string.  Input "' . substr(
+                                            $this->data,
+                                            $this->counter,
+                                            5
+                                        ) . '... state VALUE');
+                }
+                next($yymatches); // skip global match
+                $this->token = key($yymatches); // token number
+                $this->value = current($yymatches); // token value
+                $r = $this->{'yy_r2_' . $this->token}();
+                if ($r === null) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    // accept this token
+                    return true;
+                } elseif ($r === true) {
+                    // we have changed state
+                    // process this token in the new state
+                    return $this->yylex();
+                } elseif ($r === false) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    if ($this->counter >= $this->dataLength) {
+                        return false; // end of input
+                    }
+                    // skip this token
+                    continue;
+                }
+            } else {
+                throw new Exception('Unexpected input at line' . $this->line .
+                                    ': ' . $this->data[ $this->counter ]);
+            }
+            break;
+        } while (true);
+    }
+
+    public function yy_r2_1()
+    {
+        return false;
+    }
+
+    public function yy_r2_2()
+    {
+        $this->token = Smarty_Internal_Configfileparser::TPC_FLOAT;
+        $this->yypopstate();
+    }
+
+    public function yy_r2_3()
+    {
+        $this->token = Smarty_Internal_Configfileparser::TPC_INT;
+        $this->yypopstate();
+    }
+
+    public function yy_r2_4()
+    {
+        $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES;
+        $this->yypushstate(self::TRIPPLE);
+    }
+
+    public function yy_r2_5()
+    {
+        $this->token = Smarty_Internal_Configfileparser::TPC_SINGLE_QUOTED_STRING;
+        $this->yypopstate();
+    }
+
+    public function yy_r2_6()
+    {
+        $this->token = Smarty_Internal_Configfileparser::TPC_DOUBLE_QUOTED_STRING;
+        $this->yypopstate();
+    } // end function
+
+    public function yy_r2_7()
+    {
+        if (!$this->configBooleanize ||
+            !in_array(strtolower($this->value), array('true', 'false', 'on', 'off', 'yes', 'no'))) {
+            $this->yypopstate();
+            $this->yypushstate(self::NAKED_STRING_VALUE);
+            return true; //reprocess in new state
+        } else {
+            $this->token = Smarty_Internal_Configfileparser::TPC_BOOL;
+            $this->yypopstate();
+        }
+    }
+
+    public function yy_r2_8()
+    {
+        $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
+        $this->yypopstate();
+    }
+
+    public function yy_r2_9()
+    {
+        $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
+        $this->value = '';
+        $this->yypopstate();
+    } // end function
+
+    public function yylex3()
+    {
+        if (!isset($this->yy_global_pattern3)) {
+            $this->yy_global_pattern3 = $this->replace("/\G([^\n]+?(?=[ \t\r]*\n))/isS");
+        }
+        if (!isset($this->dataLength)) {
+            $this->dataLength = strlen($this->data);
+        }
+        if ($this->counter >= $this->dataLength) {
+            return false; // end of input
+        }
+        do {
+            if (preg_match($this->yy_global_pattern3, $this->data, $yymatches, 0, $this->counter)) {
+                if (!isset($yymatches[ 0 ][ 1 ])) {
+                    $yymatches = preg_grep("/(.|\s)+/", $yymatches);
+                } else {
+                    $yymatches = array_filter($yymatches);
+                }
+                if (empty($yymatches)) {
+                    throw new Exception('Error: lexing failed because a rule matched' .
+                                        ' an empty string.  Input "' . substr(
+                                            $this->data,
+                                            $this->counter,
+                                            5
+                                        ) . '... state NAKED_STRING_VALUE');
+                }
+                next($yymatches); // skip global match
+                $this->token = key($yymatches); // token number
+                $this->value = current($yymatches); // token value
+                $r = $this->{'yy_r3_' . $this->token}();
+                if ($r === null) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    // accept this token
+                    return true;
+                } elseif ($r === true) {
+                    // we have changed state
+                    // process this token in the new state
+                    return $this->yylex();
+                } elseif ($r === false) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    if ($this->counter >= $this->dataLength) {
+                        return false; // end of input
+                    }
+                    // skip this token
+                    continue;
+                }
+            } else {
+                throw new Exception('Unexpected input at line' . $this->line .
+                                    ': ' . $this->data[ $this->counter ]);
+            }
+            break;
+        } while (true);
+    }
+
+    public function yy_r3_1()
+    {
+        $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
+        $this->yypopstate();
+    }
+
+    public function yylex4()
+    {
+        if (!isset($this->yy_global_pattern4)) {
+            $this->yy_global_pattern4 = $this->replace("/\G([ \t\r]+)|\G([^\n]+?(?=[ \t\r]*\n))|\G(\n)/isS");
+        }
+        if (!isset($this->dataLength)) {
+            $this->dataLength = strlen($this->data);
+        }
+        if ($this->counter >= $this->dataLength) {
+            return false; // end of input
+        }
+        do {
+            if (preg_match($this->yy_global_pattern4, $this->data, $yymatches, 0, $this->counter)) {
+                if (!isset($yymatches[ 0 ][ 1 ])) {
+                    $yymatches = preg_grep("/(.|\s)+/", $yymatches);
+                } else {
+                    $yymatches = array_filter($yymatches);
+                }
+                if (empty($yymatches)) {
+                    throw new Exception('Error: lexing failed because a rule matched' .
+                                        ' an empty string.  Input "' . substr(
+                                            $this->data,
+                                            $this->counter,
+                                            5
+                                        ) . '... state COMMENT');
+                }
+                next($yymatches); // skip global match
+                $this->token = key($yymatches); // token number
+                $this->value = current($yymatches); // token value
+                $r = $this->{'yy_r4_' . $this->token}();
+                if ($r === null) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    // accept this token
+                    return true;
+                } elseif ($r === true) {
+                    // we have changed state
+                    // process this token in the new state
+                    return $this->yylex();
+                } elseif ($r === false) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    if ($this->counter >= $this->dataLength) {
+                        return false; // end of input
+                    }
+                    // skip this token
+                    continue;
+                }
+            } else {
+                throw new Exception('Unexpected input at line' . $this->line .
+                                    ': ' . $this->data[ $this->counter ]);
+            }
+            break;
+        } while (true);
+    }
+
+    public function yy_r4_1()
+    {
+        return false;
+    }
+
+    public function yy_r4_2()
+    {
+        $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
+    } // end function
+
+    public function yy_r4_3()
+    {
+        $this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE;
+        $this->yypopstate();
+    }
+
+    public function yylex5()
+    {
+        if (!isset($this->yy_global_pattern5)) {
+            $this->yy_global_pattern5 = $this->replace("/\G(\\.)|\G(.*?(?=[\.=[\]\r\n]))/isS");
+        }
+        if (!isset($this->dataLength)) {
+            $this->dataLength = strlen($this->data);
+        }
+        if ($this->counter >= $this->dataLength) {
+            return false; // end of input
+        }
+        do {
+            if (preg_match($this->yy_global_pattern5, $this->data, $yymatches, 0, $this->counter)) {
+                if (!isset($yymatches[ 0 ][ 1 ])) {
+                    $yymatches = preg_grep("/(.|\s)+/", $yymatches);
+                } else {
+                    $yymatches = array_filter($yymatches);
+                }
+                if (empty($yymatches)) {
+                    throw new Exception('Error: lexing failed because a rule matched' .
+                                        ' an empty string.  Input "' . substr(
+                                            $this->data,
+                                            $this->counter,
+                                            5
+                                        ) . '... state SECTION');
+                }
+                next($yymatches); // skip global match
+                $this->token = key($yymatches); // token number
+                $this->value = current($yymatches); // token value
+                $r = $this->{'yy_r5_' . $this->token}();
+                if ($r === null) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    // accept this token
+                    return true;
+                } elseif ($r === true) {
+                    // we have changed state
+                    // process this token in the new state
+                    return $this->yylex();
+                } elseif ($r === false) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    if ($this->counter >= $this->dataLength) {
+                        return false; // end of input
+                    }
+                    // skip this token
+                    continue;
+                }
+            } else {
+                throw new Exception('Unexpected input at line' . $this->line .
+                                    ': ' . $this->data[ $this->counter ]);
+            }
+            break;
+        } while (true);
+    }
+
+    public function yy_r5_1()
+    {
+        $this->token = Smarty_Internal_Configfileparser::TPC_DOT;
+    }
+
+    public function yy_r5_2()
+    {
+        $this->token = Smarty_Internal_Configfileparser::TPC_SECTION;
+        $this->yypopstate();
+    } // end function
+
+    public function yylex6()
+    {
+        if (!isset($this->yy_global_pattern6)) {
+            $this->yy_global_pattern6 = $this->replace("/\G(\"\"\"(?=[ \t\r]*[\n#;]))|\G([\S\s])/isS");
+        }
+        if (!isset($this->dataLength)) {
+            $this->dataLength = strlen($this->data);
+        }
+        if ($this->counter >= $this->dataLength) {
+            return false; // end of input
+        }
+        do {
+            if (preg_match($this->yy_global_pattern6, $this->data, $yymatches, 0, $this->counter)) {
+                if (!isset($yymatches[ 0 ][ 1 ])) {
+                    $yymatches = preg_grep("/(.|\s)+/", $yymatches);
+                } else {
+                    $yymatches = array_filter($yymatches);
+                }
+                if (empty($yymatches)) {
+                    throw new Exception('Error: lexing failed because a rule matched' .
+                                        ' an empty string.  Input "' . substr(
+                                            $this->data,
+                                            $this->counter,
+                                            5
+                                        ) . '... state TRIPPLE');
+                }
+                next($yymatches); // skip global match
+                $this->token = key($yymatches); // token number
+                $this->value = current($yymatches); // token value
+                $r = $this->{'yy_r6_' . $this->token}();
+                if ($r === null) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    // accept this token
+                    return true;
+                } elseif ($r === true) {
+                    // we have changed state
+                    // process this token in the new state
+                    return $this->yylex();
+                } elseif ($r === false) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    if ($this->counter >= $this->dataLength) {
+                        return false; // end of input
+                    }
+                    // skip this token
+                    continue;
+                }
+            } else {
+                throw new Exception('Unexpected input at line' . $this->line .
+                                    ': ' . $this->data[ $this->counter ]);
+            }
+            break;
+        } while (true);
+    }
+
+    public function yy_r6_1()
+    {
+        $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES_END;
+        $this->yypopstate();
+        $this->yypushstate(self::START);
+    }
+
+    public function yy_r6_2()
+    {
+        $to = strlen($this->data);
+        preg_match("/\"\"\"[ \t\r]*[\n#;]/", $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter);
+        if (isset($match[ 0 ][ 1 ])) {
+            $to = $match[ 0 ][ 1 ];
+        } else {
+            $this->compiler->trigger_config_file_error('missing or misspelled literal closing tag');
+        }
+        $this->value = substr($this->data, $this->counter, $to - $this->counter);
+        $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_TEXT;
+    }
+}
diff --git a/sysplugins/smarty_internal_configfileparser.php b/sysplugins/smarty_internal_configfileparser.php
new file mode 100644
index 0000000000000000000000000000000000000000..36fdb76eeb020cd857cb6c54c09cbcc7573705b7
--- /dev/null
+++ b/sysplugins/smarty_internal_configfileparser.php
@@ -0,0 +1,1046 @@
+<?php
+
+class TPC_yyStackEntry
+{
+    public $stateno;       /* The state-number */
+    public $major;         /* The major token value.  This is the code
+                     ** number for the token at this stack level */
+    public $minor; /* The user-supplied minor token value.  This
+                     ** is the value of the token  */
+}
+
+// line 12 "../smarty/lexer/smarty_internal_configfileparser.y"
+
+/**
+ * Smarty Internal Plugin Configfileparse
+ *
+ * This is the config file parser.
+ * It is generated from the smarty_internal_configfileparser.y file
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Configfileparser
+{
+    // line 25 "../smarty/lexer/smarty_internal_configfileparser.y"
+    const TPC_OPENB                = 1;
+    const TPC_SECTION              = 2;
+    const TPC_CLOSEB               = 3;
+    const TPC_DOT                  = 4;
+    const TPC_ID                   = 5;
+    const TPC_EQUAL                = 6;
+    const TPC_FLOAT                = 7;
+    const TPC_INT                  = 8;
+    const TPC_BOOL                 = 9;
+    const TPC_SINGLE_QUOTED_STRING = 10;
+    const TPC_DOUBLE_QUOTED_STRING = 11;
+    const TPC_TRIPPLE_QUOTES       = 12;
+    const TPC_TRIPPLE_TEXT         = 13;
+    const TPC_TRIPPLE_QUOTES_END   = 14;
+    const TPC_NAKED_STRING         = 15;
+    const TPC_OTHER                = 16;
+    const TPC_NEWLINE              = 17;
+    const TPC_COMMENTSTART         = 18;
+    const YY_NO_ACTION             = 60;
+    const YY_ACCEPT_ACTION         = 59;
+    const YY_ERROR_ACTION          = 58;
+    const YY_SZ_ACTTAB             = 38;
+    const YY_SHIFT_USE_DFLT        = -8;
+    const YY_SHIFT_MAX             = 19;
+    const YY_REDUCE_USE_DFLT       = -17;
+    const YY_REDUCE_MAX            = 10;
+    const YYNOCODE                 = 29;
+    const YYSTACKDEPTH             = 100;
+    const YYNSTATE                 = 36;
+    const YYNRULE                  = 22;
+    const YYERRORSYMBOL            = 19;
+    const YYERRSYMDT               = 'yy0';
+    const YYFALLBACK               = 0;
+
+    public static $yy_action        = array(
+        32, 31, 30, 29, 35, 13, 19, 3, 24, 26,
+        59, 9, 14, 1, 16, 25, 11, 28, 25, 11,
+        17, 27, 34, 20, 18, 15, 23, 5, 6, 22,
+        10, 8, 4, 12, 2, 33, 7, 21,
+    );
+
+    public static $yy_lookahead     = array(
+        7, 8, 9, 10, 11, 12, 5, 23, 15, 16,
+        20, 21, 2, 23, 4, 17, 18, 14, 17, 18,
+        13, 14, 25, 26, 15, 2, 17, 3, 3, 17,
+        25, 25, 6, 1, 23, 27, 22, 24,
+    );
+
+    public static $yy_shift_ofst    = array(
+        -8, 1, 1, 1, -7, -2, -2, 32, -8, -8,
+        -8, 9, 10, 7, 25, 24, 23, 3, 12, 26,
+    );
+
+    public static $yy_reduce_ofst   = array(
+        -10, -3, -3, -3, 8, 6, 5, 13, 11, 14,
+        -16,
+    );
+
+    public static $yyExpectedTokens = array(
+        array(),
+        array(5, 17, 18,),
+        array(5, 17, 18,),
+        array(5, 17, 18,),
+        array(7, 8, 9, 10, 11, 12, 15, 16,),
+        array(17, 18,),
+        array(17, 18,),
+        array(1,),
+        array(),
+        array(),
+        array(),
+        array(15, 17,),
+        array(2, 4,),
+        array(13, 14,),
+        array(3,),
+        array(3,),
+        array(2,),
+        array(14,),
+        array(17,),
+        array(6,),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+    );
+
+    public static $yy_default       = array(
+        44, 37, 41, 40, 58, 58, 58, 36, 44, 39,
+        44, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+        43, 38, 57, 56, 53, 55, 54, 52, 51, 49,
+        48, 47, 46, 45, 42, 50,
+    );
+
+    public static $yyFallback       = array();
+
+    public static $yyRuleName       = array(
+        'start ::= global_vars sections',
+        'global_vars ::= var_list',
+        'sections ::= sections section',
+        'sections ::=',
+        'section ::= OPENB SECTION CLOSEB newline var_list',
+        'section ::= OPENB DOT SECTION CLOSEB newline var_list',
+        'var_list ::= var_list newline',
+        'var_list ::= var_list var',
+        'var_list ::=',
+        'var ::= ID EQUAL value',
+        'value ::= FLOAT',
+        'value ::= INT',
+        'value ::= BOOL',
+        'value ::= SINGLE_QUOTED_STRING',
+        'value ::= DOUBLE_QUOTED_STRING',
+        'value ::= TRIPPLE_QUOTES TRIPPLE_TEXT TRIPPLE_QUOTES_END',
+        'value ::= TRIPPLE_QUOTES TRIPPLE_QUOTES_END',
+        'value ::= NAKED_STRING',
+        'value ::= OTHER',
+        'newline ::= NEWLINE',
+        'newline ::= COMMENTSTART NEWLINE',
+        'newline ::= COMMENTSTART NAKED_STRING NEWLINE',
+    );
+
+    public static $yyRuleInfo       = array(
+        array(0 => 20, 1 => 2),
+        array(0 => 21, 1 => 1),
+        array(0 => 22, 1 => 2),
+        array(0 => 22, 1 => 0),
+        array(0 => 24, 1 => 5),
+        array(0 => 24, 1 => 6),
+        array(0 => 23, 1 => 2),
+        array(0 => 23, 1 => 2),
+        array(0 => 23, 1 => 0),
+        array(0 => 26, 1 => 3),
+        array(0 => 27, 1 => 1),
+        array(0 => 27, 1 => 1),
+        array(0 => 27, 1 => 1),
+        array(0 => 27, 1 => 1),
+        array(0 => 27, 1 => 1),
+        array(0 => 27, 1 => 3),
+        array(0 => 27, 1 => 2),
+        array(0 => 27, 1 => 1),
+        array(0 => 27, 1 => 1),
+        array(0 => 25, 1 => 1),
+        array(0 => 25, 1 => 2),
+        array(0 => 25, 1 => 3),
+    );
+
+    public static $yyReduceMap      = array(
+        0  => 0,
+        2  => 0,
+        3  => 0,
+        19 => 0,
+        20 => 0,
+        21 => 0,
+        1  => 1,
+        4  => 4,
+        5  => 5,
+        6  => 6,
+        7  => 7,
+        8  => 8,
+        9  => 9,
+        10 => 10,
+        11 => 11,
+        12 => 12,
+        13 => 13,
+        14 => 14,
+        15 => 15,
+        16 => 16,
+        17 => 17,
+        18 => 17,
+    );
+
+    /**
+     * helper map
+     *
+     * @var array
+     */
+    private static $escapes_single = array(
+        '\\' => '\\',
+        '\'' => '\''
+    );
+
+    /**
+     * result status
+     *
+     * @var bool
+     */
+    public $successful = true;
+
+    /**
+     * return value
+     *
+     * @var mixed
+     */
+    public $retvalue = 0;
+
+    /**
+     * @var
+     */
+    public $yymajor;
+
+    /**
+     * compiler object
+     *
+     * @var Smarty_Internal_Config_File_Compiler
+     */
+    public $compiler = null;
+
+    /**
+     * smarty object
+     *
+     * @var Smarty
+     */
+    public $smarty      = null;
+
+    public $yyTraceFILE;
+
+    public $yyTracePrompt;
+
+    public $yyidx;
+
+    public $yyerrcnt;
+
+    public $yystack     = array();
+
+    public $yyTokenName = array(
+        '$', 'OPENB', 'SECTION', 'CLOSEB',
+        'DOT', 'ID', 'EQUAL', 'FLOAT',
+        'INT', 'BOOL', 'SINGLE_QUOTED_STRING', 'DOUBLE_QUOTED_STRING',
+        'TRIPPLE_QUOTES', 'TRIPPLE_TEXT', 'TRIPPLE_QUOTES_END', 'NAKED_STRING',
+        'OTHER', 'NEWLINE', 'COMMENTSTART', 'error',
+        'start', 'global_vars', 'sections', 'var_list',
+        'section', 'newline', 'var', 'value',
+    );
+
+    /**
+     * lexer object
+     *
+     * @var Smarty_Internal_Configfilelexer
+     */
+    private $lex;
+
+    /**
+     * internal error flag
+     *
+     * @var bool
+     */
+    private $internalError = false;
+
+    /**
+     * copy of config_overwrite property
+     *
+     * @var bool
+     */
+    private $configOverwrite = false;
+
+    /**
+     * copy of config_read_hidden property
+     *
+     * @var bool
+     */
+    private $configReadHidden = false;
+
+    private $_retvalue;
+
+    /**
+     * constructor
+     *
+     * @param Smarty_Internal_Configfilelexer      $lex
+     * @param Smarty_Internal_Config_File_Compiler $compiler
+     */
+    public function __construct(Smarty_Internal_Configfilelexer $lex, Smarty_Internal_Config_File_Compiler $compiler)
+    {
+        $this->lex = $lex;
+        $this->smarty = $compiler->smarty;
+        $this->compiler = $compiler;
+        $this->configOverwrite = $this->smarty->config_overwrite;
+        $this->configReadHidden = $this->smarty->config_read_hidden;
+    }
+
+    public static function yy_destructor($yymajor, $yypminor)
+    {
+        switch ($yymajor) {
+            default:
+                break;   /* If no destructor action specified: do nothing */
+        }
+    }
+
+    /**
+     * parse single quoted string
+     *  remove outer quotes
+     *  unescape inner quotes
+     *
+     * @param string $qstr
+     *
+     * @return string
+     */
+    private static function parse_single_quoted_string($qstr)
+    {
+        $escaped_string = substr($qstr, 1, strlen($qstr) - 2); //remove outer quotes
+        $ss = preg_split('/(\\\\.)/', $escaped_string, -1, PREG_SPLIT_DELIM_CAPTURE);
+        $str = '';
+        foreach ($ss as $s) {
+            if (strlen($s) === 2 && $s[ 0 ] === '\\') {
+                if (isset(self::$escapes_single[ $s[ 1 ] ])) {
+                    $s = self::$escapes_single[ $s[ 1 ] ];
+                }
+            }
+            $str .= $s;
+        }
+        return $str;
+    }                    /* Index of top element in stack */
+    /**
+     * parse double quoted string
+     *
+     * @param string $qstr
+     *
+     * @return string
+     */
+    private static function parse_double_quoted_string($qstr)
+    {
+        $inner_str = substr($qstr, 1, strlen($qstr) - 2);
+        return stripcslashes($inner_str);
+    }                 /* Shifts left before out of the error */
+    /**
+     * parse triple quoted string
+     *
+     * @param string $qstr
+     *
+     * @return string
+     */
+    private static function parse_tripple_double_quoted_string($qstr)
+    {
+        return stripcslashes($qstr);
+    }  /* The parser's stack */
+    public function Trace($TraceFILE, $zTracePrompt)
+    {
+        if (!$TraceFILE) {
+            $zTracePrompt = 0;
+        } elseif (!$zTracePrompt) {
+            $TraceFILE = 0;
+        }
+        $this->yyTraceFILE = $TraceFILE;
+        $this->yyTracePrompt = $zTracePrompt;
+    }
+
+    public function PrintTrace()
+    {
+        $this->yyTraceFILE = fopen('php://output', 'w');
+        $this->yyTracePrompt = '<br>';
+    }
+
+    public function tokenName($tokenType)
+    {
+        if ($tokenType === 0) {
+            return 'End of Input';
+        }
+        if ($tokenType > 0 && $tokenType < count($this->yyTokenName)) {
+            return $this->yyTokenName[ $tokenType ];
+        } else {
+            return 'Unknown';
+        }
+    }
+
+    public function yy_pop_parser_stack()
+    {
+        if (empty($this->yystack)) {
+            return;
+        }
+        $yytos = array_pop($this->yystack);
+        if ($this->yyTraceFILE && $this->yyidx >= 0) {
+            fwrite(
+                $this->yyTraceFILE,
+                $this->yyTracePrompt . 'Popping ' . $this->yyTokenName[ $yytos->major ] .
+                "\n"
+            );
+        }
+        $yymajor = $yytos->major;
+        self::yy_destructor($yymajor, $yytos->minor);
+        $this->yyidx--;
+        return $yymajor;
+    }
+
+    public function __destruct()
+    {
+        while ($this->yystack !== array()) {
+            $this->yy_pop_parser_stack();
+        }
+        if (is_resource($this->yyTraceFILE)) {
+            fclose($this->yyTraceFILE);
+        }
+    }
+
+    public function yy_get_expected_tokens($token)
+    {
+        static $res3 = array();
+        static $res4 = array();
+        $state = $this->yystack[ $this->yyidx ]->stateno;
+        $expected = self::$yyExpectedTokens[ $state ];
+        if (isset($res3[ $state ][ $token ])) {
+            if ($res3[ $state ][ $token ]) {
+                return $expected;
+            }
+        } else {
+            if ($res3[ $state ][ $token ] = in_array($token, self::$yyExpectedTokens[ $state ], true)) {
+                return $expected;
+            }
+        }
+        $stack = $this->yystack;
+        $yyidx = $this->yyidx;
+        do {
+            $yyact = $this->yy_find_shift_action($token);
+            if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) {
+                // reduce action
+                $done = 0;
+                do {
+                    if ($done++ === 100) {
+                        $this->yyidx = $yyidx;
+                        $this->yystack = $stack;
+                        // too much recursion prevents proper detection
+                        // so give up
+                        return array_unique($expected);
+                    }
+                    $yyruleno = $yyact - self::YYNSTATE;
+                    $this->yyidx -= self::$yyRuleInfo[ $yyruleno ][ 1 ];
+                    $nextstate = $this->yy_find_reduce_action(
+                        $this->yystack[ $this->yyidx ]->stateno,
+                        self::$yyRuleInfo[ $yyruleno ][ 0 ]
+                    );
+                    if (isset(self::$yyExpectedTokens[ $nextstate ])) {
+                        $expected = array_merge($expected, self::$yyExpectedTokens[ $nextstate ]);
+                        if (isset($res4[ $nextstate ][ $token ])) {
+                            if ($res4[ $nextstate ][ $token ]) {
+                                $this->yyidx = $yyidx;
+                                $this->yystack = $stack;
+                                return array_unique($expected);
+                            }
+                        } else {
+                            if ($res4[ $nextstate ][ $token ] =
+                                in_array($token, self::$yyExpectedTokens[ $nextstate ], true)) {
+                                $this->yyidx = $yyidx;
+                                $this->yystack = $stack;
+                                return array_unique($expected);
+                            }
+                        }
+                    }
+                    if ($nextstate < self::YYNSTATE) {
+                        // we need to shift a non-terminal
+                        $this->yyidx++;
+                        $x = new TPC_yyStackEntry;
+                        $x->stateno = $nextstate;
+                        $x->major = self::$yyRuleInfo[ $yyruleno ][ 0 ];
+                        $this->yystack[ $this->yyidx ] = $x;
+                        continue 2;
+                    } elseif ($nextstate === self::YYNSTATE + self::YYNRULE + 1) {
+                        $this->yyidx = $yyidx;
+                        $this->yystack = $stack;
+                        // the last token was just ignored, we can't accept
+                        // by ignoring input, this is in essence ignoring a
+                        // syntax error!
+                        return array_unique($expected);
+                    } elseif ($nextstate === self::YY_NO_ACTION) {
+                        $this->yyidx = $yyidx;
+                        $this->yystack = $stack;
+                        // input accepted, but not shifted (I guess)
+                        return $expected;
+                    } else {
+                        $yyact = $nextstate;
+                    }
+                } while (true);
+            }
+            break;
+        } while (true);
+        $this->yyidx = $yyidx;
+        $this->yystack = $stack;
+        return array_unique($expected);
+    }
+
+    public function yy_is_expected_token($token)
+    {
+        static $res = array();
+        static $res2 = array();
+        if ($token === 0) {
+            return true; // 0 is not part of this
+        }
+        $state = $this->yystack[ $this->yyidx ]->stateno;
+        if (isset($res[ $state ][ $token ])) {
+            if ($res[ $state ][ $token ]) {
+                return true;
+            }
+        } else {
+            if ($res[ $state ][ $token ] = in_array($token, self::$yyExpectedTokens[ $state ], true)) {
+                return true;
+            }
+        }
+        $stack = $this->yystack;
+        $yyidx = $this->yyidx;
+        do {
+            $yyact = $this->yy_find_shift_action($token);
+            if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) {
+                // reduce action
+                $done = 0;
+                do {
+                    if ($done++ === 100) {
+                        $this->yyidx = $yyidx;
+                        $this->yystack = $stack;
+                        // too much recursion prevents proper detection
+                        // so give up
+                        return true;
+                    }
+                    $yyruleno = $yyact - self::YYNSTATE;
+                    $this->yyidx -= self::$yyRuleInfo[ $yyruleno ][ 1 ];
+                    $nextstate = $this->yy_find_reduce_action(
+                        $this->yystack[ $this->yyidx ]->stateno,
+                        self::$yyRuleInfo[ $yyruleno ][ 0 ]
+                    );
+                    if (isset($res2[ $nextstate ][ $token ])) {
+                        if ($res2[ $nextstate ][ $token ]) {
+                            $this->yyidx = $yyidx;
+                            $this->yystack = $stack;
+                            return true;
+                        }
+                    } else {
+                        if ($res2[ $nextstate ][ $token ] =
+                            (isset(self::$yyExpectedTokens[ $nextstate ]) &&
+                             in_array($token, self::$yyExpectedTokens[ $nextstate ], true))) {
+                            $this->yyidx = $yyidx;
+                            $this->yystack = $stack;
+                            return true;
+                        }
+                    }
+                    if ($nextstate < self::YYNSTATE) {
+                        // we need to shift a non-terminal
+                        $this->yyidx++;
+                        $x = new TPC_yyStackEntry;
+                        $x->stateno = $nextstate;
+                        $x->major = self::$yyRuleInfo[ $yyruleno ][ 0 ];
+                        $this->yystack[ $this->yyidx ] = $x;
+                        continue 2;
+                    } elseif ($nextstate === self::YYNSTATE + self::YYNRULE + 1) {
+                        $this->yyidx = $yyidx;
+                        $this->yystack = $stack;
+                        if (!$token) {
+                            // end of input: this is valid
+                            return true;
+                        }
+                        // the last token was just ignored, we can't accept
+                        // by ignoring input, this is in essence ignoring a
+                        // syntax error!
+                        return false;
+                    } elseif ($nextstate === self::YY_NO_ACTION) {
+                        $this->yyidx = $yyidx;
+                        $this->yystack = $stack;
+                        // input accepted, but not shifted (I guess)
+                        return true;
+                    } else {
+                        $yyact = $nextstate;
+                    }
+                } while (true);
+            }
+            break;
+        } while (true);
+        $this->yyidx = $yyidx;
+        $this->yystack = $stack;
+        return true;
+    }
+
+    public function yy_find_shift_action($iLookAhead)
+    {
+        $stateno = $this->yystack[ $this->yyidx ]->stateno;
+        /* if ($this->yyidx < 0) return self::YY_NO_ACTION;  */
+        if (!isset(self::$yy_shift_ofst[ $stateno ])) {
+            // no shift actions
+            return self::$yy_default[ $stateno ];
+        }
+        $i = self::$yy_shift_ofst[ $stateno ];
+        if ($i === self::YY_SHIFT_USE_DFLT) {
+            return self::$yy_default[ $stateno ];
+        }
+        if ($iLookAhead === self::YYNOCODE) {
+            return self::YY_NO_ACTION;
+        }
+        $i += $iLookAhead;
+        if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
+            self::$yy_lookahead[ $i ] != $iLookAhead) {
+            if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback)
+                && ($iFallback = self::$yyFallback[ $iLookAhead ]) != 0) {
+                if ($this->yyTraceFILE) {
+                    fwrite($this->yyTraceFILE, $this->yyTracePrompt . 'FALLBACK ' .
+                                               $this->yyTokenName[ $iLookAhead ] . ' => ' .
+                                               $this->yyTokenName[ $iFallback ] . "\n");
+                }
+                return $this->yy_find_shift_action($iFallback);
+            }
+            return self::$yy_default[ $stateno ];
+        } else {
+            return self::$yy_action[ $i ];
+        }
+    }
+
+    public function yy_find_reduce_action($stateno, $iLookAhead)
+    {
+        /* $stateno = $this->yystack[$this->yyidx]->stateno; */
+        if (!isset(self::$yy_reduce_ofst[ $stateno ])) {
+            return self::$yy_default[ $stateno ];
+        }
+        $i = self::$yy_reduce_ofst[ $stateno ];
+        if ($i === self::YY_REDUCE_USE_DFLT) {
+            return self::$yy_default[ $stateno ];
+        }
+        if ($iLookAhead === self::YYNOCODE) {
+            return self::YY_NO_ACTION;
+        }
+        $i += $iLookAhead;
+        if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
+            self::$yy_lookahead[ $i ] != $iLookAhead) {
+            return self::$yy_default[ $stateno ];
+        } else {
+            return self::$yy_action[ $i ];
+        }
+    }
+
+    public function yy_shift($yyNewState, $yyMajor, $yypMinor)
+    {
+        $this->yyidx++;
+        if ($this->yyidx >= self::YYSTACKDEPTH) {
+            $this->yyidx--;
+            if ($this->yyTraceFILE) {
+                fprintf($this->yyTraceFILE, "%sStack Overflow!\n", $this->yyTracePrompt);
+            }
+            while ($this->yyidx >= 0) {
+                $this->yy_pop_parser_stack();
+            }
+            // line 239 "../smarty/lexer/smarty_internal_configfileparser.y"
+            $this->internalError = true;
+            $this->compiler->trigger_config_file_error('Stack overflow in configfile parser');
+            return;
+        }
+        $yytos = new TPC_yyStackEntry;
+        $yytos->stateno = $yyNewState;
+        $yytos->major = $yyMajor;
+        $yytos->minor = $yypMinor;
+        $this->yystack[] = $yytos;
+        if ($this->yyTraceFILE && $this->yyidx > 0) {
+            fprintf(
+                $this->yyTraceFILE,
+                "%sShift %d\n",
+                $this->yyTracePrompt,
+                $yyNewState
+            );
+            fprintf($this->yyTraceFILE, "%sStack:", $this->yyTracePrompt);
+            for ($i = 1; $i <= $this->yyidx; $i++) {
+                fprintf(
+                    $this->yyTraceFILE,
+                    " %s",
+                    $this->yyTokenName[ $this->yystack[ $i ]->major ]
+                );
+            }
+            fwrite($this->yyTraceFILE, "\n");
+        }
+    }
+
+    public function yy_r0()
+    {
+        $this->_retvalue = null;
+    }
+
+    public function yy_r1()
+    {
+        $this->add_global_vars($this->yystack[ $this->yyidx + 0 ]->minor);
+        $this->_retvalue = null;
+    }
+
+    public function yy_r4()
+    {
+        $this->add_section_vars($this->yystack[ $this->yyidx + -3 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor);
+        $this->_retvalue = null;
+    }
+
+    // line 245 "../smarty/lexer/smarty_internal_configfileparser.y"
+    public function yy_r5()
+    {
+        if ($this->configReadHidden) {
+            $this->add_section_vars(
+                $this->yystack[ $this->yyidx + -3 ]->minor,
+                $this->yystack[ $this->yyidx + 0 ]->minor
+            );
+        }
+        $this->_retvalue = null;
+    }
+
+    // line 250 "../smarty/lexer/smarty_internal_configfileparser.y"
+    public function yy_r6()
+    {
+        $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor;
+    }
+
+    // line 264 "../smarty/lexer/smarty_internal_configfileparser.y"
+    public function yy_r7()
+    {
+        $this->_retvalue =
+            array_merge($this->yystack[ $this->yyidx + -1 ]->minor, array($this->yystack[ $this->yyidx + 0 ]->minor));
+    }
+
+    // line 269 "../smarty/lexer/smarty_internal_configfileparser.y"
+    public function yy_r8()
+    {
+        $this->_retvalue = array();
+    }
+
+    // line 277 "../smarty/lexer/smarty_internal_configfileparser.y"
+    public function yy_r9()
+    {
+        $this->_retvalue =
+            array(
+                'key'   => $this->yystack[ $this->yyidx + -2 ]->minor,
+                'value' => $this->yystack[ $this->yyidx + 0 ]->minor
+            );
+    }
+
+    // line 281 "../smarty/lexer/smarty_internal_configfileparser.y"
+    public function yy_r10()
+    {
+        $this->_retvalue = (float)$this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 285 "../smarty/lexer/smarty_internal_configfileparser.y"
+    public function yy_r11()
+    {
+        $this->_retvalue = (int)$this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 291 "../smarty/lexer/smarty_internal_configfileparser.y"
+    public function yy_r12()
+    {
+        $this->_retvalue = $this->parse_bool($this->yystack[ $this->yyidx + 0 ]->minor);
+    }
+
+    // line 296 "../smarty/lexer/smarty_internal_configfileparser.y"
+    public function yy_r13()
+    {
+        $this->_retvalue = self::parse_single_quoted_string($this->yystack[ $this->yyidx + 0 ]->minor);
+    }
+
+    // line 300 "../smarty/lexer/smarty_internal_configfileparser.y"
+    public function yy_r14()
+    {
+        $this->_retvalue = self::parse_double_quoted_string($this->yystack[ $this->yyidx + 0 ]->minor);
+    }
+
+    // line 304 "../smarty/lexer/smarty_internal_configfileparser.y"
+    public function yy_r15()
+    {
+        $this->_retvalue = self::parse_tripple_double_quoted_string($this->yystack[ $this->yyidx + -1 ]->minor);
+    }
+
+    // line 308 "../smarty/lexer/smarty_internal_configfileparser.y"
+    public function yy_r16()
+    {
+        $this->_retvalue = '';
+    }
+
+    // line 312 "../smarty/lexer/smarty_internal_configfileparser.y"
+    public function yy_r17()
+    {
+        $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 316 "../smarty/lexer/smarty_internal_configfileparser.y"
+    public function yy_reduce($yyruleno)
+    {
+        if ($this->yyTraceFILE && $yyruleno >= 0
+            && $yyruleno < count(self::$yyRuleName)) {
+            fprintf(
+                $this->yyTraceFILE,
+                "%sReduce (%d) [%s].\n",
+                $this->yyTracePrompt,
+                $yyruleno,
+                self::$yyRuleName[ $yyruleno ]
+            );
+        }
+        $this->_retvalue = $yy_lefthand_side = null;
+        if (isset(self::$yyReduceMap[ $yyruleno ])) {
+            // call the action
+            $this->_retvalue = null;
+            $this->{'yy_r' . self::$yyReduceMap[ $yyruleno ]}();
+            $yy_lefthand_side = $this->_retvalue;
+        }
+        $yygoto = self::$yyRuleInfo[ $yyruleno ][ 0 ];
+        $yysize = self::$yyRuleInfo[ $yyruleno ][ 1 ];
+        $this->yyidx -= $yysize;
+        for ($i = $yysize; $i; $i--) {
+            // pop all of the right-hand side parameters
+            array_pop($this->yystack);
+        }
+        $yyact = $this->yy_find_reduce_action($this->yystack[ $this->yyidx ]->stateno, $yygoto);
+        if ($yyact < self::YYNSTATE) {
+            if (!$this->yyTraceFILE && $yysize) {
+                $this->yyidx++;
+                $x = new TPC_yyStackEntry;
+                $x->stateno = $yyact;
+                $x->major = $yygoto;
+                $x->minor = $yy_lefthand_side;
+                $this->yystack[ $this->yyidx ] = $x;
+            } else {
+                $this->yy_shift($yyact, $yygoto, $yy_lefthand_side);
+            }
+        } elseif ($yyact === self::YYNSTATE + self::YYNRULE + 1) {
+            $this->yy_accept();
+        }
+    }
+
+    // line 320 "../smarty/lexer/smarty_internal_configfileparser.y"
+    public function yy_parse_failed()
+    {
+        if ($this->yyTraceFILE) {
+            fprintf($this->yyTraceFILE, "%sFail!\n", $this->yyTracePrompt);
+        }
+        while ($this->yyidx >= 0) {
+            $this->yy_pop_parser_stack();
+        }
+    }
+
+    // line 324 "../smarty/lexer/smarty_internal_configfileparser.y"
+    public function yy_syntax_error($yymajor, $TOKEN)
+    {
+        // line 232 "../smarty/lexer/smarty_internal_configfileparser.y"
+        $this->internalError = true;
+        $this->yymajor = $yymajor;
+        $this->compiler->trigger_config_file_error();
+    }
+
+    public function yy_accept()
+    {
+        if ($this->yyTraceFILE) {
+            fprintf($this->yyTraceFILE, "%sAccept!\n", $this->yyTracePrompt);
+        }
+        while ($this->yyidx >= 0) {
+            $this->yy_pop_parser_stack();
+        }
+        // line 225 "../smarty/lexer/smarty_internal_configfileparser.y"
+        $this->successful = !$this->internalError;
+        $this->internalError = false;
+        $this->retvalue = $this->_retvalue;
+    }
+
+    public function doParse($yymajor, $yytokenvalue)
+    {
+        $yyerrorhit = 0;   /* True if yymajor has invoked an error */
+        if ($this->yyidx === null || $this->yyidx < 0) {
+            $this->yyidx = 0;
+            $this->yyerrcnt = -1;
+            $x = new TPC_yyStackEntry;
+            $x->stateno = 0;
+            $x->major = 0;
+            $this->yystack = array();
+            $this->yystack[] = $x;
+        }
+        $yyendofinput = ($yymajor == 0);
+        if ($this->yyTraceFILE) {
+            fprintf(
+                $this->yyTraceFILE,
+                "%sInput %s\n",
+                $this->yyTracePrompt,
+                $this->yyTokenName[ $yymajor ]
+            );
+        }
+        do {
+            $yyact = $this->yy_find_shift_action($yymajor);
+            if ($yymajor < self::YYERRORSYMBOL &&
+                !$this->yy_is_expected_token($yymajor)) {
+                // force a syntax error
+                $yyact = self::YY_ERROR_ACTION;
+            }
+            if ($yyact < self::YYNSTATE) {
+                $this->yy_shift($yyact, $yymajor, $yytokenvalue);
+                $this->yyerrcnt--;
+                if ($yyendofinput && $this->yyidx >= 0) {
+                    $yymajor = 0;
+                } else {
+                    $yymajor = self::YYNOCODE;
+                }
+            } elseif ($yyact < self::YYNSTATE + self::YYNRULE) {
+                $this->yy_reduce($yyact - self::YYNSTATE);
+            } elseif ($yyact === self::YY_ERROR_ACTION) {
+                if ($this->yyTraceFILE) {
+                    fprintf(
+                        $this->yyTraceFILE,
+                        "%sSyntax Error!\n",
+                        $this->yyTracePrompt
+                    );
+                }
+                if (self::YYERRORSYMBOL) {
+                    if ($this->yyerrcnt < 0) {
+                        $this->yy_syntax_error($yymajor, $yytokenvalue);
+                    }
+                    $yymx = $this->yystack[ $this->yyidx ]->major;
+                    if ($yymx === self::YYERRORSYMBOL || $yyerrorhit) {
+                        if ($this->yyTraceFILE) {
+                            fprintf(
+                                $this->yyTraceFILE,
+                                "%sDiscard input token %s\n",
+                                $this->yyTracePrompt,
+                                $this->yyTokenName[ $yymajor ]
+                            );
+                        }
+                        $this->yy_destructor($yymajor, $yytokenvalue);
+                        $yymajor = self::YYNOCODE;
+                    } else {
+                        while ($this->yyidx >= 0 &&
+                               $yymx !== self::YYERRORSYMBOL &&
+                               ($yyact = $this->yy_find_shift_action(self::YYERRORSYMBOL)) >= self::YYNSTATE
+                        ) {
+                            $this->yy_pop_parser_stack();
+                        }
+                        if ($this->yyidx < 0 || $yymajor == 0) {
+                            $this->yy_destructor($yymajor, $yytokenvalue);
+                            $this->yy_parse_failed();
+                            $yymajor = self::YYNOCODE;
+                        } elseif ($yymx !== self::YYERRORSYMBOL) {
+                            $u2 = 0;
+                            $this->yy_shift($yyact, self::YYERRORSYMBOL, $u2);
+                        }
+                    }
+                    $this->yyerrcnt = 3;
+                    $yyerrorhit = 1;
+                } else {
+                    if ($this->yyerrcnt <= 0) {
+                        $this->yy_syntax_error($yymajor, $yytokenvalue);
+                    }
+                    $this->yyerrcnt = 3;
+                    $this->yy_destructor($yymajor, $yytokenvalue);
+                    if ($yyendofinput) {
+                        $this->yy_parse_failed();
+                    }
+                    $yymajor = self::YYNOCODE;
+                }
+            } else {
+                $this->yy_accept();
+                $yymajor = self::YYNOCODE;
+            }
+        } while ($yymajor !== self::YYNOCODE && $this->yyidx >= 0);
+    }
+
+    /**
+     * parse optional boolean keywords
+     *
+     * @param string $str
+     *
+     * @return bool
+     */
+    private function parse_bool($str)
+    {
+        $str = strtolower($str);
+        if (in_array($str, array('on', 'yes', 'true'))) {
+            $res = true;
+        } else {
+            $res = false;
+        }
+        return $res;
+    }
+
+    /**
+     * set a config variable in target array
+     *
+     * @param array $var
+     * @param array $target_array
+     */
+    private function set_var(array $var, array &$target_array)
+    {
+        $key = $var[ 'key' ];
+        $value = $var[ 'value' ];
+        if ($this->configOverwrite || !isset($target_array[ 'vars' ][ $key ])) {
+            $target_array[ 'vars' ][ $key ] = $value;
+        } else {
+            settype($target_array[ 'vars' ][ $key ], 'array');
+            $target_array[ 'vars' ][ $key ][] = $value;
+        }
+    }
+
+    /**
+     * add config variable to global vars
+     *
+     * @param array $vars
+     */
+    private function add_global_vars(array $vars)
+    {
+        if (!isset($this->compiler->config_data[ 'vars' ])) {
+            $this->compiler->config_data[ 'vars' ] = array();
+        }
+        foreach ($vars as $var) {
+            $this->set_var($var, $this->compiler->config_data);
+        }
+    }
+
+    /**
+     * add config variable to section
+     *
+     * @param string $section_name
+     * @param array  $vars
+     */
+    private function add_section_vars($section_name, array $vars)
+    {
+        if (!isset($this->compiler->config_data[ 'sections' ][ $section_name ][ 'vars' ])) {
+            $this->compiler->config_data[ 'sections' ][ $section_name ][ 'vars' ] = array();
+        }
+        foreach ($vars as $var) {
+            $this->set_var($var, $this->compiler->config_data[ 'sections' ][ $section_name ]);
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_data.php b/sysplugins/smarty_internal_data.php
new file mode 100644
index 0000000000000000000000000000000000000000..98e3e57b34db7ea01b92f1fd7eb7e53f6d191178
--- /dev/null
+++ b/sysplugins/smarty_internal_data.php
@@ -0,0 +1,292 @@
+<?php
+/**
+ * Smarty Internal Plugin Data
+ * This file contains the basic classes and methods for template and variable creation
+ *
+ * @package    Smarty
+ * @subpackage Template
+ * @author     Uwe Tews
+ */
+
+/**
+ * Base class with template and variable methods
+ *
+ * @package    Smarty
+ * @subpackage Template
+ *
+ * @property int    $scope
+ * @property Smarty $smarty
+ * The following methods will be dynamically loaded by the extension handler when they are called.
+ * They are located in a corresponding Smarty_Internal_Method_xxxx class
+ *
+ * @method mixed _getConfigVariable(string $varName, bool $errorEnable = true)
+ * @method mixed getConfigVariable(string $varName, bool $errorEnable = true)
+ * @method mixed getConfigVars(string $varName = null, bool $searchParents = true)
+ * @method mixed getGlobal(string $varName = null)
+ * @method mixed getStreamVariable(string $variable)
+ * @method Smarty_Internal_Data clearAssign(mixed $tpl_var)
+ * @method Smarty_Internal_Data clearAllAssign()
+ * @method Smarty_Internal_Data clearConfig(string $varName = null)
+ * @method Smarty_Internal_Data configLoad(string $config_file, mixed $sections = null, string $scope = 'local')
+ */
+abstract class Smarty_Internal_Data
+{
+    /**
+     * This object type (Smarty = 1, template = 2, data = 4)
+     *
+     * @var int
+     */
+    public $_objType = 4;
+
+    /**
+     * name of class used for templates
+     *
+     * @var string
+     */
+    public $template_class = 'Smarty_Internal_Template';
+
+    /**
+     * template variables
+     *
+     * @var Smarty_Variable[]
+     */
+    public $tpl_vars = array();
+
+    /**
+     * parent template (if any)
+     *
+     * @var Smarty|Smarty_Internal_Template|Smarty_Data
+     */
+    public $parent = null;
+
+    /**
+     * configuration settings
+     *
+     * @var string[]
+     */
+    public $config_vars = array();
+
+    /**
+     * extension handler
+     *
+     * @var Smarty_Internal_Extension_Handler
+     */
+    public $ext = null;
+
+    /**
+     * Smarty_Internal_Data constructor.
+     *
+     * Install extension handler
+     */
+    public function __construct()
+    {
+        $this->ext = new Smarty_Internal_Extension_Handler();
+        $this->ext->objType = $this->_objType;
+    }
+
+    /**
+     * assigns a Smarty variable
+     *
+     * @param array|string $tpl_var the template variable name(s)
+     * @param mixed        $value   the value to assign
+     * @param boolean      $nocache if true any output of this variable will be not cached
+     *
+     * @return Smarty_Internal_Data current Smarty_Internal_Data (or Smarty or Smarty_Internal_Template) instance for
+     *                              chaining
+     */
+    public function assign($tpl_var, $value = null, $nocache = false)
+    {
+        if (is_array($tpl_var)) {
+            foreach ($tpl_var as $_key => $_val) {
+                $this->assign($_key, $_val, $nocache);
+            }
+        } else {
+            if ($tpl_var !== '') {
+                if ($this->_objType === 2) {
+                    /**
+                     *
+                     *
+                     * @var Smarty_Internal_Template $this
+                     */
+                    $this->_assignInScope($tpl_var, $value, $nocache);
+                } else {
+                    $this->tpl_vars[ $tpl_var ] = new Smarty_Variable($value, $nocache);
+                }
+            }
+        }
+        return $this;
+    }
+
+    /**
+     * appends values to template variables
+     *
+     * @api  Smarty::append()
+     * @link http://www.smarty.net/docs/en/api.append.tpl
+     *
+     * @param array|string $tpl_var the template variable name(s)
+     * @param mixed        $value   the value to append
+     * @param bool         $merge   flag if array elements shall be merged
+     * @param bool         $nocache if true any output of this variable will
+     *                              be not cached
+     *
+     * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty
+     */
+    public function append($tpl_var, $value = null, $merge = false, $nocache = false)
+    {
+        return $this->ext->append->append($this, $tpl_var, $value, $merge, $nocache);
+    }
+
+    /**
+     * assigns a global Smarty variable
+     *
+     * @param string  $varName the global variable name
+     * @param mixed   $value   the value to assign
+     * @param boolean $nocache if true any output of this variable will be not cached
+     *
+     * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty
+     */
+    public function assignGlobal($varName, $value = null, $nocache = false)
+    {
+        return $this->ext->assignGlobal->assignGlobal($this, $varName, $value, $nocache);
+    }
+
+    /**
+     * appends values to template variables by reference
+     *
+     * @param string  $tpl_var the template variable name
+     * @param mixed   &$value  the referenced value to append
+     * @param boolean $merge   flag if array elements shall be merged
+     *
+     * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty
+     */
+    public function appendByRef($tpl_var, &$value, $merge = false)
+    {
+        return $this->ext->appendByRef->appendByRef($this, $tpl_var, $value, $merge);
+    }
+
+    /**
+     * assigns values to template variables by reference
+     *
+     * @param string  $tpl_var the template variable name
+     * @param         $value
+     * @param boolean $nocache if true any output of this variable will be not cached
+     *
+     * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty
+     */
+    public function assignByRef($tpl_var, &$value, $nocache = false)
+    {
+        return $this->ext->assignByRef->assignByRef($this, $tpl_var, $value, $nocache);
+    }
+
+    /**
+     * Returns a single or all template variables
+     *
+     * @api  Smarty::getTemplateVars()
+     * @link http://www.smarty.net/docs/en/api.get.template.vars.tpl
+     *
+     * @param string                                                  $varName       variable name or null
+     * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $_ptr          optional pointer to data object
+     * @param bool                                                    $searchParents include parent templates?
+     *
+     * @return mixed variable value or or array of variables
+     */
+    public function getTemplateVars($varName = null, Smarty_Internal_Data $_ptr = null, $searchParents = true)
+    {
+        return $this->ext->getTemplateVars->getTemplateVars($this, $varName, $_ptr, $searchParents);
+    }
+
+    /**
+     * gets the object of a Smarty variable
+     *
+     * @param string               $variable      the name of the Smarty variable
+     * @param Smarty_Internal_Data $_ptr          optional pointer to data object
+     * @param boolean              $searchParents search also in parent data
+     * @param bool                 $error_enable
+     *
+     * @return     Smarty_Variable|Smarty_Undefined_Variable the object of the variable
+     * @deprecated since 3.1.28 please use Smarty_Internal_Data::getTemplateVars() instead.
+     */
+    public function getVariable(
+        $variable = null,
+        Smarty_Internal_Data $_ptr = null,
+        $searchParents = true,
+        $error_enable = true
+    ) {
+        return $this->ext->getTemplateVars->_getVariable($this, $variable, $_ptr, $searchParents, $error_enable);
+    }
+
+    /**
+     * Follow the parent chain an merge template and config variables
+     *
+     * @param \Smarty_Internal_Data|null $data
+     */
+    public function _mergeVars(Smarty_Internal_Data $data = null)
+    {
+        if (isset($data)) {
+            if (!empty($this->tpl_vars)) {
+                $data->tpl_vars = array_merge($this->tpl_vars, $data->tpl_vars);
+            }
+            if (!empty($this->config_vars)) {
+                $data->config_vars = array_merge($this->config_vars, $data->config_vars);
+            }
+        } else {
+            $data = $this;
+        }
+        if (isset($this->parent)) {
+            $this->parent->_mergeVars($data);
+        }
+    }
+
+    /**
+     * Return true if this instance is a Data obj
+     *
+     * @return bool
+     */
+    public function _isDataObj()
+    {
+        return $this->_objType === 4;
+    }
+
+    /**
+     * Return true if this instance is a template obj
+     *
+     * @return bool
+     */
+    public function _isTplObj()
+    {
+        return $this->_objType === 2;
+    }
+
+    /**
+     * Return true if this instance is a Smarty obj
+     *
+     * @return bool
+     */
+    public function _isSmartyObj()
+    {
+        return $this->_objType === 1;
+    }
+
+    /**
+     * Get Smarty object
+     *
+     * @return Smarty
+     */
+    public function _getSmartyObj()
+    {
+        return $this->smarty;
+    }
+
+    /**
+     * Handle unknown class methods
+     *
+     * @param string $name unknown method-name
+     * @param array  $args argument array
+     *
+     * @return mixed
+     */
+    public function __call($name, $args)
+    {
+        return $this->ext->_callExternalMethod($this, $name, $args);
+    }
+}
diff --git a/sysplugins/smarty_internal_debug.php b/sysplugins/smarty_internal_debug.php
new file mode 100644
index 0000000000000000000000000000000000000000..24b233e26a03342550c4a81cf0f0752cb9965246
--- /dev/null
+++ b/sysplugins/smarty_internal_debug.php
@@ -0,0 +1,425 @@
+<?php
+/**
+ * Smarty Internal Plugin Debug
+ * Class to collect data for the Smarty Debugging Console
+ *
+ * @package    Smarty
+ * @subpackage Debug
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Debug Class
+ *
+ * @package    Smarty
+ * @subpackage Debug
+ */
+class Smarty_Internal_Debug extends Smarty_Internal_Data
+{
+    /**
+     * template data
+     *
+     * @var array
+     */
+    public $template_data = array();
+
+    /**
+     * List of uid's which shall be ignored
+     *
+     * @var array
+     */
+    public $ignore_uid = array();
+
+    /**
+     * Index of display() and fetch() calls
+     *
+     * @var int
+     */
+    public $index = 0;
+
+    /**
+     * Counter for window offset
+     *
+     * @var int
+     */
+    public $offset = 0;
+
+    /**
+     * Start logging template
+     *
+     * @param \Smarty_Internal_Template $template template
+     * @param null                      $mode     true: display   false: fetch  null: subtemplate
+     */
+    public function start_template(Smarty_Internal_Template $template, $mode = null)
+    {
+        if (isset($mode) && !$template->_isSubTpl()) {
+            $this->index++;
+            $this->offset++;
+            $this->template_data[ $this->index ] = null;
+        }
+        $key = $this->get_key($template);
+        $this->template_data[ $this->index ][ $key ][ 'start_template_time' ] = microtime(true);
+    }
+
+    /**
+     * End logging of cache time
+     *
+     * @param \Smarty_Internal_Template $template cached template
+     */
+    public function end_template(Smarty_Internal_Template $template)
+    {
+        $key = $this->get_key($template);
+        $this->template_data[ $this->index ][ $key ][ 'total_time' ] +=
+            microtime(true) - $this->template_data[ $this->index ][ $key ][ 'start_template_time' ];
+        //$this->template_data[$this->index][$key]['properties'] = $template->properties;
+    }
+
+    /**
+     * Start logging of compile time
+     *
+     * @param \Smarty_Internal_Template $template
+     */
+    public function start_compile(Smarty_Internal_Template $template)
+    {
+        static $_is_stringy = array('string' => true, 'eval' => true);
+        if (!empty($template->compiler->trace_uid)) {
+            $key = $template->compiler->trace_uid;
+            if (!isset($this->template_data[ $this->index ][ $key ])) {
+                if (isset($_is_stringy[ $template->source->type ])) {
+                    $this->template_data[ $this->index ][ $key ][ 'name' ] =
+                        '\'' . substr($template->source->name, 0, 25) . '...\'';
+                } else {
+                    $this->template_data[ $this->index ][ $key ][ 'name' ] = $template->source->filepath;
+                }
+                $this->template_data[ $this->index ][ $key ][ 'compile_time' ] = 0;
+                $this->template_data[ $this->index ][ $key ][ 'render_time' ] = 0;
+                $this->template_data[ $this->index ][ $key ][ 'cache_time' ] = 0;
+            }
+        } else {
+            if (isset($this->ignore_uid[ $template->source->uid ])) {
+                return;
+            }
+            $key = $this->get_key($template);
+        }
+        $this->template_data[ $this->index ][ $key ][ 'start_time' ] = microtime(true);
+    }
+
+    /**
+     * End logging of compile time
+     *
+     * @param \Smarty_Internal_Template $template
+     */
+    public function end_compile(Smarty_Internal_Template $template)
+    {
+        if (!empty($template->compiler->trace_uid)) {
+            $key = $template->compiler->trace_uid;
+        } else {
+            if (isset($this->ignore_uid[ $template->source->uid ])) {
+                return;
+            }
+            $key = $this->get_key($template);
+        }
+        $this->template_data[ $this->index ][ $key ][ 'compile_time' ] +=
+            microtime(true) - $this->template_data[ $this->index ][ $key ][ 'start_time' ];
+    }
+
+    /**
+     * Start logging of render time
+     *
+     * @param \Smarty_Internal_Template $template
+     */
+    public function start_render(Smarty_Internal_Template $template)
+    {
+        $key = $this->get_key($template);
+        $this->template_data[ $this->index ][ $key ][ 'start_time' ] = microtime(true);
+    }
+
+    /**
+     * End logging of compile time
+     *
+     * @param \Smarty_Internal_Template $template
+     */
+    public function end_render(Smarty_Internal_Template $template)
+    {
+        $key = $this->get_key($template);
+        $this->template_data[ $this->index ][ $key ][ 'render_time' ] +=
+            microtime(true) - $this->template_data[ $this->index ][ $key ][ 'start_time' ];
+    }
+
+    /**
+     * Start logging of cache time
+     *
+     * @param \Smarty_Internal_Template $template cached template
+     */
+    public function start_cache(Smarty_Internal_Template $template)
+    {
+        $key = $this->get_key($template);
+        $this->template_data[ $this->index ][ $key ][ 'start_time' ] = microtime(true);
+    }
+
+    /**
+     * End logging of cache time
+     *
+     * @param \Smarty_Internal_Template $template cached template
+     */
+    public function end_cache(Smarty_Internal_Template $template)
+    {
+        $key = $this->get_key($template);
+        $this->template_data[ $this->index ][ $key ][ 'cache_time' ] +=
+            microtime(true) - $this->template_data[ $this->index ][ $key ][ 'start_time' ];
+    }
+
+    /**
+     * Register template object
+     *
+     * @param \Smarty_Internal_Template $template cached template
+     */
+    public function register_template(Smarty_Internal_Template $template)
+    {
+    }
+
+    /**
+     * Register data object
+     *
+     * @param \Smarty_Data $data data object
+     */
+    public static function register_data(Smarty_Data $data)
+    {
+    }
+
+    /**
+     * Opens a window for the Smarty Debugging Console and display the data
+     *
+     * @param Smarty_Internal_Template|Smarty $obj object to debug
+     * @param bool                            $full
+     *
+     * @throws \Exception
+     * @throws \SmartyException
+     */
+    public function display_debug($obj, $full = false)
+    {
+        if (!$full) {
+            $this->offset++;
+            $savedIndex = $this->index;
+            $this->index = 9999;
+        }
+        $smarty = $obj->_getSmartyObj();
+        // create fresh instance of smarty for displaying the debug console
+        // to avoid problems if the application did overload the Smarty class
+        $debObj = new Smarty();
+        // copy the working dirs from application
+        $debObj->setCompileDir($smarty->getCompileDir());
+        // init properties by hand as user may have edited the original Smarty class
+        $debObj->setPluginsDir(is_dir(dirname(__FILE__) . '/../plugins') ? dirname(__FILE__) .
+                                                                           '/../plugins' : $smarty->getPluginsDir());
+        $debObj->force_compile = false;
+        $debObj->compile_check = Smarty::COMPILECHECK_ON;
+        $debObj->left_delimiter = '{';
+        $debObj->right_delimiter = '}';
+        $debObj->security_policy = null;
+        $debObj->debugging = false;
+        $debObj->debugging_ctrl = 'NONE';
+        $debObj->error_reporting = E_ALL & ~E_NOTICE;
+        $debObj->debug_tpl =
+            isset($smarty->debug_tpl) ? $smarty->debug_tpl : 'file:' . dirname(__FILE__) . '/../debug.tpl';
+        $debObj->registered_plugins = array();
+        $debObj->registered_resources = array();
+        $debObj->registered_filters = array();
+        $debObj->autoload_filters = array();
+        $debObj->default_modifiers = array();
+        $debObj->escape_html = true;
+        $debObj->caching = Smarty::CACHING_OFF;
+        $debObj->compile_id = null;
+        $debObj->cache_id = null;
+        // prepare information of assigned variables
+        $ptr = $this->get_debug_vars($obj);
+        $_assigned_vars = $ptr->tpl_vars;
+        ksort($_assigned_vars);
+        $_config_vars = $ptr->config_vars;
+        ksort($_config_vars);
+        $debugging = $smarty->debugging;
+        $_template = new Smarty_Internal_Template($debObj->debug_tpl, $debObj);
+        if ($obj->_isTplObj()) {
+            $_template->assign('template_name', $obj->source->type . ':' . $obj->source->name);
+        }
+        if ($obj->_objType === 1 || $full) {
+            $_template->assign('template_data', $this->template_data[ $this->index ]);
+        } else {
+            $_template->assign('template_data', null);
+        }
+        $_template->assign('assigned_vars', $_assigned_vars);
+        $_template->assign('config_vars', $_config_vars);
+        $_template->assign('execution_time', microtime(true) - $smarty->start_time);
+        $_template->assign('display_mode', $debugging === 2 || !$full);
+        $_template->assign('offset', $this->offset * 50);
+        echo $_template->fetch();
+        if (isset($full)) {
+            $this->index--;
+        }
+        if (!$full) {
+            $this->index = $savedIndex;
+        }
+    }
+
+    /**
+     * Recursively gets variables from all template/data scopes
+     *
+     * @param Smarty_Internal_Template|Smarty_Data $obj object to debug
+     *
+     * @return StdClass
+     */
+    public function get_debug_vars($obj)
+    {
+        $config_vars = array();
+        foreach ($obj->config_vars as $key => $var) {
+            $config_vars[ $key ][ 'value' ] = $var;
+            if ($obj->_isTplObj()) {
+                $config_vars[ $key ][ 'scope' ] = $obj->source->type . ':' . $obj->source->name;
+            } elseif ($obj->_isDataObj()) {
+                $tpl_vars[ $key ][ 'scope' ] = $obj->dataObjectName;
+            } else {
+                $config_vars[ $key ][ 'scope' ] = 'Smarty object';
+            }
+        }
+        $tpl_vars = array();
+        foreach ($obj->tpl_vars as $key => $var) {
+            foreach ($var as $varkey => $varvalue) {
+                if ($varkey === 'value') {
+                    $tpl_vars[ $key ][ $varkey ] = $varvalue;
+                } else {
+                    if ($varkey === 'nocache') {
+                        if ($varvalue === true) {
+                            $tpl_vars[ $key ][ $varkey ] = $varvalue;
+                        }
+                    } else {
+                        if ($varkey !== 'scope' || $varvalue !== 0) {
+                            $tpl_vars[ $key ][ 'attributes' ][ $varkey ] = $varvalue;
+                        }
+                    }
+                }
+            }
+            if ($obj->_isTplObj()) {
+                $tpl_vars[ $key ][ 'scope' ] = $obj->source->type . ':' . $obj->source->name;
+            } elseif ($obj->_isDataObj()) {
+                $tpl_vars[ $key ][ 'scope' ] = $obj->dataObjectName;
+            } else {
+                $tpl_vars[ $key ][ 'scope' ] = 'Smarty object';
+            }
+        }
+        if (isset($obj->parent)) {
+            $parent = $this->get_debug_vars($obj->parent);
+            foreach ($parent->tpl_vars as $name => $pvar) {
+                if (isset($tpl_vars[ $name ]) && $tpl_vars[ $name ][ 'value' ] === $pvar[ 'value' ]) {
+                    $tpl_vars[ $name ][ 'scope' ] = $pvar[ 'scope' ];
+                }
+            }
+            $tpl_vars = array_merge($parent->tpl_vars, $tpl_vars);
+            foreach ($parent->config_vars as $name => $pvar) {
+                if (isset($config_vars[ $name ]) && $config_vars[ $name ][ 'value' ] === $pvar[ 'value' ]) {
+                    $config_vars[ $name ][ 'scope' ] = $pvar[ 'scope' ];
+                }
+            }
+            $config_vars = array_merge($parent->config_vars, $config_vars);
+        } else {
+            foreach (Smarty::$global_tpl_vars as $key => $var) {
+                if (!array_key_exists($key, $tpl_vars)) {
+                    foreach ($var as $varkey => $varvalue) {
+                        if ($varkey === 'value') {
+                            $tpl_vars[ $key ][ $varkey ] = $varvalue;
+                        } else {
+                            if ($varkey === 'nocache') {
+                                if ($varvalue === true) {
+                                    $tpl_vars[ $key ][ $varkey ] = $varvalue;
+                                }
+                            } else {
+                                if ($varkey !== 'scope' || $varvalue !== 0) {
+                                    $tpl_vars[ $key ][ 'attributes' ][ $varkey ] = $varvalue;
+                                }
+                            }
+                        }
+                    }
+                    $tpl_vars[ $key ][ 'scope' ] = 'Global';
+                }
+            }
+        }
+        return (object)array('tpl_vars' => $tpl_vars, 'config_vars' => $config_vars);
+    }
+
+    /**
+     * Return key into $template_data for template
+     *
+     * @param \Smarty_Internal_Template $template template object
+     *
+     * @return string key into $template_data
+     */
+    private function get_key(Smarty_Internal_Template $template)
+    {
+        static $_is_stringy = array('string' => true, 'eval' => true);
+        // calculate Uid if not already done
+        if ($template->source->uid === '') {
+            $template->source->filepath;
+        }
+        $key = $template->source->uid;
+        if (isset($this->template_data[ $this->index ][ $key ])) {
+            return $key;
+        } else {
+            if (isset($_is_stringy[ $template->source->type ])) {
+                $this->template_data[ $this->index ][ $key ][ 'name' ] =
+                    '\'' . substr($template->source->name, 0, 25) . '...\'';
+            } else {
+                $this->template_data[ $this->index ][ $key ][ 'name' ] = $template->source->filepath;
+            }
+            $this->template_data[ $this->index ][ $key ][ 'compile_time' ] = 0;
+            $this->template_data[ $this->index ][ $key ][ 'render_time' ] = 0;
+            $this->template_data[ $this->index ][ $key ][ 'cache_time' ] = 0;
+            $this->template_data[ $this->index ][ $key ][ 'total_time' ] = 0;
+            return $key;
+        }
+    }
+
+    /**
+     * Ignore template
+     *
+     * @param \Smarty_Internal_Template $template
+     */
+    public function ignore(Smarty_Internal_Template $template)
+    {
+        // calculate Uid if not already done
+        if ($template->source->uid === '') {
+            $template->source->filepath;
+        }
+        $this->ignore_uid[ $template->source->uid ] = true;
+    }
+
+    /**
+     * handle 'URL' debugging mode
+     *
+     * @param Smarty $smarty
+     */
+    public function debugUrl(Smarty $smarty)
+    {
+        if (isset($_SERVER[ 'QUERY_STRING' ])) {
+            $_query_string = $_SERVER[ 'QUERY_STRING' ];
+        } else {
+            $_query_string = '';
+        }
+        if (false !== strpos($_query_string, $smarty->smarty_debug_id)) {
+            if (false !== strpos($_query_string, $smarty->smarty_debug_id . '=on')) {
+                // enable debugging for this browser session
+                setcookie('SMARTY_DEBUG', true);
+                $smarty->debugging = true;
+            } elseif (false !== strpos($_query_string, $smarty->smarty_debug_id . '=off')) {
+                // disable debugging for this browser session
+                setcookie('SMARTY_DEBUG', false);
+                $smarty->debugging = false;
+            } else {
+                // enable debugging for this page
+                $smarty->debugging = true;
+            }
+        } else {
+            if (isset($_COOKIE[ 'SMARTY_DEBUG' ])) {
+                $smarty->debugging = true;
+            }
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_errorhandler.php b/sysplugins/smarty_internal_errorhandler.php
new file mode 100644
index 0000000000000000000000000000000000000000..56dca18fa94b5d37524a5b1c7ee3b7f8b321c311
--- /dev/null
+++ b/sysplugins/smarty_internal_errorhandler.php
@@ -0,0 +1,113 @@
+<?php
+
+/**
+ * Smarty error handler
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ *
+ * @deprecated
+Smarty does no longer use @filemtime()
+ */
+class Smarty_Internal_ErrorHandler
+{
+    /**
+     * contains directories outside of SMARTY_DIR that are to be muted by muteExpectedErrors()
+     */
+    public static $mutedDirectories = array();
+
+    /**
+     * error handler returned by set_error_handler() in self::muteExpectedErrors()
+     */
+    private static $previousErrorHandler = null;
+
+    /**
+     * Enable error handler to mute expected messages
+     *
+     */
+    public static function muteExpectedErrors()
+    {
+        /*
+            error muting is done because some people implemented custom error_handlers using
+            http://php.net/set_error_handler and for some reason did not understand the following paragraph:
+
+                It is important to remember that the standard PHP error handler is completely bypassed for the
+                error types specified by error_types unless the callback function returns FALSE.
+                error_reporting() settings will have no effect and your error handler will be called regardless -
+                however you are still able to read the current value of error_reporting and act appropriately.
+                Of particular note is that this value will be 0 if the statement that caused the error was
+                prepended by the @ error-control operator.
+
+            Smarty deliberately uses @filemtime() over file_exists() and filemtime() in some places. Reasons include
+                - @filemtime() is almost twice as fast as using an additional file_exists()
+                - between file_exists() and filemtime() a possible race condition is opened,
+                  which does not exist using the simple @filemtime() approach.
+        */
+        $error_handler = array('Smarty_Internal_ErrorHandler', 'mutingErrorHandler');
+        $previous = set_error_handler($error_handler);
+        // avoid dead loops
+        if ($previous !== $error_handler) {
+            self::$previousErrorHandler = $previous;
+        }
+    }
+
+    /**
+     * Error Handler to mute expected messages
+     *
+     * @link http://php.net/set_error_handler
+     *
+     * @param integer $errno Error level
+     * @param         $errstr
+     * @param         $errfile
+     * @param         $errline
+     * @param         $errcontext
+     *
+     * @return bool
+     */
+    public static function mutingErrorHandler($errno, $errstr, $errfile, $errline, $errcontext = array())
+    {
+        $_is_muted_directory = false;
+        // add the SMARTY_DIR to the list of muted directories
+        if (!isset(self::$mutedDirectories[ SMARTY_DIR ])) {
+            $smarty_dir = realpath(SMARTY_DIR);
+            if ($smarty_dir !== false) {
+                self::$mutedDirectories[ SMARTY_DIR ] =
+                    array('file' => $smarty_dir, 'length' => strlen($smarty_dir),);
+            }
+        }
+        // walk the muted directories and test against $errfile
+        foreach (self::$mutedDirectories as $key => &$dir) {
+            if (!$dir) {
+                // resolve directory and length for speedy comparisons
+                $file = realpath($key);
+                if ($file === false) {
+                    // this directory does not exist, remove and skip it
+                    unset(self::$mutedDirectories[ $key ]);
+                    continue;
+                }
+                $dir = array('file' => $file, 'length' => strlen($file),);
+            }
+            if (!strncmp($errfile, $dir[ 'file' ], $dir[ 'length' ])) {
+                $_is_muted_directory = true;
+                break;
+            }
+        }
+        // pass to next error handler if this error did not occur inside SMARTY_DIR
+        // or the error was within smarty but masked to be ignored
+        if (!$_is_muted_directory || ($errno && $errno & error_reporting())) {
+            if (self::$previousErrorHandler) {
+                return call_user_func(
+                    self::$previousErrorHandler,
+                    $errno,
+                    $errstr,
+                    $errfile,
+                    $errline,
+                    $errcontext
+                );
+            } else {
+                return false;
+            }
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_extension_handler.php b/sysplugins/smarty_internal_extension_handler.php
new file mode 100644
index 0000000000000000000000000000000000000000..b07615526da26cfac78b2a9a56687bd33ff32dae
--- /dev/null
+++ b/sysplugins/smarty_internal_extension_handler.php
@@ -0,0 +1,197 @@
+<?php
+
+/**
+ * Smarty Extension handler
+ *
+ * Load extensions dynamically
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ *
+ * Runtime extensions
+ * @property   Smarty_Internal_Runtime_CacheModify       $_cacheModify
+ * @property   Smarty_Internal_Runtime_CacheResourceFile $_cacheResourceFile
+ * @property   Smarty_Internal_Runtime_Capture           $_capture
+ * @property   Smarty_Internal_Runtime_CodeFrame         $_codeFrame
+ * @property   Smarty_Internal_Runtime_FilterHandler     $_filterHandler
+ * @property   Smarty_Internal_Runtime_Foreach           $_foreach
+ * @property   Smarty_Internal_Runtime_GetIncludePath    $_getIncludePath
+ * @property   Smarty_Internal_Runtime_Make_Nocache      $_make_nocache
+ * @property   Smarty_Internal_Runtime_UpdateCache       $_updateCache
+ * @property   Smarty_Internal_Runtime_UpdateScope       $_updateScope
+ * @property   Smarty_Internal_Runtime_TplFunction       $_tplFunction
+ * @property   Smarty_Internal_Runtime_WriteFile         $_writeFile
+ *
+ * Method extensions
+ * @property   Smarty_Internal_Method_GetTemplateVars    $getTemplateVars
+ * @property   Smarty_Internal_Method_Append             $append
+ * @property   Smarty_Internal_Method_AppendByRef        $appendByRef
+ * @property   Smarty_Internal_Method_AssignGlobal       $assignGlobal
+ * @property   Smarty_Internal_Method_AssignByRef        $assignByRef
+ * @property   Smarty_Internal_Method_LoadFilter         $loadFilter
+ * @property   Smarty_Internal_Method_LoadPlugin         $loadPlugin
+ * @property   Smarty_Internal_Method_RegisterFilter     $registerFilter
+ * @property   Smarty_Internal_Method_RegisterObject     $registerObject
+ * @property   Smarty_Internal_Method_RegisterPlugin     $registerPlugin
+ * @property   mixed|\Smarty_Template_Cached             configLoad
+ */
+class Smarty_Internal_Extension_Handler
+{
+    public $objType = null;
+
+    /**
+     * Cache for property information from generic getter/setter
+     * Preloaded with names which should not use with generic getter/setter
+     *
+     * @var array
+     */
+    private $_property_info     = array(
+        'AutoloadFilters' => 0, 'DefaultModifiers' => 0, 'ConfigVars' => 0,
+        'DebugTemplate'   => 0, 'RegisteredObject' => 0, 'StreamVariable' => 0,
+        'TemplateVars'    => 0, 'Literals' => 'Literals',
+    );//
+
+    private $resolvedProperties = array();
+
+    /**
+     * Call external Method
+     *
+     * @param \Smarty_Internal_Data $data
+     * @param string                $name external method names
+     * @param array                 $args argument array
+     *
+     * @return mixed
+     */
+    public function _callExternalMethod(Smarty_Internal_Data $data, $name, $args)
+    {
+        /* @var Smarty $data ->smarty */
+        $smarty = isset($data->smarty) ? $data->smarty : $data;
+        if (!isset($smarty->ext->$name)) {
+            if (preg_match('/^((set|get)|(.*?))([A-Z].*)$/', $name, $match)) {
+                $basename = $this->upperCase($match[ 4 ]);
+                if (!isset($smarty->ext->$basename) && isset($this->_property_info[ $basename ])
+                    && is_string($this->_property_info[ $basename ])
+                ) {
+                    $class = 'Smarty_Internal_Method_' . $this->_property_info[ $basename ];
+                    if (class_exists($class)) {
+                        $classObj = new $class();
+                        $methodes = get_class_methods($classObj);
+                        foreach ($methodes as $method) {
+                            $smarty->ext->$method = $classObj;
+                        }
+                    }
+                }
+                if (!empty($match[ 2 ]) && !isset($smarty->ext->$name)) {
+                    $class = 'Smarty_Internal_Method_' . $this->upperCase($name);
+                    if (!class_exists($class)) {
+                        $objType = $data->_objType;
+                        $propertyType = false;
+                        if (!isset($this->resolvedProperties[ $match[ 0 ] ][ $objType ])) {
+                            $property = isset($this->resolvedProperties[ 'property' ][ $basename ]) ?
+                                $this->resolvedProperties[ 'property' ][ $basename ] :
+                                $property = $this->resolvedProperties[ 'property' ][ $basename ] = strtolower(
+                                    join(
+                                        '_',
+                                        preg_split(
+                                            '/([A-Z][^A-Z]*)/',
+                                            $basename,
+                                            -1,
+                                            PREG_SPLIT_NO_EMPTY |
+                                            PREG_SPLIT_DELIM_CAPTURE
+                                        )
+                                    )
+                                );
+                            if ($property !== false) {
+                                if (property_exists($data, $property)) {
+                                    $propertyType = $this->resolvedProperties[ $match[ 0 ] ][ $objType ] = 1;
+                                } elseif (property_exists($smarty, $property)) {
+                                    $propertyType = $this->resolvedProperties[ $match[ 0 ] ][ $objType ] = 2;
+                                } else {
+                                    $this->resolvedProperties[ 'property' ][ $basename ] = $property = false;
+                                }
+                            }
+                        } else {
+                            $propertyType = $this->resolvedProperties[ $match[ 0 ] ][ $objType ];
+                            $property = $this->resolvedProperties[ 'property' ][ $basename ];
+                        }
+                        if ($propertyType) {
+                            $obj = $propertyType === 1 ? $data : $smarty;
+                            if ($match[ 2 ] === 'get') {
+                                return $obj->$property;
+                            } elseif ($match[ 2 ] === 'set') {
+                                return $obj->$property = $args[ 0 ];
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        $callback = array($smarty->ext->$name, $name);
+        array_unshift($args, $data);
+        if (isset($callback) && $callback[ 0 ]->objMap | $data->_objType) {
+            return call_user_func_array($callback, $args);
+        }
+        return call_user_func_array(array(new Smarty_Internal_Undefined(), $name), $args);
+    }
+
+    /**
+     * Make first character of name parts upper case
+     *
+     * @param string $name
+     *
+     * @return string
+     */
+    public function upperCase($name)
+    {
+        $_name = explode('_', $name);
+        $_name = array_map('ucfirst', $_name);
+        return implode('_', $_name);
+    }
+
+    /**
+     * get extension object
+     *
+     * @param string $property_name property name
+     *
+     * @return mixed|Smarty_Template_Cached
+     */
+    public function __get($property_name)
+    {
+        // object properties of runtime template extensions will start with '_'
+        if ($property_name[ 0 ] === '_') {
+            $class = 'Smarty_Internal_Runtime' . $this->upperCase($property_name);
+        } else {
+            $class = 'Smarty_Internal_Method_' . $this->upperCase($property_name);
+        }
+        if (!class_exists($class)) {
+            return $this->$property_name = new Smarty_Internal_Undefined($class);
+        }
+        return $this->$property_name = new $class();
+    }
+
+    /**
+     * set extension property
+     *
+     * @param string $property_name property name
+     * @param mixed  $value         value
+     *
+     */
+    public function __set($property_name, $value)
+    {
+        $this->$property_name = $value;
+    }
+
+    /**
+     * Call error handler for undefined method
+     *
+     * @param string $name unknown method-name
+     * @param array  $args argument array
+     *
+     * @return mixed
+     */
+    public function __call($name, $args)
+    {
+        return call_user_func_array(array(new Smarty_Internal_Undefined(), $name), array($this));
+    }
+}
diff --git a/sysplugins/smarty_internal_method_addautoloadfilters.php b/sysplugins/smarty_internal_method_addautoloadfilters.php
new file mode 100644
index 0000000000000000000000000000000000000000..a05f55a8228bd1ef8f78ae0f8ecface0b6544d32
--- /dev/null
+++ b/sysplugins/smarty_internal_method_addautoloadfilters.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * Smarty Method AddAutoloadFilters
+ *
+ * Smarty::addAutoloadFilters() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_AddAutoloadFilters extends Smarty_Internal_Method_SetAutoloadFilters
+{
+    /**
+     * Add autoload filters
+     *
+     * @api Smarty::setAutoloadFilters()
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param array                                                           $filters filters to load automatically
+     * @param string                                                          $type    "pre", "output", … specify
+     *                                                                                 the filter type to set.
+     *                                                                                 Defaults to none treating
+     *                                                                                 $filters' keys as the
+     *                                                                                 appropriate types
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     * @throws \SmartyException
+     */
+    public function addAutoloadFilters(Smarty_Internal_TemplateBase $obj, $filters, $type = null)
+    {
+        $smarty = $obj->_getSmartyObj();
+        if ($type !== null) {
+            $this->_checkFilterType($type);
+            if (!empty($smarty->autoload_filters[ $type ])) {
+                $smarty->autoload_filters[ $type ] = array_merge($smarty->autoload_filters[ $type ], (array)$filters);
+            } else {
+                $smarty->autoload_filters[ $type ] = (array)$filters;
+            }
+        } else {
+            foreach ((array)$filters as $type => $value) {
+                $this->_checkFilterType($type);
+                if (!empty($smarty->autoload_filters[ $type ])) {
+                    $smarty->autoload_filters[ $type ] =
+                        array_merge($smarty->autoload_filters[ $type ], (array)$value);
+                } else {
+                    $smarty->autoload_filters[ $type ] = (array)$value;
+                }
+            }
+        }
+        return $obj;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_adddefaultmodifiers.php b/sysplugins/smarty_internal_method_adddefaultmodifiers.php
new file mode 100644
index 0000000000000000000000000000000000000000..c3feb3d8b97295c2efe06b67dd4f2c4d0b47c38a
--- /dev/null
+++ b/sysplugins/smarty_internal_method_adddefaultmodifiers.php
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * Smarty Method AddDefaultModifiers
+ *
+ * Smarty::addDefaultModifiers() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_AddDefaultModifiers
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * Add default modifiers
+     *
+     * @api Smarty::addDefaultModifiers()
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param array|string                                                    $modifiers modifier or list of modifiers
+     *                                                                                   to add
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     */
+    public function addDefaultModifiers(Smarty_Internal_TemplateBase $obj, $modifiers)
+    {
+        $smarty = $obj->_getSmartyObj();
+        if (is_array($modifiers)) {
+            $smarty->default_modifiers = array_merge($smarty->default_modifiers, $modifiers);
+        } else {
+            $smarty->default_modifiers[] = $modifiers;
+        }
+        return $obj;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_append.php b/sysplugins/smarty_internal_method_append.php
new file mode 100644
index 0000000000000000000000000000000000000000..881375efe9c2825e01b08c76f7e6b3a71124f57e
--- /dev/null
+++ b/sysplugins/smarty_internal_method_append.php
@@ -0,0 +1,74 @@
+<?php
+
+/**
+ * Smarty Method Append
+ *
+ * Smarty::append() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_Append
+{
+    /**
+     * Valid for all objects
+     *
+     * @var int
+     */
+    public $objMap = 7;
+
+    /**
+     * appends values to template variables
+     *
+     * @api  Smarty::append()
+     * @link http://www.smarty.net/docs/en/api.append.tpl
+     *
+     * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data
+     * @param array|string                                            $tpl_var the template variable name(s)
+     * @param mixed                                                   $value   the value to append
+     * @param bool                                                    $merge   flag if array elements shall be merged
+     * @param bool                                                    $nocache if true any output of this variable will
+     *                                                                         be not cached
+     *
+     * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty
+     */
+    public function append(Smarty_Internal_Data $data, $tpl_var, $value = null, $merge = false, $nocache = false)
+    {
+        if (is_array($tpl_var)) {
+            // $tpl_var is an array, ignore $value
+            foreach ($tpl_var as $_key => $_val) {
+                if ($_key !== '') {
+                    $this->append($data, $_key, $_val, $merge, $nocache);
+                }
+            }
+        } else {
+            if ($tpl_var !== '' && isset($value)) {
+                if (!isset($data->tpl_vars[ $tpl_var ])) {
+                    $tpl_var_inst = $data->ext->getTemplateVars->_getVariable($data, $tpl_var, null, true, false);
+                    if ($tpl_var_inst instanceof Smarty_Undefined_Variable) {
+                        $data->tpl_vars[ $tpl_var ] = new Smarty_Variable(null, $nocache);
+                    } else {
+                        $data->tpl_vars[ $tpl_var ] = clone $tpl_var_inst;
+                    }
+                }
+                if (!(is_array($data->tpl_vars[ $tpl_var ]->value)
+                      || $data->tpl_vars[ $tpl_var ]->value instanceof ArrayAccess)
+                ) {
+                    settype($data->tpl_vars[ $tpl_var ]->value, 'array');
+                }
+                if ($merge && is_array($value)) {
+                    foreach ($value as $_mkey => $_mval) {
+                        $data->tpl_vars[ $tpl_var ]->value[ $_mkey ] = $_mval;
+                    }
+                } else {
+                    $data->tpl_vars[ $tpl_var ]->value[] = $value;
+                }
+            }
+            if ($data->_isTplObj() && $data->scope) {
+                $data->ext->_updateScope->_updateScope($data, $tpl_var);
+            }
+        }
+        return $data;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_appendbyref.php b/sysplugins/smarty_internal_method_appendbyref.php
new file mode 100644
index 0000000000000000000000000000000000000000..c9590446005074bcd54ab7cc7bccdd580df4e9ac
--- /dev/null
+++ b/sysplugins/smarty_internal_method_appendbyref.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * Smarty Method AppendByRef
+ *
+ * Smarty::appendByRef() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_AppendByRef
+{
+    /**
+     * appends values to template variables by reference
+     *
+     * @api  Smarty::appendByRef()
+     * @link http://www.smarty.net/docs/en/api.append.by.ref.tpl
+     *
+     * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data
+     * @param string                                                  $tpl_var the template variable name
+     * @param mixed                                                   &$value  the referenced value to append
+     * @param bool                                                    $merge   flag if array elements shall be merged
+     *
+     * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty
+     */
+    public static function appendByRef(Smarty_Internal_Data $data, $tpl_var, &$value, $merge = false)
+    {
+        if ($tpl_var !== '' && isset($value)) {
+            if (!isset($data->tpl_vars[ $tpl_var ])) {
+                $data->tpl_vars[ $tpl_var ] = new Smarty_Variable();
+            }
+            if (!is_array($data->tpl_vars[ $tpl_var ]->value)) {
+                settype($data->tpl_vars[ $tpl_var ]->value, 'array');
+            }
+            if ($merge && is_array($value)) {
+                foreach ($value as $_key => $_val) {
+                    $data->tpl_vars[ $tpl_var ]->value[ $_key ] = &$value[ $_key ];
+                }
+            } else {
+                $data->tpl_vars[ $tpl_var ]->value[] = &$value;
+            }
+            if ($data->_isTplObj() && $data->scope) {
+                $data->ext->_updateScope->_updateScope($data, $tpl_var);
+            }
+        }
+        return $data;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_assignbyref.php b/sysplugins/smarty_internal_method_assignbyref.php
new file mode 100644
index 0000000000000000000000000000000000000000..fa705bb80d8dce98b7f70515fde9077730383d3b
--- /dev/null
+++ b/sysplugins/smarty_internal_method_assignbyref.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * Smarty Method AssignByRef
+ *
+ * Smarty::assignByRef() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_AssignByRef
+{
+    /**
+     * assigns values to template variables by reference
+     *
+     * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data
+     * @param string                                                  $tpl_var the template variable name
+     * @param                                                         $value
+     * @param boolean                                                 $nocache if true any output of this variable will
+     *                                                                         be not cached
+     *
+     * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty
+     */
+    public function assignByRef(Smarty_Internal_Data $data, $tpl_var, &$value, $nocache)
+    {
+        if ($tpl_var !== '') {
+            $data->tpl_vars[ $tpl_var ] = new Smarty_Variable(null, $nocache);
+            $data->tpl_vars[ $tpl_var ]->value = &$value;
+            if ($data->_isTplObj() && $data->scope) {
+                $data->ext->_updateScope->_updateScope($data, $tpl_var);
+            }
+        }
+        return $data;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_assignglobal.php b/sysplugins/smarty_internal_method_assignglobal.php
new file mode 100644
index 0000000000000000000000000000000000000000..08cfa4693ed8a706345bea0e471677af4663f0be
--- /dev/null
+++ b/sysplugins/smarty_internal_method_assignglobal.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * Smarty Method AssignGlobal
+ *
+ * Smarty::assignGlobal() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_AssignGlobal
+{
+    /**
+     * Valid for all objects
+     *
+     * @var int
+     */
+    public $objMap = 7;
+
+    /**
+     * assigns a global Smarty variable
+     *
+     * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data
+     * @param string                                                  $varName the global variable name
+     * @param mixed                                                   $value   the value to assign
+     * @param boolean                                                 $nocache if true any output of this variable will
+     *                                                                         be not cached
+     *
+     * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty
+     */
+    public function assignGlobal(Smarty_Internal_Data $data, $varName, $value = null, $nocache = false)
+    {
+        if ($varName !== '') {
+            Smarty::$global_tpl_vars[ $varName ] = new Smarty_Variable($value, $nocache);
+            $ptr = $data;
+            while ($ptr->_isTplObj()) {
+                $ptr->tpl_vars[ $varName ] = clone Smarty::$global_tpl_vars[ $varName ];
+                $ptr = $ptr->parent;
+            }
+        }
+        return $data;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_clearallassign.php b/sysplugins/smarty_internal_method_clearallassign.php
new file mode 100644
index 0000000000000000000000000000000000000000..29ff2ffb047000c9c1c21cdf74b490a65ee480f4
--- /dev/null
+++ b/sysplugins/smarty_internal_method_clearallassign.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * Smarty Method ClearAllAssign
+ *
+ * Smarty::clearAllAssign() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_ClearAllAssign
+{
+    /**
+     * Valid for all objects
+     *
+     * @var int
+     */
+    public $objMap = 7;
+
+    /**
+     * clear all the assigned template variables.
+     *
+     * @api  Smarty::clearAllAssign()
+     * @link http://www.smarty.net/docs/en/api.clear.all.assign.tpl
+     *
+     * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data
+     *
+     * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty
+     */
+    public function clearAllAssign(Smarty_Internal_Data $data)
+    {
+        $data->tpl_vars = array();
+        return $data;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_clearallcache.php b/sysplugins/smarty_internal_method_clearallcache.php
new file mode 100644
index 0000000000000000000000000000000000000000..30d55f7d200fd594565201e87ced47083f0a0c83
--- /dev/null
+++ b/sysplugins/smarty_internal_method_clearallcache.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * Smarty Method ClearAllCache
+ *
+ * Smarty::clearAllCache() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_ClearAllCache
+{
+    /**
+     * Valid for Smarty object
+     *
+     * @var int
+     */
+    public $objMap = 1;
+
+    /**
+     * Empty cache folder
+     *
+     * @api  Smarty::clearAllCache()
+     * @link http://www.smarty.net/docs/en/api.clear.all.cache.tpl
+     *
+     * @param \Smarty $smarty
+     * @param integer $exp_time expiration time
+     * @param string  $type     resource type
+     *
+     * @return int number of cache files deleted
+     * @throws \SmartyException
+     */
+    public function clearAllCache(Smarty $smarty, $exp_time = null, $type = null)
+    {
+        $smarty->_clearTemplateCache();
+        // load cache resource and call clearAll
+        $_cache_resource = Smarty_CacheResource::load($smarty, $type);
+        return $_cache_resource->clearAll($smarty, $exp_time);
+    }
+}
diff --git a/sysplugins/smarty_internal_method_clearassign.php b/sysplugins/smarty_internal_method_clearassign.php
new file mode 100644
index 0000000000000000000000000000000000000000..22bfa2d31d0cb555ffd4d1686692cebc719ba1fe
--- /dev/null
+++ b/sysplugins/smarty_internal_method_clearassign.php
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * Smarty Method ClearAssign
+ *
+ * Smarty::clearAssign() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_ClearAssign
+{
+    /**
+     * Valid for all objects
+     *
+     * @var int
+     */
+    public $objMap = 7;
+
+    /**
+     * clear the given assigned template variable(s).
+     *
+     * @api  Smarty::clearAssign()
+     * @link http://www.smarty.net/docs/en/api.clear.assign.tpl
+     *
+     * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data
+     * @param string|array                                            $tpl_var the template variable(s) to clear
+     *
+     * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty
+     */
+    public function clearAssign(Smarty_Internal_Data $data, $tpl_var)
+    {
+        if (is_array($tpl_var)) {
+            foreach ($tpl_var as $curr_var) {
+                unset($data->tpl_vars[ $curr_var ]);
+            }
+        } else {
+            unset($data->tpl_vars[ $tpl_var ]);
+        }
+        return $data;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_clearcache.php b/sysplugins/smarty_internal_method_clearcache.php
new file mode 100644
index 0000000000000000000000000000000000000000..a5dd4e26ebc27721847677434d654595c0df3544
--- /dev/null
+++ b/sysplugins/smarty_internal_method_clearcache.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * Smarty Method ClearCache
+ *
+ * Smarty::clearCache() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_ClearCache
+{
+    /**
+     * Valid for Smarty object
+     *
+     * @var int
+     */
+    public $objMap = 1;
+
+    /**
+     * Empty cache for a specific template
+     *
+     * @api  Smarty::clearCache()
+     * @link http://www.smarty.net/docs/en/api.clear.cache.tpl
+     *
+     * @param \Smarty $smarty
+     * @param string  $template_name template name
+     * @param string  $cache_id      cache id
+     * @param string  $compile_id    compile id
+     * @param integer $exp_time      expiration time
+     * @param string  $type          resource type
+     *
+     * @return int number of cache files deleted
+     * @throws \SmartyException
+     */
+    public function clearCache(
+        Smarty $smarty,
+        $template_name,
+        $cache_id = null,
+        $compile_id = null,
+        $exp_time = null,
+        $type = null
+    ) {
+        $smarty->_clearTemplateCache();
+        // load cache resource and call clear
+        $_cache_resource = Smarty_CacheResource::load($smarty, $type);
+        return $_cache_resource->clear($smarty, $template_name, $cache_id, $compile_id, $exp_time);
+    }
+}
diff --git a/sysplugins/smarty_internal_method_clearcompiledtemplate.php b/sysplugins/smarty_internal_method_clearcompiledtemplate.php
new file mode 100644
index 0000000000000000000000000000000000000000..bf49298079d2df0991d274f017f57299212681d1
--- /dev/null
+++ b/sysplugins/smarty_internal_method_clearcompiledtemplate.php
@@ -0,0 +1,131 @@
+<?php
+
+/**
+ * Smarty Method ClearCompiledTemplate
+ *
+ * Smarty::clearCompiledTemplate() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_ClearCompiledTemplate
+{
+    /**
+     * Valid for Smarty object
+     *
+     * @var int
+     */
+    public $objMap = 1;
+
+    /**
+     * Delete compiled template file
+     *
+     * @api  Smarty::clearCompiledTemplate()
+     * @link http://www.smarty.net/docs/en/api.clear.compiled.template.tpl
+     *
+     * @param \Smarty $smarty
+     * @param string  $resource_name template name
+     * @param string  $compile_id    compile id
+     * @param integer $exp_time      expiration time
+     *
+     * @return int number of template files deleted
+     * @throws \SmartyException
+     */
+    public function clearCompiledTemplate(Smarty $smarty, $resource_name = null, $compile_id = null, $exp_time = null)
+    {
+        // clear template objects cache
+        $smarty->_clearTemplateCache();
+        $_compile_dir = $smarty->getCompileDir();
+        if ($_compile_dir === '/') { //We should never want to delete this!
+            return 0;
+        }
+        $_compile_id = isset($compile_id) ? preg_replace('![^\w]+!', '_', $compile_id) : null;
+        $_dir_sep = $smarty->use_sub_dirs ? DIRECTORY_SEPARATOR : '^';
+        if (isset($resource_name)) {
+            $_save_stat = $smarty->caching;
+            $smarty->caching = Smarty::CACHING_OFF;
+            /* @var Smarty_Internal_Template $tpl */
+            $tpl = $smarty->createTemplate($resource_name);
+            $smarty->caching = $_save_stat;
+            if (!$tpl->source->handler->uncompiled && !$tpl->source->handler->recompiled && $tpl->source->exists) {
+                $_resource_part_1 = basename(str_replace('^', DIRECTORY_SEPARATOR, $tpl->compiled->filepath));
+                $_resource_part_1_length = strlen($_resource_part_1);
+            } else {
+                return 0;
+            }
+            $_resource_part_2 = str_replace('.php', '.cache.php', $_resource_part_1);
+            $_resource_part_2_length = strlen($_resource_part_2);
+        }
+        $_dir = $_compile_dir;
+        if ($smarty->use_sub_dirs && isset($_compile_id)) {
+            $_dir .= $_compile_id . $_dir_sep;
+        }
+        if (isset($_compile_id)) {
+            $_compile_id_part = $_compile_dir . $_compile_id . $_dir_sep;
+            $_compile_id_part_length = strlen($_compile_id_part);
+        }
+        $_count = 0;
+        try {
+            $_compileDirs = new RecursiveDirectoryIterator($_dir);
+            // NOTE: UnexpectedValueException thrown for PHP >= 5.3
+        } catch (Exception $e) {
+            return 0;
+        }
+        $_compile = new RecursiveIteratorIterator($_compileDirs, RecursiveIteratorIterator::CHILD_FIRST);
+        foreach ($_compile as $_file) {
+            if (substr(basename($_file->getPathname()), 0, 1) === '.') {
+                continue;
+            }
+            $_filepath = (string)$_file;
+            if ($_file->isDir()) {
+                if (!$_compile->isDot()) {
+                    // delete folder if empty
+                    @rmdir($_file->getPathname());
+                }
+            } else {
+                // delete only php files
+                if (substr($_filepath, -4) !== '.php') {
+                    continue;
+                }
+                $unlink = false;
+                if ((!isset($_compile_id) ||
+                     (isset($_filepath[ $_compile_id_part_length ]) &&
+                      $a = !strncmp($_filepath, $_compile_id_part, $_compile_id_part_length)))
+                    && (!isset($resource_name) || (isset($_filepath[ $_resource_part_1_length ])
+                                                   && substr_compare(
+                                                          $_filepath,
+                                                          $_resource_part_1,
+                                                          -$_resource_part_1_length,
+                                                          $_resource_part_1_length
+                                                      ) === 0) || (isset($_filepath[ $_resource_part_2_length ])
+                                                                   && substr_compare(
+                                                                          $_filepath,
+                                                                          $_resource_part_2,
+                                                                          -$_resource_part_2_length,
+                                                                          $_resource_part_2_length
+                                                                      ) === 0))
+                ) {
+                    if (isset($exp_time)) {
+                        if (is_file($_filepath) && time() - filemtime($_filepath) >= $exp_time) {
+                            $unlink = true;
+                        }
+                    } else {
+                        $unlink = true;
+                    }
+                }
+                if ($unlink && is_file($_filepath) && @unlink($_filepath)) {
+                    $_count++;
+                    if (function_exists('opcache_invalidate')
+                        && (!function_exists('ini_get') || strlen(ini_get('opcache.restrict_api')) < 1)
+                    ) {
+                        opcache_invalidate($_filepath, true);
+                    } elseif (function_exists('apc_delete_file')) {
+                        apc_delete_file($_filepath);
+                    }
+                }
+            }
+        }
+        return $_count;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_clearconfig.php b/sysplugins/smarty_internal_method_clearconfig.php
new file mode 100644
index 0000000000000000000000000000000000000000..15bf492a168924a8642616db6623cad48b6c6d0f
--- /dev/null
+++ b/sysplugins/smarty_internal_method_clearconfig.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * Smarty Method ClearConfig
+ *
+ * Smarty::clearConfig() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_ClearConfig
+{
+    /**
+     * Valid for all objects
+     *
+     * @var int
+     */
+    public $objMap = 7;
+
+    /**
+     * clear a single or all config variables
+     *
+     * @api  Smarty::clearConfig()
+     * @link http://www.smarty.net/docs/en/api.clear.config.tpl
+     *
+     * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data
+     * @param string|null                                             $name variable name or null
+     *
+     * @return \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty
+     */
+    public function clearConfig(Smarty_Internal_Data $data, $name = null)
+    {
+        if (isset($name)) {
+            unset($data->config_vars[ $name ]);
+        } else {
+            $data->config_vars = array();
+        }
+        return $data;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_compileallconfig.php b/sysplugins/smarty_internal_method_compileallconfig.php
new file mode 100644
index 0000000000000000000000000000000000000000..3934ca042cbe3ebd998028b8d893c555ede4fbcd
--- /dev/null
+++ b/sysplugins/smarty_internal_method_compileallconfig.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * Smarty Method CompileAllConfig
+ *
+ * Smarty::compileAllConfig() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_CompileAllConfig extends Smarty_Internal_Method_CompileAllTemplates
+{
+    /**
+     * Compile all config files
+     *
+     * @api Smarty::compileAllConfig()
+     *
+     * @param \Smarty $smarty        passed smarty object
+     * @param string  $extension     file extension
+     * @param bool    $force_compile force all to recompile
+     * @param int     $time_limit
+     * @param int     $max_errors
+     *
+     * @return int number of template files recompiled
+     */
+    public function compileAllConfig(
+        Smarty $smarty,
+        $extension = '.conf',
+        $force_compile = false,
+        $time_limit = 0,
+        $max_errors = null
+    ) {
+        return $this->compileAll($smarty, $extension, $force_compile, $time_limit, $max_errors, true);
+    }
+}
diff --git a/sysplugins/smarty_internal_method_compilealltemplates.php b/sysplugins/smarty_internal_method_compilealltemplates.php
new file mode 100644
index 0000000000000000000000000000000000000000..5c046da4079667f29bb2683a25155beab02be865
--- /dev/null
+++ b/sysplugins/smarty_internal_method_compilealltemplates.php
@@ -0,0 +1,130 @@
+<?php
+
+/**
+ * Smarty Method CompileAllTemplates
+ *
+ * Smarty::compileAllTemplates() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_CompileAllTemplates
+{
+    /**
+     * Valid for Smarty object
+     *
+     * @var int
+     */
+    public $objMap = 1;
+
+    /**
+     * Compile all template files
+     *
+     * @api Smarty::compileAllTemplates()
+     *
+     * @param \Smarty $smarty        passed smarty object
+     * @param string  $extension     file extension
+     * @param bool    $force_compile force all to recompile
+     * @param int     $time_limit
+     * @param int     $max_errors
+     *
+     * @return integer number of template files recompiled
+     */
+    public function compileAllTemplates(
+        Smarty $smarty,
+        $extension = '.tpl',
+        $force_compile = false,
+        $time_limit = 0,
+        $max_errors = null
+    ) {
+        return $this->compileAll($smarty, $extension, $force_compile, $time_limit, $max_errors);
+    }
+
+    /**
+     * Compile all template or config files
+     *
+     * @param \Smarty $smarty
+     * @param string  $extension     template file name extension
+     * @param bool    $force_compile force all to recompile
+     * @param int     $time_limit    set maximum execution time
+     * @param int     $max_errors    set maximum allowed errors
+     * @param bool    $isConfig      flag true if called for config files
+     *
+     * @return int number of template files compiled
+     */
+    protected function compileAll(
+        Smarty $smarty,
+        $extension,
+        $force_compile,
+        $time_limit,
+        $max_errors,
+        $isConfig = false
+    ) {
+        // switch off time limit
+        if (function_exists('set_time_limit')) {
+            @set_time_limit($time_limit);
+        }
+        $_count = 0;
+        $_error_count = 0;
+        $sourceDir = $isConfig ? $smarty->getConfigDir() : $smarty->getTemplateDir();
+        // loop over array of source directories
+        foreach ($sourceDir as $_dir) {
+            $_dir_1 = new RecursiveDirectoryIterator(
+                $_dir,
+                defined('FilesystemIterator::FOLLOW_SYMLINKS') ?
+                    FilesystemIterator::FOLLOW_SYMLINKS : 0
+            );
+            $_dir_2 = new RecursiveIteratorIterator($_dir_1);
+            foreach ($_dir_2 as $_fileinfo) {
+                $_file = $_fileinfo->getFilename();
+                if (substr(basename($_fileinfo->getPathname()), 0, 1) === '.' || strpos($_file, '.svn') !== false) {
+                    continue;
+                }
+                if (substr_compare($_file, $extension, -strlen($extension)) !== 0) {
+                    continue;
+                }
+                if ($_fileinfo->getPath() !== substr($_dir, 0, -1)) {
+                    $_file = substr($_fileinfo->getPath(), strlen($_dir)) . DIRECTORY_SEPARATOR . $_file;
+                }
+                echo "\n<br>", $_dir, '---', $_file;
+                flush();
+                $_start_time = microtime(true);
+                $_smarty = clone $smarty;
+                //
+                $_smarty->_cache = array();
+                $_smarty->ext = new Smarty_Internal_Extension_Handler();
+                $_smarty->ext->objType = $_smarty->_objType;
+                $_smarty->force_compile = $force_compile;
+                try {
+                    /* @var Smarty_Internal_Template $_tpl */
+                    $_tpl = new $smarty->template_class($_file, $_smarty);
+                    $_tpl->caching = Smarty::CACHING_OFF;
+                    $_tpl->source =
+                        $isConfig ? Smarty_Template_Config::load($_tpl) : Smarty_Template_Source::load($_tpl);
+                    if ($_tpl->mustCompile()) {
+                        $_tpl->compileTemplateSource();
+                        $_count++;
+                        echo ' compiled in  ', microtime(true) - $_start_time, ' seconds';
+                        flush();
+                    } else {
+                        echo ' is up to date';
+                        flush();
+                    }
+                } catch (Exception $e) {
+                    echo "\n<br>        ------>Error: ", $e->getMessage(), "<br><br>\n";
+                    $_error_count++;
+                }
+                // free memory
+                unset($_tpl);
+                $_smarty->_clearTemplateCache();
+                if ($max_errors !== null && $_error_count === $max_errors) {
+                    echo "\n<br><br>too many errors\n";
+                    exit(1);
+                }
+            }
+        }
+        echo "\n<br>";
+        return $_count;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_configload.php b/sysplugins/smarty_internal_method_configload.php
new file mode 100644
index 0000000000000000000000000000000000000000..2e6254880944b004b3620e97733f3c2eb8ed639d
--- /dev/null
+++ b/sysplugins/smarty_internal_method_configload.php
@@ -0,0 +1,182 @@
+<?php
+
+/**
+ * Smarty Method ConfigLoad
+ *
+ * Smarty::configLoad() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_ConfigLoad
+{
+    /**
+     * Valid for all objects
+     *
+     * @var int
+     */
+    public $objMap = 7;
+
+    /**
+     * load a config file, optionally load just selected sections
+     *
+     * @api  Smarty::configLoad()
+     * @link http://www.smarty.net/docs/en/api.config.load.tpl
+     *
+     * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data
+     * @param string                                                  $config_file filename
+     * @param mixed                                                   $sections    array of section names, single
+     *                                                                             section or null
+     *
+     * @return \Smarty|\Smarty_Internal_Data|\Smarty_Internal_Template
+     * @throws \Exception
+     */
+    public function configLoad(Smarty_Internal_Data $data, $config_file, $sections = null)
+    {
+        $this->_loadConfigFile($data, $config_file, $sections, null);
+        return $data;
+    }
+
+    /**
+     * load a config file, optionally load just selected sections
+     *
+     * @api  Smarty::configLoad()
+     * @link http://www.smarty.net/docs/en/api.config.load.tpl
+     *
+     * @param \Smarty|\Smarty_Internal_Data|\Smarty_Internal_Template $data
+     * @param string                                                  $config_file filename
+     * @param mixed                                                   $sections    array of section names, single
+     *                                                                             section or null
+     * @param int                                                     $scope       scope into which config variables
+     *                                                                             shall be loaded
+     *
+     * @throws \Exception
+     */
+    public function _loadConfigFile(Smarty_Internal_Data $data, $config_file, $sections = null, $scope = 0)
+    {
+        /* @var \Smarty $smarty */
+        $smarty = $data->_getSmartyObj();
+        /* @var \Smarty_Internal_Template $confObj */
+        $confObj = new Smarty_Internal_Template($config_file, $smarty, $data, null, null, null, null, true);
+        $confObj->caching = Smarty::CACHING_OFF;
+        $confObj->source->config_sections = $sections;
+        $confObj->source->scope = $scope;
+        $confObj->compiled = Smarty_Template_Compiled::load($confObj);
+        $confObj->compiled->render($confObj);
+        if ($data->_isTplObj()) {
+            $data->compiled->file_dependency[ $confObj->source->uid ] =
+                array($confObj->source->filepath, $confObj->source->getTimeStamp(), $confObj->source->type);
+        }
+    }
+
+    /**
+     * load config variables into template object
+     *
+     * @param \Smarty_Internal_Template $tpl
+     * @param array                     $new_config_vars
+     */
+    public function _loadConfigVars(Smarty_Internal_Template $tpl, $new_config_vars)
+    {
+        $this->_assignConfigVars($tpl->parent->config_vars, $tpl, $new_config_vars);
+        $tagScope = $tpl->source->scope;
+        if ($tagScope >= 0) {
+            if ($tagScope === Smarty::SCOPE_LOCAL) {
+                $this->_updateVarStack($tpl, $new_config_vars);
+                $tagScope = 0;
+                if (!$tpl->scope) {
+                    return;
+                }
+            }
+            if ($tpl->parent->_isTplObj() && ($tagScope || $tpl->parent->scope)) {
+                $mergedScope = $tagScope | $tpl->scope;
+                if ($mergedScope) {
+                    // update scopes
+                    /* @var \Smarty_Internal_Template|\Smarty|\Smarty_Internal_Data $ptr */
+                    foreach ($tpl->smarty->ext->_updateScope->_getAffectedScopes($tpl->parent, $mergedScope) as $ptr) {
+                        $this->_assignConfigVars($ptr->config_vars, $tpl, $new_config_vars);
+                        if ($tagScope && $ptr->_isTplObj() && isset($tpl->_cache[ 'varStack' ])) {
+                            $this->_updateVarStack($tpl, $new_config_vars);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Assign all config variables in given scope
+     *
+     * @param array                     $config_vars     config variables in scope
+     * @param \Smarty_Internal_Template $tpl
+     * @param array                     $new_config_vars loaded config variables
+     */
+    public function _assignConfigVars(&$config_vars, Smarty_Internal_Template $tpl, $new_config_vars)
+    {
+        // copy global config vars
+        foreach ($new_config_vars[ 'vars' ] as $variable => $value) {
+            if ($tpl->smarty->config_overwrite || !isset($config_vars[ $variable ])) {
+                $config_vars[ $variable ] = $value;
+            } else {
+                $config_vars[ $variable ] = array_merge((array)$config_vars[ $variable ], (array)$value);
+            }
+        }
+        // scan sections
+        $sections = $tpl->source->config_sections;
+        if (!empty($sections)) {
+            foreach ((array)$sections as $tpl_section) {
+                if (isset($new_config_vars[ 'sections' ][ $tpl_section ])) {
+                    foreach ($new_config_vars[ 'sections' ][ $tpl_section ][ 'vars' ] as $variable => $value) {
+                        if ($tpl->smarty->config_overwrite || !isset($config_vars[ $variable ])) {
+                            $config_vars[ $variable ] = $value;
+                        } else {
+                            $config_vars[ $variable ] = array_merge((array)$config_vars[ $variable ], (array)$value);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Update config variables in template local variable stack
+     *
+     * @param \Smarty_Internal_Template $tpl
+     * @param array                     $config_vars
+     */
+    public function _updateVarStack(Smarty_Internal_Template $tpl, $config_vars)
+    {
+        $i = 0;
+        while (isset($tpl->_cache[ 'varStack' ][ $i ])) {
+            $this->_assignConfigVars($tpl->_cache[ 'varStack' ][ $i ][ 'config' ], $tpl, $config_vars);
+            $i++;
+        }
+    }
+
+    /**
+     * gets  a config variable value
+     *
+     * @param \Smarty|\Smarty_Internal_Data|\Smarty_Internal_Template $data
+     * @param string                                                  $varName the name of the config variable
+     * @param bool                                                    $errorEnable
+     *
+     * @return null|string  the value of the config variable
+     */
+    public function _getConfigVariable(Smarty_Internal_Data $data, $varName, $errorEnable = true)
+    {
+        $_ptr = $data;
+        while ($_ptr !== null) {
+            if (isset($_ptr->config_vars[ $varName ])) {
+                // found it, return it
+                return $_ptr->config_vars[ $varName ];
+            }
+            // not found, try at parent
+            $_ptr = $_ptr->parent;
+        }
+        if ($data->smarty->error_unassigned && $errorEnable) {
+            // force a notice
+            $x = $$varName;
+        }
+        return null;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_createdata.php b/sysplugins/smarty_internal_method_createdata.php
new file mode 100644
index 0000000000000000000000000000000000000000..f95097519c7a13700da9660255eaaa69f5dd5f00
--- /dev/null
+++ b/sysplugins/smarty_internal_method_createdata.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * Smarty Method CreateData
+ *
+ * Smarty::createData() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_CreateData
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * creates a data object
+     *
+     * @api  Smarty::createData()
+     * @link http://www.smarty.net/docs/en/api.create.data.tpl
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty      $obj
+     * @param \Smarty_Internal_Template|\Smarty_Internal_Data|\Smarty_Data|\Smarty $parent next higher level of Smarty
+     *                                                                                     variables
+     * @param string                                                               $name   optional data block name
+     *
+     * @return \Smarty_Data data object
+     */
+    public function createData(Smarty_Internal_TemplateBase $obj, Smarty_Internal_Data $parent = null, $name = null)
+    {
+        /* @var Smarty $smarty */
+        $smarty = $obj->_getSmartyObj();
+        $dataObj = new Smarty_Data($parent, $smarty, $name);
+        if ($smarty->debugging) {
+            Smarty_Internal_Debug::register_data($dataObj);
+        }
+        return $dataObj;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_getautoloadfilters.php b/sysplugins/smarty_internal_method_getautoloadfilters.php
new file mode 100644
index 0000000000000000000000000000000000000000..4145db10b26705f5d215fe7847d3cc80864e0fdc
--- /dev/null
+++ b/sysplugins/smarty_internal_method_getautoloadfilters.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * Smarty Method GetAutoloadFilters
+ *
+ * Smarty::getAutoloadFilters() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_GetAutoloadFilters extends Smarty_Internal_Method_SetAutoloadFilters
+{
+    /**
+     * Get autoload filters
+     *
+     * @api Smarty::getAutoloadFilters()
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param string                                                          $type type of filter to get auto loads
+     *                                                                              for. Defaults to all autoload
+     *                                                                              filters
+     *
+     * @return array array( 'type1' => array( 'filter1', 'filter2', … ) ) or array( 'filter1', 'filter2', …) if $type
+     *                was specified
+     * @throws \SmartyException
+     */
+    public function getAutoloadFilters(Smarty_Internal_TemplateBase $obj, $type = null)
+    {
+        $smarty = $obj->_getSmartyObj();
+        if ($type !== null) {
+            $this->_checkFilterType($type);
+            return isset($smarty->autoload_filters[ $type ]) ? $smarty->autoload_filters[ $type ] : array();
+        }
+        return $smarty->autoload_filters;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_getconfigvariable.php b/sysplugins/smarty_internal_method_getconfigvariable.php
new file mode 100644
index 0000000000000000000000000000000000000000..b54815123f10dd687a806fb64661976fe9aff278
--- /dev/null
+++ b/sysplugins/smarty_internal_method_getconfigvariable.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * Smarty Method GetConfigVariable
+ *
+ * Smarty::getConfigVariable() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_GetConfigVariable
+{
+    /**
+     * Valid for all objects
+     *
+     * @var int
+     */
+    public $objMap = 7;
+
+    /**
+     * gets  a config variable value
+     *
+     * @param \Smarty|\Smarty_Internal_Data|\Smarty_Internal_Template $data
+     * @param string                                                  $varName the name of the config variable
+     * @param bool                                                    $errorEnable
+     *
+     * @return null|string  the value of the config variable
+     */
+    public function getConfigVariable(Smarty_Internal_Data $data, $varName = null, $errorEnable = true)
+    {
+        return $data->ext->configLoad->_getConfigVariable($data, $varName, $errorEnable);
+    }
+}
diff --git a/sysplugins/smarty_internal_method_getconfigvars.php b/sysplugins/smarty_internal_method_getconfigvars.php
new file mode 100644
index 0000000000000000000000000000000000000000..1d11e44c16f3090002eb47afee932427e4d5badd
--- /dev/null
+++ b/sysplugins/smarty_internal_method_getconfigvars.php
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * Smarty Method GetConfigVars
+ *
+ * Smarty::getConfigVars() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_GetConfigVars
+{
+    /**
+     * Valid for all objects
+     *
+     * @var int
+     */
+    public $objMap = 7;
+
+    /**
+     * Returns a single or all config variables
+     *
+     * @api  Smarty::getConfigVars()
+     * @link http://www.smarty.net/docs/en/api.get.config.vars.tpl
+     *
+     * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data
+     * @param string                                                  $varname        variable name or null
+     * @param bool                                                    $search_parents include parent templates?
+     *
+     * @return mixed variable value or or array of variables
+     */
+    public function getConfigVars(Smarty_Internal_Data $data, $varname = null, $search_parents = true)
+    {
+        $_ptr = $data;
+        $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;
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_method_getdebugtemplate.php b/sysplugins/smarty_internal_method_getdebugtemplate.php
new file mode 100644
index 0000000000000000000000000000000000000000..77d908c15bba3b10c4c6413ba506fbe9a0fa5641
--- /dev/null
+++ b/sysplugins/smarty_internal_method_getdebugtemplate.php
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * Smarty Method GetDebugTemplate
+ *
+ * Smarty::getDebugTemplate() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_GetDebugTemplate
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * return name of debugging template
+     *
+     * @api Smarty::getDebugTemplate()
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     *
+     * @return string
+     */
+    public function getDebugTemplate(Smarty_Internal_TemplateBase $obj)
+    {
+        $smarty = $obj->_getSmartyObj();
+        return $smarty->debug_tpl;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_getdefaultmodifiers.php b/sysplugins/smarty_internal_method_getdefaultmodifiers.php
new file mode 100644
index 0000000000000000000000000000000000000000..57da85c497826948bcd346647c2b2aa1c3b0f2a5
--- /dev/null
+++ b/sysplugins/smarty_internal_method_getdefaultmodifiers.php
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * Smarty Method GetDefaultModifiers
+ *
+ * Smarty::getDefaultModifiers() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_GetDefaultModifiers
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * Get default modifiers
+     *
+     * @api Smarty::getDefaultModifiers()
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     *
+     * @return array list of default modifiers
+     */
+    public function getDefaultModifiers(Smarty_Internal_TemplateBase $obj)
+    {
+        $smarty = $obj->_getSmartyObj();
+        return $smarty->default_modifiers;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_getglobal.php b/sysplugins/smarty_internal_method_getglobal.php
new file mode 100644
index 0000000000000000000000000000000000000000..2be11d7e878959551391020855790488b00484db
--- /dev/null
+++ b/sysplugins/smarty_internal_method_getglobal.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * Smarty Method GetGlobal
+ *
+ * Smarty::getGlobal() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_GetGlobal
+{
+    /**
+     * Valid for all objects
+     *
+     * @var int
+     */
+    public $objMap = 7;
+
+    /**
+     * Returns a single or all global  variables
+     *
+     * @api Smarty::getGlobal()
+     *
+     * @param \Smarty_Internal_Data $data
+     * @param string                $varName variable name or null
+     *
+     * @return string|array variable value or or array of variables
+     */
+    public function getGlobal(Smarty_Internal_Data $data, $varName = null)
+    {
+        if (isset($varName)) {
+            if (isset(Smarty::$global_tpl_vars[ $varName ])) {
+                return Smarty::$global_tpl_vars[ $varName ]->value;
+            } else {
+                return '';
+            }
+        } else {
+            $_result = array();
+            foreach (Smarty::$global_tpl_vars as $key => $var) {
+                $_result[ $key ] = $var->value;
+            }
+            return $_result;
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_method_getregisteredobject.php b/sysplugins/smarty_internal_method_getregisteredobject.php
new file mode 100644
index 0000000000000000000000000000000000000000..df6ede13078c9a5676c73499fc63932a31ee575f
--- /dev/null
+++ b/sysplugins/smarty_internal_method_getregisteredobject.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * Smarty Method GetRegisteredObject
+ *
+ * Smarty::getRegisteredObject() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_GetRegisteredObject
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * return a reference to a registered object
+     *
+     * @api  Smarty::getRegisteredObject()
+     * @link http://www.smarty.net/docs/en/api.get.registered.object.tpl
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param string                                                          $object_name object name
+     *
+     * @return object
+     * @throws \SmartyException if no such object is found
+     */
+    public function getRegisteredObject(Smarty_Internal_TemplateBase $obj, $object_name)
+    {
+        $smarty = $obj->_getSmartyObj();
+        if (!isset($smarty->registered_objects[ $object_name ])) {
+            throw new SmartyException("'$object_name' is not a registered object");
+        }
+        if (!is_object($smarty->registered_objects[ $object_name ][ 0 ])) {
+            throw new SmartyException("registered '$object_name' is not an object");
+        }
+        return $smarty->registered_objects[ $object_name ][ 0 ];
+    }
+}
diff --git a/sysplugins/smarty_internal_method_getstreamvariable.php b/sysplugins/smarty_internal_method_getstreamvariable.php
new file mode 100644
index 0000000000000000000000000000000000000000..8db39c525ca61da05f742c5325e1602974754720
--- /dev/null
+++ b/sysplugins/smarty_internal_method_getstreamvariable.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * Smarty Method GetStreamVariable
+ *
+ * Smarty::getStreamVariable() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_GetStreamVariable
+{
+    /**
+     * Valid for all objects
+     *
+     * @var int
+     */
+    public $objMap = 7;
+
+    /**
+     * gets  a stream variable
+     *
+     * @api Smarty::getStreamVariable()
+     *
+     * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data
+     * @param string                                                  $variable the stream of the variable
+     *
+     * @return mixed
+     * @throws \SmartyException
+     */
+    public function getStreamVariable(Smarty_Internal_Data $data, $variable)
+    {
+        $_result = '';
+        $fp = fopen($variable, 'r+');
+        if ($fp) {
+            while (!feof($fp) && ($current_line = fgets($fp)) !== false) {
+                $_result .= $current_line;
+            }
+            fclose($fp);
+            return $_result;
+        }
+        $smarty = isset($data->smarty) ? $data->smarty : $data;
+        if ($smarty->error_unassigned) {
+            throw new SmartyException('Undefined stream variable "' . $variable . '"');
+        } else {
+            return null;
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_method_gettags.php b/sysplugins/smarty_internal_method_gettags.php
new file mode 100644
index 0000000000000000000000000000000000000000..c07ae07ec76d096f4db809b176ffdea6f6957d38
--- /dev/null
+++ b/sysplugins/smarty_internal_method_gettags.php
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * Smarty Method GetTags
+ *
+ * Smarty::getTags() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_GetTags
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * Return array of tag/attributes of all tags used by an template
+     *
+     * @api  Smarty::getTags()
+     * @link http://www.smarty.net/docs/en/api.get.tags.tpl
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param null|string|Smarty_Internal_Template                            $template
+     *
+     * @return array of tag/attributes
+     * @throws \Exception
+     * @throws \SmartyException
+     */
+    public function getTags(Smarty_Internal_TemplateBase $obj, $template = null)
+    {
+        /* @var Smarty $smarty */
+        $smarty = $obj->_getSmartyObj();
+        if ($obj->_isTplObj() && !isset($template)) {
+            $tpl = clone $obj;
+        } elseif (isset($template) && $template->_isTplObj()) {
+            $tpl = clone $template;
+        } elseif (isset($template) && is_string($template)) {
+            /* @var Smarty_Internal_Template $tpl */
+            $tpl = new $smarty->template_class($template, $smarty);
+            // checks if template exists
+            if (!$tpl->source->exists) {
+                throw new SmartyException("Unable to load template {$tpl->source->type} '{$tpl->source->name}'");
+            }
+        }
+        if (isset($tpl)) {
+            $tpl->smarty = clone $tpl->smarty;
+            $tpl->smarty->_cache[ 'get_used_tags' ] = true;
+            $tpl->_cache[ 'used_tags' ] = array();
+            $tpl->smarty->merge_compiled_includes = false;
+            $tpl->smarty->disableSecurity();
+            $tpl->caching = Smarty::CACHING_OFF;
+            $tpl->loadCompiler();
+            $tpl->compiler->compileTemplate($tpl);
+            return $tpl->_cache[ 'used_tags' ];
+        }
+        throw new SmartyException('Missing template specification');
+    }
+}
diff --git a/sysplugins/smarty_internal_method_gettemplatevars.php b/sysplugins/smarty_internal_method_gettemplatevars.php
new file mode 100644
index 0000000000000000000000000000000000000000..9ef7d46bb7cd1cb0dd2744f17e1c807238c2d6ac
--- /dev/null
+++ b/sysplugins/smarty_internal_method_gettemplatevars.php
@@ -0,0 +1,119 @@
+<?php
+
+/**
+ * Smarty Method GetTemplateVars
+ *
+ * Smarty::getTemplateVars() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_GetTemplateVars
+{
+    /**
+     * Valid for all objects
+     *
+     * @var int
+     */
+    public $objMap = 7;
+
+    /**
+     * Returns a single or all template variables
+     *
+     * @api  Smarty::getTemplateVars()
+     * @link http://www.smarty.net/docs/en/api.get.template.vars.tpl
+     *
+     * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data
+     * @param string                                                  $varName       variable name or null
+     * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $_ptr          optional pointer to data object
+     * @param bool                                                    $searchParents include parent templates?
+     *
+     * @return mixed variable value or or array of variables
+     */
+    public function getTemplateVars(
+        Smarty_Internal_Data $data,
+        $varName = null,
+        Smarty_Internal_Data $_ptr = null,
+        $searchParents = true
+    ) {
+        if (isset($varName)) {
+            $_var = $this->_getVariable($data, $varName, $_ptr, $searchParents, false);
+            if (is_object($_var)) {
+                return $_var->value;
+            } else {
+                return null;
+            }
+        } else {
+            $_result = array();
+            if ($_ptr === null) {
+                $_ptr = $data;
+            }
+            while ($_ptr !== null) {
+                foreach ($_ptr->tpl_vars as $key => $var) {
+                    if (!array_key_exists($key, $_result)) {
+                        $_result[ $key ] = $var->value;
+                    }
+                }
+                // not found, try at parent
+                if ($searchParents && isset($_ptr->parent)) {
+                    $_ptr = $_ptr->parent;
+                } else {
+                    $_ptr = null;
+                }
+            }
+            if ($searchParents && isset(Smarty::$global_tpl_vars)) {
+                foreach (Smarty::$global_tpl_vars as $key => $var) {
+                    if (!array_key_exists($key, $_result)) {
+                        $_result[ $key ] = $var->value;
+                    }
+                }
+            }
+            return $_result;
+        }
+    }
+
+    /**
+     * gets the object of a Smarty variable
+     *
+     * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data
+     * @param string                                                  $varName       the name of the Smarty variable
+     * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $_ptr          optional pointer to data object
+     * @param bool                                                    $searchParents search also in parent data
+     * @param bool                                                    $errorEnable
+     *
+     * @return \Smarty_Variable
+     */
+    public function _getVariable(
+        Smarty_Internal_Data $data,
+        $varName,
+        Smarty_Internal_Data $_ptr = null,
+        $searchParents = true,
+        $errorEnable = true
+    ) {
+        if ($_ptr === null) {
+            $_ptr = $data;
+        }
+        while ($_ptr !== null) {
+            if (isset($_ptr->tpl_vars[ $varName ])) {
+                // found it, return it
+                return $_ptr->tpl_vars[ $varName ];
+            }
+            // not found, try at parent
+            if ($searchParents && isset($_ptr->parent)) {
+                $_ptr = $_ptr->parent;
+            } else {
+                $_ptr = null;
+            }
+        }
+        if (isset(Smarty::$global_tpl_vars[ $varName ])) {
+            // found it, return it
+            return Smarty::$global_tpl_vars[ $varName ];
+        }
+        if ($errorEnable && $data->_getSmartyObj()->error_unassigned) {
+            // force a notice
+            $x = $$varName;
+        }
+        return new Smarty_Undefined_Variable;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_literals.php b/sysplugins/smarty_internal_method_literals.php
new file mode 100644
index 0000000000000000000000000000000000000000..bfa3f58ecf7b641d1183731889f8f279baae0d79
--- /dev/null
+++ b/sysplugins/smarty_internal_method_literals.php
@@ -0,0 +1,100 @@
+<?php
+
+/**
+ * Smarty Method GetLiterals
+ *
+ * Smarty::getLiterals() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_Literals
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * Get literals
+     *
+     * @api Smarty::getLiterals()
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     *
+     * @return array list of literals
+     */
+    public function getLiterals(Smarty_Internal_TemplateBase $obj)
+    {
+        $smarty = $obj->_getSmartyObj();
+        return (array)$smarty->literals;
+    }
+
+    /**
+     * Add literals
+     *
+     * @api Smarty::addLiterals()
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param array|string                                                    $literals literal or list of literals
+     *                                                                                  to addto add
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     * @throws \SmartyException
+     */
+    public function addLiterals(Smarty_Internal_TemplateBase $obj, $literals = null)
+    {
+        if (isset($literals)) {
+            $this->set($obj->_getSmartyObj(), (array)$literals);
+        }
+        return $obj;
+    }
+
+    /**
+     * Set literals
+     *
+     * @api Smarty::setLiterals()
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param array|string                                                    $literals literal or list of literals
+     *                                                                                  to setto set
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     * @throws \SmartyException
+     */
+    public function setLiterals(Smarty_Internal_TemplateBase $obj, $literals = null)
+    {
+        $smarty = $obj->_getSmartyObj();
+        $smarty->literals = array();
+        if (!empty($literals)) {
+            $this->set($smarty, (array)$literals);
+        }
+        return $obj;
+    }
+
+    /**
+     * common setter for literals for easier handling of duplicates the
+     * Smarty::$literals array gets filled with identical key values
+     *
+     * @param \Smarty $smarty
+     * @param array   $literals
+     *
+     * @throws \SmartyException
+     */
+    private function set(Smarty $smarty, $literals)
+    {
+        $literals = array_combine($literals, $literals);
+        $error = isset($literals[ $smarty->left_delimiter ]) ? array($smarty->left_delimiter) : array();
+        $error = isset($literals[ $smarty->right_delimiter ]) ? $error[] = $smarty->right_delimiter : $error;
+        if (!empty($error)) {
+            throw new SmartyException(
+                'User defined literal(s) "' . $error .
+                '" may not be identical with left or right delimiter'
+            );
+        }
+        $smarty->literals = array_merge((array)$smarty->literals, (array)$literals);
+    }
+}
diff --git a/sysplugins/smarty_internal_method_loadfilter.php b/sysplugins/smarty_internal_method_loadfilter.php
new file mode 100644
index 0000000000000000000000000000000000000000..66d80d474b486b44f31517b2cfeea672e809575a
--- /dev/null
+++ b/sysplugins/smarty_internal_method_loadfilter.php
@@ -0,0 +1,77 @@
+<?php
+
+/**
+ * Smarty Method LoadFilter
+ *
+ * Smarty::loadFilter() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_LoadFilter
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * Valid filter types
+     *
+     * @var array
+     */
+    private $filterTypes = array('pre' => true, 'post' => true, 'output' => true, 'variable' => true);
+
+    /**
+     * load a filter of specified type and name
+     *
+     * @api  Smarty::loadFilter()
+     *
+     * @link http://www.smarty.net/docs/en/api.load.filter.tpl
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param string                                                          $type filter type
+     * @param string                                                          $name filter name
+     *
+     * @return bool
+     * @throws SmartyException if filter could not be loaded
+     */
+    public function loadFilter(Smarty_Internal_TemplateBase $obj, $type, $name)
+    {
+        $smarty = $obj->_getSmartyObj();
+        $this->_checkFilterType($type);
+        $_plugin = "smarty_{$type}filter_{$name}";
+        $_filter_name = $_plugin;
+        if (is_callable($_plugin)) {
+            $smarty->registered_filters[ $type ][ $_filter_name ] = $_plugin;
+            return true;
+        }
+        if ($smarty->loadPlugin($_plugin)) {
+            if (class_exists($_plugin, false)) {
+                $_plugin = array($_plugin, 'execute');
+            }
+            if (is_callable($_plugin)) {
+                $smarty->registered_filters[ $type ][ $_filter_name ] = $_plugin;
+                return true;
+            }
+        }
+        throw new SmartyException("{$type}filter '{$name}' not found or callable");
+    }
+
+    /**
+     * Check if filter type is valid
+     *
+     * @param string $type
+     *
+     * @throws \SmartyException
+     */
+    public function _checkFilterType($type)
+    {
+        if (!isset($this->filterTypes[ $type ])) {
+            throw new SmartyException("Illegal filter type '{$type}'");
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_method_loadplugin.php b/sysplugins/smarty_internal_method_loadplugin.php
new file mode 100644
index 0000000000000000000000000000000000000000..3bd659cb862b01e855cb964ab88411fc0fa3cd06
--- /dev/null
+++ b/sysplugins/smarty_internal_method_loadplugin.php
@@ -0,0 +1,111 @@
+<?php
+
+/**
+ * Smarty Extension Loadplugin
+ *
+ * $smarty->loadPlugin() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_LoadPlugin
+{
+    /**
+     * Cache of searched plugin files
+     *
+     * @var array
+     */
+    public $plugin_files = array();
+
+    /**
+     * Takes unknown classes and loads plugin files for them
+     * class name format: Smarty_PluginType_PluginName
+     * plugin filename format: plugintype.pluginname.php
+     *
+     * @param \Smarty $smarty
+     * @param string  $plugin_name class plugin name to load
+     * @param bool    $check       check if already loaded
+     *
+     * @return bool|string
+     * @throws \SmartyException
+     */
+    public function loadPlugin(Smarty $smarty, $plugin_name, $check)
+    {
+        // if function or class exists, exit silently (already loaded)
+        if ($check && (is_callable($plugin_name) || class_exists($plugin_name, false))) {
+            return true;
+        }
+        if (!preg_match('#^smarty_((internal)|([^_]+))_(.+)$#i', $plugin_name, $match)) {
+            throw new SmartyException("plugin {$plugin_name} is not a valid name format");
+        }
+        if (!empty($match[ 2 ])) {
+            $file = SMARTY_SYSPLUGINS_DIR . strtolower($plugin_name) . '.php';
+            if (isset($this->plugin_files[ $file ])) {
+                if ($this->plugin_files[ $file ] !== false) {
+                    return $this->plugin_files[ $file ];
+                } else {
+                    return false;
+                }
+            } else {
+                if (is_file($file)) {
+                    $this->plugin_files[ $file ] = $file;
+                    include_once $file;
+                    return $file;
+                } else {
+                    $this->plugin_files[ $file ] = false;
+                    return false;
+                }
+            }
+        }
+        // plugin filename is expected to be: [type].[name].php
+        $_plugin_filename = "{$match[1]}.{$match[4]}.php";
+        $_lower_filename = strtolower($_plugin_filename);
+        if (isset($this->plugin_files)) {
+            if (isset($this->plugin_files[ 'plugins_dir' ][ $_lower_filename ])) {
+                if (!$smarty->use_include_path || $this->plugin_files[ 'plugins_dir' ][ $_lower_filename ] !== false) {
+                    return $this->plugin_files[ 'plugins_dir' ][ $_lower_filename ];
+                }
+            }
+            if (!$smarty->use_include_path || $smarty->ext->_getIncludePath->isNewIncludePath($smarty)) {
+                unset($this->plugin_files[ 'include_path' ]);
+            } else {
+                if (isset($this->plugin_files[ 'include_path' ][ $_lower_filename ])) {
+                    return $this->plugin_files[ 'include_path' ][ $_lower_filename ];
+                }
+            }
+        }
+        $_file_names = array($_plugin_filename);
+        if ($_lower_filename !== $_plugin_filename) {
+            $_file_names[] = $_lower_filename;
+        }
+        $_p_dirs = $smarty->getPluginsDir();
+        if (!isset($this->plugin_files[ 'plugins_dir' ][ $_lower_filename ])) {
+            // loop through plugin dirs and find the plugin
+            foreach ($_p_dirs as $_plugin_dir) {
+                foreach ($_file_names as $name) {
+                    $file = $_plugin_dir . $name;
+                    if (is_file($file)) {
+                        $this->plugin_files[ 'plugins_dir' ][ $_lower_filename ] = $file;
+                        include_once $file;
+                        return $file;
+                    }
+                    $this->plugin_files[ 'plugins_dir' ][ $_lower_filename ] = false;
+                }
+            }
+        }
+        if ($smarty->use_include_path) {
+            foreach ($_file_names as $_file_name) {
+                // try PHP include_path
+                $file = $smarty->ext->_getIncludePath->getIncludePath($_p_dirs, $_file_name, $smarty);
+                $this->plugin_files[ 'include_path' ][ $_lower_filename ] = $file;
+                if ($file !== false) {
+                    include_once $file;
+                    return $file;
+                }
+            }
+        }
+        // no plugin loaded
+        return false;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_mustcompile.php b/sysplugins/smarty_internal_method_mustcompile.php
new file mode 100644
index 0000000000000000000000000000000000000000..39318838ee9aa12e63956cd7fa8aec0d42ec28cb
--- /dev/null
+++ b/sysplugins/smarty_internal_method_mustcompile.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * Smarty Method MustCompile
+ *
+ * Smarty_Internal_Template::mustCompile() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_MustCompile
+{
+    /**
+     * Valid for template object
+     *
+     * @var int
+     */
+    public $objMap = 2;
+
+    /**
+     * Returns if the current template must be compiled by the Smarty compiler
+     * It does compare the timestamps of template source and the compiled templates and checks the force compile
+     * configuration
+     *
+     * @param \Smarty_Internal_Template $_template
+     *
+     * @return bool
+     * @throws \SmartyException
+     */
+    public function mustCompile(Smarty_Internal_Template $_template)
+    {
+        if (!$_template->source->exists) {
+            if ($_template->_isSubTpl()) {
+                $parent_resource = " in '$_template->parent->template_resource}'";
+            } else {
+                $parent_resource = '';
+            }
+            throw new SmartyException("Unable to load template {$_template->source->type} '{$_template->source->name}'{$parent_resource}");
+        }
+        if ($_template->mustCompile === null) {
+            $_template->mustCompile = (!$_template->source->handler->uncompiled &&
+                                       ($_template->smarty->force_compile || $_template->source->handler->recompiled ||
+                                        !$_template->compiled->exists || ($_template->compile_check &&
+                                                                          $_template->compiled->getTimeStamp() <
+                                                                          $_template->source->getTimeStamp())));
+        }
+        return $_template->mustCompile;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_registercacheresource.php b/sysplugins/smarty_internal_method_registercacheresource.php
new file mode 100644
index 0000000000000000000000000000000000000000..6483656190d34027209412947328a92218d97380
--- /dev/null
+++ b/sysplugins/smarty_internal_method_registercacheresource.php
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * Smarty Method RegisterCacheResource
+ *
+ * Smarty::registerCacheResource() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_RegisterCacheResource
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * Registers a resource to fetch a template
+     *
+     * @api  Smarty::registerCacheResource()
+     * @link http://www.smarty.net/docs/en/api.register.cacheresource.tpl
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param string                                                          $name name of resource type
+     * @param \Smarty_CacheResource                                           $resource_handler
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     */
+    public function registerCacheResource(
+        Smarty_Internal_TemplateBase $obj,
+        $name,
+        Smarty_CacheResource $resource_handler
+    ) {
+        $smarty = $obj->_getSmartyObj();
+        $smarty->registered_cache_resources[ $name ] = $resource_handler;
+        return $obj;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_registerclass.php b/sysplugins/smarty_internal_method_registerclass.php
new file mode 100644
index 0000000000000000000000000000000000000000..8d18547e2726a22719abd20b05756805d72ade5a
--- /dev/null
+++ b/sysplugins/smarty_internal_method_registerclass.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * Smarty Method RegisterClass
+ *
+ * Smarty::registerClass() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_RegisterClass
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * Registers static classes to be used in templates
+     *
+     * @api  Smarty::registerClass()
+     * @link http://www.smarty.net/docs/en/api.register.class.tpl
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param string                                                          $class_name
+     * @param string                                                          $class_impl the referenced PHP class to
+     *                                                                                    register
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     * @throws \SmartyException
+     */
+    public function registerClass(Smarty_Internal_TemplateBase $obj, $class_name, $class_impl)
+    {
+        $smarty = $obj->_getSmartyObj();
+        // test if exists
+        if (!class_exists($class_impl)) {
+            throw new SmartyException("Undefined class '$class_impl' in register template class");
+        }
+        // register the class
+        $smarty->registered_classes[ $class_name ] = $class_impl;
+        return $obj;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_registerdefaultconfighandler.php b/sysplugins/smarty_internal_method_registerdefaultconfighandler.php
new file mode 100644
index 0000000000000000000000000000000000000000..b340f178de405b9402d9db4e0ff4ae737b212cf2
--- /dev/null
+++ b/sysplugins/smarty_internal_method_registerdefaultconfighandler.php
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * Smarty Method RegisterDefaultConfigHandler
+ *
+ * Smarty::registerDefaultConfigHandler() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_RegisterDefaultConfigHandler
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * Register config default handler
+     *
+     * @api Smarty::registerDefaultConfigHandler()
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param callable                                                        $callback class/method name
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     * @throws SmartyException              if $callback is not callable
+     */
+    public function registerDefaultConfigHandler(Smarty_Internal_TemplateBase $obj, $callback)
+    {
+        $smarty = $obj->_getSmartyObj();
+        if (is_callable($callback)) {
+            $smarty->default_config_handler_func = $callback;
+        } else {
+            throw new SmartyException('Default config handler not callable');
+        }
+        return $obj;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_registerdefaultpluginhandler.php b/sysplugins/smarty_internal_method_registerdefaultpluginhandler.php
new file mode 100644
index 0000000000000000000000000000000000000000..a9fb78dc6f03e021b48b04952aaf7b35d918254a
--- /dev/null
+++ b/sysplugins/smarty_internal_method_registerdefaultpluginhandler.php
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * Smarty Method RegisterDefaultPluginHandler
+ *
+ * Smarty::registerDefaultPluginHandler() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_RegisterDefaultPluginHandler
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * Registers a default plugin handler
+     *
+     * @api  Smarty::registerDefaultPluginHandler()
+     * @link http://www.smarty.net/docs/en/api.register.default.plugin.handler.tpl
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param callable                                                        $callback class/method name
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     * @throws SmartyException              if $callback is not callable
+     */
+    public function registerDefaultPluginHandler(Smarty_Internal_TemplateBase $obj, $callback)
+    {
+        $smarty = $obj->_getSmartyObj();
+        if (is_callable($callback)) {
+            $smarty->default_plugin_handler_func = $callback;
+        } else {
+            throw new SmartyException("Default plugin handler '$callback' not callable");
+        }
+        return $obj;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php b/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php
new file mode 100644
index 0000000000000000000000000000000000000000..cbc133ccd8de087025f6fc56baf3dfe85a7a13c3
--- /dev/null
+++ b/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php
@@ -0,0 +1,88 @@
+<?php
+
+/**
+ * Smarty Method RegisterDefaultTemplateHandler
+ *
+ * Smarty::registerDefaultTemplateHandler() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_RegisterDefaultTemplateHandler
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * Register template default handler
+     *
+     * @api Smarty::registerDefaultTemplateHandler()
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param callable                                                        $callback class/method name
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     * @throws SmartyException              if $callback is not callable
+     */
+    public function registerDefaultTemplateHandler(Smarty_Internal_TemplateBase $obj, $callback)
+    {
+        $smarty = $obj->_getSmartyObj();
+        if (is_callable($callback)) {
+            $smarty->default_template_handler_func = $callback;
+        } else {
+            throw new SmartyException('Default template handler not callable');
+        }
+        return $obj;
+    }
+
+    /**
+     * get default content from template or config resource handler
+     *
+     * @param Smarty_Template_Source $source
+     *
+     * @throws \SmartyException
+     */
+    public static function _getDefaultTemplate(Smarty_Template_Source $source)
+    {
+        if ($source->isConfig) {
+            $default_handler = $source->smarty->default_config_handler_func;
+        } else {
+            $default_handler = $source->smarty->default_template_handler_func;
+        }
+        $_content = $_timestamp = null;
+        $_return = call_user_func_array(
+            $default_handler,
+            array($source->type, $source->name, &$_content, &$_timestamp, $source->smarty)
+        );
+        if (is_string($_return)) {
+            $source->exists = is_file($_return);
+            if ($source->exists) {
+                $source->timestamp = filemtime($_return);
+            } else {
+                throw new SmartyException(
+                    'Default handler: Unable to load ' .
+                    ($source->isConfig ? 'config' : 'template') .
+                    " default file '{$_return}' for '{$source->type}:{$source->name}'"
+                );
+            }
+            $source->name = $source->filepath = $_return;
+            $source->uid = sha1($source->filepath);
+        } elseif ($_return === true) {
+            $source->content = $_content;
+            $source->exists = true;
+            $source->uid = $source->name = sha1($_content);
+            $source->handler = Smarty_Resource::load($source->smarty, 'eval');
+        } else {
+            $source->exists = false;
+            throw new SmartyException(
+                'Default handler: No ' . ($source->isConfig ? 'config' : 'template') .
+                " default content for '{$source->type}:{$source->name}'"
+            );
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_method_registerfilter.php b/sysplugins/smarty_internal_method_registerfilter.php
new file mode 100644
index 0000000000000000000000000000000000000000..c0f9fff10536ea0974df4d5c9cfc384125374295
--- /dev/null
+++ b/sysplugins/smarty_internal_method_registerfilter.php
@@ -0,0 +1,87 @@
+<?php
+
+/**
+ * Smarty Method RegisterFilter
+ *
+ * Smarty::registerFilter() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_RegisterFilter
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * Valid filter types
+     *
+     * @var array
+     */
+    private $filterTypes = array('pre' => true, 'post' => true, 'output' => true, 'variable' => true);
+
+    /**
+     * Registers a filter function
+     *
+     * @api  Smarty::registerFilter()
+     *
+     * @link http://www.smarty.net/docs/en/api.register.filter.tpl
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param string                                                          $type filter type
+     * @param callback                                                        $callback
+     * @param string|null                                                     $name optional filter name
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     * @throws \SmartyException
+     */
+    public function registerFilter(Smarty_Internal_TemplateBase $obj, $type, $callback, $name = null)
+    {
+        $smarty = $obj->_getSmartyObj();
+        $this->_checkFilterType($type);
+        $name = isset($name) ? $name : $this->_getFilterName($callback);
+        if (!is_callable($callback)) {
+            throw new SmartyException("{$type}filter '{$name}' not callable");
+        }
+        $smarty->registered_filters[ $type ][ $name ] = $callback;
+        return $obj;
+    }
+
+    /**
+     * Return internal filter name
+     *
+     * @param callback $function_name
+     *
+     * @return string   internal filter name
+     */
+    public function _getFilterName($function_name)
+    {
+        if (is_array($function_name)) {
+            $_class_name = (is_object($function_name[ 0 ]) ? get_class($function_name[ 0 ]) : $function_name[ 0 ]);
+            return $_class_name . '_' . $function_name[ 1 ];
+        } elseif (is_string($function_name)) {
+            return $function_name;
+        } else {
+            return 'closure';
+        }
+    }
+
+    /**
+     * Check if filter type is valid
+     *
+     * @param string $type
+     *
+     * @throws \SmartyException
+     */
+    public function _checkFilterType($type)
+    {
+        if (!isset($this->filterTypes[ $type ])) {
+            throw new SmartyException("Illegal filter type '{$type}'");
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_method_registerobject.php b/sysplugins/smarty_internal_method_registerobject.php
new file mode 100644
index 0000000000000000000000000000000000000000..4646e4f2254cb7c3e0c2b70d743766aa0aba8476
--- /dev/null
+++ b/sysplugins/smarty_internal_method_registerobject.php
@@ -0,0 +1,84 @@
+<?php
+
+/**
+ * Smarty Method RegisterObject
+ *
+ * Smarty::registerObject() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_RegisterObject
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * Registers object to be used in templates
+     *
+     * @api  Smarty::registerObject()
+     * @link http://www.smarty.net/docs/en/api.register.object.tpl
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param string                                                          $object_name
+     * @param object                                                          $object                     the
+     *                                                                                                    referenced
+     *                                                                                                    PHP
+     *                                                                                                    object
+     *                                                                                                    to
+     *                                                                                                    register
+     *
+     * @param array                                                           $allowed_methods_properties list of
+     *                                                                                                    allowed
+     *                                                                                                    methods
+     *                                                                                                    (empty
+     *                                                                                                    = all)
+     *
+     * @param bool                                                            $format                     smarty
+     *                                                                                                    argument
+     *                                                                                                    format,
+     *                                                                                                    else
+     *                                                                                                    traditional
+     *
+     * @param array                                                           $block_methods              list of
+     *                                                                                                    block-methods
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     * @throws \SmartyException
+     */
+    public function registerObject(
+        Smarty_Internal_TemplateBase $obj,
+        $object_name,
+        $object,
+        $allowed_methods_properties = array(),
+        $format = true,
+        $block_methods = array()
+    ) {
+        $smarty = $obj->_getSmartyObj();
+        // test if allowed methods callable
+        if (!empty($allowed_methods_properties)) {
+            foreach ((array)$allowed_methods_properties as $method) {
+                if (!is_callable(array($object, $method)) && !property_exists($object, $method)) {
+                    throw new SmartyException("Undefined method or property '$method' in registered object");
+                }
+            }
+        }
+        // test if block methods callable
+        if (!empty($block_methods)) {
+            foreach ((array)$block_methods as $method) {
+                if (!is_callable(array($object, $method))) {
+                    throw new SmartyException("Undefined method '$method' in registered object");
+                }
+            }
+        }
+        // register the object
+        $smarty->registered_objects[ $object_name ] =
+            array($object, (array)$allowed_methods_properties, (boolean)$format, (array)$block_methods);
+        return $obj;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_registerplugin.php b/sysplugins/smarty_internal_method_registerplugin.php
new file mode 100644
index 0000000000000000000000000000000000000000..ed18d84bbc01024e35c0ebcf1635a4270b58ec46
--- /dev/null
+++ b/sysplugins/smarty_internal_method_registerplugin.php
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * Smarty Method RegisterPlugin
+ *
+ * Smarty::registerPlugin() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_RegisterPlugin
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * Registers plugin to be used in templates
+     *
+     * @api  Smarty::registerPlugin()
+     * @link http://www.smarty.net/docs/en/api.register.plugin.tpl
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param string                                                          $type       plugin type
+     * @param string                                                          $name       name of template tag
+     * @param callback                                                        $callback   PHP callback to register
+     * @param bool                                                            $cacheable  if true (default) this
+     *                                                                                    function is cache able
+     * @param mixed                                                           $cache_attr caching attributes if any
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     * @throws SmartyException              when the plugin tag is invalid
+     */
+    public function registerPlugin(
+        Smarty_Internal_TemplateBase $obj,
+        $type,
+        $name,
+        $callback,
+        $cacheable = true,
+        $cache_attr = null
+    ) {
+        $smarty = $obj->_getSmartyObj();
+        if (isset($smarty->registered_plugins[ $type ][ $name ])) {
+            throw new SmartyException("Plugin tag '{$name}' already registered");
+        } elseif (!is_callable($callback)) {
+            throw new SmartyException("Plugin '{$name}' not callable");
+        } elseif ($cacheable && $cache_attr) {
+            throw new SmartyException("Cannot set caching attributes for plugin '{$name}' when it is cacheable.");
+        } else {
+            $smarty->registered_plugins[ $type ][ $name ] = array($callback, (bool)$cacheable, (array)$cache_attr);
+        }
+        return $obj;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_registerresource.php b/sysplugins/smarty_internal_method_registerresource.php
new file mode 100644
index 0000000000000000000000000000000000000000..7c7d0f78af76122724f58f37279a5c42f1fbc80f
--- /dev/null
+++ b/sysplugins/smarty_internal_method_registerresource.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * Smarty Method RegisterResource
+ *
+ * Smarty::registerResource() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_RegisterResource
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * Registers a resource to fetch a template
+     *
+     * @api  Smarty::registerResource()
+     * @link http://www.smarty.net/docs/en/api.register.resource.tpl
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param string                                                          $name             name of resource type
+     * @param Smarty_Resource|array                                           $resource_handler or instance of
+     *                                                                                          Smarty_Resource,
+     *                                                                                          or array of
+     *                                                                                          callbacks to
+     *                                                                                          handle
+     *                                                                                          resource
+     *                                                                                          (deprecated)
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     */
+    public function registerResource(Smarty_Internal_TemplateBase $obj, $name, $resource_handler)
+    {
+        $smarty = $obj->_getSmartyObj();
+        $smarty->registered_resources[ $name ] =
+            $resource_handler instanceof Smarty_Resource ? $resource_handler : array($resource_handler, false);
+        return $obj;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_setautoloadfilters.php b/sysplugins/smarty_internal_method_setautoloadfilters.php
new file mode 100644
index 0000000000000000000000000000000000000000..2972f3ce1b3d8913843cc8d50b6ff5b653886cd1
--- /dev/null
+++ b/sysplugins/smarty_internal_method_setautoloadfilters.php
@@ -0,0 +1,72 @@
+<?php
+
+/**
+ * Smarty Method SetAutoloadFilters
+ *
+ * Smarty::setAutoloadFilters() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_SetAutoloadFilters
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * Valid filter types
+     *
+     * @var array
+     */
+    private $filterTypes = array('pre' => true, 'post' => true, 'output' => true, 'variable' => true);
+
+    /**
+     * Set autoload filters
+     *
+     * @api Smarty::setAutoloadFilters()
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param array                                                           $filters filters to load automatically
+     * @param string                                                          $type    "pre", "output", … specify
+     *                                                                                 the filter type to set.
+     *                                                                                 Defaults to none treating
+     *                                                                                 $filters' keys as the
+     *                                                                                 appropriate types
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     * @throws \SmartyException
+     */
+    public function setAutoloadFilters(Smarty_Internal_TemplateBase $obj, $filters, $type = null)
+    {
+        $smarty = $obj->_getSmartyObj();
+        if ($type !== null) {
+            $this->_checkFilterType($type);
+            $smarty->autoload_filters[ $type ] = (array)$filters;
+        } else {
+            foreach ((array)$filters as $type => $value) {
+                $this->_checkFilterType($type);
+            }
+            $smarty->autoload_filters = (array)$filters;
+        }
+        return $obj;
+    }
+
+    /**
+     * Check if filter type is valid
+     *
+     * @param string $type
+     *
+     * @throws \SmartyException
+     */
+    public function _checkFilterType($type)
+    {
+        if (!isset($this->filterTypes[ $type ])) {
+            throw new SmartyException("Illegal filter type '{$type}'");
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_method_setdebugtemplate.php b/sysplugins/smarty_internal_method_setdebugtemplate.php
new file mode 100644
index 0000000000000000000000000000000000000000..cc9d23e2aede5456b864b9530cf876571d78fd2e
--- /dev/null
+++ b/sysplugins/smarty_internal_method_setdebugtemplate.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * Smarty Method SetDebugTemplate
+ *
+ * Smarty::setDebugTemplate() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_SetDebugTemplate
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * set the debug template
+     *
+     * @api Smarty::setDebugTemplate()
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param string                                                          $tpl_name
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     * @throws SmartyException if file is not readable
+     */
+    public function setDebugTemplate(Smarty_Internal_TemplateBase $obj, $tpl_name)
+    {
+        $smarty = $obj->_getSmartyObj();
+        if (!is_readable($tpl_name)) {
+            throw new SmartyException("Unknown file '{$tpl_name}'");
+        }
+        $smarty->debug_tpl = $tpl_name;
+        return $obj;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_setdefaultmodifiers.php b/sysplugins/smarty_internal_method_setdefaultmodifiers.php
new file mode 100644
index 0000000000000000000000000000000000000000..eadc2de1bf8e0bd3fb05e48d1ba8bb75a7c16b21
--- /dev/null
+++ b/sysplugins/smarty_internal_method_setdefaultmodifiers.php
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * Smarty Method SetDefaultModifiers
+ *
+ * Smarty::setDefaultModifiers() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_SetDefaultModifiers
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * Set default modifiers
+     *
+     * @api Smarty::setDefaultModifiers()
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param array|string                                                    $modifiers modifier or list of modifiers
+     *                                                                                   to set
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     */
+    public function setDefaultModifiers(Smarty_Internal_TemplateBase $obj, $modifiers)
+    {
+        $smarty = $obj->_getSmartyObj();
+        $smarty->default_modifiers = (array)$modifiers;
+        return $obj;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_unloadfilter.php b/sysplugins/smarty_internal_method_unloadfilter.php
new file mode 100644
index 0000000000000000000000000000000000000000..55e1596be1fe7dd742fe46114afba1d91d820c4b
--- /dev/null
+++ b/sysplugins/smarty_internal_method_unloadfilter.php
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * Smarty Method UnloadFilter
+ *
+ * Smarty::unloadFilter() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_UnloadFilter extends Smarty_Internal_Method_LoadFilter
+{
+    /**
+     * load a filter of specified type and name
+     *
+     * @api  Smarty::unloadFilter()
+     *
+     * @link http://www.smarty.net/docs/en/api.unload.filter.tpl
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param string                                                          $type filter type
+     * @param string                                                          $name filter name
+     *
+     * @return Smarty_Internal_TemplateBase
+     * @throws \SmartyException
+     */
+    public function unloadFilter(Smarty_Internal_TemplateBase $obj, $type, $name)
+    {
+        $smarty = $obj->_getSmartyObj();
+        $this->_checkFilterType($type);
+        if (isset($smarty->registered_filters[ $type ])) {
+            $_filter_name = "smarty_{$type}filter_{$name}";
+            if (isset($smarty->registered_filters[ $type ][ $_filter_name ])) {
+                unset($smarty->registered_filters[ $type ][ $_filter_name ]);
+                if (empty($smarty->registered_filters[ $type ])) {
+                    unset($smarty->registered_filters[ $type ]);
+                }
+            }
+        }
+        return $obj;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_unregistercacheresource.php b/sysplugins/smarty_internal_method_unregistercacheresource.php
new file mode 100644
index 0000000000000000000000000000000000000000..b999038672107b89361e4341d9e5cfe5e4b1ea7f
--- /dev/null
+++ b/sysplugins/smarty_internal_method_unregistercacheresource.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * Smarty Method UnregisterCacheResource
+ *
+ * Smarty::unregisterCacheResource() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_UnregisterCacheResource
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * Registers a resource to fetch a template
+     *
+     * @api  Smarty::unregisterCacheResource()
+     * @link http://www.smarty.net/docs/en/api.unregister.cacheresource.tpl
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param                                                                 $name
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     */
+    public function unregisterCacheResource(Smarty_Internal_TemplateBase $obj, $name)
+    {
+        $smarty = $obj->_getSmartyObj();
+        if (isset($smarty->registered_cache_resources[ $name ])) {
+            unset($smarty->registered_cache_resources[ $name ]);
+        }
+        return $obj;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_unregisterfilter.php b/sysplugins/smarty_internal_method_unregisterfilter.php
new file mode 100644
index 0000000000000000000000000000000000000000..9cb494a52a3e8599f99e3ee898e2f22a2ad09651
--- /dev/null
+++ b/sysplugins/smarty_internal_method_unregisterfilter.php
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * Smarty Method UnregisterFilter
+ *
+ * Smarty::unregisterFilter() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_UnregisterFilter extends Smarty_Internal_Method_RegisterFilter
+{
+    /**
+     * Unregisters a filter function
+     *
+     * @api  Smarty::unregisterFilter()
+     *
+     * @link http://www.smarty.net/docs/en/api.unregister.filter.tpl
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param string                                                          $type filter type
+     * @param callback|string                                                 $callback
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     * @throws \SmartyException
+     */
+    public function unregisterFilter(Smarty_Internal_TemplateBase $obj, $type, $callback)
+    {
+        $smarty = $obj->_getSmartyObj();
+        $this->_checkFilterType($type);
+        if (isset($smarty->registered_filters[ $type ])) {
+            $name = is_string($callback) ? $callback : $this->_getFilterName($callback);
+            if (isset($smarty->registered_filters[ $type ][ $name ])) {
+                unset($smarty->registered_filters[ $type ][ $name ]);
+                if (empty($smarty->registered_filters[ $type ])) {
+                    unset($smarty->registered_filters[ $type ]);
+                }
+            }
+        }
+        return $obj;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_unregisterobject.php b/sysplugins/smarty_internal_method_unregisterobject.php
new file mode 100644
index 0000000000000000000000000000000000000000..1e592b339b2a320d84361c7c6ab8ab50b23d05c2
--- /dev/null
+++ b/sysplugins/smarty_internal_method_unregisterobject.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * Smarty Method UnregisterObject
+ *
+ * Smarty::unregisterObject() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_UnregisterObject
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * Registers plugin to be used in templates
+     *
+     * @api  Smarty::unregisterObject()
+     * @link http://www.smarty.net/docs/en/api.unregister.object.tpl
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param string                                                          $object_name name of object
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     */
+    public function unregisterObject(Smarty_Internal_TemplateBase $obj, $object_name)
+    {
+        $smarty = $obj->_getSmartyObj();
+        if (isset($smarty->registered_objects[ $object_name ])) {
+            unset($smarty->registered_objects[ $object_name ]);
+        }
+        return $obj;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_unregisterplugin.php b/sysplugins/smarty_internal_method_unregisterplugin.php
new file mode 100644
index 0000000000000000000000000000000000000000..f39e3167827ccb07ba5c5cc85ecb81b2b85bc7bd
--- /dev/null
+++ b/sysplugins/smarty_internal_method_unregisterplugin.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * Smarty Method UnregisterPlugin
+ *
+ * Smarty::unregisterPlugin() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_UnregisterPlugin
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * Registers plugin to be used in templates
+     *
+     * @api  Smarty::unregisterPlugin()
+     * @link http://www.smarty.net/docs/en/api.unregister.plugin.tpl
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param string                                                          $type plugin type
+     * @param string                                                          $name name of template tag
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     */
+    public function unregisterPlugin(Smarty_Internal_TemplateBase $obj, $type, $name)
+    {
+        $smarty = $obj->_getSmartyObj();
+        if (isset($smarty->registered_plugins[ $type ][ $name ])) {
+            unset($smarty->registered_plugins[ $type ][ $name ]);
+        }
+        return $obj;
+    }
+}
diff --git a/sysplugins/smarty_internal_method_unregisterresource.php b/sysplugins/smarty_internal_method_unregisterresource.php
new file mode 100644
index 0000000000000000000000000000000000000000..a79db429960b5b73b6295a2bfd7b0dc8b13dbc85
--- /dev/null
+++ b/sysplugins/smarty_internal_method_unregisterresource.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * Smarty Method UnregisterResource
+ *
+ * Smarty::unregisterResource() method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Method_UnregisterResource
+{
+    /**
+     * Valid for Smarty and template object
+     *
+     * @var int
+     */
+    public $objMap = 3;
+
+    /**
+     * Registers a resource to fetch a template
+     *
+     * @api  Smarty::unregisterResource()
+     * @link http://www.smarty.net/docs/en/api.unregister.resource.tpl
+     *
+     * @param \Smarty_Internal_TemplateBase|\Smarty_Internal_Template|\Smarty $obj
+     * @param string                                                          $type name of resource type
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     */
+    public function unregisterResource(Smarty_Internal_TemplateBase $obj, $type)
+    {
+        $smarty = $obj->_getSmartyObj();
+        if (isset($smarty->registered_resources[ $type ])) {
+            unset($smarty->registered_resources[ $type ]);
+        }
+        return $obj;
+    }
+}
diff --git a/sysplugins/smarty_internal_nocache_insert.php b/sysplugins/smarty_internal_nocache_insert.php
new file mode 100644
index 0000000000000000000000000000000000000000..88694dcfdcfc33125a0cc7647bab88b30fe60ac1
--- /dev/null
+++ b/sysplugins/smarty_internal_nocache_insert.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Smarty Internal Plugin Nocache Insert
+ * Compiles the {insert} tag into the cache file
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile Insert Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Nocache_Insert
+{
+    /**
+     * Compiles code for the {insert} tag into cache file
+     *
+     * @param string                   $_function insert function name
+     * @param array                    $_attr     array with parameter
+     * @param Smarty_Internal_Template $_template template object
+     * @param string                   $_script   script name to load or 'null'
+     * @param string                   $_assign   optional variable name
+     *
+     * @return string                   compiled code
+     */
+    public static function compile($_function, $_attr, $_template, $_script, $_assign = null)
+    {
+        $_output = '<?php ';
+        if ($_script !== 'null') {
+            // script which must be included
+            // code for script file loading
+            $_output .= "require_once '{$_script}';";
+        }
+        // call insert
+        if (isset($_assign)) {
+            $_output .= "\$_smarty_tpl->assign('{$_assign}' , {$_function} (" . var_export($_attr, true) .
+                        ',\$_smarty_tpl), true);?>';
+        } else {
+            $_output .= "echo {$_function}(" . var_export($_attr, true) . ',$_smarty_tpl);?>';
+        }
+        $_tpl = $_template;
+        while ($_tpl->_isSubTpl()) {
+            $_tpl = $_tpl->parent;
+        }
+        return "/*%%SmartyNocache:{$_tpl->compiled->nocache_hash}%%*/{$_output}/*/%%SmartyNocache:{$_tpl->compiled->nocache_hash}%%*/";
+    }
+}
diff --git a/sysplugins/smarty_internal_parsetree.php b/sysplugins/smarty_internal_parsetree.php
new file mode 100644
index 0000000000000000000000000000000000000000..9f7678526b232a7ca3ebda2babc46fbcfff0d0b3
--- /dev/null
+++ b/sysplugins/smarty_internal_parsetree.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Smarty Internal Plugin Templateparser Parsetree
+ * These are classes to build parsetree in the template parser
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Thue Kristensen
+ * @author     Uwe Tews
+ */
+
+/**
+ * @package    Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+abstract class Smarty_Internal_ParseTree
+{
+    /**
+     * Buffer content
+     *
+     * @var mixed
+     */
+    public $data;
+
+    /**
+     * Subtree array
+     *
+     * @var array
+     */
+    public $subtrees = array();
+
+    /**
+     * Return buffer
+     *
+     * @param \Smarty_Internal_Templateparser $parser
+     *
+     * @return string buffer content
+     */
+    abstract public function to_smarty_php(Smarty_Internal_Templateparser $parser);
+
+    /**
+     * Template data object destructor
+     */
+    public function __destruct()
+    {
+        $this->data = null;
+        $this->subtrees = null;
+    }
+}
diff --git a/sysplugins/smarty_internal_parsetree_code.php b/sysplugins/smarty_internal_parsetree_code.php
new file mode 100644
index 0000000000000000000000000000000000000000..7bd0bc45c41c38935b858d5e2575fc3ad97a5f9e
--- /dev/null
+++ b/sysplugins/smarty_internal_parsetree_code.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Smarty Internal Plugin Templateparser Parse Tree
+ * These are classes to build parse trees in the template parser
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Thue Kristensen
+ * @author     Uwe Tews
+ */
+
+/**
+ * Code fragment inside a tag .
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+class Smarty_Internal_ParseTree_Code extends Smarty_Internal_ParseTree
+{
+    /**
+     * Create parse tree buffer for code fragment
+     *
+     * @param string $data content
+     */
+    public function __construct($data)
+    {
+        $this->data = $data;
+    }
+
+    /**
+     * Return buffer content in parentheses
+     *
+     * @param \Smarty_Internal_Templateparser $parser
+     *
+     * @return string content
+     */
+    public function to_smarty_php(Smarty_Internal_Templateparser $parser)
+    {
+        return sprintf('(%s)', $this->data);
+    }
+}
diff --git a/sysplugins/smarty_internal_parsetree_dq.php b/sysplugins/smarty_internal_parsetree_dq.php
new file mode 100644
index 0000000000000000000000000000000000000000..8655f5869ec4f1a3aef3435190090837b6d81a8f
--- /dev/null
+++ b/sysplugins/smarty_internal_parsetree_dq.php
@@ -0,0 +1,95 @@
+<?php
+/**
+ * Double quoted string inside a tag.
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+
+/**
+ * Double quoted string inside a tag.
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+class Smarty_Internal_ParseTree_Dq extends Smarty_Internal_ParseTree
+{
+    /**
+     * Create parse tree buffer for double quoted string subtrees
+     *
+     * @param object                    $parser  parser object
+     * @param Smarty_Internal_ParseTree $subtree parse tree buffer
+     */
+    public function __construct($parser, Smarty_Internal_ParseTree $subtree)
+    {
+        $this->subtrees[] = $subtree;
+        if ($subtree instanceof Smarty_Internal_ParseTree_Tag) {
+            $parser->block_nesting_level = count($parser->compiler->_tag_stack);
+        }
+    }
+
+    /**
+     * Append buffer to subtree
+     *
+     * @param \Smarty_Internal_Templateparser $parser
+     * @param Smarty_Internal_ParseTree       $subtree parse tree buffer
+     */
+    public function append_subtree(Smarty_Internal_Templateparser $parser, Smarty_Internal_ParseTree $subtree)
+    {
+        $last_subtree = count($this->subtrees) - 1;
+        if ($last_subtree >= 0 && $this->subtrees[ $last_subtree ] instanceof Smarty_Internal_ParseTree_Tag
+            && $this->subtrees[ $last_subtree ]->saved_block_nesting < $parser->block_nesting_level
+        ) {
+            if ($subtree instanceof Smarty_Internal_ParseTree_Code) {
+                $this->subtrees[ $last_subtree ]->data =
+                    $parser->compiler->appendCode(
+                        $this->subtrees[ $last_subtree ]->data,
+                        '<?php echo ' . $subtree->data . ';?>'
+                    );
+            } elseif ($subtree instanceof Smarty_Internal_ParseTree_DqContent) {
+                $this->subtrees[ $last_subtree ]->data =
+                    $parser->compiler->appendCode(
+                        $this->subtrees[ $last_subtree ]->data,
+                        '<?php echo "' . $subtree->data . '";?>'
+                    );
+            } else {
+                $this->subtrees[ $last_subtree ]->data =
+                    $parser->compiler->appendCode($this->subtrees[ $last_subtree ]->data, $subtree->data);
+            }
+        } else {
+            $this->subtrees[] = $subtree;
+        }
+        if ($subtree instanceof Smarty_Internal_ParseTree_Tag) {
+            $parser->block_nesting_level = count($parser->compiler->_tag_stack);
+        }
+    }
+
+    /**
+     * Merge subtree buffer content together
+     *
+     * @param \Smarty_Internal_Templateparser $parser
+     *
+     * @return string compiled template code
+     */
+    public function to_smarty_php(Smarty_Internal_Templateparser $parser)
+    {
+        $code = '';
+        foreach ($this->subtrees as $subtree) {
+            if ($code !== '') {
+                $code .= '.';
+            }
+            if ($subtree instanceof Smarty_Internal_ParseTree_Tag) {
+                $more_php = $subtree->assign_to_var($parser);
+            } else {
+                $more_php = $subtree->to_smarty_php($parser);
+            }
+            $code .= $more_php;
+            if (!$subtree instanceof Smarty_Internal_ParseTree_DqContent) {
+                $parser->compiler->has_variable_string = true;
+            }
+        }
+        return $code;
+    }
+}
diff --git a/sysplugins/smarty_internal_parsetree_dqcontent.php b/sysplugins/smarty_internal_parsetree_dqcontent.php
new file mode 100644
index 0000000000000000000000000000000000000000..a8ca389d9ca2198e7162efa8422983fcc30fa55b
--- /dev/null
+++ b/sysplugins/smarty_internal_parsetree_dqcontent.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Smarty Internal Plugin Templateparser Parse Tree
+ * These are classes to build parse tree  in the template parser
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Thue Kristensen
+ * @author     Uwe Tews
+ */
+
+/**
+ * Raw chars as part of a double quoted string.
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+class Smarty_Internal_ParseTree_DqContent extends Smarty_Internal_ParseTree
+{
+    /**
+     * Create parse tree buffer with string content
+     *
+     * @param string $data string section
+     */
+    public function __construct($data)
+    {
+        $this->data = $data;
+    }
+
+    /**
+     * Return content as double quoted string
+     *
+     * @param \Smarty_Internal_Templateparser $parser
+     *
+     * @return string doubled quoted string
+     */
+    public function to_smarty_php(Smarty_Internal_Templateparser $parser)
+    {
+        return '"' . $this->data . '"';
+    }
+}
diff --git a/sysplugins/smarty_internal_parsetree_tag.php b/sysplugins/smarty_internal_parsetree_tag.php
new file mode 100644
index 0000000000000000000000000000000000000000..e6c755604c450668c97ccba50d1efa6c2bb112eb
--- /dev/null
+++ b/sysplugins/smarty_internal_parsetree_tag.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Smarty Internal Plugin Templateparser Parse Tree
+ * These are classes to build parse tree in the template parser
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Thue Kristensen
+ * @author     Uwe Tews
+ */
+
+/**
+ * A complete smarty tag.
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+class Smarty_Internal_ParseTree_Tag extends Smarty_Internal_ParseTree
+{
+    /**
+     * Saved block nesting level
+     *
+     * @var int
+     */
+    public $saved_block_nesting;
+
+    /**
+     * Create parse tree buffer for Smarty tag
+     *
+     * @param \Smarty_Internal_Templateparser $parser parser object
+     * @param string                          $data   content
+     */
+    public function __construct(Smarty_Internal_Templateparser $parser, $data)
+    {
+        $this->data = $data;
+        $this->saved_block_nesting = $parser->block_nesting_level;
+    }
+
+    /**
+     * Return buffer content
+     *
+     * @param \Smarty_Internal_Templateparser $parser
+     *
+     * @return string content
+     */
+    public function to_smarty_php(Smarty_Internal_Templateparser $parser)
+    {
+        return $this->data;
+    }
+
+    /**
+     * Return complied code that loads the evaluated output of buffer content into a temporary variable
+     *
+     * @param \Smarty_Internal_Templateparser $parser
+     *
+     * @return string template code
+     */
+    public function assign_to_var(Smarty_Internal_Templateparser $parser)
+    {
+        $var = $parser->compiler->getNewPrefixVariable();
+        $tmp = $parser->compiler->appendCode('<?php ob_start();?>', $this->data);
+        $tmp = $parser->compiler->appendCode($tmp, "<?php {$var}=ob_get_clean();?>");
+        $parser->compiler->prefix_code[] = sprintf('%s', $tmp);
+        return $var;
+    }
+}
diff --git a/sysplugins/smarty_internal_parsetree_template.php b/sysplugins/smarty_internal_parsetree_template.php
new file mode 100644
index 0000000000000000000000000000000000000000..ab4c3ec3b61e98cdf7da770ff9c4f6ecce80d21e
--- /dev/null
+++ b/sysplugins/smarty_internal_parsetree_template.php
@@ -0,0 +1,169 @@
+<?php
+/**
+ * Smarty Internal Plugin Templateparser Parse Tree
+ * These are classes to build parse tree in the template parser
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Thue Kristensen
+ * @author     Uwe Tews
+ */
+
+/**
+ * Template element
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+class Smarty_Internal_ParseTree_Template extends Smarty_Internal_ParseTree
+{
+    /**
+     * Array of template elements
+     *
+     * @var array
+     */
+    public $subtrees = array();
+
+    /**
+     * Create root of parse tree for template elements
+     */
+    public function __construct()
+    {
+    }
+
+    /**
+     * Append buffer to subtree
+     *
+     * @param \Smarty_Internal_Templateparser $parser
+     * @param Smarty_Internal_ParseTree       $subtree
+     */
+    public function append_subtree(Smarty_Internal_Templateparser $parser, Smarty_Internal_ParseTree $subtree)
+    {
+        if (!empty($subtree->subtrees)) {
+            $this->subtrees = array_merge($this->subtrees, $subtree->subtrees);
+        } else {
+            if ($subtree->data !== '') {
+                $this->subtrees[] = $subtree;
+            }
+        }
+    }
+
+    /**
+     * Append array to subtree
+     *
+     * @param \Smarty_Internal_Templateparser $parser
+     * @param \Smarty_Internal_ParseTree[]    $array
+     */
+    public function append_array(Smarty_Internal_Templateparser $parser, $array = array())
+    {
+        if (!empty($array)) {
+            $this->subtrees = array_merge($this->subtrees, (array)$array);
+        }
+    }
+
+    /**
+     * Prepend array to subtree
+     *
+     * @param \Smarty_Internal_Templateparser $parser
+     * @param \Smarty_Internal_ParseTree[]    $array
+     */
+    public function prepend_array(Smarty_Internal_Templateparser $parser, $array = array())
+    {
+        if (!empty($array)) {
+            $this->subtrees = array_merge((array)$array, $this->subtrees);
+        }
+    }
+
+    /**
+     * Sanitize and merge subtree buffers together
+     *
+     * @param \Smarty_Internal_Templateparser $parser
+     *
+     * @return string template code content
+     */
+    public function to_smarty_php(Smarty_Internal_Templateparser $parser)
+    {
+        $code = '';
+
+        foreach ($this->getChunkedSubtrees() as $chunk) {
+	        $text = '';
+	        switch ($chunk['mode']) {
+		        case 'textstripped':
+			        foreach ($chunk['subtrees'] as $subtree) {
+				        $text .= $subtree->to_smarty_php($parser);
+			        }
+			        $code .= preg_replace(
+				        '/((<%)|(%>)|(<\?php)|(<\?)|(\?>)|(<\/?script))/',
+				        "<?php echo '\$1'; ?>\n",
+				        $parser->compiler->processText($text)
+			        );
+			        break;
+		        case 'text':
+			        foreach ($chunk['subtrees'] as $subtree) {
+				        $text .= $subtree->to_smarty_php($parser);
+			        }
+			        $code .= preg_replace(
+				        '/((<%)|(%>)|(<\?php)|(<\?)|(\?>)|(<\/?script))/',
+				        "<?php echo '\$1'; ?>\n",
+				        $text
+			        );
+			        break;
+		        case 'tag':
+			        foreach ($chunk['subtrees'] as $subtree) {
+				        $text = $parser->compiler->appendCode($text, $subtree->to_smarty_php($parser));
+			        }
+			        $code .= $text;
+			        break;
+		        default:
+			        foreach ($chunk['subtrees'] as $subtree) {
+				        $text = $subtree->to_smarty_php($parser);
+			        }
+			        $code .= $text;
+
+	        }
+        }
+        return $code;
+    }
+
+    private function getChunkedSubtrees() {
+    	$chunks = array();
+    	$currentMode = null;
+    	$currentChunk = array();
+	    for ($key = 0, $cnt = count($this->subtrees); $key < $cnt; $key++) {
+
+	    	if ($this->subtrees[ $key ]->data === '' && in_array($currentMode, array('textstripped', 'text', 'tag'))) {
+	    		continue;
+	    	}
+
+		    if ($this->subtrees[ $key ] instanceof Smarty_Internal_ParseTree_Text
+			    && $this->subtrees[ $key ]->isToBeStripped()) {
+		    	$newMode = 'textstripped';
+		    } elseif ($this->subtrees[ $key ] instanceof Smarty_Internal_ParseTree_Text) {
+			    $newMode = 'text';
+		    } elseif ($this->subtrees[ $key ] instanceof Smarty_Internal_ParseTree_Tag) {
+			    $newMode = 'tag';
+		    } else {
+			    $newMode = 'other';
+		    }
+
+		    if ($newMode == $currentMode) {
+			    $currentChunk[] = $this->subtrees[ $key ];
+		    } else {
+		    	$chunks[] = array(
+		    		'mode' => $currentMode,
+				    'subtrees' => $currentChunk
+			    );
+		    	$currentMode = $newMode;
+			    $currentChunk = array($this->subtrees[ $key ]);
+		    }
+	    }
+	    if ($currentMode && $currentChunk) {
+		    $chunks[] = array(
+			    'mode' => $currentMode,
+			    'subtrees' => $currentChunk
+		    );
+	    }
+		return $chunks;
+    }
+}
diff --git a/sysplugins/smarty_internal_parsetree_text.php b/sysplugins/smarty_internal_parsetree_text.php
new file mode 100644
index 0000000000000000000000000000000000000000..399e84941d605c7839d772ecad0d9dd9e6f0e84b
--- /dev/null
+++ b/sysplugins/smarty_internal_parsetree_text.php
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * Smarty Internal Plugin Templateparser Parse Tree
+ * These are classes to build parse tree in the template parser
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Thue Kristensen
+ * @author     Uwe Tews
+ *             *
+ *             template text
+ * @package    Smarty
+ * @subpackage Compiler
+ * @ignore
+ */
+class Smarty_Internal_ParseTree_Text extends Smarty_Internal_ParseTree
+{
+
+	/**
+	 * Wether this section should be stripped on output to smarty php
+	 * @var bool
+	 */
+	private $toBeStripped = false;
+
+	/**
+	 * Create template text buffer
+	 *
+	 * @param string $data text
+	 * @param bool $toBeStripped wether this section should be stripped on output to smarty php
+	 */
+    public function __construct($data, $toBeStripped = false)
+    {
+        $this->data = $data;
+        $this->toBeStripped = $toBeStripped;
+    }
+
+	/**
+	 * Wether this section should be stripped on output to smarty php
+	 * @return bool
+	 */
+	public function isToBeStripped() {
+    	return $this->toBeStripped;
+    }
+
+    /**
+     * Return buffer content
+     *
+     * @param \Smarty_Internal_Templateparser $parser
+     *
+     * @return string text
+     */
+    public function to_smarty_php(Smarty_Internal_Templateparser $parser)
+    {
+        return $this->data;
+    }
+}
diff --git a/sysplugins/smarty_internal_resource_eval.php b/sysplugins/smarty_internal_resource_eval.php
new file mode 100644
index 0000000000000000000000000000000000000000..3b552a589f7dca602b8505357b1f3759c045a533
--- /dev/null
+++ b/sysplugins/smarty_internal_resource_eval.php
@@ -0,0 +1,94 @@
+<?php
+/**
+ * Smarty Internal Plugin Resource Eval
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ * @author     Uwe Tews
+ * @author     Rodney Rehm
+ */
+
+/**
+ * Smarty Internal Plugin Resource Eval
+ * Implements the strings as resource for Smarty template
+ * {@internal unlike string-resources the compiled state of eval-resources is NOT saved for subsequent access}}
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ */
+class Smarty_Internal_Resource_Eval extends Smarty_Resource_Recompiled
+{
+    /**
+     * populate Source Object with meta data from Resource
+     *
+     * @param Smarty_Template_Source   $source    source object
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @return void
+     */
+    public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null)
+    {
+        $source->uid = $source->filepath = sha1($source->name);
+        $source->timestamp = $source->exists = true;
+    }
+
+    /**
+     * Load template's source from $resource_name into current template object
+     *
+     * @uses decode() to decode base64 and urlencoded template_resources
+     *
+     * @param Smarty_Template_Source $source source object
+     *
+     * @return string                 template source
+     */
+    public function getContent(Smarty_Template_Source $source)
+    {
+        return $this->decode($source->name);
+    }
+
+    /**
+     * decode base64 and urlencode
+     *
+     * @param string $string template_resource to decode
+     *
+     * @return string decoded template_resource
+     */
+    protected function decode($string)
+    {
+        // decode if specified
+        if (($pos = strpos($string, ':')) !== false) {
+            if (!strncmp($string, 'base64', 6)) {
+                return base64_decode(substr($string, 7));
+            } elseif (!strncmp($string, 'urlencode', 9)) {
+                return urldecode(substr($string, 10));
+            }
+        }
+        return $string;
+    }
+
+    /**
+     * modify resource_name according to resource handlers specifications
+     *
+     * @param Smarty  $smarty        Smarty instance
+     * @param string  $resource_name resource_name to make unique
+     * @param boolean $isConfig      flag for config resource
+     *
+     * @return string unique resource name
+     */
+    public function buildUniqueResourceName(Smarty $smarty, $resource_name, $isConfig = false)
+    {
+        return get_class($this) . '#' . $this->decode($resource_name);
+    }
+
+    /**
+     * Determine basename for compiled filename
+     *
+     * @param Smarty_Template_Source $source source object
+     *
+     * @return string                 resource's basename
+     */
+    public function getBasename(Smarty_Template_Source $source)
+    {
+        return '';
+    }
+}
diff --git a/sysplugins/smarty_internal_resource_extends.php b/sysplugins/smarty_internal_resource_extends.php
new file mode 100644
index 0000000000000000000000000000000000000000..80946932eaea741c3412eb3b66765822c416950e
--- /dev/null
+++ b/sysplugins/smarty_internal_resource_extends.php
@@ -0,0 +1,126 @@
+<?php
+/**
+ * Smarty Internal Plugin Resource Extends
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ * @author     Uwe Tews
+ * @author     Rodney Rehm
+ */
+
+/**
+ * Smarty Internal Plugin Resource Extends
+ * Implements the file system as resource for Smarty which {extend}s a chain of template files templates
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ */
+class Smarty_Internal_Resource_Extends extends Smarty_Resource
+{
+    /**
+     * mbstring.overload flag
+     *
+     * @var int
+     */
+    public $mbstring_overload = 0;
+
+    /**
+     * populate Source Object with meta data from Resource
+     *
+     * @param Smarty_Template_Source   $source    source object
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @throws SmartyException
+     */
+    public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null)
+    {
+        $uid = '';
+        $sources = array();
+        $components = explode('|', $source->name);
+        $smarty = &$source->smarty;
+        $exists = true;
+        foreach ($components as $component) {
+            /* @var \Smarty_Template_Source $_s */
+            $_s = Smarty_Template_Source::load(null, $smarty, $component);
+            if ($_s->type === 'php') {
+                throw new SmartyException("Resource type {$_s->type} cannot be used with the extends resource type");
+            }
+            $sources[ $_s->uid ] = $_s;
+            $uid .= $_s->filepath;
+            if ($_template) {
+                $exists = $exists && $_s->exists;
+            }
+        }
+        $source->components = $sources;
+        $source->filepath = $_s->filepath;
+        $source->uid = sha1($uid . $source->smarty->_joined_template_dir);
+        $source->exists = $exists;
+        if ($_template) {
+            $source->timestamp = $_s->timestamp;
+        }
+    }
+
+    /**
+     * populate Source Object with timestamp and exists from Resource
+     *
+     * @param Smarty_Template_Source $source source object
+     */
+    public function populateTimestamp(Smarty_Template_Source $source)
+    {
+        $source->exists = true;
+        /* @var \Smarty_Template_Source $_s */
+        foreach ($source->components as $_s) {
+            $source->exists = $source->exists && $_s->exists;
+        }
+        $source->timestamp = $source->exists ? $_s->getTimeStamp() : false;
+    }
+
+    /**
+     * Load template's source from files into current template object
+     *
+     * @param Smarty_Template_Source $source source object
+     *
+     * @return string template source
+     * @throws SmartyException if source cannot be loaded
+     */
+    public function getContent(Smarty_Template_Source $source)
+    {
+        if (!$source->exists) {
+            throw new SmartyException("Unable to load template '{$source->type}:{$source->name}'");
+        }
+        $_components = array_reverse($source->components);
+        $_content = '';
+        /* @var \Smarty_Template_Source $_s */
+        foreach ($_components as $_s) {
+            // read content
+            $_content .= $_s->getContent();
+        }
+        return $_content;
+    }
+
+    /**
+     * Determine basename for compiled filename
+     *
+     * @param Smarty_Template_Source $source source object
+     *
+     * @return string resource's basename
+     */
+    public function getBasename(Smarty_Template_Source $source)
+    {
+        return str_replace(':', '.', basename($source->filepath));
+    }
+
+    /*
+      * Disable timestamp checks for extends resource.
+      * The individual source components will be checked.
+      *
+      * @return bool
+      */
+    /**
+     * @return bool
+     */
+    public function checkTimestamps()
+    {
+        return false;
+    }
+}
diff --git a/sysplugins/smarty_internal_resource_file.php b/sysplugins/smarty_internal_resource_file.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae2060673e788bfcdedd1926bd830916526e719e
--- /dev/null
+++ b/sysplugins/smarty_internal_resource_file.php
@@ -0,0 +1,180 @@
+<?php
+/**
+ * Smarty Internal Plugin Resource File
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ * @author     Uwe Tews
+ * @author     Rodney Rehm
+ */
+
+/**
+ * Smarty Internal Plugin Resource File
+ * Implements the file system as resource for Smarty templates
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ */
+class Smarty_Internal_Resource_File extends Smarty_Resource
+{
+    /**
+     * populate Source Object with meta data from Resource
+     *
+     * @param Smarty_Template_Source   $source    source object
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @throws \SmartyException
+     */
+    public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null)
+    {
+        $source->filepath = $this->buildFilepath($source, $_template);
+        if ($source->filepath !== false) {
+            if (isset($source->smarty->security_policy) && is_object($source->smarty->security_policy)) {
+                $source->smarty->security_policy->isTrustedResourceDir($source->filepath, $source->isConfig);
+            }
+            $source->exists = true;
+            $source->uid = sha1(
+                $source->filepath . ($source->isConfig ? $source->smarty->_joined_config_dir :
+                    $source->smarty->_joined_template_dir)
+            );
+            $source->timestamp = filemtime($source->filepath);
+        } else {
+            $source->timestamp = $source->exists = false;
+        }
+    }
+
+    /**
+     * populate Source Object with timestamp and exists from Resource
+     *
+     * @param Smarty_Template_Source $source source object
+     */
+    public function populateTimestamp(Smarty_Template_Source $source)
+    {
+        if (!$source->exists) {
+            $source->timestamp = $source->exists = is_file($source->filepath);
+        }
+        if ($source->exists) {
+            $source->timestamp = filemtime($source->filepath);
+        }
+    }
+
+    /**
+     * Load template's source from file into current template object
+     *
+     * @param Smarty_Template_Source $source source object
+     *
+     * @return string                 template source
+     * @throws SmartyException        if source cannot be loaded
+     */
+    public function getContent(Smarty_Template_Source $source)
+    {
+        if ($source->exists) {
+            return file_get_contents($source->filepath);
+        }
+        throw new SmartyException(
+            'Unable to read ' . ($source->isConfig ? 'config' : 'template') .
+            " {$source->type} '{$source->name}'"
+        );
+    }
+
+    /**
+     * Determine basename for compiled filename
+     *
+     * @param Smarty_Template_Source $source source object
+     *
+     * @return string                 resource's basename
+     */
+    public function getBasename(Smarty_Template_Source $source)
+    {
+        return basename($source->filepath);
+    }
+
+    /**
+     * build template filepath by traversing the template_dir array
+     *
+     * @param Smarty_Template_Source   $source    source object
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @return string fully qualified filepath
+     * @throws SmartyException
+     */
+    protected function buildFilepath(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null)
+    {
+        $file = $source->name;
+        // absolute file ?
+        if ($file[ 0 ] === '/' || $file[ 1 ] === ':') {
+            $file = $source->smarty->_realpath($file, true);
+            return is_file($file) ? $file : false;
+        }
+        // go relative to a given template?
+        if ($file[ 0 ] === '.' && $_template && $_template->_isSubTpl()
+            && preg_match('#^[.]{1,2}[\\\/]#', $file)
+        ) {
+            if ($_template->parent->source->type !== 'file' && $_template->parent->source->type !== 'extends'
+                && !isset($_template->parent->_cache[ 'allow_relative_path' ])
+            ) {
+                throw new SmartyException("Template '{$file}' cannot be relative to template of resource type '{$_template->parent->source->type}'");
+            }
+            // normalize path
+            $path =
+                $source->smarty->_realpath(dirname($_template->parent->source->filepath) . DIRECTORY_SEPARATOR . $file);
+            // files relative to a template only get one shot
+            return is_file($path) ? $path : false;
+        }
+        // normalize DIRECTORY_SEPARATOR
+        if (strpos($file, DIRECTORY_SEPARATOR === '/' ? '\\' : '/') !== false) {
+            $file = str_replace(DIRECTORY_SEPARATOR === '/' ? '\\' : '/', DIRECTORY_SEPARATOR, $file);
+        }
+        $_directories = $source->smarty->getTemplateDir(null, $source->isConfig);
+        // template_dir index?
+        if ($file[ 0 ] === '[' && preg_match('#^\[([^\]]+)\](.+)$#', $file, $fileMatch)) {
+            $file = $fileMatch[ 2 ];
+            $_indices = explode(',', $fileMatch[ 1 ]);
+            $_index_dirs = array();
+            foreach ($_indices as $index) {
+                $index = trim($index);
+                // try string indexes
+                if (isset($_directories[ $index ])) {
+                    $_index_dirs[] = $_directories[ $index ];
+                } elseif (is_numeric($index)) {
+                    // try numeric index
+                    $index = (int)$index;
+                    if (isset($_directories[ $index ])) {
+                        $_index_dirs[] = $_directories[ $index ];
+                    } else {
+                        // try at location index
+                        $keys = array_keys($_directories);
+                        if (isset($_directories[ $keys[ $index ] ])) {
+                            $_index_dirs[] = $_directories[ $keys[ $index ] ];
+                        }
+                    }
+                }
+            }
+            if (empty($_index_dirs)) {
+                // index not found
+                return false;
+            } else {
+                $_directories = $_index_dirs;
+            }
+        }
+        // relative file name?
+        foreach ($_directories as $_directory) {
+            $path = $_directory . $file;
+            if (is_file($path)) {
+                return (strpos($path, '.' . DIRECTORY_SEPARATOR) !== false) ? $source->smarty->_realpath($path) : $path;
+            }
+        }
+        if (!isset($_index_dirs)) {
+            // Could be relative to cwd
+            $path = $source->smarty->_realpath($file, true);
+            if (is_file($path)) {
+                return $path;
+            }
+        }
+        // Use include path ?
+        if ($source->smarty->use_include_path) {
+            return $source->smarty->ext->_getIncludePath->getIncludePath($_directories, $file, $source->smarty);
+        }
+        return false;
+    }
+}
diff --git a/sysplugins/smarty_internal_resource_php.php b/sysplugins/smarty_internal_resource_php.php
new file mode 100644
index 0000000000000000000000000000000000000000..9d98ae181f76917257ac68aaccf2191455fce758
--- /dev/null
+++ b/sysplugins/smarty_internal_resource_php.php
@@ -0,0 +1,116 @@
+<?php
+
+/**
+ * Smarty Internal Plugin Resource PHP
+ * Implements the file system as resource for PHP templates
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ * @author     Uwe Tews
+ * @author     Rodney Rehm
+ */
+class Smarty_Internal_Resource_Php extends Smarty_Internal_Resource_File
+{
+    /**
+     * Flag that it's an uncompiled resource
+     *
+     * @var bool
+     */
+    public $uncompiled = true;
+
+    /**
+     * Resource does implement populateCompiledFilepath() method
+     *
+     * @var bool
+     */
+    public $hasCompiledHandler = true;
+
+    /**
+     * container for short_open_tag directive's value before executing PHP templates
+     *
+     * @var string
+     */
+    protected $short_open_tag;
+
+    /**
+     * Create a new PHP Resource
+     */
+    public function __construct()
+    {
+        $this->short_open_tag = function_exists('ini_get') ? ini_get('short_open_tag') : 1;
+    }
+
+    /**
+     * Load template's source from file into current template object
+     *
+     * @param Smarty_Template_Source $source source object
+     *
+     * @return string                 template source
+     * @throws SmartyException        if source cannot be loaded
+     */
+    public function getContent(Smarty_Template_Source $source)
+    {
+        if ($source->exists) {
+            return '';
+        }
+        throw new SmartyException("Unable to read template {$source->type} '{$source->name}'");
+    }
+
+    /**
+     * populate compiled object with compiled filepath
+     *
+     * @param Smarty_Template_Compiled $compiled  compiled object
+     * @param Smarty_Internal_Template $_template template object (is ignored)
+     */
+    public function populateCompiledFilepath(Smarty_Template_Compiled $compiled, Smarty_Internal_Template $_template)
+    {
+        $compiled->filepath = $_template->source->filepath;
+        $compiled->timestamp = $_template->source->timestamp;
+        $compiled->exists = $_template->source->exists;
+        $compiled->file_dependency[ $_template->source->uid ] =
+            array(
+                $compiled->filepath,
+                $compiled->timestamp,
+                $_template->source->type,
+            );
+    }
+
+    /**
+     * Render and output the template (without using the compiler)
+     *
+     * @param Smarty_Template_Source   $source    source object
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @return void
+     * @throws SmartyException          if template cannot be loaded or allow_php_templates is disabled
+     */
+    public function renderUncompiled(Smarty_Template_Source $source, Smarty_Internal_Template $_template)
+    {
+        if (!$source->smarty->allow_php_templates) {
+            throw new SmartyException('PHP templates are disabled');
+        }
+        if (!$source->exists) {
+            throw new SmartyException(
+                "Unable to load template '{$source->type}:{$source->name}'" .
+                ($_template->_isSubTpl() ? " in '{$_template->parent->template_resource}'" : '')
+            );
+        }
+        // prepare variables
+        extract($_template->getTemplateVars());
+        // include PHP template with short open tags enabled
+        if (function_exists('ini_set')) {
+            ini_set('short_open_tag', '1');
+        }
+        /**
+         *
+         *
+         * @var Smarty_Internal_Template $_smarty_template
+         * used in included file
+         */
+        $_smarty_template = $_template;
+        include $source->filepath;
+        if (function_exists('ini_set')) {
+            ini_set('short_open_tag', $this->short_open_tag);
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_resource_registered.php b/sysplugins/smarty_internal_resource_registered.php
new file mode 100644
index 0000000000000000000000000000000000000000..df526101f016771f5622c69d7073b58a9ddfe318
--- /dev/null
+++ b/sysplugins/smarty_internal_resource_registered.php
@@ -0,0 +1,101 @@
+<?php
+/**
+ * Smarty Internal Plugin Resource Registered
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ * @author     Uwe Tews
+ * @author     Rodney Rehm
+ */
+
+/**
+ * Smarty Internal Plugin Resource Registered
+ * Implements the registered resource for Smarty template
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ * @deprecated
+ */
+class Smarty_Internal_Resource_Registered extends Smarty_Resource
+{
+    /**
+     * populate Source Object with meta data from Resource
+     *
+     * @param Smarty_Template_Source   $source    source object
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @return void
+     */
+    public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null)
+    {
+        $source->filepath = $source->type . ':' . $source->name;
+        $source->uid = sha1($source->filepath . $source->smarty->_joined_template_dir);
+        $source->timestamp = $this->getTemplateTimestamp($source);
+        $source->exists = !!$source->timestamp;
+    }
+
+    /**
+     * populate Source Object with timestamp and exists from Resource
+     *
+     * @param Smarty_Template_Source $source source object
+     *
+     * @return void
+     */
+    public function populateTimestamp(Smarty_Template_Source $source)
+    {
+        $source->timestamp = $this->getTemplateTimestamp($source);
+        $source->exists = !!$source->timestamp;
+    }
+
+    /**
+     * Get timestamp (epoch) the template source was modified
+     *
+     * @param Smarty_Template_Source $source source object
+     *
+     * @return integer|boolean        timestamp (epoch) the template was modified, false if resources has no timestamp
+     */
+    public function getTemplateTimestamp(Smarty_Template_Source $source)
+    {
+        // return timestamp
+        $time_stamp = false;
+        call_user_func_array(
+            $source->smarty->registered_resources[ $source->type ][ 0 ][ 1 ],
+            array($source->name, &$time_stamp, $source->smarty)
+        );
+        return is_numeric($time_stamp) ? (int)$time_stamp : $time_stamp;
+    }
+
+    /**
+     * Load template's source by invoking the registered callback into current template object
+     *
+     * @param Smarty_Template_Source $source source object
+     *
+     * @return string                 template source
+     * @throws SmartyException        if source cannot be loaded
+     */
+    public function getContent(Smarty_Template_Source $source)
+    {
+        // return template string
+        $content = null;
+        $t = call_user_func_array(
+            $source->smarty->registered_resources[ $source->type ][ 0 ][ 0 ],
+            array($source->name, &$content, $source->smarty)
+        );
+        if (is_bool($t) && !$t) {
+            throw new SmartyException("Unable to read template {$source->type} '{$source->name}'");
+        }
+        return $content;
+    }
+
+    /**
+     * Determine basename for compiled filename
+     *
+     * @param Smarty_Template_Source $source source object
+     *
+     * @return string                 resource's basename
+     */
+    public function getBasename(Smarty_Template_Source $source)
+    {
+        return basename($source->name);
+    }
+}
diff --git a/sysplugins/smarty_internal_resource_stream.php b/sysplugins/smarty_internal_resource_stream.php
new file mode 100644
index 0000000000000000000000000000000000000000..9956bd07306f0af6e7a01c199b902a0709d41060
--- /dev/null
+++ b/sysplugins/smarty_internal_resource_stream.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Smarty Internal Plugin Resource Stream
+ * Implements the streams as resource for Smarty template
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ * @author     Uwe Tews
+ * @author     Rodney Rehm
+ */
+
+/**
+ * Smarty Internal Plugin Resource Stream
+ * Implements the streams as resource for Smarty template
+ *
+ * @link       http://php.net/streams
+ * @package    Smarty
+ * @subpackage TemplateResources
+ */
+class Smarty_Internal_Resource_Stream extends Smarty_Resource_Recompiled
+{
+    /**
+     * populate Source Object with meta data from Resource
+     *
+     * @param Smarty_Template_Source   $source    source object
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @return void
+     */
+    public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null)
+    {
+        if (strpos($source->resource, '://') !== false) {
+            $source->filepath = $source->resource;
+        } else {
+            $source->filepath = str_replace(':', '://', $source->resource);
+        }
+        $source->uid = false;
+        $source->content = $this->getContent($source);
+        $source->timestamp = $source->exists = !!$source->content;
+    }
+
+    /**
+     * Load template's source from stream into current template object
+     *
+     * @param Smarty_Template_Source $source source object
+     *
+     * @return string template source
+     */
+    public function getContent(Smarty_Template_Source $source)
+    {
+        $t = '';
+        // the availability of the stream has already been checked in Smarty_Resource::fetch()
+        $fp = fopen($source->filepath, 'r+');
+        if ($fp) {
+            while (!feof($fp) && ($current_line = fgets($fp)) !== false) {
+                $t .= $current_line;
+            }
+            fclose($fp);
+            return $t;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * modify resource_name according to resource handlers specifications
+     *
+     * @param Smarty  $smarty        Smarty instance
+     * @param string  $resource_name resource_name to make unique
+     * @param boolean $isConfig      flag for config resource
+     *
+     * @return string unique resource name
+     */
+    public function buildUniqueResourceName(Smarty $smarty, $resource_name, $isConfig = false)
+    {
+        return get_class($this) . '#' . $resource_name;
+    }
+}
diff --git a/sysplugins/smarty_internal_resource_string.php b/sysplugins/smarty_internal_resource_string.php
new file mode 100644
index 0000000000000000000000000000000000000000..3fecbb7ef782ba04a99b3d22554b173e56fa9515
--- /dev/null
+++ b/sysplugins/smarty_internal_resource_string.php
@@ -0,0 +1,108 @@
+<?php
+/**
+ * Smarty Internal Plugin Resource String
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ * @author     Uwe Tews
+ * @author     Rodney Rehm
+ */
+
+/**
+ * Smarty Internal Plugin Resource String
+ * Implements the strings as resource for Smarty template
+ * {@internal unlike eval-resources the compiled state of string-resources is saved for subsequent access}}
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ */
+class Smarty_Internal_Resource_String extends Smarty_Resource
+{
+    /**
+     * populate Source Object with meta data from Resource
+     *
+     * @param Smarty_Template_Source   $source    source object
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @return void
+     */
+    public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null)
+    {
+        $source->uid = $source->filepath = sha1($source->name . $source->smarty->_joined_template_dir);
+        $source->timestamp = $source->exists = true;
+    }
+
+    /**
+     * Load template's source from $resource_name into current template object
+     *
+     * @uses decode() to decode base64 and urlencoded template_resources
+     *
+     * @param Smarty_Template_Source $source source object
+     *
+     * @return string                 template source
+     */
+    public function getContent(Smarty_Template_Source $source)
+    {
+        return $this->decode($source->name);
+    }
+
+    /**
+     * decode base64 and urlencode
+     *
+     * @param string $string template_resource to decode
+     *
+     * @return string decoded template_resource
+     */
+    protected function decode($string)
+    {
+        // decode if specified
+        if (($pos = strpos($string, ':')) !== false) {
+            if (!strncmp($string, 'base64', 6)) {
+                return base64_decode(substr($string, 7));
+            } elseif (!strncmp($string, 'urlencode', 9)) {
+                return urldecode(substr($string, 10));
+            }
+        }
+        return $string;
+    }
+
+    /**
+     * modify resource_name according to resource handlers specifications
+     *
+     * @param Smarty  $smarty        Smarty instance
+     * @param string  $resource_name resource_name to make unique
+     * @param boolean $isConfig      flag for config resource
+     *
+     * @return string unique resource name
+     */
+    public function buildUniqueResourceName(Smarty $smarty, $resource_name, $isConfig = false)
+    {
+        return get_class($this) . '#' . $this->decode($resource_name);
+    }
+
+    /**
+     * Determine basename for compiled filename
+     * Always returns an empty string.
+     *
+     * @param Smarty_Template_Source $source source object
+     *
+     * @return string                 resource's basename
+     */
+    public function getBasename(Smarty_Template_Source $source)
+    {
+        return '';
+    }
+
+    /*
+        * Disable timestamp checks for string resource.
+        *
+        * @return bool
+        */
+    /**
+     * @return bool
+     */
+    public function checkTimestamps()
+    {
+        return false;
+    }
+}
diff --git a/sysplugins/smarty_internal_runtime_cachemodify.php b/sysplugins/smarty_internal_runtime_cachemodify.php
new file mode 100644
index 0000000000000000000000000000000000000000..6e12d2ae19aa005078eb9c094d7ce1bf331a3735
--- /dev/null
+++ b/sysplugins/smarty_internal_runtime_cachemodify.php
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * Inline Runtime Methods render, setSourceByUid, setupSubTemplate
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ **/
+class Smarty_Internal_Runtime_CacheModify
+{
+    /**
+     * check client side cache
+     *
+     * @param \Smarty_Template_Cached   $cached
+     * @param \Smarty_Internal_Template $_template
+     * @param string                    $content
+     *
+     * @throws \Exception
+     * @throws \SmartyException
+     */
+    public function cacheModifiedCheck(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template, $content)
+    {
+        $_isCached = $_template->isCached() && !$_template->compiled->has_nocache_code;
+        $_last_modified_date =
+            @substr($_SERVER[ 'HTTP_IF_MODIFIED_SINCE' ], 0, strpos($_SERVER[ 'HTTP_IF_MODIFIED_SINCE' ], 'GMT') + 3);
+        if ($_isCached && $cached->timestamp <= strtotime($_last_modified_date)) {
+            switch (PHP_SAPI) {
+                case 'cgi': // php-cgi < 5.3
+                case 'cgi-fcgi': // php-cgi >= 5.3
+                case 'fpm-fcgi': // php-fpm >= 5.3.3
+                    header('Status: 304 Not Modified');
+                    break;
+                case 'cli':
+                    if (/* ^phpunit */
+                    !empty($_SERVER[ 'SMARTY_PHPUNIT_DISABLE_HEADERS' ]) /* phpunit$ */
+                    ) {
+                        $_SERVER[ 'SMARTY_PHPUNIT_HEADERS' ][] = '304 Not Modified';
+                    }
+                    break;
+                default:
+                    if (/* ^phpunit */
+                    !empty($_SERVER[ 'SMARTY_PHPUNIT_DISABLE_HEADERS' ]) /* phpunit$ */
+                    ) {
+                        $_SERVER[ 'SMARTY_PHPUNIT_HEADERS' ][] = '304 Not Modified';
+                    } else {
+                        header($_SERVER[ 'SERVER_PROTOCOL' ] . ' 304 Not Modified');
+                    }
+                    break;
+            }
+        } else {
+            switch (PHP_SAPI) {
+                case 'cli':
+                    if (/* ^phpunit */
+                    !empty($_SERVER[ 'SMARTY_PHPUNIT_DISABLE_HEADERS' ]) /* phpunit$ */
+                    ) {
+                        $_SERVER[ 'SMARTY_PHPUNIT_HEADERS' ][] =
+                            'Last-Modified: ' . gmdate('D, d M Y H:i:s', $cached->timestamp) . ' GMT';
+                    }
+                    break;
+                default:
+                    header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $cached->timestamp) . ' GMT');
+                    break;
+            }
+            echo $content;
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_runtime_cacheresourcefile.php b/sysplugins/smarty_internal_runtime_cacheresourcefile.php
new file mode 100644
index 0000000000000000000000000000000000000000..2870964383418c34f54f8efc1bc796d0a052e2b4
--- /dev/null
+++ b/sysplugins/smarty_internal_runtime_cacheresourcefile.php
@@ -0,0 +1,139 @@
+<?php
+/**
+ * Smarty cache resource file clear method
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Runtime Cache Resource File Class
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ */
+class Smarty_Internal_Runtime_CacheResourceFile
+{
+    /**
+     * Empty cache for a specific template
+     *
+     * @param Smarty  $smarty
+     * @param string  $resource_name template name
+     * @param string  $cache_id      cache id
+     * @param string  $compile_id    compile id
+     * @param integer $exp_time      expiration time (number of seconds, not timestamp)
+     *
+     * @return integer number of cache files deleted
+     */
+    public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time)
+    {
+        $_cache_id = isset($cache_id) ? preg_replace('![^\w\|]+!', '_', $cache_id) : null;
+        $_compile_id = isset($compile_id) ? preg_replace('![^\w]+!', '_', $compile_id) : null;
+        $_dir_sep = $smarty->use_sub_dirs ? '/' : '^';
+        $_compile_id_offset = $smarty->use_sub_dirs ? 3 : 0;
+        $_dir = $smarty->getCacheDir();
+        if ($_dir === '/') { //We should never want to delete this!
+            return 0;
+        }
+        $_dir_length = strlen($_dir);
+        if (isset($_cache_id)) {
+            $_cache_id_parts = explode('|', $_cache_id);
+            $_cache_id_parts_count = count($_cache_id_parts);
+            if ($smarty->use_sub_dirs) {
+                foreach ($_cache_id_parts as $id_part) {
+                    $_dir .= $id_part . '/';
+                }
+            }
+        }
+        if (isset($resource_name)) {
+            $_save_stat = $smarty->caching;
+            $smarty->caching = Smarty::CACHING_LIFETIME_CURRENT;
+            $tpl = new $smarty->template_class($resource_name, $smarty);
+            $smarty->caching = $_save_stat;
+            // remove from template cache
+            $tpl->source; // have the template registered before unset()
+            if ($tpl->source->exists) {
+                $_resourcename_parts = basename(str_replace('^', '/', $tpl->cached->filepath));
+            } else {
+                return 0;
+            }
+        }
+        $_count = 0;
+        $_time = time();
+        if (file_exists($_dir)) {
+            $_cacheDirs = new RecursiveDirectoryIterator($_dir);
+            $_cache = new RecursiveIteratorIterator($_cacheDirs, RecursiveIteratorIterator::CHILD_FIRST);
+            foreach ($_cache as $_file) {
+                if (substr(basename($_file->getPathname()), 0, 1) === '.') {
+                    continue;
+                }
+                $_filepath = (string)$_file;
+                // directory ?
+                if ($_file->isDir()) {
+                    if (!$_cache->isDot()) {
+                        // delete folder if empty
+                        @rmdir($_file->getPathname());
+                    }
+                } else {
+                    // delete only php files
+                    if (substr($_filepath, -4) !== '.php') {
+                        continue;
+                    }
+                    $_parts = explode($_dir_sep, str_replace('\\', '/', substr($_filepath, $_dir_length)));
+                    $_parts_count = count($_parts);
+                    // check name
+                    if (isset($resource_name)) {
+                        if ($_parts[ $_parts_count - 1 ] !== $_resourcename_parts) {
+                            continue;
+                        }
+                    }
+                    // check compile id
+                    if (isset($_compile_id) && (!isset($_parts[ $_parts_count - 2 - $_compile_id_offset ])
+                                                || $_parts[ $_parts_count - 2 - $_compile_id_offset ] !== $_compile_id)
+                    ) {
+                        continue;
+                    }
+                    // check cache id
+                    if (isset($_cache_id)) {
+                        // count of cache id parts
+                        $_parts_count = (isset($_compile_id)) ? $_parts_count - 2 - $_compile_id_offset :
+                            $_parts_count - 1 - $_compile_id_offset;
+                        if ($_parts_count < $_cache_id_parts_count) {
+                            continue;
+                        }
+                        for ($i = 0; $i < $_cache_id_parts_count; $i++) {
+                            if ($_parts[ $i ] !== $_cache_id_parts[ $i ]) {
+                                continue 2;
+                            }
+                        }
+                    }
+                    if (is_file($_filepath)) {
+                        // expired ?
+                        if (isset($exp_time)) {
+                            if ($exp_time < 0) {
+                                preg_match('#\'cache_lifetime\' =>\s*(\d*)#', file_get_contents($_filepath), $match);
+                                if ($_time < (filemtime($_filepath) + $match[ 1 ])) {
+                                    continue;
+                                }
+                            } else {
+                                if ($_time - filemtime($_filepath) < $exp_time) {
+                                    continue;
+                                }
+                            }
+                        }
+                        $_count += @unlink($_filepath) ? 1 : 0;
+                        if (function_exists('opcache_invalidate')
+                            && (!function_exists('ini_get') || strlen(ini_get("opcache.restrict_api")) < 1)
+                        ) {
+                            opcache_invalidate($_filepath, true);
+                        } elseif (function_exists('apc_delete_file')) {
+                            apc_delete_file($_filepath);
+                        }
+                    }
+                }
+            }
+        }
+        return $_count;
+    }
+}
diff --git a/sysplugins/smarty_internal_runtime_capture.php b/sysplugins/smarty_internal_runtime_capture.php
new file mode 100644
index 0000000000000000000000000000000000000000..c9dca83d95fa3c5b7f2ce6033e5a92aed9fcffd6
--- /dev/null
+++ b/sysplugins/smarty_internal_runtime_capture.php
@@ -0,0 +1,174 @@
+<?php
+
+/**
+ * Runtime Extension Capture
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Runtime_Capture
+{
+    /**
+     * Flag that this instance  will not be cached
+     *
+     * @var bool
+     */
+    public $isPrivateExtension = true;
+
+    /**
+     * Stack of capture parameter
+     *
+     * @var array
+     */
+    private $captureStack = array();
+
+    /**
+     * Current open capture sections
+     *
+     * @var int
+     */
+    private $captureCount = 0;
+
+    /**
+     * Count stack
+     *
+     * @var int[]
+     */
+    private $countStack = array();
+
+    /**
+     * Named buffer
+     *
+     * @var string[]
+     */
+    private $namedBuffer = array();
+
+    /**
+     * Flag if callbacks are registered
+     *
+     * @var bool
+     */
+    private $isRegistered = false;
+
+    /**
+     * Open capture section
+     *
+     * @param \Smarty_Internal_Template $_template
+     * @param string                    $buffer capture name
+     * @param string                    $assign variable name
+     * @param string                    $append variable name
+     */
+    public function open(Smarty_Internal_Template $_template, $buffer, $assign, $append)
+    {
+        if (!$this->isRegistered) {
+            $this->register($_template);
+        }
+        $this->captureStack[] = array(
+            $buffer,
+            $assign,
+            $append
+        );
+        $this->captureCount++;
+        ob_start();
+    }
+
+    /**
+     * Register callbacks in template class
+     *
+     * @param \Smarty_Internal_Template $_template
+     */
+    private function register(Smarty_Internal_Template $_template)
+    {
+        $_template->startRenderCallbacks[] = array(
+            $this,
+            'startRender'
+        );
+        $_template->endRenderCallbacks[] = array(
+            $this,
+            'endRender'
+        );
+        $this->startRender($_template);
+        $this->isRegistered = true;
+    }
+
+    /**
+     * Start render callback
+     *
+     * @param \Smarty_Internal_Template $_template
+     */
+    public function startRender(Smarty_Internal_Template $_template)
+    {
+        $this->countStack[] = $this->captureCount;
+        $this->captureCount = 0;
+    }
+
+    /**
+     * Close capture section
+     *
+     * @param \Smarty_Internal_Template $_template
+     *
+     * @throws \SmartyException
+     */
+    public function close(Smarty_Internal_Template $_template)
+    {
+        if ($this->captureCount) {
+            list($buffer, $assign, $append) = array_pop($this->captureStack);
+            $this->captureCount--;
+            if (isset($assign)) {
+                $_template->assign($assign, ob_get_contents());
+            }
+            if (isset($append)) {
+                $_template->append($append, ob_get_contents());
+            }
+            $this->namedBuffer[ $buffer ] = ob_get_clean();
+        } else {
+            $this->error($_template);
+        }
+    }
+
+    /**
+     * Error exception on not matching {capture}{/capture}
+     *
+     * @param \Smarty_Internal_Template $_template
+     *
+     * @throws \SmartyException
+     */
+    public function error(Smarty_Internal_Template $_template)
+    {
+        throw new SmartyException("Not matching {capture}{/capture} in '{$_template->template_resource}'");
+    }
+
+    /**
+     * Return content of named capture buffer by key or as array
+     *
+     * @param \Smarty_Internal_Template $_template
+     * @param string|null               $name
+     *
+     * @return string|string[]|null
+     */
+    public function getBuffer(Smarty_Internal_Template $_template, $name = null)
+    {
+        if (isset($name)) {
+            return isset($this->namedBuffer[ $name ]) ? $this->namedBuffer[ $name ] : null;
+        } else {
+            return $this->namedBuffer;
+        }
+    }
+
+    /**
+     * End render callback
+     *
+     * @param \Smarty_Internal_Template $_template
+     *
+     * @throws \SmartyException
+     */
+    public function endRender(Smarty_Internal_Template $_template)
+    {
+        if ($this->captureCount) {
+            $this->error($_template);
+        } else {
+            $this->captureCount = array_pop($this->countStack);
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_runtime_codeframe.php b/sysplugins/smarty_internal_runtime_codeframe.php
new file mode 100644
index 0000000000000000000000000000000000000000..983ca6180fa065669e7c85bb60577e699266e092
--- /dev/null
+++ b/sysplugins/smarty_internal_runtime_codeframe.php
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Smarty Internal Extension
+ * This file contains the Smarty template extension to create a code frame
+ *
+ * @package    Smarty
+ * @subpackage Template
+ * @author     Uwe Tews
+ */
+
+/**
+ * Class Smarty_Internal_Extension_CodeFrame
+ * Create code frame for compiled and cached templates
+ */
+class Smarty_Internal_Runtime_CodeFrame
+{
+    /**
+     * Create code frame for compiled and cached templates
+     *
+     * @param Smarty_Internal_Template              $_template
+     * @param string                                $content   optional template content
+     * @param string                                $functions compiled template function and block code
+     * @param bool                                  $cache     flag for cache file
+     * @param \Smarty_Internal_TemplateCompilerBase $compiler
+     *
+     * @return string
+     */
+    public function create(
+        Smarty_Internal_Template $_template,
+        $content = '',
+        $functions = '',
+        $cache = false,
+        Smarty_Internal_TemplateCompilerBase $compiler = null
+    ) {
+        // build property code
+        $properties[ 'version' ] = Smarty::SMARTY_VERSION;
+        $properties[ 'unifunc' ] = 'content_' . str_replace(array('.', ','), '_', uniqid('', true));
+        if (!$cache) {
+            $properties[ 'has_nocache_code' ] = $_template->compiled->has_nocache_code;
+            $properties[ 'file_dependency' ] = $_template->compiled->file_dependency;
+            $properties[ 'includes' ] = $_template->compiled->includes;
+        } else {
+            $properties[ 'has_nocache_code' ] = $_template->cached->has_nocache_code;
+            $properties[ 'file_dependency' ] = $_template->cached->file_dependency;
+            $properties[ 'cache_lifetime' ] = $_template->cache_lifetime;
+        }
+        $output = "<?php\n";
+        $output .= "/* Smarty version {$properties[ 'version' ]}, created on " . strftime("%Y-%m-%d %H:%M:%S") .
+                   "\n  from '" . str_replace('*/', '* /', $_template->source->filepath) . "' */\n\n";
+        $output .= "/* @var Smarty_Internal_Template \$_smarty_tpl */\n";
+        $dec = "\$_smarty_tpl->_decodeProperties(\$_smarty_tpl, " . var_export($properties, true) . ',' .
+               ($cache ? 'true' : 'false') . ')';
+        $output .= "if ({$dec}) {\n";
+        $output .= "function {$properties['unifunc']} (Smarty_Internal_Template \$_smarty_tpl) {\n";
+        if (!$cache && !empty($compiler->tpl_function)) {
+            $output .= '$_smarty_tpl->smarty->ext->_tplFunction->registerTplFunctions($_smarty_tpl, ';
+            $output .= var_export($compiler->tpl_function, true);
+            $output .= ");\n";
+        }
+        if ($cache && isset($_template->smarty->ext->_tplFunction)) {
+            $output .= "\$_smarty_tpl->smarty->ext->_tplFunction->registerTplFunctions(\$_smarty_tpl, " .
+                       var_export($_template->smarty->ext->_tplFunction->getTplFunction($_template), true) . ");\n";
+        }
+        $output .= "?>";
+        $output .= $content;
+        $output .= "<?php }\n?>";
+        $output .= $functions;
+        $output .= "<?php }\n";
+        // remove unneeded PHP tags
+        if (preg_match('/\s*\?>[\n]?<\?php\s*/', $output)) {
+            $curr_split = preg_split(
+                '/\s*\?>[\n]?<\?php\s*/',
+                $output
+            );
+            preg_match_all(
+                '/\s*\?>[\n]?<\?php\s*/',
+                $output,
+                $curr_parts
+            );
+            $output = '';
+            foreach ($curr_split as $idx => $curr_output) {
+                $output .= $curr_output;
+                if (isset($curr_parts[ 0 ][ $idx ])) {
+                    $output .= "\n";
+                }
+            }
+        }
+        if (preg_match('/\?>\s*$/', $output)) {
+            $curr_split = preg_split(
+                '/\?>\s*$/',
+                $output
+            );
+            $output = '';
+            foreach ($curr_split as $idx => $curr_output) {
+                $output .= $curr_output;
+            }
+        }
+        return $output;
+    }
+}
diff --git a/sysplugins/smarty_internal_runtime_filterhandler.php b/sysplugins/smarty_internal_runtime_filterhandler.php
new file mode 100644
index 0000000000000000000000000000000000000000..9f868e1a40b1e0cff9f4c44d7d475d0805ab7f44
--- /dev/null
+++ b/sysplugins/smarty_internal_runtime_filterhandler.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Smarty Internal Plugin Filter Handler
+ * Smarty filter handler class
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+
+/**
+ * Class for filter processing
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ */
+class Smarty_Internal_Runtime_FilterHandler
+{
+    /**
+     * Run filters over content
+     * The filters will be lazy loaded if required
+     * class name format: Smarty_FilterType_FilterName
+     * plugin filename format: filtertype.filtername.php
+     * Smarty2 filter plugins could be used
+     *
+     * @param string                   $type     the type of filter ('pre','post','output') which shall run
+     * @param string                   $content  the content which shall be processed by the filters
+     * @param Smarty_Internal_Template $template template object
+     *
+     * @throws SmartyException
+     * @return string                   the filtered content
+     */
+    public function runFilter($type, $content, Smarty_Internal_Template $template)
+    {
+        // loop over autoload filters of specified type
+        if (!empty($template->smarty->autoload_filters[ $type ])) {
+            foreach ((array)$template->smarty->autoload_filters[ $type ] as $name) {
+                $plugin_name = "Smarty_{$type}filter_{$name}";
+                if (function_exists($plugin_name)) {
+                    $callback = $plugin_name;
+                } elseif (class_exists($plugin_name, false) && is_callable(array($plugin_name, 'execute'))) {
+                    $callback = array($plugin_name, 'execute');
+                } elseif ($template->smarty->loadPlugin($plugin_name, false)) {
+                    if (function_exists($plugin_name)) {
+                        // use loaded Smarty2 style plugin
+                        $callback = $plugin_name;
+                    } elseif (class_exists($plugin_name, false) && is_callable(array($plugin_name, 'execute'))) {
+                        // loaded class of filter plugin
+                        $callback = array($plugin_name, 'execute');
+                    } else {
+                        throw new SmartyException("Auto load {$type}-filter plugin method '{$plugin_name}::execute' not callable");
+                    }
+                } else {
+                    // nothing found, throw exception
+                    throw new SmartyException("Unable to auto load {$type}-filter plugin '{$plugin_name}'");
+                }
+                $content = call_user_func($callback, $content, $template);
+            }
+        }
+        // loop over registered filters of specified type
+        if (!empty($template->smarty->registered_filters[ $type ])) {
+            foreach ($template->smarty->registered_filters[ $type ] as $key => $name) {
+                $content = call_user_func($template->smarty->registered_filters[ $type ][ $key ], $content, $template);
+            }
+        }
+        // return filtered output
+        return $content;
+    }
+}
diff --git a/sysplugins/smarty_internal_runtime_foreach.php b/sysplugins/smarty_internal_runtime_foreach.php
new file mode 100644
index 0000000000000000000000000000000000000000..badead16545f88007efd7b56f2989029bad9a76c
--- /dev/null
+++ b/sysplugins/smarty_internal_runtime_foreach.php
@@ -0,0 +1,162 @@
+<?php
+
+/**
+ * Foreach Runtime Methods count(), init(), restore()
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Runtime_Foreach
+{
+    /**
+     * Stack of saved variables
+     *
+     * @var array
+     */
+    private $stack = array();
+
+    /**
+     * Init foreach loop
+     *  - save item and key variables, named foreach property data if defined
+     *  - init item and key variables, named foreach property data if required
+     *  - count total if required
+     *
+     * @param \Smarty_Internal_Template $tpl
+     * @param mixed                     $from       values to loop over
+     * @param string                    $item       variable name
+     * @param bool                      $needTotal  flag if we need to count values
+     * @param null|string               $key        variable name
+     * @param null|string               $name       of named foreach
+     * @param array                     $properties of named foreach
+     *
+     * @return mixed $from
+     */
+    public function init(
+        Smarty_Internal_Template $tpl,
+        $from,
+        $item,
+        $needTotal = false,
+        $key = null,
+        $name = null,
+        $properties = array()
+    ) {
+        $needTotal = $needTotal || isset($properties[ 'total' ]);
+        $saveVars = array();
+        $total = null;
+        if (!is_array($from)) {
+            if (is_object($from)) {
+                if ($needTotal) {
+                    $total = $this->count($from);
+                }
+            } else {
+                settype($from, 'array');
+            }
+        }
+        if (!isset($total)) {
+            $total = empty($from) ? 0 : ($needTotal ? count($from) : 1);
+        }
+        if (isset($tpl->tpl_vars[ $item ])) {
+            $saveVars[ 'item' ] = array(
+                $item,
+                $tpl->tpl_vars[ $item ]
+            );
+        }
+        $tpl->tpl_vars[ $item ] = new Smarty_Variable(null, $tpl->isRenderingCache);
+        if ($total === 0) {
+            $from = null;
+        } else {
+            if ($key) {
+                if (isset($tpl->tpl_vars[ $key ])) {
+                    $saveVars[ 'key' ] = array(
+                        $key,
+                        $tpl->tpl_vars[ $key ]
+                    );
+                }
+                $tpl->tpl_vars[ $key ] = new Smarty_Variable(null, $tpl->isRenderingCache);
+            }
+        }
+        if ($needTotal) {
+            $tpl->tpl_vars[ $item ]->total = $total;
+        }
+        if ($name) {
+            $namedVar = "__smarty_foreach_{$name}";
+            if (isset($tpl->tpl_vars[ $namedVar ])) {
+                $saveVars[ 'named' ] = array(
+                    $namedVar,
+                    $tpl->tpl_vars[ $namedVar ]
+                );
+            }
+            $namedProp = array();
+            if (isset($properties[ 'total' ])) {
+                $namedProp[ 'total' ] = $total;
+            }
+            if (isset($properties[ 'iteration' ])) {
+                $namedProp[ 'iteration' ] = 0;
+            }
+            if (isset($properties[ 'index' ])) {
+                $namedProp[ 'index' ] = -1;
+            }
+            if (isset($properties[ 'show' ])) {
+                $namedProp[ 'show' ] = ($total > 0);
+            }
+            $tpl->tpl_vars[ $namedVar ] = new Smarty_Variable($namedProp);
+        }
+        $this->stack[] = $saveVars;
+        return $from;
+    }
+
+    /**
+     * [util function] counts an array, arrayAccess/traversable or PDOStatement object
+     *
+     * @param mixed $value
+     *
+     * @return int   the count for arrays and objects that implement countable, 1 for other objects that don't, and 0
+     *               for empty elements
+     */
+    public function count($value)
+    {
+        if ($value instanceof IteratorAggregate) {
+            // Note: getIterator() returns a Traversable, not an Iterator
+            // thus rewind() and valid() methods may not be present
+            return iterator_count($value->getIterator());
+        } elseif ($value instanceof Iterator) {
+            return $value instanceof Generator ? 1 : iterator_count($value);
+        } elseif ($value instanceof Countable) {
+            return count($value);
+        } elseif ($value instanceof PDOStatement) {
+            return $value->rowCount();
+        } elseif ($value instanceof Traversable) {
+            return iterator_count($value);
+        }
+        return count((array)$value);
+    }
+
+    /**
+     * Restore saved variables
+     *
+     * will be called by {break n} or {continue n} for the required number of levels
+     *
+     * @param \Smarty_Internal_Template $tpl
+     * @param int                       $levels number of levels
+     */
+    public function restore(Smarty_Internal_Template $tpl, $levels = 1)
+    {
+        while ($levels) {
+            $saveVars = array_pop($this->stack);
+            if (!empty($saveVars)) {
+                if (isset($saveVars[ 'item' ])) {
+                    $item = &$saveVars[ 'item' ];
+                    $tpl->tpl_vars[ $item[ 0 ] ]->value = $item[ 1 ]->value;
+                }
+                if (isset($saveVars[ 'key' ])) {
+                    $tpl->tpl_vars[ $saveVars[ 'key' ][ 0 ] ] = $saveVars[ 'key' ][ 1 ];
+                }
+                if (isset($saveVars[ 'named' ])) {
+                    $tpl->tpl_vars[ $saveVars[ 'named' ][ 0 ] ] = $saveVars[ 'named' ][ 1 ];
+                }
+            }
+            $levels--;
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_runtime_getincludepath.php b/sysplugins/smarty_internal_runtime_getincludepath.php
new file mode 100644
index 0000000000000000000000000000000000000000..5ae98304ea10a71bf54588473ef0af572ad4b677
--- /dev/null
+++ b/sysplugins/smarty_internal_runtime_getincludepath.php
@@ -0,0 +1,181 @@
+<?php
+/**
+ * Smarty read include path plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Monte Ohrt
+ */
+
+/**
+ * Smarty Internal Read Include Path Class
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ */
+class Smarty_Internal_Runtime_GetIncludePath
+{
+    /**
+     * include path cache
+     *
+     * @var string
+     */
+    public $_include_path = '';
+
+    /**
+     * include path directory cache
+     *
+     * @var array
+     */
+    public $_include_dirs = array();
+
+    /**
+     * include path directory cache
+     *
+     * @var array
+     */
+    public $_user_dirs = array();
+
+    /**
+     * stream cache
+     *
+     * @var string[][]
+     */
+    public $isFile = array();
+
+    /**
+     * stream cache
+     *
+     * @var string[]
+     */
+    public $isPath = array();
+
+    /**
+     * stream cache
+     *
+     * @var int[]
+     */
+    public $number = array();
+
+    /**
+     * status cache
+     *
+     * @var bool
+     */
+    public $_has_stream_include = null;
+
+    /**
+     * Number for array index
+     *
+     * @var int
+     */
+    public $counter = 0;
+
+    /**
+     * Check if include path was updated
+     *
+     * @param \Smarty $smarty
+     *
+     * @return bool
+     */
+    public function isNewIncludePath(Smarty $smarty)
+    {
+        $_i_path = get_include_path();
+        if ($this->_include_path !== $_i_path) {
+            $this->_include_dirs = array();
+            $this->_include_path = $_i_path;
+            $_dirs = (array)explode(PATH_SEPARATOR, $_i_path);
+            foreach ($_dirs as $_path) {
+                if (is_dir($_path)) {
+                    $this->_include_dirs[] = $smarty->_realpath($_path . DIRECTORY_SEPARATOR, true);
+                }
+            }
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * return array with include path directories
+     *
+     * @param \Smarty $smarty
+     *
+     * @return array
+     */
+    public function getIncludePathDirs(Smarty $smarty)
+    {
+        $this->isNewIncludePath($smarty);
+        return $this->_include_dirs;
+    }
+
+    /**
+     * Return full file path from PHP include_path
+     *
+     * @param string[] $dirs
+     * @param string   $file
+     * @param \Smarty  $smarty
+     *
+     * @return bool|string full filepath or false
+     */
+    public function getIncludePath($dirs, $file, Smarty $smarty)
+    {
+        //if (!(isset($this->_has_stream_include) ? $this->_has_stream_include : $this->_has_stream_include = false)) {
+        if (!(isset($this->_has_stream_include) ? $this->_has_stream_include :
+            $this->_has_stream_include = function_exists('stream_resolve_include_path'))
+        ) {
+            $this->isNewIncludePath($smarty);
+        }
+        // try PHP include_path
+        foreach ($dirs as $dir) {
+            $dir_n = isset($this->number[ $dir ]) ? $this->number[ $dir ] : $this->number[ $dir ] = $this->counter++;
+            if (isset($this->isFile[ $dir_n ][ $file ])) {
+                if ($this->isFile[ $dir_n ][ $file ]) {
+                    return $this->isFile[ $dir_n ][ $file ];
+                } else {
+                    continue;
+                }
+            }
+            if (isset($this->_user_dirs[ $dir_n ])) {
+                if (false === $this->_user_dirs[ $dir_n ]) {
+                    continue;
+                } else {
+                    $dir = $this->_user_dirs[ $dir_n ];
+                }
+            } else {
+                if ($dir[ 0 ] === '/' || $dir[ 1 ] === ':') {
+                    $dir = str_ireplace(getcwd(), '.', $dir);
+                    if ($dir[ 0 ] === '/' || $dir[ 1 ] === ':') {
+                        $this->_user_dirs[ $dir_n ] = false;
+                        continue;
+                    }
+                }
+                $dir = substr($dir, 2);
+                $this->_user_dirs[ $dir_n ] = $dir;
+            }
+            if ($this->_has_stream_include) {
+                $path = stream_resolve_include_path($dir . (isset($file) ? $file : ''));
+                if ($path) {
+                    return $this->isFile[ $dir_n ][ $file ] = $path;
+                }
+            } else {
+                foreach ($this->_include_dirs as $key => $_i_path) {
+                    $path = isset($this->isPath[ $key ][ $dir_n ]) ? $this->isPath[ $key ][ $dir_n ] :
+                        $this->isPath[ $key ][ $dir_n ] = is_dir($_dir_path = $_i_path . $dir) ? $_dir_path : false;
+                    if ($path === false) {
+                        continue;
+                    }
+                    if (isset($file)) {
+                        $_file = $this->isFile[ $dir_n ][ $file ] = (is_file($path . $file)) ? $path . $file : false;
+                        if ($_file) {
+                            return $_file;
+                        }
+                    } else {
+                        // no file was given return directory path
+                        return $path;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+}
diff --git a/sysplugins/smarty_internal_runtime_inheritance.php b/sysplugins/smarty_internal_runtime_inheritance.php
new file mode 100644
index 0000000000000000000000000000000000000000..8f7f02d59b5e90d80e4294a18d50dd901a1a3948
--- /dev/null
+++ b/sysplugins/smarty_internal_runtime_inheritance.php
@@ -0,0 +1,251 @@
+<?php
+
+/**
+ * Inheritance Runtime Methods processBlock, endChild, init
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ **/
+class Smarty_Internal_Runtime_Inheritance
+{
+    /**
+     * State machine
+     * - 0 idle next extends will create a new inheritance tree
+     * - 1 processing child template
+     * - 2 wait for next inheritance template
+     * - 3 assume parent template, if child will loaded goto state 1
+     *     a call to a sub template resets the state to 0
+     *
+     * @var int
+     */
+    public $state = 0;
+
+    /**
+     * Array of root child {block} objects
+     *
+     * @var Smarty_Internal_Block[]
+     */
+    public $childRoot = array();
+
+    /**
+     * inheritance template nesting level
+     *
+     * @var int
+     */
+    public $inheritanceLevel = 0;
+
+    /**
+     * inheritance template index
+     *
+     * @var int
+     */
+    public $tplIndex = -1;
+
+    /**
+     * Array of template source objects
+     *
+     * @var Smarty_Template_Source[]
+     */
+    public $sources = array();
+
+    /**
+     * Stack of source objects while executing block code
+     *
+     * @var Smarty_Template_Source[]
+     */
+    public $sourceStack = array();
+
+    /**
+     * Initialize inheritance
+     *
+     * @param \Smarty_Internal_Template $tpl        template object of caller
+     * @param bool                      $initChild  if true init for child template
+     * @param array                     $blockNames outer level block name
+     */
+    public function init(Smarty_Internal_Template $tpl, $initChild, $blockNames = array())
+    {
+        // if called while executing parent template it must be a sub-template with new inheritance root
+        if ($initChild && $this->state === 3 && (strpos($tpl->template_resource, 'extendsall') === false)) {
+            $tpl->inheritance = new Smarty_Internal_Runtime_Inheritance();
+            $tpl->inheritance->init($tpl, $initChild, $blockNames);
+            return;
+        }
+        ++$this->tplIndex;
+        $this->sources[ $this->tplIndex ] = $tpl->source;
+        // start of child sub template(s)
+        if ($initChild) {
+            $this->state = 1;
+            if (!$this->inheritanceLevel) {
+                //grab any output of child templates
+                ob_start();
+            }
+            ++$this->inheritanceLevel;
+            //           $tpl->startRenderCallbacks[ 'inheritance' ] = array($this, 'subTemplateStart');
+            //           $tpl->endRenderCallbacks[ 'inheritance' ] = array($this, 'subTemplateEnd');
+        }
+        // if state was waiting for parent change state to parent
+        if ($this->state === 2) {
+            $this->state = 3;
+        }
+    }
+
+    /**
+     * End of child template(s)
+     * - if outer level is reached flush output buffer and switch to wait for parent template state
+     *
+     * @param \Smarty_Internal_Template $tpl
+     * @param null|string               $template optional name of inheritance parent template
+     * @param null|string               $uid      uid of inline template
+     * @param null|string               $func     function call name of inline template
+     *
+     * @throws \Exception
+     * @throws \SmartyException
+     */
+    public function endChild(Smarty_Internal_Template $tpl, $template = null, $uid = null, $func = null)
+    {
+        --$this->inheritanceLevel;
+        if (!$this->inheritanceLevel) {
+            ob_end_clean();
+            $this->state = 2;
+        }
+        if (isset($template) && (($tpl->parent->_isTplObj() && $tpl->parent->source->type !== 'extends')
+                                 || $tpl->smarty->extends_recursion)
+        ) {
+            $tpl->_subTemplateRender(
+                $template,
+                $tpl->cache_id,
+                $tpl->compile_id,
+                $tpl->caching ? 9999 : 0,
+                $tpl->cache_lifetime,
+                array(),
+                2,
+                false,
+                $uid,
+                $func
+            );
+        }
+    }
+
+    /**
+     * Smarty_Internal_Block constructor.
+     * - if outer level {block} of child template ($state === 1) save it as child root block
+     * - otherwise process inheritance and render
+     *
+     * @param \Smarty_Internal_Template $tpl
+     * @param                           $className
+     * @param string                    $name
+     * @param int|null                  $tplIndex index of outer level {block} if nested
+     *
+     * @throws \SmartyException
+     */
+    public function instanceBlock(Smarty_Internal_Template $tpl, $className, $name, $tplIndex = null)
+    {
+        $block = new $className($name, isset($tplIndex) ? $tplIndex : $this->tplIndex);
+        if (isset($this->childRoot[ $name ])) {
+            $block->child = $this->childRoot[ $name ];
+        }
+        if ($this->state === 1) {
+            $this->childRoot[ $name ] = $block;
+            return;
+        }
+        // make sure we got child block of child template of current block
+        while ($block->child && $block->child->child && $block->tplIndex <= $block->child->tplIndex) {
+            $block->child = $block->child->child;
+        }
+        $this->process($tpl, $block);
+    }
+
+    /**
+     * Goto child block or render this
+     *
+     * @param \Smarty_Internal_Template   $tpl
+     * @param \Smarty_Internal_Block      $block
+     * @param \Smarty_Internal_Block|null $parent
+     *
+     * @throws \SmartyException
+     */
+    public function process(
+        Smarty_Internal_Template $tpl,
+        Smarty_Internal_Block $block,
+        Smarty_Internal_Block $parent = null
+    ) {
+        if ($block->hide && !isset($block->child)) {
+            return;
+        }
+        if (isset($block->child) && $block->child->hide && !isset($block->child->child)) {
+            $block->child = null;
+        }
+        $block->parent = $parent;
+        if ($block->append && !$block->prepend && isset($parent)) {
+            $this->callParent($tpl, $block, '\'{block append}\'');
+        }
+        if ($block->callsChild || !isset($block->child) || ($block->child->hide && !isset($block->child->child))) {
+            $this->callBlock($block, $tpl);
+        } else {
+            $this->process($tpl, $block->child, $block);
+        }
+        if ($block->prepend && isset($parent)) {
+            $this->callParent($tpl, $block, '{block prepend}');
+            if ($block->append) {
+                if ($block->callsChild || !isset($block->child)
+                    || ($block->child->hide && !isset($block->child->child))
+                ) {
+                    $this->callBlock($block, $tpl);
+                } else {
+                    $this->process($tpl, $block->child, $block);
+                }
+            }
+        }
+        $block->parent = null;
+    }
+
+    /**
+     * Render child on \$smarty.block.child
+     *
+     * @param \Smarty_Internal_Template $tpl
+     * @param \Smarty_Internal_Block    $block
+     *
+     * @return null|string block content
+     * @throws \SmartyException
+     */
+    public function callChild(Smarty_Internal_Template $tpl, Smarty_Internal_Block $block)
+    {
+        if (isset($block->child)) {
+            $this->process($tpl, $block->child, $block);
+        }
+    }
+
+    /**
+     * Render parent block on \$smarty.block.parent or {block append/prepend}
+     *
+     * @param \Smarty_Internal_Template $tpl
+     * @param \Smarty_Internal_Block    $block
+     * @param string                    $tag
+     *
+     * @return null|string  block content
+     * @throws \SmartyException
+     */
+    public function callParent(Smarty_Internal_Template $tpl, Smarty_Internal_Block $block, $tag)
+    {
+        if (isset($block->parent)) {
+            $this->callBlock($block->parent, $tpl);
+        } else {
+            throw new SmartyException("inheritance: illegal '{$tag}' used in child template '{$tpl->inheritance->sources[$block->tplIndex]->filepath}' block '{$block->name}'");
+        }
+    }
+
+    /**
+     * render block
+     *
+     * @param \Smarty_Internal_Block    $block
+     * @param \Smarty_Internal_Template $tpl
+     */
+    public function callBlock(Smarty_Internal_Block $block, Smarty_Internal_Template $tpl)
+    {
+        $this->sourceStack[] = $tpl->source;
+        $tpl->source = $this->sources[ $block->tplIndex ];
+        $block->callBlock($tpl);
+        $tpl->source = array_pop($this->sourceStack);
+    }
+}
diff --git a/sysplugins/smarty_internal_runtime_make_nocache.php b/sysplugins/smarty_internal_runtime_make_nocache.php
new file mode 100644
index 0000000000000000000000000000000000000000..53069148ddda1bbb0cafb709936a402800d677c5
--- /dev/null
+++ b/sysplugins/smarty_internal_runtime_make_nocache.php
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * {make_nocache} Runtime Methods save(), store()
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Runtime_Make_Nocache
+{
+    /**
+     * Save current variable value while rendering compiled template and inject nocache code to
+     * assign variable value in cahed template
+     *
+     * @param \Smarty_Internal_Template $tpl
+     * @param string                    $var variable name
+     *
+     * @throws \SmartyException
+     */
+    public function save(Smarty_Internal_Template $tpl, $var)
+    {
+        if (isset($tpl->tpl_vars[ $var ])) {
+            $export =
+                preg_replace('/^Smarty_Variable::__set_state[(]|[)]$/', '', var_export($tpl->tpl_vars[ $var ], true));
+            if (preg_match('/(\w+)::__set_state/', $export, $match)) {
+                throw new SmartyException("{make_nocache \${$var}} in template '{$tpl->source->name}': variable does contain object '{$match[1]}' not implementing method '__set_state'");
+            }
+            echo "/*%%SmartyNocache:{$tpl->compiled->nocache_hash}%%*/<?php " .
+                 addcslashes("\$_smarty_tpl->smarty->ext->_make_nocache->store(\$_smarty_tpl, '{$var}', ", '\\') .
+                 $export . ");?>\n/*/%%SmartyNocache:{$tpl->compiled->nocache_hash}%%*/";
+        }
+    }
+
+    /**
+     * Store variable value saved while rendering compiled template in cached template context
+     *
+     * @param \Smarty_Internal_Template $tpl
+     * @param string                    $var variable name
+     * @param array                     $properties
+     */
+    public function store(Smarty_Internal_Template $tpl, $var, $properties)
+    {
+        // do not overwrite existing nocache variables
+        if (!isset($tpl->tpl_vars[ $var ]) || !$tpl->tpl_vars[ $var ]->nocache) {
+            $newVar = new Smarty_Variable();
+            unset($properties[ 'nocache' ]);
+            foreach ($properties as $k => $v) {
+                $newVar->$k = $v;
+            }
+            $tpl->tpl_vars[ $var ] = $newVar;
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_runtime_tplfunction.php b/sysplugins/smarty_internal_runtime_tplfunction.php
new file mode 100644
index 0000000000000000000000000000000000000000..e5f8e48f7929e4e1dc4f228e8153f2893ad82441
--- /dev/null
+++ b/sysplugins/smarty_internal_runtime_tplfunction.php
@@ -0,0 +1,177 @@
+<?php
+
+/**
+ * TplFunction Runtime Methods callTemplateFunction
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ **/
+class Smarty_Internal_Runtime_TplFunction
+{
+    /**
+     * Call template function
+     *
+     * @param \Smarty_Internal_Template $tpl     template object
+     * @param string                    $name    template function name
+     * @param array                     $params  parameter array
+     * @param bool                      $nocache true if called nocache
+     *
+     * @throws \SmartyException
+     */
+    public function callTemplateFunction(Smarty_Internal_Template $tpl, $name, $params, $nocache)
+    {
+        $funcParam = isset($tpl->tplFunctions[ $name ]) ? $tpl->tplFunctions[ $name ] :
+            (isset($tpl->smarty->tplFunctions[ $name ]) ? $tpl->smarty->tplFunctions[ $name ] : null);
+        if (isset($funcParam)) {
+            if (!$tpl->caching || ($tpl->caching && $nocache)) {
+                $function = $funcParam[ 'call_name' ];
+            } else {
+                if (isset($funcParam[ 'call_name_caching' ])) {
+                    $function = $funcParam[ 'call_name_caching' ];
+                } else {
+                    $function = $funcParam[ 'call_name' ];
+                }
+            }
+            if (function_exists($function)) {
+                $this->saveTemplateVariables($tpl, $name);
+                $function($tpl, $params);
+                $this->restoreTemplateVariables($tpl, $name);
+                return;
+            }
+            // try to load template function dynamically
+            if ($this->addTplFuncToCache($tpl, $name, $function)) {
+                $this->saveTemplateVariables($tpl, $name);
+                $function($tpl, $params);
+                $this->restoreTemplateVariables($tpl, $name);
+                return;
+            }
+        }
+        throw new SmartyException("Unable to find template function '{$name}'");
+    }
+
+    /**
+     * Register template functions defined by template
+     *
+     * @param \Smarty|\Smarty_Internal_Template|\Smarty_Internal_TemplateBase $obj
+     * @param array                                                           $tplFunctions source information array of
+     *                                                                                      template functions defined
+     *                                                                                      in template
+     * @param bool                                                            $override     if true replace existing
+     *                                                                                      functions with same name
+     */
+    public function registerTplFunctions(Smarty_Internal_TemplateBase $obj, $tplFunctions, $override = true)
+    {
+        $obj->tplFunctions =
+            $override ? array_merge($obj->tplFunctions, $tplFunctions) : array_merge($tplFunctions, $obj->tplFunctions);
+        // make sure that the template functions are known in parent templates
+        if ($obj->_isSubTpl()) {
+            $obj->smarty->ext->_tplFunction->registerTplFunctions($obj->parent, $tplFunctions, false);
+        } else {
+            $obj->smarty->tplFunctions = $override ? array_merge($obj->smarty->tplFunctions, $tplFunctions) :
+                array_merge($tplFunctions, $obj->smarty->tplFunctions);
+        }
+    }
+
+    /**
+     * Return source parameter array for single or all template functions
+     *
+     * @param \Smarty_Internal_Template $tpl  template object
+     * @param null|string               $name template function name
+     *
+     * @return array|bool|mixed
+     */
+    public function getTplFunction(Smarty_Internal_Template $tpl, $name = null)
+    {
+        if (isset($name)) {
+            return isset($tpl->tplFunctions[ $name ]) ? $tpl->tplFunctions[ $name ] :
+                (isset($tpl->smarty->tplFunctions[ $name ]) ? $tpl->smarty->tplFunctions[ $name ] : false);
+        } else {
+            return empty($tpl->tplFunctions) ? $tpl->smarty->tplFunctions : $tpl->tplFunctions;
+        }
+    }
+
+    /**
+     * Add template function to cache file for nocache calls
+     *
+     * @param Smarty_Internal_Template $tpl
+     * @param string                   $_name     template function name
+     * @param string                   $_function PHP function name
+     *
+     * @return bool
+     */
+    public function addTplFuncToCache(Smarty_Internal_Template $tpl, $_name, $_function)
+    {
+        $funcParam = $tpl->tplFunctions[ $_name ];
+        if (is_file($funcParam[ 'compiled_filepath' ])) {
+            // read compiled file
+            $code = file_get_contents($funcParam[ 'compiled_filepath' ]);
+            // grab template function
+            if (preg_match("/\/\* {$_function} \*\/([\S\s]*?)\/\*\/ {$_function} \*\//", $code, $match)) {
+                // grab source info from file dependency
+                preg_match("/\s*'{$funcParam['uid']}'([\S\s]*?)\),/", $code, $match1);
+                unset($code);
+                // make PHP function known
+                eval($match[ 0 ]);
+                if (function_exists($_function)) {
+                    // search cache file template
+                    $tplPtr = $tpl;
+                    while (!isset($tplPtr->cached) && isset($tplPtr->parent)) {
+                        $tplPtr = $tplPtr->parent;
+                    }
+                    // add template function code to cache file
+                    if (isset($tplPtr->cached)) {
+                        $content = $tplPtr->cached->read($tplPtr);
+                        if ($content) {
+                            // check if we must update file dependency
+                            if (!preg_match("/'{$funcParam['uid']}'(.*?)'nocache_hash'/", $content, $match2)) {
+                                $content = preg_replace("/('file_dependency'(.*?)\()/", "\\1{$match1[0]}", $content);
+                            }
+                            $tplPtr->smarty->ext->_updateCache->write(
+                                $tplPtr,
+                                preg_replace('/\s*\?>\s*$/', "\n", $content) .
+                                "\n" . preg_replace(
+                                    array(
+                                        '/^\s*<\?php\s+/',
+                                        '/\s*\?>\s*$/',
+                                    ),
+                                    "\n",
+                                    $match[ 0 ]
+                                )
+                            );
+                        }
+                    }
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Save current template variables on stack
+     *
+     * @param \Smarty_Internal_Template $tpl
+     * @param string                    $name stack name
+     */
+    public function saveTemplateVariables(Smarty_Internal_Template $tpl, $name)
+    {
+        $tpl->_cache[ 'varStack' ][] =
+            array('tpl' => $tpl->tpl_vars, 'config' => $tpl->config_vars, 'name' => "_tplFunction_{$name}");
+    }
+
+    /**
+     * Restore saved variables into template objects
+     *
+     * @param \Smarty_Internal_Template $tpl
+     * @param string                    $name stack name
+     */
+    public function restoreTemplateVariables(Smarty_Internal_Template $tpl, $name)
+    {
+        if (isset($tpl->_cache[ 'varStack' ])) {
+            $vars = array_pop($tpl->_cache[ 'varStack' ]);
+            $tpl->tpl_vars = $vars[ 'tpl' ];
+            $tpl->config_vars = $vars[ 'config' ];
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_runtime_updatecache.php b/sysplugins/smarty_internal_runtime_updatecache.php
new file mode 100644
index 0000000000000000000000000000000000000000..c1abbb321a0e2ee13dcaca52e2f1442ec7bd13ea
--- /dev/null
+++ b/sysplugins/smarty_internal_runtime_updatecache.php
@@ -0,0 +1,183 @@
+<?php
+
+/**
+ * Inline Runtime Methods render, setSourceByUid, setupSubTemplate
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ **/
+class Smarty_Internal_Runtime_UpdateCache
+{
+    /**
+     * check client side cache
+     *
+     * @param \Smarty_Template_Cached  $cached
+     * @param Smarty_Internal_Template $_template
+     * @param string                   $content
+     */
+    public function cacheModifiedCheck(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template, $content)
+    {
+    }
+
+    /**
+     * Cache was invalid , so render from compiled and write to cache
+     *
+     * @param \Smarty_Template_Cached   $cached
+     * @param \Smarty_Internal_Template $_template
+     * @param                           $no_output_filter
+     *
+     * @throws \Exception
+     */
+    public function updateCache(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template, $no_output_filter)
+    {
+        ob_start();
+        if (!isset($_template->compiled)) {
+            $_template->loadCompiled();
+        }
+        $_template->compiled->render($_template);
+        if ($_template->smarty->debugging) {
+            $_template->smarty->_debug->start_cache($_template);
+        }
+        $this->removeNoCacheHash($cached, $_template, $no_output_filter);
+        $compile_check = (int)$_template->compile_check;
+        $_template->compile_check = Smarty::COMPILECHECK_OFF;
+        if ($_template->_isSubTpl()) {
+            $_template->compiled->unifunc = $_template->parent->compiled->unifunc;
+        }
+        if (!$_template->cached->processed) {
+            $_template->cached->process($_template, true);
+        }
+        $_template->compile_check = $compile_check;
+        $cached->getRenderedTemplateCode($_template);
+        if ($_template->smarty->debugging) {
+            $_template->smarty->_debug->end_cache($_template);
+        }
+    }
+
+    /**
+     * Sanitize content and write it to cache resource
+     *
+     * @param \Smarty_Template_Cached  $cached
+     * @param Smarty_Internal_Template $_template
+     * @param bool                     $no_output_filter
+     *
+     * @throws \SmartyException
+     */
+    public function removeNoCacheHash(
+        Smarty_Template_Cached $cached,
+        Smarty_Internal_Template $_template,
+        $no_output_filter
+    ) {
+        $php_pattern = '/(<%|%>|<\?php|<\?|\?>|<script\s+language\s*=\s*[\"\']?\s*php\s*[\"\']?\s*>)/';
+        $content = ob_get_clean();
+        $hash_array = $cached->hashes;
+        $hash_array[ $_template->compiled->nocache_hash ] = true;
+        $hash_array = array_keys($hash_array);
+        $nocache_hash = '(' . implode('|', $hash_array) . ')';
+        $_template->cached->has_nocache_code = false;
+        // get text between non-cached items
+        $cache_split =
+            preg_split(
+                "!/\*%%SmartyNocache:{$nocache_hash}%%\*\/(.+?)/\*/%%SmartyNocache:{$nocache_hash}%%\*/!s",
+                $content
+            );
+        // get non-cached items
+        preg_match_all(
+            "!/\*%%SmartyNocache:{$nocache_hash}%%\*\/(.+?)/\*/%%SmartyNocache:{$nocache_hash}%%\*/!s",
+            $content,
+            $cache_parts
+        );
+        $content = '';
+        // loop over items, stitch back together
+        foreach ($cache_split as $curr_idx => $curr_split) {
+            if (preg_match($php_pattern, $curr_split)) {
+                // escape PHP tags in template content
+                $php_split = preg_split(
+                    $php_pattern,
+                    $curr_split
+                );
+                preg_match_all(
+                    $php_pattern,
+                    $curr_split,
+                    $php_parts
+                );
+                foreach ($php_split as $idx_php => $curr_php) {
+                    $content .= $curr_php;
+                    if (isset($php_parts[ 0 ][ $idx_php ])) {
+                        $content .= "<?php echo '{$php_parts[ 1 ][ $idx_php ]}'; ?>\n";
+                    }
+                }
+            } else {
+                $content .= $curr_split;
+            }
+            if (isset($cache_parts[ 0 ][ $curr_idx ])) {
+                $_template->cached->has_nocache_code = true;
+                $content .= $cache_parts[ 2 ][ $curr_idx ];
+            }
+        }
+        if (!$no_output_filter && !$_template->cached->has_nocache_code
+            && (isset($_template->smarty->autoload_filters[ 'output' ])
+                || isset($_template->smarty->registered_filters[ 'output' ]))
+        ) {
+            $content = $_template->smarty->ext->_filterHandler->runFilter('output', $content, $_template);
+        }
+        // write cache file content
+        $this->writeCachedContent($_template, $content);
+    }
+
+    /**
+     * Writes the content to cache resource
+     *
+     * @param Smarty_Internal_Template $_template
+     * @param string                   $content
+     *
+     * @return bool
+     */
+    public function writeCachedContent(Smarty_Internal_Template $_template, $content)
+    {
+        if ($_template->source->handler->recompiled || !$_template->caching
+        ) {
+            // don't write cache file
+            return false;
+        }
+        if (!isset($_template->cached)) {
+            $_template->loadCached();
+        }
+        $content = $_template->smarty->ext->_codeFrame->create($_template, $content, '', true);
+        return $this->write($_template, $content);
+    }
+
+    /**
+     * Write this cache object to handler
+     *
+     * @param Smarty_Internal_Template $_template template object
+     * @param string                   $content   content to cache
+     *
+     * @return bool success
+     */
+    public function write(Smarty_Internal_Template $_template, $content)
+    {
+        if (!$_template->source->handler->recompiled) {
+            $cached = $_template->cached;
+            if ($cached->handler->writeCachedContent($_template, $content)) {
+                $cached->content = null;
+                $cached->timestamp = time();
+                $cached->exists = true;
+                $cached->valid = true;
+                $cached->cache_lifetime = $_template->cache_lifetime;
+                $cached->processed = false;
+                if ($_template->smarty->cache_locking) {
+                    $cached->handler->releaseLock($_template->smarty, $cached);
+                }
+                return true;
+            }
+            $cached->content = null;
+            $cached->timestamp = false;
+            $cached->exists = false;
+            $cached->valid = false;
+            $cached->processed = false;
+        }
+        return false;
+    }
+}
diff --git a/sysplugins/smarty_internal_runtime_updatescope.php b/sysplugins/smarty_internal_runtime_updatescope.php
new file mode 100644
index 0000000000000000000000000000000000000000..2240f97cac0efa6880c9ee60a3e6d7ed171288fd
--- /dev/null
+++ b/sysplugins/smarty_internal_runtime_updatescope.php
@@ -0,0 +1,115 @@
+<?php
+
+/**
+ * Runtime Extension updateScope
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ **/
+class Smarty_Internal_Runtime_UpdateScope
+{
+    /**
+     * Update new assigned template or config variable in other effected scopes
+     *
+     * @param Smarty_Internal_Template $tpl      data object
+     * @param string|null              $varName  variable name
+     * @param int                      $tagScope tag scope to which bubble up variable value
+     */
+    public function _updateScope(Smarty_Internal_Template $tpl, $varName, $tagScope = 0)
+    {
+        if ($tagScope) {
+            $this->_updateVarStack($tpl, $varName);
+            $tagScope = $tagScope & ~Smarty::SCOPE_LOCAL;
+            if (!$tpl->scope && !$tagScope) {
+                return;
+            }
+        }
+        $mergedScope = $tagScope | $tpl->scope;
+        if ($mergedScope) {
+            if ($mergedScope & Smarty::SCOPE_GLOBAL && $varName) {
+                Smarty::$global_tpl_vars[ $varName ] = $tpl->tpl_vars[ $varName ];
+            }
+            // update scopes
+            foreach ($this->_getAffectedScopes($tpl, $mergedScope) as $ptr) {
+                $this->_updateVariableInOtherScope($ptr->tpl_vars, $tpl, $varName);
+                if ($tagScope && $ptr->_isTplObj() && isset($tpl->_cache[ 'varStack' ])) {
+                    $this->_updateVarStack($ptr, $varName);
+                }
+            }
+        }
+    }
+
+    /**
+     * Get array of objects which needs to be updated  by given scope value
+     *
+     * @param Smarty_Internal_Template $tpl
+     * @param int                      $mergedScope merged tag and template scope to which bubble up variable value
+     *
+     * @return array
+     */
+    public function _getAffectedScopes(Smarty_Internal_Template $tpl, $mergedScope)
+    {
+        $_stack = array();
+        $ptr = $tpl->parent;
+        if ($mergedScope && isset($ptr) && $ptr->_isTplObj()) {
+            $_stack[] = $ptr;
+            $mergedScope = $mergedScope & ~Smarty::SCOPE_PARENT;
+            if (!$mergedScope) {
+                // only parent was set, we are done
+                return $_stack;
+            }
+            $ptr = $ptr->parent;
+        }
+        while (isset($ptr) && $ptr->_isTplObj()) {
+            $_stack[] = $ptr;
+            $ptr = $ptr->parent;
+        }
+        if ($mergedScope & Smarty::SCOPE_SMARTY) {
+            if (isset($tpl->smarty)) {
+                $_stack[] = $tpl->smarty;
+            }
+        } elseif ($mergedScope & Smarty::SCOPE_ROOT) {
+            while (isset($ptr)) {
+                if (!$ptr->_isTplObj()) {
+                    $_stack[] = $ptr;
+                    break;
+                }
+                $ptr = $ptr->parent;
+            }
+        }
+        return $_stack;
+    }
+
+    /**
+     * Update variable in other scope
+     *
+     * @param array                     $tpl_vars template variable array
+     * @param \Smarty_Internal_Template $from
+     * @param string                    $varName  variable name
+     */
+    public function _updateVariableInOtherScope(&$tpl_vars, Smarty_Internal_Template $from, $varName)
+    {
+        if (!isset($tpl_vars[ $varName ])) {
+            $tpl_vars[ $varName ] = clone $from->tpl_vars[ $varName ];
+        } else {
+            $tpl_vars[ $varName ] = clone $tpl_vars[ $varName ];
+            $tpl_vars[ $varName ]->value = $from->tpl_vars[ $varName ]->value;
+        }
+    }
+
+    /**
+     * Update variable in template local variable stack
+     *
+     * @param \Smarty_Internal_Template $tpl
+     * @param string|null               $varName variable name or null for config variables
+     */
+    public function _updateVarStack(Smarty_Internal_Template $tpl, $varName)
+    {
+        $i = 0;
+        while (isset($tpl->_cache[ 'varStack' ][ $i ])) {
+            $this->_updateVariableInOtherScope($tpl->_cache[ 'varStack' ][ $i ][ 'tpl' ], $tpl, $varName);
+            $i++;
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_runtime_writefile.php b/sysplugins/smarty_internal_runtime_writefile.php
new file mode 100644
index 0000000000000000000000000000000000000000..4383e6f38f427cf17202fa76e84f52f7c8f0036a
--- /dev/null
+++ b/sysplugins/smarty_internal_runtime_writefile.php
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Smarty write file plugin
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Monte Ohrt
+ */
+
+/**
+ * Smarty Internal Write File Class
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ */
+class Smarty_Internal_Runtime_WriteFile
+{
+    /**
+     * Writes file in a safe way to disk
+     *
+     * @param string $_filepath complete filepath
+     * @param string $_contents file content
+     * @param Smarty $smarty    smarty instance
+     *
+     * @throws SmartyException
+     * @return boolean true
+     */
+    public function writeFile($_filepath, $_contents, Smarty $smarty)
+    {
+        $_error_reporting = error_reporting();
+        error_reporting($_error_reporting & ~E_NOTICE & ~E_WARNING);
+        $_file_perms = property_exists($smarty, '_file_perms') ? $smarty->_file_perms : 0644;
+        $_dir_perms =
+            property_exists($smarty, '_dir_perms') ? (isset($smarty->_dir_perms) ? $smarty->_dir_perms : 0777) : 0771;
+        if ($_file_perms !== null) {
+            $old_umask = umask(0);
+        }
+        $_dirpath = dirname($_filepath);
+        // if subdirs, create dir structure
+        if ($_dirpath !== '.') {
+            $i = 0;
+            // loop if concurrency problem occurs
+            // see https://bugs.php.net/bug.php?id=35326
+            while (!is_dir($_dirpath)) {
+                if (@mkdir($_dirpath, $_dir_perms, true)) {
+                    break;
+                }
+                clearstatcache();
+                if (++$i === 3) {
+                    error_reporting($_error_reporting);
+                    throw new SmartyException("unable to create directory {$_dirpath}");
+                }
+                sleep(1);
+            }
+        }
+        // write to tmp file, then move to overt file lock race condition
+        $_tmp_file = $_dirpath . DIRECTORY_SEPARATOR . str_replace(array('.', ','), '_', uniqid('wrt', true));
+        if (!file_put_contents($_tmp_file, $_contents)) {
+            error_reporting($_error_reporting);
+            throw new SmartyException("unable to write file {$_tmp_file}");
+        }
+        /*
+         * Windows' rename() fails if the destination exists,
+         * Linux' rename() properly handles the overwrite.
+         * Simply unlink()ing a file might cause other processes
+         * currently reading that file to fail, but linux' rename()
+         * seems to be smart enough to handle that for us.
+         */
+        if (Smarty::$_IS_WINDOWS) {
+            // remove original file
+            if (is_file($_filepath)) {
+                @unlink($_filepath);
+            }
+            // rename tmp file
+            $success = @rename($_tmp_file, $_filepath);
+        } else {
+            // rename tmp file
+            $success = @rename($_tmp_file, $_filepath);
+            if (!$success) {
+                // remove original file
+                if (is_file($_filepath)) {
+                    @unlink($_filepath);
+                }
+                // rename tmp file
+                $success = @rename($_tmp_file, $_filepath);
+            }
+        }
+        if (!$success) {
+            error_reporting($_error_reporting);
+            throw new SmartyException("unable to write file {$_filepath}");
+        }
+        if ($_file_perms !== null) {
+            // set file permissions
+            chmod($_filepath, $_file_perms);
+            umask($old_umask);
+        }
+        error_reporting($_error_reporting);
+        return true;
+    }
+}
diff --git a/sysplugins/smarty_internal_smartytemplatecompiler.php b/sysplugins/smarty_internal_smartytemplatecompiler.php
new file mode 100644
index 0000000000000000000000000000000000000000..21f4e3fddcee8d6913ae7ce9ea13a1eb46442509
--- /dev/null
+++ b/sysplugins/smarty_internal_smartytemplatecompiler.php
@@ -0,0 +1,184 @@
+<?php
+/**
+ * Smarty Internal Plugin Smarty Template Compiler Base
+ * This file contains the basic classes and methods for compiling Smarty templates with lexer/parser
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Class SmartyTemplateCompiler
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_SmartyTemplateCompiler extends Smarty_Internal_TemplateCompilerBase
+{
+    /**
+     * Lexer class name
+     *
+     * @var string
+     */
+    public $lexer_class;
+
+    /**
+     * Parser class name
+     *
+     * @var string
+     */
+    public $parser_class;
+
+    /**
+     * array of vars which can be compiled in local scope
+     *
+     * @var array
+     */
+    public $local_var = array();
+
+    /**
+     * array of callbacks called when the normal compile process of template is finished
+     *
+     * @var array
+     */
+    public $postCompileCallbacks = array();
+
+    /**
+     * prefix code
+     *
+     * @var string
+     */
+    public $prefixCompiledCode = '';
+
+    /**
+     * postfix code
+     *
+     * @var string
+     */
+    public $postfixCompiledCode = '';
+
+    /**
+     * Initialize compiler
+     *
+     * @param string $lexer_class  class name
+     * @param string $parser_class class name
+     * @param Smarty $smarty       global instance
+     */
+    public function __construct($lexer_class, $parser_class, Smarty $smarty)
+    {
+        parent::__construct($smarty);
+        // get required plugins
+        $this->lexer_class = $lexer_class;
+        $this->parser_class = $parser_class;
+    }
+
+    /**
+     * method to compile a Smarty template
+     *
+     * @param mixed $_content template source
+     * @param bool  $isTemplateSource
+     *
+     * @return bool true if compiling succeeded, false if it failed
+     * @throws \SmartyCompilerException
+     */
+    protected function doCompile($_content, $isTemplateSource = false)
+    {
+        /* here is where the compiling takes place. Smarty
+          tags in the templates are replaces with PHP code,
+          then written to compiled files. */
+        // init the lexer/parser to compile the template
+        $this->parser =
+            new $this->parser_class(
+                new $this->lexer_class(
+                    str_replace(
+                        array(
+                            "\r\n",
+                            "\r"
+                        ),
+                        "\n",
+                        $_content
+                    ),
+                    $this
+                ),
+                $this
+            );
+        if ($isTemplateSource && $this->template->caching) {
+            $this->parser->insertPhpCode("<?php\n\$_smarty_tpl->compiled->nocache_hash = '{$this->nocache_hash}';\n?>\n");
+        }
+        if (function_exists('mb_internal_encoding')
+            && function_exists('ini_get')
+            && ((int)ini_get('mbstring.func_overload')) & 2
+        ) {
+            $mbEncoding = mb_internal_encoding();
+            mb_internal_encoding('ASCII');
+        } else {
+            $mbEncoding = null;
+        }
+        if ($this->smarty->_parserdebug) {
+            $this->parser->PrintTrace();
+            $this->parser->lex->PrintTrace();
+        }
+        // get tokens from lexer and parse them
+        while ($this->parser->lex->yylex()) {
+            if ($this->smarty->_parserdebug) {
+                echo "<pre>Line {$this->parser->lex->line} Parsing  {$this->parser->yyTokenName[$this->parser->lex->token]} Token " .
+                     htmlentities($this->parser->lex->value) . "</pre>";
+            }
+            $this->parser->doParse($this->parser->lex->token, $this->parser->lex->value);
+        }
+        // finish parsing process
+        $this->parser->doParse(0, 0);
+        if ($mbEncoding) {
+            mb_internal_encoding($mbEncoding);
+        }
+        // check for unclosed tags
+        if (count($this->_tag_stack) > 0) {
+            // get stacked info
+            list($openTag, $_data) = array_pop($this->_tag_stack);
+            $this->trigger_template_error(
+                "unclosed {$this->smarty->left_delimiter}" . $openTag .
+                "{$this->smarty->right_delimiter} tag"
+            );
+        }
+        // call post compile callbacks
+        foreach ($this->postCompileCallbacks as $cb) {
+            $parameter = $cb;
+            $parameter[ 0 ] = $this;
+            call_user_func_array($cb[ 0 ], $parameter);
+        }
+        // return compiled code
+        return $this->prefixCompiledCode . $this->parser->retvalue . $this->postfixCompiledCode;
+    }
+
+    /**
+     * Register a post compile callback
+     * - when the callback is called after template compiling the compiler object will be inserted as first parameter
+     *
+     * @param callback $callback
+     * @param array    $parameter optional parameter array
+     * @param string   $key       optional key for callback
+     * @param bool     $replace   if true replace existing keyed callback
+     */
+    public function registerPostCompileCallback($callback, $parameter = array(), $key = null, $replace = false)
+    {
+        array_unshift($parameter, $callback);
+        if (isset($key)) {
+            if ($replace || !isset($this->postCompileCallbacks[ $key ])) {
+                $this->postCompileCallbacks[ $key ] = $parameter;
+            }
+        } else {
+            $this->postCompileCallbacks[] = $parameter;
+        }
+    }
+
+    /**
+     * Remove a post compile callback
+     *
+     * @param string $key callback key
+     */
+    public function unregisterPostCompileCallback($key)
+    {
+        unset($this->postCompileCallbacks[ $key ]);
+    }
+}
diff --git a/sysplugins/smarty_internal_template.php b/sysplugins/smarty_internal_template.php
new file mode 100644
index 0000000000000000000000000000000000000000..bae22a7d58676393dc72829672a6ced04f951bc3
--- /dev/null
+++ b/sysplugins/smarty_internal_template.php
@@ -0,0 +1,740 @@
+<?php
+/**
+ * Smarty Internal Plugin Template
+ * This file contains the Smarty template engine
+ *
+ * @package    Smarty
+ * @subpackage Template
+ * @author     Uwe Tews
+ */
+
+/**
+ * Main class with template data structures and methods
+ *
+ * @package    Smarty
+ * @subpackage Template
+ *
+ * @property Smarty_Template_Compiled             $compiled
+ * @property Smarty_Template_Cached               $cached
+ * @property Smarty_Internal_TemplateCompilerBase $compiler
+ * @property mixed|\Smarty_Template_Cached        registered_plugins
+ *
+ * The following methods will be dynamically loaded by the extension handler when they are called.
+ * They are located in a corresponding Smarty_Internal_Method_xxxx class
+ *
+ * @method bool mustCompile()
+ */
+class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
+{
+    /**
+     * Template object cache
+     *
+     * @var Smarty_Internal_Template[]
+     */
+    public static $tplObjCache = array();
+
+    /**
+     * Template object cache for Smarty::isCached() === true
+     *
+     * @var Smarty_Internal_Template[]
+     */
+    public static $isCacheTplObj = array();
+
+    /**
+     * Sub template Info Cache
+     * - index name
+     * - value use count
+     *
+     * @var int[]
+     */
+    public static $subTplInfo = array();
+
+    /**
+     * This object type (Smarty = 1, template = 2, data = 4)
+     *
+     * @var int
+     */
+    public $_objType = 2;
+
+    /**
+     * Global smarty instance
+     *
+     * @var Smarty
+     */
+    public $smarty = null;
+
+    /**
+     * Source instance
+     *
+     * @var Smarty_Template_Source|Smarty_Template_Config
+     */
+    public $source = null;
+
+    /**
+     * Inheritance runtime extension
+     *
+     * @var Smarty_Internal_Runtime_Inheritance
+     */
+    public $inheritance = null;
+
+    /**
+     * Template resource
+     *
+     * @var string
+     */
+    public $template_resource = null;
+
+    /**
+     * flag if compiled template is invalid and must be (re)compiled
+     *
+     * @var bool
+     */
+    public $mustCompile = null;
+
+    /**
+     * Template Id
+     *
+     * @var null|string
+     */
+    public $templateId = null;
+
+    /**
+     * Scope in which variables shall be assigned
+     *
+     * @var int
+     */
+    public $scope = 0;
+
+    /**
+     * Flag which is set while rending a cache file
+     *
+     * @var bool
+     */
+    public $isRenderingCache = false;
+
+    /**
+     * Callbacks called before rendering template
+     *
+     * @var callback[]
+     */
+    public $startRenderCallbacks = array();
+
+    /**
+     * Callbacks called after rendering template
+     *
+     * @var callback[]
+     */
+    public $endRenderCallbacks = array();
+
+    /**
+     * Create template data object
+     * Some of the global Smarty settings copied to template scope
+     * It load the required template resources and caching plugins
+     *
+     * @param string                                                       $template_resource template resource string
+     * @param Smarty                                                       $smarty            Smarty instance
+     * @param null|\Smarty_Internal_Template|\Smarty|\Smarty_Internal_Data $_parent           back pointer to parent
+     *                                                                                        object with variables or
+     *                                                                                        null
+     * @param mixed                                                        $_cache_id         cache   id or null
+     * @param mixed                                                        $_compile_id       compile id or null
+     * @param bool|int|null                                                $_caching          use caching?
+     * @param int|null                                                     $_cache_lifetime   cache life-time in
+     *                                                                                        seconds
+     * @param bool                                                         $_isConfig
+     *
+     * @throws \SmartyException
+     */
+    public function __construct(
+        $template_resource,
+        Smarty $smarty,
+        Smarty_Internal_Data $_parent = null,
+        $_cache_id = null,
+        $_compile_id = null,
+        $_caching = null,
+        $_cache_lifetime = null,
+        $_isConfig = false
+    ) {
+        $this->smarty = $smarty;
+        // Smarty parameter
+        $this->cache_id = $_cache_id === null ? $this->smarty->cache_id : $_cache_id;
+        $this->compile_id = $_compile_id === null ? $this->smarty->compile_id : $_compile_id;
+        $this->caching = (int)($_caching === null ? $this->smarty->caching : $_caching);
+        $this->cache_lifetime = $_cache_lifetime === null ? $this->smarty->cache_lifetime : $_cache_lifetime;
+        $this->compile_check = (int)$smarty->compile_check;
+        $this->parent = $_parent;
+        // Template resource
+        $this->template_resource = $template_resource;
+        $this->source = $_isConfig ? Smarty_Template_Config::load($this) : Smarty_Template_Source::load($this);
+        parent::__construct();
+        if ($smarty->security_policy && method_exists($smarty->security_policy, 'registerCallBacks')) {
+            $smarty->security_policy->registerCallBacks($this);
+        }
+    }
+
+    /**
+     * render template
+     *
+     * @param bool      $no_output_filter if true do not run output filter
+     * @param null|bool $display          true: display, false: fetch null: sub-template
+     *
+     * @return string
+     * @throws \Exception
+     * @throws \SmartyException
+     */
+    public function render($no_output_filter = true, $display = null)
+    {
+        if ($this->smarty->debugging) {
+            if (!isset($this->smarty->_debug)) {
+                $this->smarty->_debug = new Smarty_Internal_Debug();
+            }
+            $this->smarty->_debug->start_template($this, $display);
+        }
+        // checks if template exists
+        if (!$this->source->exists) {
+            throw new SmartyException(
+                "Unable to load template '{$this->source->type}:{$this->source->name}'" .
+                ($this->_isSubTpl() ? " in '{$this->parent->template_resource}'" : '')
+            );
+        }
+        // disable caching for evaluated code
+        if ($this->source->handler->recompiled) {
+            $this->caching = Smarty::CACHING_OFF;
+        }
+        // read from cache or render
+        if ($this->caching === Smarty::CACHING_LIFETIME_CURRENT || $this->caching === Smarty::CACHING_LIFETIME_SAVED) {
+            if (!isset($this->cached) || $this->cached->cache_id !== $this->cache_id
+                || $this->cached->compile_id !== $this->compile_id
+            ) {
+                $this->loadCached(true);
+            }
+            $this->cached->render($this, $no_output_filter);
+        } else {
+            if (!isset($this->compiled) || $this->compiled->compile_id !== $this->compile_id) {
+                $this->loadCompiled(true);
+            }
+            $this->compiled->render($this);
+        }
+        // display or fetch
+        if ($display) {
+            if ($this->caching && $this->smarty->cache_modified_check) {
+                $this->smarty->ext->_cacheModify->cacheModifiedCheck(
+                    $this->cached,
+                    $this,
+                    isset($content) ? $content : ob_get_clean()
+                );
+            } else {
+                if ((!$this->caching || $this->cached->has_nocache_code || $this->source->handler->recompiled)
+                    && !$no_output_filter && (isset($this->smarty->autoload_filters[ 'output' ])
+                                              || isset($this->smarty->registered_filters[ 'output' ]))
+                ) {
+                    echo $this->smarty->ext->_filterHandler->runFilter('output', ob_get_clean(), $this);
+                } else {
+                    echo ob_get_clean();
+                }
+            }
+            if ($this->smarty->debugging) {
+                $this->smarty->_debug->end_template($this);
+                // debug output
+                $this->smarty->_debug->display_debug($this, true);
+            }
+            return '';
+        } else {
+            if ($this->smarty->debugging) {
+                $this->smarty->_debug->end_template($this);
+                if ($this->smarty->debugging === 2 && $display === false) {
+                    $this->smarty->_debug->display_debug($this, true);
+                }
+            }
+            if (!$no_output_filter
+                && (!$this->caching || $this->cached->has_nocache_code || $this->source->handler->recompiled)
+                && (isset($this->smarty->autoload_filters[ 'output' ])
+                    || isset($this->smarty->registered_filters[ 'output' ]))
+            ) {
+                return $this->smarty->ext->_filterHandler->runFilter('output', ob_get_clean(), $this);
+            }
+            // return cache content
+            return null;
+        }
+    }
+
+    /**
+     * Runtime function to render sub-template
+     *
+     * @param string  $template       template name
+     * @param mixed   $cache_id       cache id
+     * @param mixed   $compile_id     compile id
+     * @param integer $caching        cache mode
+     * @param integer $cache_lifetime life time of cache data
+     * @param array   $data           passed parameter template variables
+     * @param int     $scope          scope in which {include} should execute
+     * @param bool    $forceTplCache  cache template object
+     * @param string  $uid            file dependency uid
+     * @param string  $content_func   function name
+     *
+     * @throws \Exception
+     * @throws \SmartyException
+     */
+    public function _subTemplateRender(
+        $template,
+        $cache_id,
+        $compile_id,
+        $caching,
+        $cache_lifetime,
+        $data,
+        $scope,
+        $forceTplCache,
+        $uid = null,
+        $content_func = null
+    ) {
+        $tpl = clone $this;
+        $tpl->parent = $this;
+        $smarty = &$this->smarty;
+        $_templateId = $smarty->_getTemplateId($template, $cache_id, $compile_id, $caching, $tpl);
+        // recursive call ?
+        if (isset($tpl->templateId) ? $tpl->templateId : $tpl->_getTemplateId() !== $_templateId) {
+            // already in template cache?
+            if (isset(self::$tplObjCache[ $_templateId ])) {
+                // copy data from cached object
+                $cachedTpl = &self::$tplObjCache[ $_templateId ];
+                $tpl->templateId = $cachedTpl->templateId;
+                $tpl->template_resource = $cachedTpl->template_resource;
+                $tpl->cache_id = $cachedTpl->cache_id;
+                $tpl->compile_id = $cachedTpl->compile_id;
+                $tpl->source = $cachedTpl->source;
+                if (isset($cachedTpl->compiled)) {
+                    $tpl->compiled = $cachedTpl->compiled;
+                } else {
+                    unset($tpl->compiled);
+                }
+                if ($caching !== 9999 && isset($cachedTpl->cached)) {
+                    $tpl->cached = $cachedTpl->cached;
+                } else {
+                    unset($tpl->cached);
+                }
+            } else {
+                $tpl->templateId = $_templateId;
+                $tpl->template_resource = $template;
+                $tpl->cache_id = $cache_id;
+                $tpl->compile_id = $compile_id;
+                if (isset($uid)) {
+                    // for inline templates we can get all resource information from file dependency
+                    list($filepath, $timestamp, $type) = $tpl->compiled->file_dependency[ $uid ];
+                    $tpl->source = new Smarty_Template_Source($smarty, $filepath, $type, $filepath);
+                    $tpl->source->filepath = $filepath;
+                    $tpl->source->timestamp = $timestamp;
+                    $tpl->source->exists = true;
+                    $tpl->source->uid = $uid;
+                } else {
+                    $tpl->source = Smarty_Template_Source::load($tpl);
+                    unset($tpl->compiled);
+                }
+                if ($caching !== 9999) {
+                    unset($tpl->cached);
+                }
+            }
+        } else {
+            // on recursive calls force caching
+            $forceTplCache = true;
+        }
+        $tpl->caching = $caching;
+        $tpl->cache_lifetime = $cache_lifetime;
+        // set template scope
+        $tpl->scope = $scope;
+        if (!isset(self::$tplObjCache[ $tpl->templateId ]) && !$tpl->source->handler->recompiled) {
+            // check if template object should be cached
+            if ($forceTplCache || (isset(self::$subTplInfo[ $tpl->template_resource ])
+                                   && self::$subTplInfo[ $tpl->template_resource ] > 1)
+                || ($tpl->_isSubTpl() && isset(self::$tplObjCache[ $tpl->parent->templateId ]))
+            ) {
+                self::$tplObjCache[ $tpl->templateId ] = $tpl;
+            }
+        }
+        if (!empty($data)) {
+            // set up variable values
+            foreach ($data as $_key => $_val) {
+                $tpl->tpl_vars[ $_key ] = new Smarty_Variable($_val, $this->isRenderingCache);
+            }
+        }
+        if ($tpl->caching === 9999) {
+            if (!isset($tpl->compiled)) {
+                $this->loadCompiled(true);
+            }
+            if ($tpl->compiled->has_nocache_code) {
+                $this->cached->hashes[ $tpl->compiled->nocache_hash ] = true;
+            }
+        }
+        $tpl->_cache = array();
+        if (isset($uid)) {
+            if ($smarty->debugging) {
+                if (!isset($smarty->_debug)) {
+                    $smarty->_debug = new Smarty_Internal_Debug();
+                }
+                $smarty->_debug->start_template($tpl);
+                $smarty->_debug->start_render($tpl);
+            }
+            $tpl->compiled->getRenderedTemplateCode($tpl, $content_func);
+            if ($smarty->debugging) {
+                $smarty->_debug->end_template($tpl);
+                $smarty->_debug->end_render($tpl);
+            }
+        } else {
+            if (isset($tpl->compiled)) {
+                $tpl->compiled->render($tpl);
+            } else {
+                $tpl->render();
+            }
+        }
+    }
+
+    /**
+     * Get called sub-templates and save call count
+     */
+    public function _subTemplateRegister()
+    {
+        foreach ($this->compiled->includes as $name => $count) {
+            if (isset(self::$subTplInfo[ $name ])) {
+                self::$subTplInfo[ $name ] += $count;
+            } else {
+                self::$subTplInfo[ $name ] = $count;
+            }
+        }
+    }
+
+    /**
+     * Check if this is a sub template
+     *
+     * @return bool true is sub template
+     */
+    public function _isSubTpl()
+    {
+        return isset($this->parent) && $this->parent->_isTplObj();
+    }
+
+    /**
+     * Assign variable in scope
+     *
+     * @param string $varName variable name
+     * @param mixed  $value   value
+     * @param bool   $nocache nocache flag
+     * @param int    $scope   scope into which variable shall be assigned
+     */
+    public function _assignInScope($varName, $value, $nocache = false, $scope = 0)
+    {
+        if (isset($this->tpl_vars[ $varName ])) {
+            $this->tpl_vars[ $varName ] = clone $this->tpl_vars[ $varName ];
+            $this->tpl_vars[ $varName ]->value = $value;
+            if ($nocache || $this->isRenderingCache) {
+                $this->tpl_vars[ $varName ]->nocache = true;
+            }
+        } else {
+            $this->tpl_vars[ $varName ] = new Smarty_Variable($value, $nocache || $this->isRenderingCache);
+        }
+        if ($scope >= 0) {
+            if ($scope > 0 || $this->scope > 0) {
+                $this->smarty->ext->_updateScope->_updateScope($this, $varName, $scope);
+            }
+        }
+    }
+
+    /**
+     * Check if plugins are callable require file otherwise
+     *
+     * @param array $plugins required plugins
+     *
+     * @throws \SmartyException
+     */
+    public function _checkPlugins($plugins)
+    {
+        static $checked = array();
+        foreach ($plugins as $plugin) {
+            $name = join('::', (array)$plugin[ 'function' ]);
+            if (!isset($checked[ $name ])) {
+                if (!is_callable($plugin[ 'function' ])) {
+                    if (is_file($plugin[ 'file' ])) {
+                        include_once $plugin[ 'file' ];
+                        if (is_callable($plugin[ 'function' ])) {
+                            $checked[ $name ] = true;
+                        }
+                    }
+                } else {
+                    $checked[ $name ] = true;
+                }
+            }
+            if (!isset($checked[ $name ])) {
+                if (false !== $this->smarty->loadPlugin($name)) {
+                    $checked[ $name ] = true;
+                } else {
+                    throw new SmartyException("Plugin '{$name}' not callable");
+                }
+            }
+        }
+    }
+
+    /**
+     * This function is executed automatically when a compiled or cached template file is included
+     * - Decode saved properties from compiled template and cache files
+     * - Check if compiled or cache file is valid
+     *
+     * @param \Smarty_Internal_Template $tpl
+     * @param array                     $properties special template properties
+     * @param bool                      $cache      flag if called from cache file
+     *
+     * @return bool flag if compiled or cache file is valid
+     * @throws \SmartyException
+     */
+    public function _decodeProperties(Smarty_Internal_Template $tpl, $properties, $cache = false)
+    {
+        // on cache resources other than file check version stored in cache code
+        if (!isset($properties[ 'version' ]) || Smarty::SMARTY_VERSION !== $properties[ 'version' ]) {
+            if ($cache) {
+                $tpl->smarty->clearAllCache();
+            } else {
+                $tpl->smarty->clearCompiledTemplate();
+            }
+            return false;
+        }
+        $is_valid = true;
+        if (!empty($properties[ 'file_dependency' ])
+            && ((!$cache && $tpl->compile_check) || $tpl->compile_check === Smarty::COMPILECHECK_ON)
+        ) {
+            // check file dependencies at compiled code
+            foreach ($properties[ 'file_dependency' ] as $_file_to_check) {
+                if ($_file_to_check[ 2 ] === 'file' || $_file_to_check[ 2 ] === 'php') {
+                    if ($tpl->source->filepath === $_file_to_check[ 0 ]) {
+                        // do not recheck current template
+                        continue;
+                        //$mtime = $tpl->source->getTimeStamp();
+                    } else {
+                        // file and php types can be checked without loading the respective resource handlers
+                        $mtime = is_file($_file_to_check[ 0 ]) ? filemtime($_file_to_check[ 0 ]) : false;
+                    }
+                } else {
+                    $handler = Smarty_Resource::load($tpl->smarty, $_file_to_check[ 2 ]);
+                    if ($handler->checkTimestamps()) {
+                        $source = Smarty_Template_Source::load($tpl, $tpl->smarty, $_file_to_check[ 0 ]);
+                        $mtime = $source->getTimeStamp();
+                    } else {
+                        continue;
+                    }
+                }
+                if ($mtime === false || $mtime > $_file_to_check[ 1 ]) {
+                    $is_valid = false;
+                    break;
+                }
+            }
+        }
+        if ($cache) {
+            // CACHING_LIFETIME_SAVED cache expiry has to be validated here since otherwise we'd define the unifunc
+            if ($tpl->caching === Smarty::CACHING_LIFETIME_SAVED && $properties[ 'cache_lifetime' ] >= 0
+                && (time() > ($tpl->cached->timestamp + $properties[ 'cache_lifetime' ]))
+            ) {
+                $is_valid = false;
+            }
+            $tpl->cached->cache_lifetime = $properties[ 'cache_lifetime' ];
+            $tpl->cached->valid = $is_valid;
+            $resource = $tpl->cached;
+        } else {
+            $tpl->mustCompile = !$is_valid;
+            $resource = $tpl->compiled;
+            $resource->includes = isset($properties[ 'includes' ]) ? $properties[ 'includes' ] : array();
+        }
+        if ($is_valid) {
+            $resource->unifunc = $properties[ 'unifunc' ];
+            $resource->has_nocache_code = $properties[ 'has_nocache_code' ];
+            //            $tpl->compiled->nocache_hash = $properties['nocache_hash'];
+            $resource->file_dependency = $properties[ 'file_dependency' ];
+        }
+        return $is_valid && !function_exists($properties[ 'unifunc' ]);
+    }
+
+    /**
+     * Compiles the template
+     * If the template is not evaluated the compiled template is saved on disk
+     *
+     * @throws \Exception
+     */
+    public function compileTemplateSource()
+    {
+        return $this->compiled->compileTemplateSource($this);
+    }
+
+    /**
+     * Writes the content to cache resource
+     *
+     * @param string $content
+     *
+     * @return bool
+     */
+    public function writeCachedContent($content)
+    {
+        return $this->smarty->ext->_updateCache->writeCachedContent($this, $content);
+    }
+
+    /**
+     * Get unique template id
+     *
+     * @return string
+     * @throws \SmartyException
+     */
+    public function _getTemplateId()
+    {
+        return isset($this->templateId) ? $this->templateId : $this->templateId =
+            $this->smarty->_getTemplateId($this->template_resource, $this->cache_id, $this->compile_id);
+    }
+
+    /**
+     * runtime error not matching capture tags
+     *
+     * @throws \SmartyException
+     */
+    public function capture_error()
+    {
+        throw new SmartyException("Not matching {capture} open/close in '{$this->template_resource}'");
+    }
+
+    /**
+     * Load compiled object
+     *
+     * @param bool $force force new compiled object
+     */
+    public function loadCompiled($force = false)
+    {
+        if ($force || !isset($this->compiled)) {
+            $this->compiled = Smarty_Template_Compiled::load($this);
+        }
+    }
+
+    /**
+     * Load cached object
+     *
+     * @param bool $force force new cached object
+     */
+    public function loadCached($force = false)
+    {
+        if ($force || !isset($this->cached)) {
+            $this->cached = Smarty_Template_Cached::load($this);
+        }
+    }
+
+    /**
+     * Load inheritance object
+     */
+    public function _loadInheritance()
+    {
+        if (!isset($this->inheritance)) {
+            $this->inheritance = new Smarty_Internal_Runtime_Inheritance();
+        }
+    }
+
+    /**
+     * Unload inheritance object
+     */
+    public function _cleanUp()
+    {
+        $this->startRenderCallbacks = array();
+        $this->endRenderCallbacks = array();
+        $this->inheritance = null;
+    }
+
+    /**
+     * Load compiler object
+     *
+     * @throws \SmartyException
+     */
+    public function loadCompiler()
+    {
+        if (!class_exists($this->source->compiler_class)) {
+            $this->smarty->loadPlugin($this->source->compiler_class);
+        }
+        $this->compiler =
+            new $this->source->compiler_class(
+                $this->source->template_lexer_class,
+                $this->source->template_parser_class,
+                $this->smarty
+            );
+    }
+
+    /**
+     * Handle unknown class methods
+     *
+     * @param string $name unknown method-name
+     * @param array  $args argument array
+     *
+     * @return mixed
+     */
+    public function __call($name, $args)
+    {
+        // method of Smarty object?
+        if (method_exists($this->smarty, $name)) {
+            return call_user_func_array(array($this->smarty, $name), $args);
+        }
+        // parent
+        return parent::__call($name, $args);
+    }
+
+    /**
+     * get Smarty property in template context
+     *
+     * @param string $property_name property name
+     *
+     * @return mixed|Smarty_Template_Cached
+     * @throws SmartyException
+     */
+    public function __get($property_name)
+    {
+        switch ($property_name) {
+            case 'compiled':
+                $this->loadCompiled();
+                return $this->compiled;
+            case 'cached':
+                $this->loadCached();
+                return $this->cached;
+            case 'compiler':
+                $this->loadCompiler();
+                return $this->compiler;
+            default:
+                // Smarty property ?
+                if (property_exists($this->smarty, $property_name)) {
+                    return $this->smarty->$property_name;
+                }
+        }
+        throw new SmartyException("template property '$property_name' does not exist.");
+    }
+
+    /**
+     * set Smarty property in template context
+     *
+     * @param string $property_name property name
+     * @param mixed  $value         value
+     *
+     * @throws SmartyException
+     */
+    public function __set($property_name, $value)
+    {
+        switch ($property_name) {
+            case 'compiled':
+            case 'cached':
+            case 'compiler':
+                $this->$property_name = $value;
+                return;
+            default:
+                // Smarty property ?
+                if (property_exists($this->smarty, $property_name)) {
+                    $this->smarty->$property_name = $value;
+                    return;
+                }
+        }
+        throw new SmartyException("invalid template property '$property_name'.");
+    }
+
+    /**
+     * Template data object destructor
+     */
+    public function __destruct()
+    {
+        if ($this->smarty->cache_locking && isset($this->cached) && $this->cached->is_locked) {
+            $this->cached->handler->releaseLock($this->smarty, $this->cached);
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_templatebase.php b/sysplugins/smarty_internal_templatebase.php
new file mode 100644
index 0000000000000000000000000000000000000000..200c11bb5f53acf245cc37117ad12ffb2c1da101
--- /dev/null
+++ b/sysplugins/smarty_internal_templatebase.php
@@ -0,0 +1,386 @@
+<?php
+/**
+ * Smarty Internal Plugin Smarty Template  Base
+ * This file contains the basic shared methods for template handling
+ *
+ * @package    Smarty
+ * @subpackage Template
+ * @author     Uwe Tews
+ */
+
+/**
+ * Class with shared smarty/template methods
+ *
+ * @package    Smarty
+ * @subpackage Template
+ *
+ * @property int $_objType
+ *
+ * The following methods will be dynamically loaded by the extension handler when they are called.
+ * They are located in a corresponding Smarty_Internal_Method_xxxx class
+ *
+ * @method Smarty_Internal_TemplateBase addAutoloadFilters(mixed $filters, string $type = null)
+ * @method Smarty_Internal_TemplateBase addDefaultModifiers(mixed $modifiers)
+ * @method Smarty_Internal_TemplateBase addLiterals(mixed $literals)
+ * @method Smarty_Internal_TemplateBase createData(Smarty_Internal_Data $parent = null, string $name = null)
+ * @method array getAutoloadFilters(string $type = null)
+ * @method string getDebugTemplate()
+ * @method array getDefaultModifier()
+ * @method array getLiterals()
+ * @method array getTags(mixed $template = null)
+ * @method object getRegisteredObject(string $object_name)
+ * @method Smarty_Internal_TemplateBase registerCacheResource(string $name, Smarty_CacheResource $resource_handler)
+ * @method Smarty_Internal_TemplateBase registerClass(string $class_name, string $class_impl)
+ * @method Smarty_Internal_TemplateBase registerDefaultConfigHandler(callback $callback)
+ * @method Smarty_Internal_TemplateBase registerDefaultPluginHandler(callback $callback)
+ * @method Smarty_Internal_TemplateBase registerDefaultTemplateHandler(callback $callback)
+ * @method Smarty_Internal_TemplateBase registerResource(string $name, mixed $resource_handler)
+ * @method Smarty_Internal_TemplateBase setAutoloadFilters(mixed $filters, string $type = null)
+ * @method Smarty_Internal_TemplateBase setDebugTemplate(string $tpl_name)
+ * @method Smarty_Internal_TemplateBase setDefaultModifiers(mixed $modifiers)
+ * @method Smarty_Internal_TemplateBase setLiterals(mixed $literals)
+ * @method Smarty_Internal_TemplateBase unloadFilter(string $type, string $name)
+ * @method Smarty_Internal_TemplateBase unregisterCacheResource(string $name)
+ * @method Smarty_Internal_TemplateBase unregisterObject(string $object_name)
+ * @method Smarty_Internal_TemplateBase unregisterPlugin(string $type, string $name)
+ * @method Smarty_Internal_TemplateBase unregisterFilter(string $type, mixed $callback)
+ * @method Smarty_Internal_TemplateBase unregisterResource(string $name)
+ */
+abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data
+{
+    /**
+     * Set this if you want different sets of cache files for the same
+     * templates.
+     *
+     * @var string
+     */
+    public $cache_id = null;
+
+    /**
+     * Set this if you want different sets of compiled files for the same
+     * templates.
+     *
+     * @var string
+     */
+    public $compile_id = null;
+
+    /**
+     * caching enabled
+     *
+     * @var int
+     */
+    public $caching = Smarty::CACHING_OFF;
+
+    /**
+     * check template for modifications?
+     *
+     * @var int
+     */
+    public $compile_check = Smarty::COMPILECHECK_ON;
+
+    /**
+     * cache lifetime in seconds
+     *
+     * @var integer
+     */
+    public $cache_lifetime = 3600;
+
+    /**
+     * Array of source information for known template functions
+     *
+     * @var array
+     */
+    public $tplFunctions = array();
+
+    /**
+     * universal cache
+     *
+     * @var array()
+     */
+    public $_cache = array();
+
+    /**
+     * fetches a rendered Smarty template
+     *
+     * @param string $template   the resource handle of the template file or template object
+     * @param mixed  $cache_id   cache id to be used with this template
+     * @param mixed  $compile_id compile id to be used with this template
+     * @param object $parent     next higher level of Smarty variables
+     *
+     * @throws Exception
+     * @throws SmartyException
+     * @return string rendered template output
+     */
+    public function fetch($template = null, $cache_id = null, $compile_id = null, $parent = null)
+    {
+        $result = $this->_execute($template, $cache_id, $compile_id, $parent, 0);
+        return $result === null ? ob_get_clean() : $result;
+    }
+
+    /**
+     * displays a Smarty template
+     *
+     * @param string $template   the resource handle of the template file or template object
+     * @param mixed  $cache_id   cache id to be used with this template
+     * @param mixed  $compile_id compile id to be used with this template
+     * @param object $parent     next higher level of Smarty variables
+     *
+     * @throws \Exception
+     * @throws \SmartyException
+     */
+    public function display($template = null, $cache_id = null, $compile_id = null, $parent = null)
+    {
+        // display template
+        $this->_execute($template, $cache_id, $compile_id, $parent, 1);
+    }
+
+    /**
+     * test if cache is valid
+     *
+     * @api  Smarty::isCached()
+     * @link http://www.smarty.net/docs/en/api.is.cached.tpl
+     *
+     * @param null|string|\Smarty_Internal_Template $template   the resource handle of the template file or template
+     *                                                          object
+     * @param mixed                                 $cache_id   cache id to be used with this template
+     * @param mixed                                 $compile_id compile id to be used with this template
+     * @param object                                $parent     next higher level of Smarty variables
+     *
+     * @return bool cache status
+     * @throws \Exception
+     * @throws \SmartyException
+     */
+    public function isCached($template = null, $cache_id = null, $compile_id = null, $parent = null)
+    {
+        return $this->_execute($template, $cache_id, $compile_id, $parent, 2);
+    }
+
+    /**
+     * fetches a rendered Smarty template
+     *
+     * @param string $template   the resource handle of the template file or template object
+     * @param mixed  $cache_id   cache id to be used with this template
+     * @param mixed  $compile_id compile id to be used with this template
+     * @param object $parent     next higher level of Smarty variables
+     * @param string $function   function type 0 = fetch,  1 = display, 2 = isCache
+     *
+     * @return mixed
+     * @throws \Exception
+     * @throws \SmartyException
+     */
+    private function _execute($template, $cache_id, $compile_id, $parent, $function)
+    {
+        $smarty = $this->_getSmartyObj();
+        $saveVars = true;
+        if ($template === null) {
+            if (!$this->_isTplObj()) {
+                throw new SmartyException($function . '():Missing \'$template\' parameter');
+            } else {
+                $template = $this;
+            }
+        } elseif (is_object($template)) {
+            /* @var Smarty_Internal_Template $template */
+            if (!isset($template->_objType) || !$template->_isTplObj()) {
+                throw new SmartyException($function . '():Template object expected');
+            }
+        } else {
+            // get template object
+            $saveVars = false;
+            $template = $smarty->createTemplate($template, $cache_id, $compile_id, $parent ? $parent : $this, false);
+            if ($this->_objType === 1) {
+                // set caching in template object
+                $template->caching = $this->caching;
+            }
+        }
+        // make sure we have integer values
+        $template->caching = (int)$template->caching;
+        // fetch template content
+        $level = ob_get_level();
+        try {
+            $_smarty_old_error_level =
+                isset($smarty->error_reporting) ? error_reporting($smarty->error_reporting) : null;
+            if ($this->_objType === 2) {
+                /* @var Smarty_Internal_Template $this */
+                $template->tplFunctions = $this->tplFunctions;
+                $template->inheritance = $this->inheritance;
+            }
+            /* @var Smarty_Internal_Template $parent */
+            if (isset($parent->_objType) && ($parent->_objType === 2) && !empty($parent->tplFunctions)) {
+                $template->tplFunctions = array_merge($parent->tplFunctions, $template->tplFunctions);
+            }
+            if ($function === 2) {
+                if ($template->caching) {
+                    // return cache status of template
+                    if (!isset($template->cached)) {
+                        $template->loadCached();
+                    }
+                    $result = $template->cached->isCached($template);
+                    Smarty_Internal_Template::$isCacheTplObj[ $template->_getTemplateId() ] = $template;
+                } else {
+                    return false;
+                }
+            } else {
+                if ($saveVars) {
+                    $savedTplVars = $template->tpl_vars;
+                    $savedConfigVars = $template->config_vars;
+                }
+                ob_start();
+                $template->_mergeVars();
+                if (!empty(Smarty::$global_tpl_vars)) {
+                    $template->tpl_vars = array_merge(Smarty::$global_tpl_vars, $template->tpl_vars);
+                }
+                $result = $template->render(false, $function);
+                $template->_cleanUp();
+                if ($saveVars) {
+                    $template->tpl_vars = $savedTplVars;
+                    $template->config_vars = $savedConfigVars;
+                } else {
+                    if (!$function && !isset(Smarty_Internal_Template::$tplObjCache[ $template->templateId ])) {
+                        $template->parent = null;
+                        $template->tpl_vars = $template->config_vars = array();
+                        Smarty_Internal_Template::$tplObjCache[ $template->templateId ] = $template;
+                    }
+                }
+            }
+            if (isset($_smarty_old_error_level)) {
+                error_reporting($_smarty_old_error_level);
+            }
+            return $result;
+        } catch (Exception $e) {
+            while (ob_get_level() > $level) {
+                ob_end_clean();
+            }
+            if (isset($_smarty_old_error_level)) {
+                error_reporting($_smarty_old_error_level);
+            }
+            throw $e;
+        }
+    }
+
+    /**
+     * Registers plugin to be used in templates
+     *
+     * @api  Smarty::registerPlugin()
+     * @link http://www.smarty.net/docs/en/api.register.plugin.tpl
+     *
+     * @param string   $type       plugin type
+     * @param string   $name       name of template tag
+     * @param callable $callback   PHP callback to register
+     * @param bool     $cacheable  if true (default) this function is cache able
+     * @param mixed    $cache_attr caching attributes if any
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     * @throws \SmartyException
+     */
+    public function registerPlugin($type, $name, $callback, $cacheable = true, $cache_attr = null)
+    {
+        return $this->ext->registerPlugin->registerPlugin($this, $type, $name, $callback, $cacheable, $cache_attr);
+    }
+
+    /**
+     * load a filter of specified type and name
+     *
+     * @api  Smarty::loadFilter()
+     * @link http://www.smarty.net/docs/en/api.load.filter.tpl
+     *
+     * @param string $type filter type
+     * @param string $name filter name
+     *
+     * @return bool
+     * @throws \SmartyException
+     */
+    public function loadFilter($type, $name)
+    {
+        return $this->ext->loadFilter->loadFilter($this, $type, $name);
+    }
+
+    /**
+     * Registers a filter function
+     *
+     * @api  Smarty::registerFilter()
+     * @link http://www.smarty.net/docs/en/api.register.filter.tpl
+     *
+     * @param string      $type filter type
+     * @param callable    $callback
+     * @param string|null $name optional filter name
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     * @throws \SmartyException
+     */
+    public function registerFilter($type, $callback, $name = null)
+    {
+        return $this->ext->registerFilter->registerFilter($this, $type, $callback, $name);
+    }
+
+    /**
+     * Registers object to be used in templates
+     *
+     * @api  Smarty::registerObject()
+     * @link http://www.smarty.net/docs/en/api.register.object.tpl
+     *
+     * @param string $object_name
+     * @param object $object                     the referenced PHP object to register
+     * @param array  $allowed_methods_properties list of allowed methods (empty = all)
+     * @param bool   $format                     smarty argument format, else traditional
+     * @param array  $block_methods              list of block-methods
+     *
+     * @return \Smarty|\Smarty_Internal_Template
+     * @throws \SmartyException
+     */
+    public function registerObject(
+        $object_name,
+        $object,
+        $allowed_methods_properties = array(),
+        $format = true,
+        $block_methods = array()
+    ) {
+        return $this->ext->registerObject->registerObject(
+            $this,
+            $object_name,
+            $object,
+            $allowed_methods_properties,
+            $format,
+            $block_methods
+        );
+    }
+
+    /**
+     * @param int $compile_check
+     */
+    public function setCompileCheck($compile_check)
+    {
+        $this->compile_check = (int)$compile_check;
+    }
+
+    /**
+     * @param int $caching
+     */
+    public function setCaching($caching)
+    {
+        $this->caching = (int)$caching;
+    }
+
+    /**
+     * @param int $cache_lifetime
+     */
+    public function setCacheLifetime($cache_lifetime)
+    {
+        $this->cache_lifetime = $cache_lifetime;
+    }
+
+    /**
+     * @param string $compile_id
+     */
+    public function setCompileId($compile_id)
+    {
+        $this->compile_id = $compile_id;
+    }
+
+    /**
+     * @param string $cache_id
+     */
+    public function setCacheId($cache_id)
+    {
+        $this->cache_id = $cache_id;
+    }
+}
diff --git a/sysplugins/smarty_internal_templatecompilerbase.php b/sysplugins/smarty_internal_templatecompilerbase.php
new file mode 100644
index 0000000000000000000000000000000000000000..3cc957dece8e3c72d0f0a88dbce057e62c2067bf
--- /dev/null
+++ b/sysplugins/smarty_internal_templatecompilerbase.php
@@ -0,0 +1,1760 @@
+<?php
+/**
+ * Smarty Internal Plugin Smarty Template Compiler Base
+ * This file contains the basic classes and methods for compiling Smarty templates with lexer/parser
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Main abstract compiler class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ *
+ * @property Smarty_Internal_SmartyTemplateCompiler $prefixCompiledCode  = ''
+ * @property Smarty_Internal_SmartyTemplateCompiler $postfixCompiledCode = ''
+ * @method   registerPostCompileCallback($callback, $parameter = array(), $key = null, $replace = false)
+ * @method   unregisterPostCompileCallback($key)
+ */
+abstract class Smarty_Internal_TemplateCompilerBase
+{
+    /**
+     * compile tag objects cache
+     *
+     * @var array
+     */
+    public static $_tag_objects = array();
+
+    /**
+     * counter for prefix variable number
+     *
+     * @var int
+     */
+    public static $prefixVariableNumber = 0;
+
+    /**
+     * Smarty object
+     *
+     * @var Smarty
+     */
+    public $smarty = null;
+
+    /**
+     * Parser object
+     *
+     * @var Smarty_Internal_Templateparser
+     */
+    public $parser = null;
+
+    /**
+     * hash for nocache sections
+     *
+     * @var mixed
+     */
+    public $nocache_hash = null;
+
+    /**
+     * suppress generation of nocache code
+     *
+     * @var bool
+     */
+    public $suppressNocacheProcessing = false;
+
+    /**
+     * caching enabled (copied from template object)
+     *
+     * @var int
+     */
+    public $caching = 0;
+
+    /**
+     * tag stack
+     *
+     * @var array
+     */
+    public $_tag_stack = array();
+
+    /**
+     * tag stack count
+     *
+     * @var array
+     */
+    public $_tag_stack_count = array();
+
+    /**
+     * Plugins used by template
+     *
+     * @var array
+     */
+    public $required_plugins = array('compiled' => array(), 'nocache' => array());
+
+    /**
+     * Required plugins stack
+     *
+     * @var array
+     */
+    public $required_plugins_stack = array();
+
+    /**
+     * current template
+     *
+     * @var Smarty_Internal_Template
+     */
+    public $template = null;
+
+    /**
+     * merged included sub template data
+     *
+     * @var array
+     */
+    public $mergedSubTemplatesData = array();
+
+    /**
+     * merged sub template code
+     *
+     * @var array
+     */
+    public $mergedSubTemplatesCode = array();
+
+    /**
+     * collected template properties during compilation
+     *
+     * @var array
+     */
+    public $templateProperties = array();
+
+    /**
+     * source line offset for error messages
+     *
+     * @var int
+     */
+    public $trace_line_offset = 0;
+
+    /**
+     * trace uid
+     *
+     * @var string
+     */
+    public $trace_uid = '';
+
+    /**
+     * trace file path
+     *
+     * @var string
+     */
+    public $trace_filepath = '';
+
+    /**
+     * stack for tracing file and line of nested {block} tags
+     *
+     * @var array
+     */
+    public $trace_stack = array();
+
+    /**
+     * plugins loaded by default plugin handler
+     *
+     * @var array
+     */
+    public $default_handler_plugins = array();
+
+    /**
+     * saved preprocessed modifier list
+     *
+     * @var mixed
+     */
+    public $default_modifier_list = null;
+
+    /**
+     * force compilation of complete template as nocache
+     *
+     * @var boolean
+     */
+    public $forceNocache = false;
+
+    /**
+     * flag if compiled template file shall we written
+     *
+     * @var bool
+     */
+    public $write_compiled_code = true;
+
+    /**
+     * Template functions
+     *
+     * @var array
+     */
+    public $tpl_function = array();
+
+    /**
+     * called sub functions from template function
+     *
+     * @var array
+     */
+    public $called_functions = array();
+
+    /**
+     * compiled template or block function code
+     *
+     * @var string
+     */
+    public $blockOrFunctionCode = '';
+
+    /**
+     * php_handling setting either from Smarty or security
+     *
+     * @var int
+     */
+    public $php_handling = 0;
+
+    /**
+     * flags for used modifier plugins
+     *
+     * @var array
+     */
+    public $modifier_plugins = array();
+
+    /**
+     * type of already compiled modifier
+     *
+     * @var array
+     */
+    public $known_modifier_type = array();
+
+    /**
+     * parent compiler object for merged subtemplates and template functions
+     *
+     * @var Smarty_Internal_TemplateCompilerBase
+     */
+    public $parent_compiler = null;
+
+    /**
+     * Flag true when compiling nocache section
+     *
+     * @var bool
+     */
+    public $nocache = false;
+
+    /**
+     * Flag true when tag is compiled as nocache
+     *
+     * @var bool
+     */
+    public $tag_nocache = false;
+
+    /**
+     * Compiled tag prefix code
+     *
+     * @var array
+     */
+    public $prefix_code = array();
+
+    /**
+     * used prefix variables by current compiled tag
+     *
+     * @var array
+     */
+    public $usedPrefixVariables = array();
+
+    /**
+     * Prefix code  stack
+     *
+     * @var array
+     */
+    public $prefixCodeStack = array();
+
+    /**
+     * Tag has compiled code
+     *
+     * @var bool
+     */
+    public $has_code = false;
+
+    /**
+     * A variable string was compiled
+     *
+     * @var bool
+     */
+    public $has_variable_string = false;
+
+    /**
+     * Stack for {setfilter} {/setfilter}
+     *
+     * @var array
+     */
+    public $variable_filter_stack = array();
+
+    /**
+     * variable filters for {setfilter} {/setfilter}
+     *
+     * @var array
+     */
+    public $variable_filters = array();
+
+    /**
+     * Nesting count of looping tags like {foreach}, {for}, {section}, {while}
+     *
+     * @var int
+     */
+    public $loopNesting = 0;
+
+    /**
+     * Strip preg pattern
+     *
+     * @var string
+     */
+    public $stripRegEx = '![\t ]*[\r\n]+[\t ]*!';
+
+    /**
+     * plugin search order
+     *
+     * @var array
+     */
+    public $plugin_search_order = array(
+        'function',
+        'block',
+        'compiler',
+        'class'
+    );
+
+    /**
+     * General storage area for tag compiler plugins
+     *
+     * @var array
+     */
+    public $_cache = array();
+
+    /**
+     * Lexer preg pattern for left delimiter
+     *
+     * @var string
+     */
+    private $ldelPreg = '[{]';
+
+    /**
+     * Lexer preg pattern for right delimiter
+     *
+     * @var string
+     */
+    private $rdelPreg = '[}]';
+
+    /**
+     * Length of right delimiter
+     *
+     * @var int
+     */
+    private $rdelLength = 0;
+
+    /**
+     * Length of left delimiter
+     *
+     * @var int
+     */
+    private $ldelLength = 0;
+
+    /**
+     * Lexer preg pattern for user literals
+     *
+     * @var string
+     */
+    private $literalPreg = '';
+
+    /**
+     * Initialize compiler
+     *
+     * @param Smarty $smarty global instance
+     */
+    public function __construct(Smarty $smarty)
+    {
+        $this->smarty = $smarty;
+        $this->nocache_hash = str_replace(
+            array(
+                '.',
+                ','
+            ),
+            '_',
+            uniqid(mt_rand(), true)
+        );
+    }
+
+    /**
+     * Method to compile a Smarty template
+     *
+     * @param Smarty_Internal_Template                  $template template object to compile
+     * @param bool                                      $nocache  true is shall be compiled in nocache mode
+     * @param null|Smarty_Internal_TemplateCompilerBase $parent_compiler
+     *
+     * @return bool true if compiling succeeded, false if it failed
+     * @throws \Exception
+     */
+    public function compileTemplate(
+        Smarty_Internal_Template $template,
+        $nocache = null,
+        Smarty_Internal_TemplateCompilerBase $parent_compiler = null
+    ) {
+        // get code frame of compiled template
+        $_compiled_code = $template->smarty->ext->_codeFrame->create(
+            $template,
+            $this->compileTemplateSource(
+                $template,
+                $nocache,
+                $parent_compiler
+            ),
+            $this->postFilter($this->blockOrFunctionCode) .
+            join('', $this->mergedSubTemplatesCode),
+            false,
+            $this
+        );
+        return $_compiled_code;
+    }
+
+    /**
+     * Compile template source and run optional post filter
+     *
+     * @param \Smarty_Internal_Template             $template
+     * @param null|bool                             $nocache flag if template must be compiled in nocache mode
+     * @param \Smarty_Internal_TemplateCompilerBase $parent_compiler
+     *
+     * @return string
+     * @throws \Exception
+     */
+    public function compileTemplateSource(
+        Smarty_Internal_Template $template,
+        $nocache = null,
+        Smarty_Internal_TemplateCompilerBase $parent_compiler = null
+    ) {
+        try {
+            // save template object in compiler class
+            $this->template = $template;
+            if (property_exists($this->template->smarty, 'plugin_search_order')) {
+                $this->plugin_search_order = $this->template->smarty->plugin_search_order;
+            }
+            if ($this->smarty->debugging) {
+                if (!isset($this->smarty->_debug)) {
+                    $this->smarty->_debug = new Smarty_Internal_Debug();
+                }
+                $this->smarty->_debug->start_compile($this->template);
+            }
+            if (isset($this->template->smarty->security_policy)) {
+                $this->php_handling = $this->template->smarty->security_policy->php_handling;
+            } else {
+                $this->php_handling = $this->template->smarty->php_handling;
+            }
+            $this->parent_compiler = $parent_compiler ? $parent_compiler : $this;
+            $nocache = isset($nocache) ? $nocache : false;
+            if (empty($template->compiled->nocache_hash)) {
+                $template->compiled->nocache_hash = $this->nocache_hash;
+            } else {
+                $this->nocache_hash = $template->compiled->nocache_hash;
+            }
+            $this->caching = $template->caching;
+            // flag for nocache sections
+            $this->nocache = $nocache;
+            $this->tag_nocache = false;
+            // reset has nocache code flag
+            $this->template->compiled->has_nocache_code = false;
+            $this->has_variable_string = false;
+            $this->prefix_code = array();
+            // add file dependency
+            if ($this->smarty->merge_compiled_includes || $this->template->source->handler->checkTimestamps()) {
+                $this->parent_compiler->template->compiled->file_dependency[ $this->template->source->uid ] =
+                    array(
+                        $this->template->source->filepath,
+                        $this->template->source->getTimeStamp(),
+                        $this->template->source->type,
+                    );
+            }
+            $this->smarty->_current_file = $this->template->source->filepath;
+            // get template source
+            if (!empty($this->template->source->components)) {
+                // we have array of inheritance templates by extends: resource
+                // generate corresponding source code sequence
+                $_content =
+                    Smarty_Internal_Compile_Extends::extendsSourceArrayCode($this->template);
+            } else {
+                // get template source
+                $_content = $this->template->source->getContent();
+            }
+            $_compiled_code = $this->postFilter($this->doCompile($this->preFilter($_content), true));
+            if (!empty($this->required_plugins[ 'compiled' ]) || !empty($this->required_plugins[ 'nocache' ])) {
+                $_compiled_code = '<?php ' . $this->compileRequiredPlugins() . "?>\n" . $_compiled_code;
+            }
+        } catch (Exception $e) {
+            if ($this->smarty->debugging) {
+                $this->smarty->_debug->end_compile($this->template);
+            }
+            $this->_tag_stack = array();
+            // free memory
+            $this->parent_compiler = null;
+            $this->template = null;
+            $this->parser = null;
+            throw $e;
+        }
+        if ($this->smarty->debugging) {
+            $this->smarty->_debug->end_compile($this->template);
+        }
+        $this->parent_compiler = null;
+        $this->parser = null;
+        return $_compiled_code;
+    }
+
+    /**
+     * Optionally process compiled code by post filter
+     *
+     * @param string $code compiled code
+     *
+     * @return string
+     * @throws \SmartyException
+     */
+    public function postFilter($code)
+    {
+        // run post filter if on code
+        if (!empty($code)
+            && (isset($this->smarty->autoload_filters[ 'post' ]) || isset($this->smarty->registered_filters[ 'post' ]))
+        ) {
+            return $this->smarty->ext->_filterHandler->runFilter('post', $code, $this->template);
+        } else {
+            return $code;
+        }
+    }
+
+    /**
+     * Run optional prefilter
+     *
+     * @param string $_content template source
+     *
+     * @return string
+     * @throws \SmartyException
+     */
+    public function preFilter($_content)
+    {
+        // run pre filter if required
+        if ($_content !== ''
+            && ((isset($this->smarty->autoload_filters[ 'pre' ]) || isset($this->smarty->registered_filters[ 'pre' ])))
+        ) {
+            return $this->smarty->ext->_filterHandler->runFilter('pre', $_content, $this->template);
+        } else {
+            return $_content;
+        }
+    }
+
+    /**
+     * Compile Tag
+     * This is a call back from the lexer/parser
+     *
+     * Save current prefix code
+     * Compile tag
+     * Merge tag prefix code with saved one
+     * (required nested tags in attributes)
+     *
+     * @param string $tag       tag name
+     * @param array  $args      array with tag attributes
+     * @param array  $parameter array with compilation parameter
+     *
+     * @throws SmartyCompilerException
+     * @throws SmartyException
+     * @return string compiled code
+     */
+    public function compileTag($tag, $args, $parameter = array())
+    {
+        $this->prefixCodeStack[] = $this->prefix_code;
+        $this->prefix_code = array();
+        $result = $this->compileTag2($tag, $args, $parameter);
+        $this->prefix_code = array_merge($this->prefix_code, array_pop($this->prefixCodeStack));
+        return $result;
+    }
+
+    /**
+     * compile variable
+     *
+     * @param string $variable
+     *
+     * @return string
+     */
+    public function compileVariable($variable)
+    {
+        if (!strpos($variable, '(')) {
+            // not a variable variable
+            $var = trim($variable, '\'');
+            $this->tag_nocache = $this->tag_nocache |
+                                 $this->template->ext->getTemplateVars->_getVariable(
+                                     $this->template,
+                                     $var,
+                                     null,
+                                     true,
+                                     false
+                                 )->nocache;
+            // todo $this->template->compiled->properties['variables'][$var] = $this->tag_nocache | $this->nocache;
+        }
+        return '$_smarty_tpl->tpl_vars[' . $variable . ']->value';
+    }
+
+    /**
+     * compile config variable
+     *
+     * @param string $variable
+     *
+     * @return string
+     */
+    public function compileConfigVariable($variable)
+    {
+        // return '$_smarty_tpl->config_vars[' . $variable . ']';
+        return '$_smarty_tpl->smarty->ext->configLoad->_getConfigVariable($_smarty_tpl, ' . $variable . ')';
+    }
+
+    /**
+     * compile PHP function call
+     *
+     * @param string $name
+     * @param array  $parameter
+     *
+     * @return string
+     * @throws \SmartyCompilerException
+     */
+    public function compilePHPFunctionCall($name, $parameter)
+    {
+        if (!$this->smarty->security_policy || $this->smarty->security_policy->isTrustedPhpFunction($name, $this)) {
+            if (strcasecmp($name, 'isset') === 0 || strcasecmp($name, 'empty') === 0
+                || strcasecmp($name, 'array') === 0 || is_callable($name)
+            ) {
+                $func_name = strtolower($name);
+
+                if ($func_name === 'isset') {
+                    if (count($parameter) === 0) {
+                        $this->trigger_template_error('Illegal number of parameter in "isset()"');
+                    }
+
+	                $pa = array();
+	                foreach ($parameter as $p) {
+		                $pa[] = $this->syntaxMatchesVariable($p) ? 'isset(' . $p . ')' : '(' . $p . ' !== null )';
+	                }
+	                return '(' . implode(' && ', $pa) . ')';
+
+                } elseif (in_array(
+                    $func_name,
+                    array(
+                        'empty',
+                        'reset',
+                        'current',
+                        'end',
+                        'prev',
+                        'next'
+                    )
+                )
+                ) {
+                    if (count($parameter) !== 1) {
+                        $this->trigger_template_error("Illegal number of parameter in '{$func_name()}'");
+                    }
+                    if ($func_name === 'empty') {
+                        if (!$this->syntaxMatchesVariable($parameter[0]) && version_compare(PHP_VERSION, '5.5.0', '<')) {
+                            return '(' . $parameter[ 0 ] . ' === false )';
+                        } else {
+                            return $func_name . '(' .
+                                   str_replace("')->value", "',null,true,false)->value", $parameter[ 0 ]) . ')';
+                        }
+                    } else {
+                        return $func_name . '(' . $parameter[ 0 ] . ')';
+                    }
+                } else {
+                    return $name . '(' . implode(',', $parameter) . ')';
+                }
+            } else {
+                $this->trigger_template_error("unknown function '{$name}'");
+            }
+        }
+    }
+
+	/**
+	 * Determines whether the passed string represents a valid (PHP) variable.
+	 * This is important, because `isset()` only works on variables and `empty()` can only be passed
+	 * a variable prior to php5.5
+	 * @param $string
+	 * @return bool
+	 */
+	private function syntaxMatchesVariable($string) {
+    	static $regex_pattern = '/^\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*((->)[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*|\[.*]*\])*$/';
+    	return 1 === preg_match($regex_pattern, trim($string));
+    }
+
+    /**
+     * This method is called from parser to process a text content section if strip is enabled
+     * - remove text from inheritance child templates as they may generate output
+     *
+     * @param string $text
+     *
+     * @return string
+     */
+    public function processText($text)
+    {
+
+        if (strpos($text, '<') === false) {
+        	return preg_replace($this->stripRegEx, '', $text);
+        }
+
+	    $store = array();
+	    $_store = 0;
+
+        // capture html elements not to be messed with
+        $_offset = 0;
+        if (preg_match_all(
+            '#(<script[^>]*>.*?</script[^>]*>)|(<textarea[^>]*>.*?</textarea[^>]*>)|(<pre[^>]*>.*?</pre[^>]*>)#is',
+            $text,
+            $matches,
+            PREG_OFFSET_CAPTURE | PREG_SET_ORDER
+        )
+        ) {
+            foreach ($matches as $match) {
+                $store[] = $match[ 0 ][ 0 ];
+                $_length = strlen($match[ 0 ][ 0 ]);
+                $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@';
+                $text = substr_replace($text, $replace, $match[ 0 ][ 1 ] - $_offset, $_length);
+                $_offset += $_length - strlen($replace);
+                $_store++;
+            }
+        }
+        $expressions = array(// replace multiple spaces between tags by a single space
+                             '#(:SMARTY@!@|>)[\040\011]+(?=@!@SMARTY:|<)#s'                            => '\1 \2',
+                             // remove newline between tags
+                             '#(:SMARTY@!@|>)[\040\011]*[\n]\s*(?=@!@SMARTY:|<)#s'                     => '\1\2',
+                             // remove multiple spaces between attributes (but not in attribute values!)
+                             '#(([a-z0-9]\s*=\s*("[^"]*?")|(\'[^\']*?\'))|<[a-z0-9_]+)\s+([a-z/>])#is' => '\1 \5',
+                             '#>[\040\011]+$#Ss'                                                       => '> ',
+                             '#>[\040\011]*[\n]\s*$#Ss'                                                => '>',
+                             $this->stripRegEx                                                         => '',
+        );
+        $text = preg_replace(array_keys($expressions), array_values($expressions), $text);
+        $_offset = 0;
+        if (preg_match_all(
+            '#@!@SMARTY:([0-9]+):SMARTY@!@#is',
+            $text,
+            $matches,
+            PREG_OFFSET_CAPTURE | PREG_SET_ORDER
+        )
+        ) {
+            foreach ($matches as $match) {
+                $_length = strlen($match[ 0 ][ 0 ]);
+                $replace = $store[ $match[ 1 ][ 0 ] ];
+                $text = substr_replace($text, $replace, $match[ 0 ][ 1 ] + $_offset, $_length);
+                $_offset += strlen($replace) - $_length;
+                $_store++;
+            }
+        }
+        return $text;
+    }
+
+    /**
+     * lazy loads internal compile plugin for tag and calls the compile method
+     * compile objects cached for reuse.
+     * class name format:  Smarty_Internal_Compile_TagName
+     * plugin filename format: Smarty_Internal_TagName.php
+     *
+     * @param string $tag    tag name
+     * @param array  $args   list of tag attributes
+     * @param mixed  $param1 optional parameter
+     * @param mixed  $param2 optional parameter
+     * @param mixed  $param3 optional parameter
+     *
+     * @return bool|string compiled code or false
+     * @throws \SmartyCompilerException
+     */
+    public function callTagCompiler($tag, $args, $param1 = null, $param2 = null, $param3 = null)
+    {
+        /* @var Smarty_Internal_CompileBase $tagCompiler */
+        $tagCompiler = $this->getTagCompiler($tag);
+        // compile this tag
+        return $tagCompiler === false ? false : $tagCompiler->compile($args, $this, $param1, $param2, $param3);
+    }
+
+    /**
+     * lazy loads internal compile plugin for tag compile objects cached for reuse.
+     *
+     * class name format:  Smarty_Internal_Compile_TagName
+     * plugin filename format: Smarty_Internal_TagName.php
+     *
+     * @param string $tag tag name
+     *
+     * @return bool|\Smarty_Internal_CompileBase tag compiler object or false if not found
+     */
+    public function getTagCompiler($tag)
+    {
+        // re-use object if already exists
+        if (!isset(self::$_tag_objects[ $tag ])) {
+            // lazy load internal compiler plugin
+            $_tag = explode('_', $tag);
+            $_tag = array_map('ucfirst', $_tag);
+            $class_name = 'Smarty_Internal_Compile_' . implode('_', $_tag);
+            if (class_exists($class_name)
+                && (!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($tag, $this))
+            ) {
+                self::$_tag_objects[ $tag ] = new $class_name;
+            } else {
+                self::$_tag_objects[ $tag ] = false;
+            }
+        }
+        return self::$_tag_objects[ $tag ];
+    }
+
+    /**
+     * Check for plugins and return function name
+     *
+     * @param        $plugin_name
+     * @param string $plugin_type type of plugin
+     *
+     * @return string call name of function
+     * @throws \SmartyException
+     */
+    public function getPlugin($plugin_name, $plugin_type)
+    {
+        $function = null;
+        if ($this->caching && ($this->nocache || $this->tag_nocache)) {
+            if (isset($this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ])) {
+                $function =
+                    $this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ];
+            } elseif (isset($this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ])) {
+                $this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ] =
+                    $this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ];
+                $function =
+                    $this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ];
+            }
+        } else {
+            if (isset($this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ])) {
+                $function =
+                    $this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ];
+            } elseif (isset($this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ])) {
+                $this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ] =
+                    $this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ];
+                $function =
+                    $this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ];
+            }
+        }
+        if (isset($function)) {
+            if ($plugin_type === 'modifier') {
+                $this->modifier_plugins[ $plugin_name ] = true;
+            }
+            return $function;
+        }
+        // loop through plugin dirs and find the plugin
+        $function = 'smarty_' . $plugin_type . '_' . $plugin_name;
+        $file = $this->smarty->loadPlugin($function, false);
+        if (is_string($file)) {
+            if ($this->caching && ($this->nocache || $this->tag_nocache)) {
+                $this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'file' ] =
+                    $file;
+                $this->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ] =
+                    $function;
+            } else {
+                $this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'file' ] =
+                    $file;
+                $this->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ] =
+                    $function;
+            }
+            if ($plugin_type === 'modifier') {
+                $this->modifier_plugins[ $plugin_name ] = true;
+            }
+            return $function;
+        }
+        if (is_callable($function)) {
+            // plugin function is defined in the script
+            return $function;
+        }
+        return false;
+    }
+
+    /**
+     * Check for plugins by default plugin handler
+     *
+     * @param string $tag         name of tag
+     * @param string $plugin_type type of plugin
+     *
+     * @return bool true if found
+     * @throws \SmartyCompilerException
+     */
+    public function getPluginFromDefaultHandler($tag, $plugin_type)
+    {
+        $callback = null;
+        $script = null;
+        $cacheable = true;
+        $result = call_user_func_array(
+            $this->smarty->default_plugin_handler_func,
+            array(
+                $tag,
+                $plugin_type,
+                $this->template,
+                &$callback,
+                &$script,
+                &$cacheable,
+            )
+        );
+        if ($result) {
+            $this->tag_nocache = $this->tag_nocache || !$cacheable;
+            if ($script !== null) {
+                if (is_file($script)) {
+                    if ($this->caching && ($this->nocache || $this->tag_nocache)) {
+                        $this->required_plugins[ 'nocache' ][ $tag ][ $plugin_type ][ 'file' ] =
+                            $script;
+                        $this->required_plugins[ 'nocache' ][ $tag ][ $plugin_type ][ 'function' ] =
+                            $callback;
+                    } else {
+                        $this->required_plugins[ 'compiled' ][ $tag ][ $plugin_type ][ 'file' ] =
+                            $script;
+                        $this->required_plugins[ 'compiled' ][ $tag ][ $plugin_type ][ 'function' ] =
+                            $callback;
+                    }
+                    include_once $script;
+                } else {
+                    $this->trigger_template_error("Default plugin handler: Returned script file '{$script}' for '{$tag}' not found");
+                }
+            }
+            if (is_callable($callback)) {
+                $this->default_handler_plugins[ $plugin_type ][ $tag ] = array(
+                    $callback,
+                    true,
+                    array()
+                );
+                return true;
+            } else {
+                $this->trigger_template_error("Default plugin handler: Returned callback for '{$tag}' not callable");
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Append code segments and remove unneeded ?> <?php transitions
+     *
+     * @param string $left
+     * @param string $right
+     *
+     * @return string
+     */
+    public function appendCode($left, $right)
+    {
+        if (preg_match('/\s*\?>\s?$/D', $left) && preg_match('/^<\?php\s+/', $right)) {
+            $left = preg_replace('/\s*\?>\s?$/D', "\n", $left);
+            $left .= preg_replace('/^<\?php\s+/', '', $right);
+        } else {
+            $left .= $right;
+        }
+        return $left;
+    }
+
+    /**
+     * Inject inline code for nocache template sections
+     * This method gets the content of each template element from the parser.
+     * If the content is compiled code and it should be not cached the code is injected
+     * into the rendered output.
+     *
+     * @param string  $content content of template element
+     * @param boolean $is_code true if content is compiled code
+     *
+     * @return string  content
+     */
+    public function processNocacheCode($content, $is_code)
+    {
+        // If the template is not evaluated and we have a nocache section and or a nocache tag
+        if ($is_code && !empty($content)) {
+            // generate replacement code
+            if ((!($this->template->source->handler->recompiled) || $this->forceNocache) && $this->caching
+                && !$this->suppressNocacheProcessing && ($this->nocache || $this->tag_nocache)
+            ) {
+                $this->template->compiled->has_nocache_code = true;
+                $_output = addcslashes($content, '\'\\');
+                $_output = str_replace('^#^', '\'', $_output);
+                $_output =
+                    "<?php echo '/*%%SmartyNocache:{$this->nocache_hash}%%*/{$_output}/*/%%SmartyNocache:{$this->nocache_hash}%%*/';?>\n";
+                // make sure we include modifier plugins for nocache code
+                foreach ($this->modifier_plugins as $plugin_name => $dummy) {
+                    if (isset($this->required_plugins[ 'compiled' ][ $plugin_name ][ 'modifier' ])) {
+                        $this->required_plugins[ 'nocache' ][ $plugin_name ][ 'modifier' ] =
+                            $this->required_plugins[ 'compiled' ][ $plugin_name ][ 'modifier' ];
+                    }
+                }
+            } else {
+                $_output = $content;
+            }
+        } else {
+            $_output = $content;
+        }
+        $this->modifier_plugins = array();
+        $this->suppressNocacheProcessing = false;
+        $this->tag_nocache = false;
+        return $_output;
+    }
+
+    /**
+     * Get Id
+     *
+     * @param string $input
+     *
+     * @return bool|string
+     */
+    public function getId($input)
+    {
+        if (preg_match('~^([\'"]*)([0-9]*[a-zA-Z_]\w*)\1$~', $input, $match)) {
+            return $match[ 2 ];
+        }
+        return false;
+    }
+
+    /**
+     * Get variable name from string
+     *
+     * @param string $input
+     *
+     * @return bool|string
+     */
+    public function getVariableName($input)
+    {
+        if (preg_match('~^[$]_smarty_tpl->tpl_vars\[[\'"]*([0-9]*[a-zA-Z_]\w*)[\'"]*\]->value$~', $input, $match)) {
+            return $match[ 1 ];
+        }
+        return false;
+    }
+
+    /**
+     * Set nocache flag in variable or create new variable
+     *
+     * @param string $varName
+     */
+    public function setNocacheInVariable($varName)
+    {
+        // create nocache var to make it know for further compiling
+        if ($_var = $this->getId($varName)) {
+            if (isset($this->template->tpl_vars[ $_var ])) {
+                $this->template->tpl_vars[ $_var ] = clone $this->template->tpl_vars[ $_var ];
+                $this->template->tpl_vars[ $_var ]->nocache = true;
+            } else {
+                $this->template->tpl_vars[ $_var ] = new Smarty_Variable(null, true);
+            }
+        }
+    }
+
+    /**
+     * @param array $_attr tag attributes
+     * @param array $validScopes
+     *
+     * @return int|string
+     * @throws \SmartyCompilerException
+     */
+    public function convertScope($_attr, $validScopes)
+    {
+        $_scope = 0;
+        if (isset($_attr[ 'scope' ])) {
+            $_scopeName = trim($_attr[ 'scope' ], '\'"');
+            if (is_numeric($_scopeName) && in_array($_scopeName, $validScopes)) {
+                $_scope = $_scopeName;
+            } elseif (is_string($_scopeName)) {
+                $_scopeName = trim($_scopeName, '\'"');
+                $_scope = isset($validScopes[ $_scopeName ]) ? $validScopes[ $_scopeName ] : false;
+            } else {
+                $_scope = false;
+            }
+            if ($_scope === false) {
+                $err = var_export($_scopeName, true);
+                $this->trigger_template_error("illegal value '{$err}' for \"scope\" attribute", null, true);
+            }
+        }
+        return $_scope;
+    }
+
+    /**
+     * Generate nocache code string
+     *
+     * @param string $code PHP code
+     *
+     * @return string
+     */
+    public function makeNocacheCode($code)
+    {
+        return "echo '/*%%SmartyNocache:{$this->nocache_hash}%%*/<?php " .
+               str_replace('^#^', '\'', addcslashes($code, '\'\\')) .
+               "?>/*/%%SmartyNocache:{$this->nocache_hash}%%*/';\n";
+    }
+
+    /**
+     * display compiler error messages without dying
+     * If parameter $args is empty it is a parser detected syntax error.
+     * In this case the parser is called to obtain information about expected tokens.
+     * If parameter $args contains a string this is used as error message
+     *
+     * @param string    $args    individual error message or null
+     * @param string    $line    line-number
+     * @param null|bool $tagline if true the line number of last tag
+     *
+     * @throws \SmartyCompilerException when an unexpected token is found
+     */
+    public function trigger_template_error($args = null, $line = null, $tagline = null)
+    {
+        $lex = $this->parser->lex;
+        if ($tagline === true) {
+            // get line number of Tag
+            $line = $lex->taglineno;
+        } elseif (!isset($line)) {
+            // get template source line which has error
+            $line = $lex->line;
+        } else {
+            $line = (int)$line;
+        }
+        if (in_array(
+            $this->template->source->type,
+            array(
+                'eval',
+                'string'
+            )
+        )
+        ) {
+            $templateName = $this->template->source->type . ':' . trim(
+                    preg_replace(
+                        '![\t\r\n]+!',
+                        ' ',
+                        strlen($lex->data) > 40 ?
+                            substr($lex->data, 0, 40) .
+                            '...' : $lex->data
+                    )
+                );
+        } else {
+            $templateName = $this->template->source->type . ':' . $this->template->source->filepath;
+        }
+        //        $line += $this->trace_line_offset;
+        $match = preg_split("/\n/", $lex->data);
+        $error_text =
+            'Syntax error in template "' . (empty($this->trace_filepath) ? $templateName : $this->trace_filepath) .
+            '"  on line ' . ($line + $this->trace_line_offset) . ' "' .
+            trim(preg_replace('![\t\r\n]+!', ' ', $match[ $line - 1 ])) . '" ';
+        if (isset($args)) {
+            // individual error message
+            $error_text .= $args;
+        } else {
+            $expect = array();
+            // expected token from parser
+            $error_text .= ' - Unexpected "' . $lex->value . '"';
+            if (count($this->parser->yy_get_expected_tokens($this->parser->yymajor)) <= 4) {
+                foreach ($this->parser->yy_get_expected_tokens($this->parser->yymajor) as $token) {
+                    $exp_token = $this->parser->yyTokenName[ $token ];
+                    if (isset($lex->smarty_token_names[ $exp_token ])) {
+                        // token type from lexer
+                        $expect[] = '"' . $lex->smarty_token_names[ $exp_token ] . '"';
+                    } else {
+                        // otherwise internal token name
+                        $expect[] = $this->parser->yyTokenName[ $token ];
+                    }
+                }
+                $error_text .= ', expected one of: ' . implode(' , ', $expect);
+            }
+        }
+        if ($this->smarty->_parserdebug) {
+            $this->parser->errorRunDown();
+            echo ob_get_clean();
+            flush();
+        }
+        $e = new SmartyCompilerException($error_text);
+        $e->line = $line;
+        $e->source = trim(preg_replace('![\t\r\n]+!', ' ', $match[ $line - 1 ]));
+        $e->desc = $args;
+        $e->template = $this->template->source->filepath;
+        throw $e;
+    }
+
+    /**
+     * Return var_export() value with all white spaces removed
+     *
+     * @param mixed $value
+     *
+     * @return string
+     */
+    public function getVarExport($value)
+    {
+        return preg_replace('/\s/', '', var_export($value, true));
+    }
+
+    /**
+     *  enter double quoted string
+     *  - save tag stack count
+     */
+    public function enterDoubleQuote()
+    {
+        array_push($this->_tag_stack_count, $this->getTagStackCount());
+    }
+
+    /**
+     * Return tag stack count
+     *
+     * @return int
+     */
+    public function getTagStackCount()
+    {
+        return count($this->_tag_stack);
+    }
+
+    /**
+     * @param $lexerPreg
+     *
+     * @return mixed
+     */
+    public function replaceDelimiter($lexerPreg)
+    {
+        return str_replace(
+            array('SMARTYldel', 'SMARTYliteral', 'SMARTYrdel', 'SMARTYautoliteral', 'SMARTYal'),
+            array(
+                $this->ldelPreg, $this->literalPreg, $this->rdelPreg,
+                $this->smarty->getAutoLiteral() ? '{1,}' : '{9}',
+                $this->smarty->getAutoLiteral() ? '' : '\\s*'
+            ),
+            $lexerPreg
+        );
+    }
+
+    /**
+     * Build lexer regular expressions for left and right delimiter and user defined literals
+     */
+    public function initDelimiterPreg()
+    {
+        $ldel = $this->smarty->getLeftDelimiter();
+        $this->ldelLength = strlen($ldel);
+        $this->ldelPreg = '';
+        foreach (str_split($ldel, 1) as $chr) {
+            $this->ldelPreg .= '[' . preg_quote($chr,'/') . ']';
+        }
+        $rdel = $this->smarty->getRightDelimiter();
+        $this->rdelLength = strlen($rdel);
+        $this->rdelPreg = '';
+        foreach (str_split($rdel, 1) as $chr) {
+            $this->rdelPreg .= '[' . preg_quote($chr,'/') . ']';
+        }
+        $literals = $this->smarty->getLiterals();
+        if (!empty($literals)) {
+            foreach ($literals as $key => $literal) {
+                $literalPreg = '';
+                foreach (str_split($literal, 1) as $chr) {
+                    $literalPreg .= '[' . preg_quote($chr,'/') . ']';
+                }
+                $literals[ $key ] = $literalPreg;
+            }
+            $this->literalPreg = '|' . implode('|', $literals);
+        } else {
+            $this->literalPreg = '';
+        }
+    }
+
+    /**
+     *  leave double quoted string
+     *  - throw exception if block in string was not closed
+     *
+     * @throws \SmartyCompilerException
+     */
+    public function leaveDoubleQuote()
+    {
+        if (array_pop($this->_tag_stack_count) !== $this->getTagStackCount()) {
+            $tag = $this->getOpenBlockTag();
+            $this->trigger_template_error(
+                "unclosed '{{$tag}}' in doubled quoted string",
+                null,
+                true
+            );
+        }
+    }
+
+    /**
+     * Get left delimiter preg
+     *
+     * @return string
+     */
+    public function getLdelPreg()
+    {
+        return $this->ldelPreg;
+    }
+
+    /**
+     * Get right delimiter preg
+     *
+     * @return string
+     */
+    public function getRdelPreg()
+    {
+        return $this->rdelPreg;
+    }
+
+    /**
+     * Get length of left delimiter
+     *
+     * @return int
+     */
+    public function getLdelLength()
+    {
+        return $this->ldelLength;
+    }
+
+    /**
+     * Get length of right delimiter
+     *
+     * @return int
+     */
+    public function getRdelLength()
+    {
+        return $this->rdelLength;
+    }
+
+    /**
+     * Get name of current open block tag
+     *
+     * @return string|boolean
+     */
+    public function getOpenBlockTag()
+    {
+        $tagCount = $this->getTagStackCount();
+        if ($tagCount) {
+            return $this->_tag_stack[ $tagCount - 1 ][ 0 ];
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Check if $value contains variable elements
+     *
+     * @param mixed $value
+     *
+     * @return bool|int
+     */
+    public function isVariable($value)
+    {
+        if (is_string($value)) {
+            return preg_match('/[$(]/', $value);
+        }
+        if (is_bool($value) || is_numeric($value)) {
+            return false;
+        }
+        if (is_array($value)) {
+            foreach ($value as $k => $v) {
+                if ($this->isVariable($k) || $this->isVariable($v)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+        return false;
+    }
+
+    /**
+     * Get new prefix variable name
+     *
+     * @return string
+     */
+    public function getNewPrefixVariable()
+    {
+        ++self::$prefixVariableNumber;
+        return $this->getPrefixVariable();
+    }
+
+    /**
+     * Get current prefix variable name
+     *
+     * @return string
+     */
+    public function getPrefixVariable()
+    {
+        return '$_prefixVariable' . self::$prefixVariableNumber;
+    }
+
+    /**
+     * append  code to prefix buffer
+     *
+     * @param string $code
+     */
+    public function appendPrefixCode($code)
+    {
+        $this->prefix_code[] = $code;
+    }
+
+    /**
+     * get prefix code string
+     *
+     * @return string
+     */
+    public function getPrefixCode()
+    {
+        $code = '';
+        $prefixArray = array_merge($this->prefix_code, array_pop($this->prefixCodeStack));
+        $this->prefixCodeStack[] = array();
+        foreach ($prefixArray as $c) {
+            $code = $this->appendCode($code, $c);
+        }
+        $this->prefix_code = array();
+        return $code;
+    }
+
+    /**
+     * Save current required plugins
+     *
+     * @param bool $init if true init required plugins
+     */
+    public function saveRequiredPlugins($init = false)
+    {
+        $this->required_plugins_stack[] = $this->required_plugins;
+        if ($init) {
+            $this->required_plugins = array('compiled' => array(), 'nocache' => array());
+        }
+    }
+
+    /**
+     * Restore required plugins
+     */
+    public function restoreRequiredPlugins()
+    {
+        $this->required_plugins = array_pop($this->required_plugins_stack);
+    }
+
+    /**
+     * Compile code to call Smarty_Internal_Template::_checkPlugins()
+     * for required plugins
+     *
+     * @return string
+     */
+    public function compileRequiredPlugins()
+    {
+        $code = $this->compileCheckPlugins($this->required_plugins[ 'compiled' ]);
+        if ($this->caching && !empty($this->required_plugins[ 'nocache' ])) {
+            $code .= $this->makeNocacheCode($this->compileCheckPlugins($this->required_plugins[ 'nocache' ]));
+        }
+        return $code;
+    }
+
+    /**
+     * Compile code to call Smarty_Internal_Template::_checkPlugins
+     *   - checks if plugin is callable require otherwise
+     *
+     * @param $requiredPlugins
+     *
+     * @return string
+     */
+    public function compileCheckPlugins($requiredPlugins)
+    {
+        if (!empty($requiredPlugins)) {
+            $plugins = array();
+            foreach ($requiredPlugins as $plugin) {
+                foreach ($plugin as $data) {
+                    $plugins[] = $data;
+                }
+            }
+            return '$_smarty_tpl->_checkPlugins(' . $this->getVarExport($plugins) . ');' . "\n";
+        } else {
+            return '';
+        }
+    }
+
+    /**
+     * method to compile a Smarty template
+     *
+     * @param mixed $_content template source
+     * @param bool  $isTemplateSource
+     *
+     * @return bool true if compiling succeeded, false if it failed
+     */
+    abstract protected function doCompile($_content, $isTemplateSource = false);
+
+    /**
+     * Compile Tag
+     *
+     * @param string $tag       tag name
+     * @param array  $args      array with tag attributes
+     * @param array  $parameter array with compilation parameter
+     *
+     * @throws SmartyCompilerException
+     * @throws SmartyException
+     * @return string compiled code
+     */
+    private function compileTag2($tag, $args, $parameter)
+    {
+        $plugin_type = '';
+        // $args contains the attributes parsed and compiled by the lexer/parser
+        // assume that tag does compile into code, but creates no HTML output
+        $this->has_code = true;
+        // log tag/attributes
+        if (isset($this->smarty->_cache[ 'get_used_tags' ])) {
+            $this->template->_cache[ 'used_tags' ][] = array(
+                $tag,
+                $args
+            );
+        }
+        // check nocache option flag
+        foreach ($args as $arg) {
+            if (!is_array($arg)) {
+                if ($arg === "'nocache'" || $arg === 'nocache') {
+                    $this->tag_nocache = true;
+                }
+            } else {
+                foreach ($arg as $k => $v) {
+                    if (($k === "'nocache'" || $k === 'nocache') && (trim($v, "'\" ") === 'true')) {
+                        $this->tag_nocache = true;
+                    }
+                }
+            }
+        }
+        // compile the smarty tag (required compile classes to compile the tag are auto loaded)
+        if (($_output = $this->callTagCompiler($tag, $args, $parameter)) === false) {
+            if (isset($this->parent_compiler->tpl_function[ $tag ])
+                || (isset($this->template->smarty->ext->_tplFunction)
+                    && $this->template->smarty->ext->_tplFunction->getTplFunction($this->template, $tag) !== false)
+            ) {
+                // template defined by {template} tag
+                $args[ '_attr' ][ 'name' ] = "'{$tag}'";
+                $_output = $this->callTagCompiler('call', $args, $parameter);
+            }
+        }
+        if ($_output !== false) {
+            if ($_output !== true) {
+                // did we get compiled code
+                if ($this->has_code) {
+                    // return compiled code
+                    return $_output;
+                }
+            }
+            // tag did not produce compiled code
+            return null;
+        } else {
+            // map_named attributes
+            if (isset($args[ '_attr' ])) {
+                foreach ($args[ '_attr' ] as $key => $attribute) {
+                    if (is_array($attribute)) {
+                        $args = array_merge($args, $attribute);
+                    }
+                }
+            }
+            // not an internal compiler tag
+            if (strlen($tag) < 6 || substr($tag, -5) !== 'close') {
+                // check if tag is a registered object
+                if (isset($this->smarty->registered_objects[ $tag ]) && isset($parameter[ 'object_method' ])) {
+                    $method = $parameter[ 'object_method' ];
+                    if (!in_array($method, $this->smarty->registered_objects[ $tag ][ 3 ])
+                        && (empty($this->smarty->registered_objects[ $tag ][ 1 ])
+                            || in_array($method, $this->smarty->registered_objects[ $tag ][ 1 ]))
+                    ) {
+                        return $this->callTagCompiler('private_object_function', $args, $parameter, $tag, $method);
+                    } elseif (in_array($method, $this->smarty->registered_objects[ $tag ][ 3 ])) {
+                        return $this->callTagCompiler(
+                            'private_object_block_function',
+                            $args,
+                            $parameter,
+                            $tag,
+                            $method
+                        );
+                    } else {
+                        // throw exception
+                        $this->trigger_template_error(
+                            'not allowed method "' . $method . '" in registered object "' .
+                            $tag . '"',
+                            null,
+                            true
+                        );
+                    }
+                }
+                // check if tag is registered
+                foreach (array(
+                    Smarty::PLUGIN_COMPILER,
+                    Smarty::PLUGIN_FUNCTION,
+                    Smarty::PLUGIN_BLOCK,
+                ) as $plugin_type) {
+                    if (isset($this->smarty->registered_plugins[ $plugin_type ][ $tag ])) {
+                        // if compiler function plugin call it now
+                        if ($plugin_type === Smarty::PLUGIN_COMPILER) {
+                            $new_args = array();
+                            foreach ($args as $key => $mixed) {
+                                if (is_array($mixed)) {
+                                    $new_args = array_merge($new_args, $mixed);
+                                } else {
+                                    $new_args[ $key ] = $mixed;
+                                }
+                            }
+                            if (!$this->smarty->registered_plugins[ $plugin_type ][ $tag ][ 1 ]) {
+                                $this->tag_nocache = true;
+                            }
+                            return call_user_func_array(
+                                $this->smarty->registered_plugins[ $plugin_type ][ $tag ][ 0 ],
+                                array(
+                                    $new_args,
+                                    $this
+                                )
+                            );
+                        }
+                        // compile registered function or block function
+                        if ($plugin_type === Smarty::PLUGIN_FUNCTION || $plugin_type === Smarty::PLUGIN_BLOCK) {
+                            return $this->callTagCompiler(
+                                'private_registered_' . $plugin_type,
+                                $args,
+                                $parameter,
+                                $tag
+                            );
+                        }
+                    }
+                }
+                // check plugins from plugins folder
+                foreach ($this->plugin_search_order as $plugin_type) {
+                    if ($plugin_type === Smarty::PLUGIN_COMPILER
+                        && $this->smarty->loadPlugin('smarty_compiler_' . $tag)
+                        && (!isset($this->smarty->security_policy)
+                            || $this->smarty->security_policy->isTrustedTag($tag, $this))
+                    ) {
+                        $plugin = 'smarty_compiler_' . $tag;
+                        if (is_callable($plugin)) {
+                            // convert arguments format for old compiler plugins
+                            $new_args = array();
+                            foreach ($args as $key => $mixed) {
+                                if (is_array($mixed)) {
+                                    $new_args = array_merge($new_args, $mixed);
+                                } else {
+                                    $new_args[ $key ] = $mixed;
+                                }
+                            }
+                            return $plugin($new_args, $this->smarty);
+                        }
+                        if (class_exists($plugin, false)) {
+                            $plugin_object = new $plugin;
+                            if (method_exists($plugin_object, 'compile')) {
+                                return $plugin_object->compile($args, $this);
+                            }
+                        }
+                        throw new SmartyException("Plugin '{$tag}' not callable");
+                    } else {
+                        if ($function = $this->getPlugin($tag, $plugin_type)) {
+                            if (!isset($this->smarty->security_policy)
+                                || $this->smarty->security_policy->isTrustedTag($tag, $this)
+                            ) {
+                                return $this->callTagCompiler(
+                                    'private_' . $plugin_type . '_plugin',
+                                    $args,
+                                    $parameter,
+                                    $tag,
+                                    $function
+                                );
+                            }
+                        }
+                    }
+                }
+                if (is_callable($this->smarty->default_plugin_handler_func)) {
+                    $found = false;
+                    // look for already resolved tags
+                    foreach ($this->plugin_search_order as $plugin_type) {
+                        if (isset($this->default_handler_plugins[ $plugin_type ][ $tag ])) {
+                            $found = true;
+                            break;
+                        }
+                    }
+                    if (!$found) {
+                        // call default handler
+                        foreach ($this->plugin_search_order as $plugin_type) {
+                            if ($this->getPluginFromDefaultHandler($tag, $plugin_type)) {
+                                $found = true;
+                                break;
+                            }
+                        }
+                    }
+                    if ($found) {
+                        // if compiler function plugin call it now
+                        if ($plugin_type === Smarty::PLUGIN_COMPILER) {
+                            $new_args = array();
+                            foreach ($args as $key => $mixed) {
+                                if (is_array($mixed)) {
+                                    $new_args = array_merge($new_args, $mixed);
+                                } else {
+                                    $new_args[ $key ] = $mixed;
+                                }
+                            }
+                            return call_user_func_array(
+                                $this->default_handler_plugins[ $plugin_type ][ $tag ][ 0 ],
+                                array(
+                                    $new_args,
+                                    $this
+                                )
+                            );
+                        } else {
+                            return $this->callTagCompiler(
+                                'private_registered_' . $plugin_type,
+                                $args,
+                                $parameter,
+                                $tag
+                            );
+                        }
+                    }
+                }
+            } else {
+                // compile closing tag of block function
+                $base_tag = substr($tag, 0, -5);
+                // check if closing tag is a registered object
+                if (isset($this->smarty->registered_objects[ $base_tag ]) && isset($parameter[ 'object_method' ])) {
+                    $method = $parameter[ 'object_method' ];
+                    if (in_array($method, $this->smarty->registered_objects[ $base_tag ][ 3 ])) {
+                        return $this->callTagCompiler(
+                            'private_object_block_function',
+                            $args,
+                            $parameter,
+                            $tag,
+                            $method
+                        );
+                    } else {
+                        // throw exception
+                        $this->trigger_template_error(
+                            'not allowed closing tag method "' . $method .
+                            '" in registered object "' . $base_tag . '"',
+                            null,
+                            true
+                        );
+                    }
+                }
+                // registered block tag ?
+                if (isset($this->smarty->registered_plugins[ Smarty::PLUGIN_BLOCK ][ $base_tag ])
+                    || isset($this->default_handler_plugins[ Smarty::PLUGIN_BLOCK ][ $base_tag ])
+                ) {
+                    return $this->callTagCompiler('private_registered_block', $args, $parameter, $tag);
+                }
+                // registered function tag ?
+                if (isset($this->smarty->registered_plugins[ Smarty::PLUGIN_FUNCTION ][ $tag ])) {
+                    return $this->callTagCompiler('private_registered_function', $args, $parameter, $tag);
+                }
+                // block plugin?
+                if ($function = $this->getPlugin($base_tag, Smarty::PLUGIN_BLOCK)) {
+                    return $this->callTagCompiler('private_block_plugin', $args, $parameter, $tag, $function);
+                }
+                // function plugin?
+                if ($function = $this->getPlugin($tag, Smarty::PLUGIN_FUNCTION)) {
+                    if (!isset($this->smarty->security_policy)
+                        || $this->smarty->security_policy->isTrustedTag($tag, $this)
+                    ) {
+                        return $this->callTagCompiler('private_function_plugin', $args, $parameter, $tag, $function);
+                    }
+                }
+                // registered compiler plugin ?
+                if (isset($this->smarty->registered_plugins[ Smarty::PLUGIN_COMPILER ][ $tag ])) {
+                    // if compiler function plugin call it now
+                    $args = array();
+                    if (!$this->smarty->registered_plugins[ Smarty::PLUGIN_COMPILER ][ $tag ][ 1 ]) {
+                        $this->tag_nocache = true;
+                    }
+                    return call_user_func_array(
+                        $this->smarty->registered_plugins[ Smarty::PLUGIN_COMPILER ][ $tag ][ 0 ],
+                        array(
+                            $args,
+                            $this
+                        )
+                    );
+                }
+                if ($this->smarty->loadPlugin('smarty_compiler_' . $tag)) {
+                    $plugin = 'smarty_compiler_' . $tag;
+                    if (is_callable($plugin)) {
+                        return $plugin($args, $this->smarty);
+                    }
+                    if (class_exists($plugin, false)) {
+                        $plugin_object = new $plugin;
+                        if (method_exists($plugin_object, 'compile')) {
+                            return $plugin_object->compile($args, $this);
+                        }
+                    }
+                    throw new SmartyException("Plugin '{$tag}' not callable");
+                }
+            }
+            $this->trigger_template_error("unknown tag '{$tag}'", null, true);
+        }
+    }
+}
diff --git a/sysplugins/smarty_internal_templatelexer.php b/sysplugins/smarty_internal_templatelexer.php
new file mode 100644
index 0000000000000000000000000000000000000000..867a31d26400fc7ff3ddc13d19acc647e650a496
--- /dev/null
+++ b/sysplugins/smarty_internal_templatelexer.php
@@ -0,0 +1,1095 @@
+<?php
+/*
+ * This file is part of Smarty.
+ *
+ * (c) 2015 Uwe Tews
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Smarty_Internal_Templatelexer
+ * This is the template file lexer.
+ * It is generated from the smarty_internal_templatelexer.plex file
+ *
+ *
+ * @author Uwe Tews <uwe.tews@googlemail.com>
+ */
+class Smarty_Internal_Templatelexer
+{
+    const TEXT               = 1;
+    const TAG                = 2;
+    const TAGBODY            = 3;
+    const LITERAL            = 4;
+    const DOUBLEQUOTEDSTRING = 5;
+
+    /**
+     * Source
+     *
+     * @var string
+     */
+    public $data;
+
+    /**
+     * Source length
+     *
+     * @var int
+     */
+    public $dataLength = null;
+
+    /**
+     * byte counter
+     *
+     * @var int
+     */
+    public $counter;
+
+    /**
+     * token number
+     *
+     * @var int
+     */
+    public $token;
+
+    /**
+     * token value
+     *
+     * @var string
+     */
+    public $value;
+
+    /**
+     * current line
+     *
+     * @var int
+     */
+    public $line;
+
+    /**
+     * tag start line
+     *
+     * @var
+     */
+    public $taglineno;
+
+    /**
+     * php code type
+     *
+     * @var string
+     */
+    public $phpType = '';
+
+    /**
+     * state number
+     *
+     * @var int
+     */
+    public $state = 1;
+
+    /**
+     * Smarty object
+     *
+     * @var Smarty
+     */
+    public $smarty = null;
+
+    /**
+     * compiler object
+     *
+     * @var Smarty_Internal_TemplateCompilerBase
+     */
+    public $compiler = null;
+
+    /**
+     * trace file
+     *
+     * @var resource
+     */
+    public $yyTraceFILE;
+
+    /**
+     * trace prompt
+     *
+     * @var string
+     */
+    public $yyTracePrompt;
+
+    /**
+     * XML flag true while processing xml
+     *
+     * @var bool
+     */
+    public $is_xml = false;
+
+    /**
+     * state names
+     *
+     * @var array
+     */
+    public $state_name = array(1 => 'TEXT', 2 => 'TAG', 3 => 'TAGBODY', 4 => 'LITERAL', 5 => 'DOUBLEQUOTEDSTRING',);
+
+    /**
+     * token names
+     *
+     * @var array
+     */
+    public $smarty_token_names = array(        // Text for parser error messages
+                                               'NOT'         => '(!,not)',
+                                               'OPENP'       => '(',
+                                               'CLOSEP'      => ')',
+                                               'OPENB'       => '[',
+                                               'CLOSEB'      => ']',
+                                               'PTR'         => '->',
+                                               'APTR'        => '=>',
+                                               'EQUAL'       => '=',
+                                               'NUMBER'      => 'number',
+                                               'UNIMATH'     => '+" , "-',
+                                               'MATH'        => '*" , "/" , "%',
+                                               'INCDEC'      => '++" , "--',
+                                               'SPACE'       => ' ',
+                                               'DOLLAR'      => '$',
+                                               'SEMICOLON'   => ';',
+                                               'COLON'       => ':',
+                                               'DOUBLECOLON' => '::',
+                                               'AT'          => '@',
+                                               'HATCH'       => '#',
+                                               'QUOTE'       => '"',
+                                               'BACKTICK'    => '`',
+                                               'VERT'        => '"|" modifier',
+                                               'DOT'         => '.',
+                                               'COMMA'       => '","',
+                                               'QMARK'       => '"?"',
+                                               'ID'          => 'id, name',
+                                               'TEXT'        => 'text',
+                                               'LDELSLASH'   => '{/..} closing tag',
+                                               'LDEL'        => '{...} Smarty tag',
+                                               'COMMENT'     => 'comment',
+                                               'AS'          => 'as',
+                                               'TO'          => 'to',
+                                               'PHP'         => '"<?php", "<%", "{php}" tag',
+                                               'LOGOP'       => '"<", "==" ... logical operator',
+                                               'TLOGOP'      => '"lt", "eq" ... logical operator; "is div by" ... if condition',
+                                               'SCOND'       => '"is even" ... if condition',
+    );
+
+    /**
+     * literal tag nesting level
+     *
+     * @var int
+     */
+    private $literal_cnt = 0;
+
+    /**
+     * preg token pattern for state TEXT
+     *
+     * @var string
+     */
+    private $yy_global_pattern1 = null;
+
+    /**
+     * preg token pattern for state TAG
+     *
+     * @var string
+     */
+    private $yy_global_pattern2 = null;
+
+    /**
+     * preg token pattern for state TAGBODY
+     *
+     * @var string
+     */
+    private $yy_global_pattern3 = null;
+
+    /**
+     * preg token pattern for state LITERAL
+     *
+     * @var string
+     */
+    private $yy_global_pattern4 = null;
+
+    /**
+     * preg token pattern for state DOUBLEQUOTEDSTRING
+     *
+     * @var null
+     */
+    private $yy_global_pattern5 = null;
+
+    /**
+     * preg token pattern for text
+     *
+     * @var null
+     */
+    private $yy_global_text = null;
+
+    /**
+     * preg token pattern for literal
+     *
+     * @var null
+     */
+    private $yy_global_literal = null;
+
+    private $_yy_state         = 1;
+
+    private $_yy_stack         = array();
+
+    /**
+     * constructor
+     *
+     * @param   string                             $source template source
+     * @param Smarty_Internal_TemplateCompilerBase $compiler
+     */
+    public function __construct($source, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        $this->data = $source;
+        $this->dataLength = strlen($this->data);
+        $this->counter = 0;
+        if (preg_match('/^\xEF\xBB\xBF/i', $this->data, $match)) {
+            $this->counter += strlen($match[ 0 ]);
+        }
+        $this->line = 1;
+        $this->smarty = $compiler->template->smarty;
+        $this->compiler = $compiler;
+        $this->compiler->initDelimiterPreg();
+        $this->smarty_token_names[ 'LDEL' ] = $this->smarty->getLeftDelimiter();
+        $this->smarty_token_names[ 'RDEL' ] = $this->smarty->getRightDelimiter();
+    }
+
+    /**
+     * open lexer/parser trace file
+     *
+     */
+    public function PrintTrace()
+    {
+        $this->yyTraceFILE = fopen('php://output', 'w');
+        $this->yyTracePrompt = '<br>';
+    }
+
+    /**
+     * replace placeholders with runtime preg  code
+     *
+     * @param string $preg
+     *
+     * @return string
+     */
+    public function replace($preg)
+    {
+        return $this->compiler->replaceDelimiter($preg);
+    }
+
+    /**
+     * check if current value is an autoliteral left delimiter
+     *
+     * @return bool
+     */
+    public function isAutoLiteral()
+    {
+        return $this->smarty->getAutoLiteral() && isset($this->value[ $this->compiler->getLdelLength() ]) ?
+            strpos(" \n\t\r", $this->value[ $this->compiler->getLdelLength() ]) !== false : false;
+    } // end function
+
+    public function yylex()
+    {
+        return $this->{'yylex' . $this->_yy_state}();
+    }
+
+    public function yypushstate($state)
+    {
+        if ($this->yyTraceFILE) {
+            fprintf($this->yyTraceFILE, "%sState push %s\n", $this->yyTracePrompt,
+                isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state);
+        }
+        array_push($this->_yy_stack, $this->_yy_state);
+        $this->_yy_state = $state;
+        if ($this->yyTraceFILE) {
+            fprintf($this->yyTraceFILE, "%snew State %s\n", $this->yyTracePrompt,
+                isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state);
+        }
+    }
+
+    public function yypopstate()
+    {
+        if ($this->yyTraceFILE) {
+            fprintf($this->yyTraceFILE, "%sState pop %s\n", $this->yyTracePrompt,
+                isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state);
+        }
+        $this->_yy_state = array_pop($this->_yy_stack);
+        if ($this->yyTraceFILE) {
+            fprintf($this->yyTraceFILE, "%snew State %s\n", $this->yyTracePrompt,
+                isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state);
+        }
+    }
+
+    public function yybegin($state)
+    {
+        $this->_yy_state = $state;
+        if ($this->yyTraceFILE) {
+            fprintf($this->yyTraceFILE, "%sState set %s\n", $this->yyTracePrompt,
+                isset($this->state_name[ $this->_yy_state ]) ? $this->state_name[ $this->_yy_state ] : $this->_yy_state);
+        }
+    }
+
+    public function yylex1()
+    {
+        if (!isset($this->yy_global_pattern1)) {
+            $this->yy_global_pattern1 =
+                $this->replace("/\G([{][}])|\G((SMARTYldel)SMARTYal[*])|\G((SMARTYldel)SMARTYalphp([ ].*?)?SMARTYrdel|(SMARTYldel)SMARTYal[\/]phpSMARTYrdel)|\G((SMARTYldel)SMARTYautoliteral\\s+SMARTYliteral)|\G((SMARTYldel)SMARTYalliteral\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/]literal\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal)|\G([<][?]((php\\s+|=)|\\s+)|[<][%]|[<][?]xml\\s+|[<]script\\s+language\\s*=\\s*[\"']?\\s*php\\s*[\"']?\\s*[>]|[?][>]|[%][>])|\G([\S\s])/isS");
+        }
+        if (!isset($this->dataLength)) {
+            $this->dataLength = strlen($this->data);
+        }
+        if ($this->counter >= $this->dataLength) {
+            return false; // end of input
+        }
+        do {
+            if (preg_match($this->yy_global_pattern1, $this->data, $yymatches, 0, $this->counter)) {
+                if (!isset($yymatches[ 0 ][ 1 ])) {
+                    $yymatches = preg_grep("/(.|\s)+/", $yymatches);
+                } else {
+                    $yymatches = array_filter($yymatches);
+                }
+                if (empty($yymatches)) {
+                    throw new Exception('Error: lexing failed because a rule matched' .
+                                        ' an empty string.  Input "' . substr($this->data,
+                            $this->counter, 5) . '... state TEXT');
+                }
+                next($yymatches); // skip global match
+                $this->token = key($yymatches); // token number
+                $this->value = current($yymatches); // token value
+                $r = $this->{'yy_r1_' . $this->token}();
+                if ($r === null) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    // accept this token
+                    return true;
+                } elseif ($r === true) {
+                    // we have changed state
+                    // process this token in the new state
+                    return $this->yylex();
+                } elseif ($r === false) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    if ($this->counter >= $this->dataLength) {
+                        return false; // end of input
+                    }
+                    // skip this token
+                    continue;
+                }
+            } else {
+                throw new Exception('Unexpected input at line ' . $this->line .
+                                    ': ' . $this->data[ $this->counter ]);
+            }
+            break;
+        } while (true);
+    }
+
+    public function yy_r1_1()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+    }
+
+    public function yy_r1_2()
+    {
+        $to = $this->dataLength;
+        preg_match("/[*]{$this->compiler->getRdelPreg()}[\n]?/", $this->data, $match, PREG_OFFSET_CAPTURE,
+            $this->counter);
+        if (isset($match[ 0 ][ 1 ])) {
+            $to = $match[ 0 ][ 1 ] + strlen($match[ 0 ][ 0 ]);
+        } else {
+            $this->compiler->trigger_template_error("missing or misspelled comment closing tag '{$this->smarty->getRightDelimiter()}'");
+        }
+        $this->value = substr($this->data, $this->counter, $to - $this->counter);
+        return false;
+    }
+
+    public function yy_r1_4()
+    {
+        $this->compiler->getTagCompiler('private_php')->parsePhp($this);
+    }
+
+    public function yy_r1_8()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+    }
+
+    public function yy_r1_10()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_LITERALSTART;
+        $this->yypushstate(self::LITERAL);
+    }
+
+    public function yy_r1_12()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_LITERALEND;
+        $this->yypushstate(self::LITERAL);
+    } // end function
+
+    public function yy_r1_14()
+    {
+        $this->yypushstate(self::TAG);
+        return true;
+    }
+
+    public function yy_r1_16()
+    {
+        $this->compiler->getTagCompiler('private_php')->parsePhp($this);
+    }
+
+    public function yy_r1_19()
+    {
+        if (!isset($this->yy_global_text)) {
+            $this->yy_global_text =
+                $this->replace('/(SMARTYldel)SMARTYal|[<][?]((php\s+|=)|\s+)|[<][%]|[<][?]xml\s+|[<]script\s+language\s*=\s*["\']?\s*php\s*["\']?\s*[>]|[?][>]|[%][>]SMARTYliteral/isS');
+        }
+        $to = $this->dataLength;
+        preg_match($this->yy_global_text, $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter);
+        if (isset($match[ 0 ][ 1 ])) {
+            $to = $match[ 0 ][ 1 ];
+        }
+        $this->value = substr($this->data, $this->counter, $to - $this->counter);
+        $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+    }
+
+    public function yylex2()
+    {
+        if (!isset($this->yy_global_pattern2)) {
+            $this->yy_global_pattern2 =
+                $this->replace("/\G((SMARTYldel)SMARTYal(if|elseif|else if|while)\\s+)|\G((SMARTYldel)SMARTYalfor\\s+)|\G((SMARTYldel)SMARTYalforeach(?![^\s]))|\G((SMARTYldel)SMARTYalsetfilter\\s+)|\G((SMARTYldel)SMARTYalmake_nocache\\s+)|\G((SMARTYldel)SMARTYal[0-9]*[a-zA-Z_]\\w*(\\s+nocache)?\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[$]smarty\\.block\\.(child|parent)\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/][0-9]*[a-zA-Z_]\\w*\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[$][0-9]*[a-zA-Z_]\\w*(\\s+nocache)?\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/])|\G((SMARTYldel)SMARTYal)/isS");
+        }
+        if (!isset($this->dataLength)) {
+            $this->dataLength = strlen($this->data);
+        }
+        if ($this->counter >= $this->dataLength) {
+            return false; // end of input
+        }
+        do {
+            if (preg_match($this->yy_global_pattern2, $this->data, $yymatches, 0, $this->counter)) {
+                if (!isset($yymatches[ 0 ][ 1 ])) {
+                    $yymatches = preg_grep("/(.|\s)+/", $yymatches);
+                } else {
+                    $yymatches = array_filter($yymatches);
+                }
+                if (empty($yymatches)) {
+                    throw new Exception('Error: lexing failed because a rule matched' .
+                                        ' an empty string.  Input "' . substr($this->data,
+                            $this->counter, 5) . '... state TAG');
+                }
+                next($yymatches); // skip global match
+                $this->token = key($yymatches); // token number
+                $this->value = current($yymatches); // token value
+                $r = $this->{'yy_r2_' . $this->token}();
+                if ($r === null) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    // accept this token
+                    return true;
+                } elseif ($r === true) {
+                    // we have changed state
+                    // process this token in the new state
+                    return $this->yylex();
+                } elseif ($r === false) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    if ($this->counter >= $this->dataLength) {
+                        return false; // end of input
+                    }
+                    // skip this token
+                    continue;
+                }
+            } else {
+                throw new Exception('Unexpected input at line ' . $this->line .
+                                    ': ' . $this->data[ $this->counter ]);
+            }
+            break;
+        } while (true);
+    }
+
+    public function yy_r2_1()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_LDELIF;
+        $this->yybegin(self::TAGBODY);
+        $this->taglineno = $this->line;
+    }
+
+    public function yy_r2_4()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_LDELFOR;
+        $this->yybegin(self::TAGBODY);
+        $this->taglineno = $this->line;
+    }
+
+    public function yy_r2_6()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH;
+        $this->yybegin(self::TAGBODY);
+        $this->taglineno = $this->line;
+    }
+
+    public function yy_r2_8()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_LDELSETFILTER;
+        $this->yybegin(self::TAGBODY);
+        $this->taglineno = $this->line;
+    }
+
+    public function yy_r2_10()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_LDELMAKENOCACHE;
+        $this->yybegin(self::TAGBODY);
+        $this->taglineno = $this->line;
+    }
+
+    public function yy_r2_12()
+    {
+        $this->yypopstate();
+        $this->token = Smarty_Internal_Templateparser::TP_SIMPLETAG;
+        $this->taglineno = $this->line;
+    }
+
+    public function yy_r2_15()
+    {
+        $this->yypopstate();
+        $this->token = Smarty_Internal_Templateparser::TP_SMARTYBLOCKCHILDPARENT;
+        $this->taglineno = $this->line;
+    }
+
+    public function yy_r2_18()
+    {
+        $this->yypopstate();
+        $this->token = Smarty_Internal_Templateparser::TP_CLOSETAG;
+        $this->taglineno = $this->line;
+    }
+
+    public function yy_r2_20()
+    {
+        if ($this->_yy_stack[ count($this->_yy_stack) - 1 ] === self::TEXT) {
+            $this->yypopstate();
+            $this->token = Smarty_Internal_Templateparser::TP_SIMPELOUTPUT;
+            $this->taglineno = $this->line;
+        } else {
+            $this->value = $this->smarty->getLeftDelimiter();
+            $this->token = Smarty_Internal_Templateparser::TP_LDEL;
+            $this->yybegin(self::TAGBODY);
+            $this->taglineno = $this->line;
+        }
+    } // end function
+
+    public function yy_r2_23()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
+        $this->yybegin(self::TAGBODY);
+        $this->taglineno = $this->line;
+    }
+
+    public function yy_r2_25()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_LDEL;
+        $this->yybegin(self::TAGBODY);
+        $this->taglineno = $this->line;
+    }
+
+    public function yylex3()
+    {
+        if (!isset($this->yy_global_pattern3)) {
+            $this->yy_global_pattern3 =
+                $this->replace("/\G(\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal)|\G([\"])|\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|\G([$][0-9]*[a-zA-Z_]\\w*)|\G([$])|\G(\\s+is\\s+in\\s+)|\G(\\s+as\\s+)|\G(\\s+to\\s+)|\G(\\s+step\\s+)|\G(\\s+instanceof\\s+)|\G(\\s*([!=][=]{1,2}|[<][=>]?|[>][=]?|[&|]{2})\\s*)|\G(\\s+(eq|ne|neq|gt|ge|gte|lt|le|lte|mod|and|or|xor)\\s+)|\G(\\s+is\\s+(not\\s+)?(odd|even|div)\\s+by\\s+)|\G(\\s+is\\s+(not\\s+)?(odd|even))|\G([!]\\s*|not\\s+)|\G([(](int(eger)?|bool(ean)?|float|double|real|string|binary|array|object)[)]\\s*)|\G(\\s*[(]\\s*)|\G(\\s*[)])|\G(\\[\\s*)|\G(\\s*\\])|\G(\\s*[-][>]\\s*)|\G(\\s*[=][>]\\s*)|\G(\\s*[=]\\s*)|\G(([+]|[-]){2})|\G(\\s*([+]|[-])\\s*)|\G(\\s*([*]{1,2}|[%\/^&]|[<>]{2})\\s*)|\G([@])|\G(array\\s*[(]\\s*)|\G([#])|\G(\\s+[0-9]*[a-zA-Z_][a-zA-Z0-9_\-:]*\\s*[=]\\s*)|\G(([0-9]*[a-zA-Z_]\\w*)?(\\\\[0-9]*[a-zA-Z_]\\w*)+)|\G([0-9]*[a-zA-Z_]\\w*)|\G(\\d+)|\G([`])|\G([|][@]?)|\G([.])|\G(\\s*[,]\\s*)|\G(\\s*[;]\\s*)|\G([:]{2})|\G(\\s*[:]\\s*)|\G(\\s*[?]\\s*)|\G(0[xX][0-9a-fA-F]+)|\G(\\s+)|\G([\S\s])/isS");
+        }
+        if (!isset($this->dataLength)) {
+            $this->dataLength = strlen($this->data);
+        }
+        if ($this->counter >= $this->dataLength) {
+            return false; // end of input
+        }
+        do {
+            if (preg_match($this->yy_global_pattern3, $this->data, $yymatches, 0, $this->counter)) {
+                if (!isset($yymatches[ 0 ][ 1 ])) {
+                    $yymatches = preg_grep("/(.|\s)+/", $yymatches);
+                } else {
+                    $yymatches = array_filter($yymatches);
+                }
+                if (empty($yymatches)) {
+                    throw new Exception('Error: lexing failed because a rule matched' .
+                                        ' an empty string.  Input "' . substr($this->data,
+                            $this->counter, 5) . '... state TAGBODY');
+                }
+                next($yymatches); // skip global match
+                $this->token = key($yymatches); // token number
+                $this->value = current($yymatches); // token value
+                $r = $this->{'yy_r3_' . $this->token}();
+                if ($r === null) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    // accept this token
+                    return true;
+                } elseif ($r === true) {
+                    // we have changed state
+                    // process this token in the new state
+                    return $this->yylex();
+                } elseif ($r === false) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    if ($this->counter >= $this->dataLength) {
+                        return false; // end of input
+                    }
+                    // skip this token
+                    continue;
+                }
+            } else {
+                throw new Exception('Unexpected input at line ' . $this->line .
+                                    ': ' . $this->data[ $this->counter ]);
+            }
+            break;
+        } while (true);
+    }
+
+    public function yy_r3_1()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_RDEL;
+        $this->yypopstate();
+    }
+
+    public function yy_r3_2()
+    {
+        $this->yypushstate(self::TAG);
+        return true;
+    }
+
+    public function yy_r3_4()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_QUOTE;
+        $this->yypushstate(self::DOUBLEQUOTEDSTRING);
+        $this->compiler->enterDoubleQuote();
+    }
+
+    public function yy_r3_5()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_SINGLEQUOTESTRING;
+    }
+
+    public function yy_r3_6()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_DOLLARID;
+    }
+
+    public function yy_r3_7()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_DOLLAR;
+    }
+
+    public function yy_r3_8()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_ISIN;
+    }
+
+    public function yy_r3_9()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_AS;
+    }
+
+    public function yy_r3_10()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_TO;
+    }
+
+    public function yy_r3_11()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_STEP;
+    }
+
+    public function yy_r3_12()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_INSTANCEOF;
+    }
+
+    public function yy_r3_13()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_LOGOP;
+    }
+
+    public function yy_r3_15()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_SLOGOP;
+    }
+
+    public function yy_r3_17()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_TLOGOP;
+    }
+
+    public function yy_r3_20()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_SINGLECOND;
+    }
+
+    public function yy_r3_23()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_NOT;
+    }
+
+    public function yy_r3_24()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_TYPECAST;
+    }
+
+    public function yy_r3_28()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_OPENP;
+    }
+
+    public function yy_r3_29()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_CLOSEP;
+    }
+
+    public function yy_r3_30()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_OPENB;
+    }
+
+    public function yy_r3_31()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_CLOSEB;
+    }
+
+    public function yy_r3_32()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_PTR;
+    }
+
+    public function yy_r3_33()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_APTR;
+    }
+
+    public function yy_r3_34()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_EQUAL;
+    }
+
+    public function yy_r3_35()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_INCDEC;
+    }
+
+    public function yy_r3_37()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_UNIMATH;
+    }
+
+    public function yy_r3_39()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_MATH;
+    }
+
+    public function yy_r3_41()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_AT;
+    }
+
+    public function yy_r3_42()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_ARRAYOPEN;
+    }
+
+    public function yy_r3_43()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_HATCH;
+    }
+
+    public function yy_r3_44()
+    {
+        // resolve conflicts with shorttag and right_delimiter starting with '='
+        if (substr($this->data, $this->counter + strlen($this->value) - 1, $this->compiler->getRdelLength()) ===
+            $this->smarty->getRightDelimiter()) {
+            preg_match('/\s+/', $this->value, $match);
+            $this->value = $match[ 0 ];
+            $this->token = Smarty_Internal_Templateparser::TP_SPACE;
+        } else {
+            $this->token = Smarty_Internal_Templateparser::TP_ATTR;
+        }
+    }
+
+    public function yy_r3_45()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_NAMESPACE;
+    }
+
+    public function yy_r3_48()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_ID;
+    }
+
+    public function yy_r3_49()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_INTEGER;
+    }
+
+    public function yy_r3_50()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_BACKTICK;
+        $this->yypopstate();
+    }
+
+    public function yy_r3_51()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_VERT;
+    }
+
+    public function yy_r3_52()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_DOT;
+    }
+
+    public function yy_r3_53()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_COMMA;
+    }
+
+    public function yy_r3_54()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_SEMICOLON;
+    }
+
+    public function yy_r3_55()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_DOUBLECOLON;
+    }
+
+    public function yy_r3_56()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_COLON;
+    }
+
+    public function yy_r3_57()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_QMARK;
+    }
+
+    public function yy_r3_58()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_HEX;
+    }
+
+    public function yy_r3_59()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_SPACE;
+    } // end function
+
+    public function yy_r3_60()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+    }
+
+    public function yylex4()
+    {
+        if (!isset($this->yy_global_pattern4)) {
+            $this->yy_global_pattern4 =
+                $this->replace("/\G((SMARTYldel)SMARTYalliteral\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/]literal\\s*SMARTYrdel)|\G([\S\s])/isS");
+        }
+        if (!isset($this->dataLength)) {
+            $this->dataLength = strlen($this->data);
+        }
+        if ($this->counter >= $this->dataLength) {
+            return false; // end of input
+        }
+        do {
+            if (preg_match($this->yy_global_pattern4, $this->data, $yymatches, 0, $this->counter)) {
+                if (!isset($yymatches[ 0 ][ 1 ])) {
+                    $yymatches = preg_grep("/(.|\s)+/", $yymatches);
+                } else {
+                    $yymatches = array_filter($yymatches);
+                }
+                if (empty($yymatches)) {
+                    throw new Exception('Error: lexing failed because a rule matched' .
+                                        ' an empty string.  Input "' . substr($this->data,
+                            $this->counter, 5) . '... state LITERAL');
+                }
+                next($yymatches); // skip global match
+                $this->token = key($yymatches); // token number
+                $this->value = current($yymatches); // token value
+                $r = $this->{'yy_r4_' . $this->token}();
+                if ($r === null) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    // accept this token
+                    return true;
+                } elseif ($r === true) {
+                    // we have changed state
+                    // process this token in the new state
+                    return $this->yylex();
+                } elseif ($r === false) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    if ($this->counter >= $this->dataLength) {
+                        return false; // end of input
+                    }
+                    // skip this token
+                    continue;
+                }
+            } else {
+                throw new Exception('Unexpected input at line ' . $this->line .
+                                    ': ' . $this->data[ $this->counter ]);
+            }
+            break;
+        } while (true);
+    }
+
+    public function yy_r4_1()
+    {
+        $this->literal_cnt++;
+        $this->token = Smarty_Internal_Templateparser::TP_LITERAL;
+    }
+
+    public function yy_r4_3()
+    {
+        if ($this->literal_cnt) {
+            $this->literal_cnt--;
+            $this->token = Smarty_Internal_Templateparser::TP_LITERAL;
+        } else {
+            $this->token = Smarty_Internal_Templateparser::TP_LITERALEND;
+            $this->yypopstate();
+        }
+    }
+
+    public function yy_r4_5()
+    {
+        if (!isset($this->yy_global_literal)) {
+            $this->yy_global_literal = $this->replace('/(SMARTYldel)SMARTYal[\/]?literalSMARTYrdel/isS');
+        }
+        $to = $this->dataLength;
+        preg_match($this->yy_global_literal, $this->data, $match, PREG_OFFSET_CAPTURE, $this->counter);
+        if (isset($match[ 0 ][ 1 ])) {
+            $to = $match[ 0 ][ 1 ];
+        } else {
+            $this->compiler->trigger_template_error("missing or misspelled literal closing tag");
+        }
+        $this->value = substr($this->data, $this->counter, $to - $this->counter);
+        $this->token = Smarty_Internal_Templateparser::TP_LITERAL;
+    } // end function
+
+    public function yylex5()
+    {
+        if (!isset($this->yy_global_pattern5)) {
+            $this->yy_global_pattern5 =
+                $this->replace("/\G((SMARTYldel)SMARTYautoliteral\\s+SMARTYliteral)|\G((SMARTYldel)SMARTYalliteral\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/]literal\\s*SMARTYrdel)|\G((SMARTYldel)SMARTYal[\/])|\G((SMARTYldel)SMARTYal[0-9]*[a-zA-Z_]\\w*)|\G((SMARTYldel)SMARTYal)|\G([\"])|\G([`][$])|\G([$][0-9]*[a-zA-Z_]\\w*)|\G([$])|\G(([^\"\\\\]*?)((?:\\\\.[^\"\\\\]*?)*?)(?=((SMARTYldel)SMARTYal|\\$|`\\$|\"SMARTYliteral)))|\G([\S\s])/isS");
+        }
+        if (!isset($this->dataLength)) {
+            $this->dataLength = strlen($this->data);
+        }
+        if ($this->counter >= $this->dataLength) {
+            return false; // end of input
+        }
+        do {
+            if (preg_match($this->yy_global_pattern5, $this->data, $yymatches, 0, $this->counter)) {
+                if (!isset($yymatches[ 0 ][ 1 ])) {
+                    $yymatches = preg_grep("/(.|\s)+/", $yymatches);
+                } else {
+                    $yymatches = array_filter($yymatches);
+                }
+                if (empty($yymatches)) {
+                    throw new Exception('Error: lexing failed because a rule matched' .
+                                        ' an empty string.  Input "' . substr($this->data,
+                            $this->counter, 5) . '... state DOUBLEQUOTEDSTRING');
+                }
+                next($yymatches); // skip global match
+                $this->token = key($yymatches); // token number
+                $this->value = current($yymatches); // token value
+                $r = $this->{'yy_r5_' . $this->token}();
+                if ($r === null) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    // accept this token
+                    return true;
+                } elseif ($r === true) {
+                    // we have changed state
+                    // process this token in the new state
+                    return $this->yylex();
+                } elseif ($r === false) {
+                    $this->counter += strlen($this->value);
+                    $this->line += substr_count($this->value, "\n");
+                    if ($this->counter >= $this->dataLength) {
+                        return false; // end of input
+                    }
+                    // skip this token
+                    continue;
+                }
+            } else {
+                throw new Exception('Unexpected input at line ' . $this->line .
+                                    ': ' . $this->data[ $this->counter ]);
+            }
+            break;
+        } while (true);
+    }
+
+    public function yy_r5_1()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+    }
+
+    public function yy_r5_3()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+    }
+
+    public function yy_r5_5()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+    }
+
+    public function yy_r5_7()
+    {
+        $this->yypushstate(self::TAG);
+        return true;
+    }
+
+    public function yy_r5_9()
+    {
+        $this->yypushstate(self::TAG);
+        return true;
+    }
+
+    public function yy_r5_11()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_LDEL;
+        $this->taglineno = $this->line;
+        $this->yypushstate(self::TAGBODY);
+    }
+
+    public function yy_r5_13()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_QUOTE;
+        $this->yypopstate();
+    }
+
+    public function yy_r5_14()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_BACKTICK;
+        $this->value = substr($this->value, 0, -1);
+        $this->yypushstate(self::TAGBODY);
+        $this->taglineno = $this->line;
+    }
+
+    public function yy_r5_15()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_DOLLARID;
+    }
+
+    public function yy_r5_16()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+    }
+
+    public function yy_r5_17()
+    {
+        $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+    }
+
+    public function yy_r5_22()
+    {
+        $to = $this->dataLength;
+        $this->value = substr($this->data, $this->counter, $to - $this->counter);
+        $this->token = Smarty_Internal_Templateparser::TP_TEXT;
+    }
+}
+
+     
diff --git a/sysplugins/smarty_internal_templateparser.php b/sysplugins/smarty_internal_templateparser.php
new file mode 100644
index 0000000000000000000000000000000000000000..aaeae63b715bd5fc5dc41163e1e0dfb6eeba7d82
--- /dev/null
+++ b/sysplugins/smarty_internal_templateparser.php
@@ -0,0 +1,3623 @@
+<?php
+
+class TP_yyStackEntry
+{
+    public $stateno;       /* The state-number */
+    public $major;         /* The major token value.  This is the code
+                     ** number for the token at this stack level */
+    public $minor; /* The user-supplied minor token value.  This
+                     ** is the value of the token  */
+}
+
+// line 11 "../smarty/lexer/smarty_internal_templateparser.y"
+
+/**
+ * Smarty Template Parser Class
+ *
+ * This is the template parser.
+ * It is generated from the smarty_internal_templateparser.y file
+ *
+ * @author Uwe Tews <uwe.tews@googlemail.com>
+ */
+class Smarty_Internal_Templateparser
+{
+    // line 23 "../smarty/lexer/smarty_internal_templateparser.y"
+    const ERR1                      = 'Security error: Call to private object member not allowed';
+    const ERR2                      = 'Security error: Call to dynamic object member not allowed';
+    const ERR3                      = 'PHP in template not allowed. Use SmartyBC to enable it';
+    const TP_VERT                   = 1;
+    const TP_COLON                  = 2;
+    const TP_PHP                    = 3;
+    const TP_TEXT                   = 4;
+    const TP_STRIPON                = 5;
+    const TP_STRIPOFF               = 6;
+    const TP_LITERALSTART           = 7;
+    const TP_LITERALEND             = 8;
+    const TP_LITERAL                = 9;
+    const TP_SIMPELOUTPUT           = 10;
+    const TP_SIMPLETAG              = 11;
+    const TP_SMARTYBLOCKCHILDPARENT = 12;
+    const TP_LDEL                   = 13;
+    const TP_RDEL                   = 14;
+    const TP_DOLLARID               = 15;
+    const TP_EQUAL                  = 16;
+    const TP_ID                     = 17;
+    const TP_PTR                    = 18;
+    const TP_LDELMAKENOCACHE        = 19;
+    const TP_LDELIF                 = 20;
+    const TP_LDELFOR                = 21;
+    const TP_SEMICOLON              = 22;
+    const TP_INCDEC                 = 23;
+    const TP_TO                     = 24;
+    const TP_STEP                   = 25;
+    const TP_LDELFOREACH            = 26;
+    const TP_SPACE                  = 27;
+    const TP_AS                     = 28;
+    const TP_APTR                   = 29;
+    const TP_LDELSETFILTER          = 30;
+    const TP_CLOSETAG               = 31;
+    const TP_LDELSLASH              = 32;
+    const TP_ATTR                   = 33;
+    const TP_INTEGER                = 34;
+    const TP_COMMA                  = 35;
+    const TP_OPENP                  = 36;
+    const TP_CLOSEP                 = 37;
+    const TP_MATH                   = 38;
+    const TP_UNIMATH                = 39;
+    const TP_ISIN                   = 40;
+    const TP_QMARK                  = 41;
+    const TP_NOT                    = 42;
+    const TP_TYPECAST               = 43;
+    const TP_HEX                    = 44;
+    const TP_DOT                    = 45;
+    const TP_INSTANCEOF             = 46;
+    const TP_SINGLEQUOTESTRING      = 47;
+    const TP_DOUBLECOLON            = 48;
+    const TP_NAMESPACE              = 49;
+    const TP_AT                     = 50;
+    const TP_HATCH                  = 51;
+    const TP_OPENB                  = 52;
+    const TP_CLOSEB                 = 53;
+    const TP_DOLLAR                 = 54;
+    const TP_LOGOP                  = 55;
+    const TP_SLOGOP                 = 56;
+    const TP_TLOGOP                 = 57;
+    const TP_SINGLECOND             = 58;
+    const TP_ARRAYOPEN              = 59;
+    const TP_QUOTE                  = 60;
+    const TP_BACKTICK               = 61;
+    const YY_NO_ACTION              = 516;
+    const YY_ACCEPT_ACTION          = 515;
+    const YY_ERROR_ACTION           = 514;
+    const YY_SZ_ACTTAB              = 2071;
+    const YY_SHIFT_USE_DFLT         = -31;
+    const YY_SHIFT_MAX              = 230;
+    const YY_REDUCE_USE_DFLT        = -91;
+    const YY_REDUCE_MAX             = 178;
+    const YYNOCODE                  = 110;
+    const YYSTACKDEPTH              = 500;
+    const YYNSTATE                  = 327;
+    const YYNRULE                   = 187;
+    const YYERRORSYMBOL             = 62;
+    const YYERRSYMDT                = 'yy0';
+    const YYFALLBACK                = 0;
+
+    public static $yy_action        = array(
+        251, 234, 237, 1, 144, 127, 428, 184, 199, 212,
+        10, 54, 19, 175, 282, 215, 109, 389, 428, 428,
+        224, 321, 223, 303, 203, 389, 13, 389, 281, 43,
+        389, 428, 41, 40, 266, 225, 389, 213, 389, 194,
+        389, 52, 4, 308, 301, 383, 34, 209, 222, 3,
+        50, 153, 251, 234, 237, 1, 199, 131, 383, 198,
+        305, 212, 10, 54, 383, 16, 199, 428, 109, 385,
+        132, 18, 224, 321, 223, 222, 221, 12, 32, 428,
+        116, 43, 385, 262, 41, 40, 266, 225, 385, 233,
+        95, 194, 16, 52, 4, 131, 301, 252, 18, 265,
+        164, 3, 50, 324, 251, 234, 237, 1, 23, 130,
+        229, 198, 150, 212, 10, 54, 326, 11, 170, 284,
+        109, 42, 22, 239, 224, 321, 223, 193, 221, 261,
+        13, 52, 157, 43, 301, 286, 41, 40, 266, 225,
+        205, 233, 5, 194, 96, 52, 4, 263, 301, 301,
+        99, 349, 96, 3, 50, 199, 251, 234, 237, 1,
+        238, 130, 241, 181, 349, 212, 10, 54, 382, 240,
+        349, 36, 109, 185, 104, 256, 224, 321, 223, 132,
+        191, 382, 13, 49, 91, 43, 12, 382, 41, 40,
+        266, 225, 257, 233, 152, 194, 457, 52, 4, 457,
+        301, 301, 228, 457, 282, 3, 50, 285, 251, 234,
+        237, 1, 301, 131, 441, 198, 238, 212, 10, 54,
+        349, 441, 325, 175, 109, 30, 349, 273, 224, 321,
+        223, 20, 221, 295, 32, 211, 457, 39, 166, 49,
+        41, 40, 266, 225, 87, 233, 205, 194, 279, 52,
+        4, 24, 301, 204, 200, 280, 99, 3, 50, 199,
+        251, 234, 237, 1, 31, 130, 96, 198, 205, 212,
+        10, 54, 350, 55, 293, 207, 109, 283, 99, 96,
+        224, 321, 223, 199, 180, 350, 13, 134, 230, 43,
+        222, 350, 41, 40, 266, 225, 104, 233, 316, 194,
+        279, 52, 4, 24, 301, 165, 284, 280, 85, 3,
+        50, 25, 251, 234, 237, 1, 131, 129, 210, 198,
+        14, 212, 10, 54, 269, 270, 301, 116, 109, 295,
+        216, 211, 224, 321, 223, 171, 221, 95, 13, 28,
+        219, 43, 323, 9, 41, 40, 266, 225, 151, 233,
+        324, 194, 52, 52, 4, 301, 301, 30, 282, 302,
+        178, 3, 50, 7, 251, 234, 237, 1, 136, 130,
+        304, 179, 238, 212, 10, 54, 279, 175, 282, 24,
+        109, 238, 429, 280, 224, 321, 223, 177, 221, 270,
+        13, 255, 281, 43, 429, 49, 41, 40, 266, 225,
+        275, 233, 318, 194, 49, 52, 4, 276, 301, 163,
+        26, 199, 8, 3, 50, 119, 251, 234, 237, 1,
+        11, 93, 291, 51, 107, 212, 10, 54, 226, 428,
+        206, 201, 109, 148, 178, 322, 224, 321, 223, 441,
+        221, 428, 13, 282, 9, 43, 441, 115, 41, 40,
+        266, 225, 167, 233, 227, 194, 457, 52, 4, 457,
+        301, 96, 158, 457, 101, 3, 50, 271, 251, 234,
+        237, 1, 282, 130, 235, 186, 135, 212, 10, 54,
+        199, 37, 119, 315, 109, 165, 284, 176, 224, 321,
+        223, 104, 221, 149, 13, 281, 146, 43, 281, 300,
+        41, 40, 266, 225, 30, 233, 289, 194, 21, 52,
+        4, 272, 301, 211, 18, 301, 161, 3, 50, 110,
+        251, 234, 237, 1, 137, 128, 282, 198, 268, 212,
+        10, 54, 222, 169, 515, 92, 109, 172, 284, 31,
+        224, 321, 223, 29, 221, 238, 6, 260, 53, 43,
+        232, 139, 41, 40, 266, 225, 154, 233, 178, 194,
+        168, 52, 4, 214, 301, 145, 99, 33, 49, 3,
+        50, 245, 208, 211, 320, 282, 90, 111, 311, 183,
+        98, 70, 309, 297, 236, 178, 95, 319, 142, 258,
+        247, 267, 249, 264, 250, 195, 231, 199, 246, 324,
+        317, 253, 254, 259, 126, 137, 133, 251, 234, 237,
+        1, 326, 290, 105, 143, 156, 212, 10, 54, 88,
+        84, 83, 484, 109, 322, 282, 37, 224, 321, 223,
+        245, 208, 211, 320, 281, 90, 111, 298, 182, 98,
+        56, 245, 298, 211, 178, 95, 103, 147, 258, 197,
+        102, 75, 141, 250, 195, 231, 95, 246, 324, 258,
+        279, 242, 89, 24, 250, 195, 231, 280, 246, 324,
+        298, 298, 298, 298, 298, 298, 298, 16, 298, 192,
+        277, 298, 298, 18, 294, 44, 45, 38, 298, 298,
+        251, 234, 237, 2, 298, 296, 298, 298, 298, 212,
+        10, 54, 310, 312, 313, 314, 109, 162, 298, 298,
+        224, 321, 223, 298, 298, 298, 294, 282, 298, 42,
+        22, 239, 251, 234, 237, 2, 298, 296, 298, 298,
+        298, 212, 10, 54, 298, 159, 298, 298, 109, 298,
+        298, 17, 224, 321, 223, 282, 298, 42, 22, 239,
+        298, 298, 245, 298, 211, 278, 298, 103, 111, 298,
+        183, 98, 70, 298, 298, 298, 298, 95, 298, 298,
+        258, 298, 292, 17, 298, 250, 195, 231, 279, 246,
+        324, 24, 298, 395, 245, 280, 211, 298, 298, 103,
+        298, 298, 197, 102, 75, 16, 298, 140, 298, 95,
+        298, 18, 258, 298, 298, 298, 298, 250, 195, 231,
+        298, 246, 324, 298, 298, 298, 298, 428, 298, 395,
+        395, 395, 202, 277, 298, 245, 298, 211, 298, 428,
+        103, 298, 298, 197, 120, 69, 395, 395, 395, 395,
+        95, 298, 298, 258, 298, 298, 298, 160, 250, 195,
+        231, 86, 246, 324, 245, 16, 211, 282, 298, 103,
+        196, 18, 197, 120, 69, 298, 44, 45, 38, 95,
+        298, 298, 258, 298, 298, 298, 178, 250, 195, 231,
+        298, 246, 324, 310, 312, 313, 314, 298, 298, 190,
+        245, 298, 211, 298, 298, 103, 298, 298, 197, 102,
+        75, 298, 298, 298, 298, 95, 298, 298, 258, 298,
+        298, 298, 298, 250, 195, 231, 298, 246, 324, 298,
+        298, 298, 245, 298, 211, 298, 199, 100, 298, 288,
+        197, 120, 47, 298, 106, 298, 298, 95, 298, 353,
+        258, 155, 298, 218, 298, 250, 195, 231, 298, 246,
+        324, 282, 16, 42, 22, 239, 298, 245, 18, 211,
+        298, 428, 103, 298, 298, 197, 120, 69, 298, 298,
+        298, 298, 95, 428, 298, 258, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 245, 298, 211, 298,
+        298, 100, 189, 298, 197, 120, 59, 245, 207, 211,
+        298, 95, 103, 298, 258, 197, 120, 81, 298, 250,
+        195, 231, 95, 246, 324, 258, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 298, 245, 298, 211,
+        298, 298, 103, 298, 298, 197, 120, 80, 298, 298,
+        298, 298, 95, 298, 298, 258, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 245, 298, 211, 298,
+        298, 103, 298, 298, 197, 120, 67, 245, 298, 211,
+        298, 95, 103, 298, 258, 197, 120, 57, 298, 250,
+        195, 231, 95, 246, 324, 258, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 298, 245, 298, 211,
+        298, 298, 103, 298, 298, 197, 120, 58, 298, 298,
+        298, 298, 95, 298, 298, 258, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 245, 298, 211, 298,
+        298, 103, 298, 298, 197, 120, 82, 245, 298, 211,
+        298, 95, 103, 298, 258, 197, 97, 76, 298, 250,
+        195, 231, 95, 246, 324, 258, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 298, 245, 298, 211,
+        298, 298, 103, 298, 298, 197, 120, 71, 298, 298,
+        298, 298, 95, 298, 298, 258, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 245, 298, 211, 298,
+        298, 103, 298, 298, 187, 120, 61, 245, 298, 211,
+        298, 95, 103, 298, 258, 197, 120, 63, 298, 250,
+        195, 231, 95, 246, 324, 258, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 298, 245, 298, 211,
+        298, 298, 103, 298, 298, 197, 94, 79, 298, 298,
+        298, 298, 95, 298, 298, 258, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 245, 298, 211, 298,
+        298, 103, 298, 298, 197, 120, 59, 245, 298, 211,
+        298, 95, 103, 298, 258, 197, 120, 77, 298, 250,
+        195, 231, 95, 246, 324, 258, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 298, 245, 298, 211,
+        298, 298, 103, 298, 298, 188, 108, 64, 298, 298,
+        298, 298, 95, 298, 298, 258, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 245, 298, 211, 298,
+        298, 103, 298, 298, 197, 120, 65, 245, 298, 211,
+        298, 95, 103, 298, 258, 197, 97, 66, 298, 250,
+        195, 231, 95, 246, 324, 258, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 298, 245, 298, 211,
+        298, 298, 103, 298, 298, 197, 120, 68, 298, 298,
+        298, 298, 95, 298, 298, 258, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 245, 298, 211, 298,
+        298, 103, 298, 298, 197, 120, 62, 245, 298, 211,
+        298, 95, 103, 298, 258, 197, 120, 60, 298, 250,
+        195, 231, 95, 246, 324, 258, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 298, 245, 298, 211,
+        298, 298, 103, 298, 298, 197, 120, 74, 298, 298,
+        298, 298, 95, 298, 298, 258, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 245, 298, 211, 298,
+        298, 103, 298, 298, 197, 120, 72, 245, 298, 211,
+        298, 95, 103, 298, 258, 197, 120, 48, 298, 250,
+        195, 231, 95, 246, 324, 258, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 298, 245, 298, 211,
+        298, 298, 103, 298, 298, 197, 120, 46, 298, 298,
+        298, 298, 95, 298, 298, 258, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 245, 298, 211, 298,
+        298, 103, 298, 298, 197, 120, 78, 245, 298, 211,
+        298, 95, 103, 298, 258, 197, 120, 73, 298, 250,
+        195, 231, 95, 246, 324, 258, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 298, 245, 298, 211,
+        298, 298, 103, 298, 298, 197, 125, 298, 298, 298,
+        298, 298, 95, 298, 298, 298, 298, 298, 298, 244,
+        250, 195, 231, 298, 246, 324, 245, 298, 211, 298,
+        298, 103, 298, 298, 197, 114, 298, 245, 298, 211,
+        298, 95, 103, 298, 298, 197, 122, 298, 243, 250,
+        195, 231, 95, 246, 324, 298, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 298, 245, 298, 211,
+        298, 298, 103, 298, 298, 197, 117, 298, 298, 298,
+        298, 298, 95, 298, 298, 298, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 245, 298, 211, 298,
+        298, 103, 298, 298, 197, 121, 298, 245, 298, 211,
+        298, 95, 103, 298, 298, 197, 124, 298, 298, 250,
+        195, 231, 95, 246, 324, 298, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 298, 245, 298, 211,
+        298, 298, 103, 298, 298, 197, 118, 298, 298, 298,
+        298, 298, 95, 298, 298, 298, 298, 298, 298, 298,
+        250, 195, 231, 298, 246, 324, 245, 298, 211, 298,
+        298, 103, 298, 298, 197, 123, 298, 245, 298, 211,
+        298, 95, 103, 298, 298, 197, 113, 298, 298, 250,
+        195, 231, 95, 246, 324, 298, 298, 298, 298, 298,
+        250, 195, 231, 220, 246, 324, 298, 27, 298, 16,
+        298, 457, 298, 298, 457, 18, 298, 26, 457, 441,
+        44, 45, 38, 217, 44, 45, 38, 298, 298, 298,
+        298, 298, 298, 298, 298, 298, 298, 310, 312, 313,
+        314, 310, 312, 313, 314, 298, 441, 298, 298, 441,
+        298, 457, 220, 441, 457, 298, 298, 457, 298, 298,
+        457, 457, 441, 457, 298, 298, 220, 457, 441, 298,
+        298, 298, 298, 298, 457, 298, 298, 457, 298, 298,
+        5, 457, 441, 298, 298, 298, 298, 298, 298, 441,
+        298, 298, 441, 298, 457, 441, 441, 298, 441, 298,
+        457, 298, 441, 306, 298, 298, 298, 298, 298, 441,
+        298, 298, 441, 298, 457, 220, 441, 298, 298, 298,
+        298, 298, 298, 457, 298, 298, 457, 298, 298, 15,
+        457, 441, 35, 274, 44, 45, 38, 457, 298, 298,
+        457, 298, 298, 298, 457, 441, 298, 298, 298, 298,
+        298, 310, 312, 313, 314, 298, 298, 298, 441, 298,
+        298, 441, 298, 457, 298, 441, 287, 298, 44, 45,
+        38, 298, 441, 298, 298, 441, 298, 457, 298, 441,
+        248, 298, 298, 298, 298, 310, 312, 313, 314, 298,
+        44, 45, 38, 298, 298, 112, 298, 44, 45, 38,
+        298, 173, 298, 298, 44, 45, 38, 310, 312, 313,
+        314, 44, 45, 38, 310, 312, 313, 314, 298, 298,
+        299, 310, 312, 313, 314, 44, 45, 38, 310, 312,
+        313, 314, 174, 298, 298, 298, 138, 298, 298, 298,
+        298, 298, 310, 312, 313, 314, 44, 45, 38, 298,
+        298, 298, 44, 45, 38, 298, 44, 45, 38, 298,
+        44, 45, 38, 310, 312, 313, 314, 307, 298, 310,
+        312, 313, 314, 310, 312, 313, 314, 310, 312, 313,
+        314,
+    );
+
+    public static $yy_lookahead     = array(
+        10, 11, 12, 13, 74, 15, 36, 17, 1, 19,
+        20, 21, 29, 103, 84, 45, 26, 14, 48, 36,
+        30, 31, 32, 53, 34, 22, 36, 24, 98, 39,
+        27, 48, 42, 43, 44, 45, 33, 47, 35, 49,
+        37, 51, 52, 53, 54, 14, 16, 16, 45, 59,
+        60, 96, 10, 11, 12, 13, 1, 15, 27, 17,
+        53, 19, 20, 21, 33, 27, 1, 36, 26, 14,
+        45, 33, 30, 31, 32, 45, 34, 52, 36, 48,
+        72, 39, 27, 75, 42, 43, 44, 45, 33, 47,
+        82, 49, 27, 51, 52, 15, 54, 17, 33, 91,
+        83, 59, 60, 95, 10, 11, 12, 13, 13, 15,
+        15, 17, 17, 19, 20, 21, 97, 35, 99, 100,
+        26, 86, 87, 88, 30, 31, 32, 66, 34, 49,
+        36, 51, 96, 39, 54, 53, 42, 43, 44, 45,
+        72, 47, 16, 49, 18, 51, 52, 79, 54, 54,
+        82, 14, 18, 59, 60, 1, 10, 11, 12, 13,
+        23, 15, 15, 17, 27, 19, 20, 21, 14, 17,
+        33, 13, 26, 15, 48, 17, 30, 31, 32, 45,
+        34, 27, 36, 46, 83, 39, 52, 33, 42, 43,
+        44, 45, 34, 47, 74, 49, 10, 51, 52, 13,
+        54, 54, 50, 17, 84, 59, 60, 14, 10, 11,
+        12, 13, 54, 15, 45, 17, 23, 19, 20, 21,
+        27, 52, 100, 103, 26, 35, 33, 37, 30, 31,
+        32, 22, 34, 67, 36, 69, 50, 39, 83, 46,
+        42, 43, 44, 45, 35, 47, 72, 49, 10, 51,
+        52, 13, 54, 79, 80, 17, 82, 59, 60, 1,
+        10, 11, 12, 13, 16, 15, 18, 17, 72, 19,
+        20, 21, 14, 107, 108, 79, 26, 71, 82, 18,
+        30, 31, 32, 1, 34, 27, 36, 15, 50, 39,
+        45, 33, 42, 43, 44, 45, 48, 47, 53, 49,
+        10, 51, 52, 13, 54, 99, 100, 17, 36, 59,
+        60, 29, 10, 11, 12, 13, 15, 15, 17, 17,
+        13, 19, 20, 21, 8, 9, 54, 72, 26, 67,
+        75, 69, 30, 31, 32, 78, 34, 82, 36, 24,
+        50, 39, 17, 36, 42, 43, 44, 45, 74, 47,
+        95, 49, 51, 51, 52, 54, 54, 35, 84, 37,
+        103, 59, 60, 36, 10, 11, 12, 13, 74, 15,
+        108, 17, 23, 19, 20, 21, 10, 103, 84, 13,
+        26, 23, 36, 17, 30, 31, 32, 7, 34, 9,
+        36, 17, 98, 39, 48, 46, 42, 43, 44, 45,
+        17, 47, 53, 49, 46, 51, 52, 93, 54, 78,
+        16, 1, 36, 59, 60, 101, 10, 11, 12, 13,
+        35, 15, 37, 17, 48, 19, 20, 21, 18, 36,
+        65, 66, 26, 74, 103, 104, 30, 31, 32, 45,
+        34, 48, 36, 84, 36, 39, 52, 17, 42, 43,
+        44, 45, 15, 47, 17, 49, 10, 51, 52, 13,
+        54, 18, 74, 17, 82, 59, 60, 34, 10, 11,
+        12, 13, 84, 15, 93, 17, 15, 19, 20, 21,
+        1, 2, 101, 101, 26, 99, 100, 17, 30, 31,
+        32, 48, 34, 96, 36, 98, 96, 39, 98, 71,
+        42, 43, 44, 45, 35, 47, 37, 49, 27, 51,
+        52, 67, 54, 69, 33, 54, 74, 59, 60, 17,
+        10, 11, 12, 13, 96, 15, 84, 17, 34, 19,
+        20, 21, 45, 78, 63, 64, 26, 99, 100, 16,
+        30, 31, 32, 16, 34, 23, 36, 17, 17, 39,
+        23, 51, 42, 43, 44, 45, 72, 47, 103, 49,
+        78, 51, 52, 17, 54, 74, 82, 41, 46, 59,
+        60, 67, 68, 69, 70, 84, 72, 73, 53, 75,
+        76, 77, 53, 61, 15, 103, 82, 14, 51, 85,
+        14, 37, 17, 8, 90, 91, 92, 1, 94, 95,
+        3, 4, 5, 6, 7, 96, 82, 10, 11, 12,
+        13, 97, 84, 81, 96, 74, 19, 20, 21, 78,
+        82, 82, 1, 26, 104, 84, 2, 30, 31, 32,
+        67, 68, 69, 70, 98, 72, 73, 109, 75, 76,
+        77, 67, 109, 69, 103, 82, 72, 96, 85, 75,
+        76, 77, 96, 90, 91, 92, 82, 94, 95, 85,
+        10, 14, 96, 13, 90, 91, 92, 17, 94, 95,
+        109, 109, 109, 109, 109, 109, 109, 27, 109, 105,
+        106, 109, 109, 33, 4, 38, 39, 40, 109, 109,
+        10, 11, 12, 13, 109, 15, 109, 109, 109, 19,
+        20, 21, 55, 56, 57, 58, 26, 74, 109, 109,
+        30, 31, 32, 109, 109, 109, 4, 84, 109, 86,
+        87, 88, 10, 11, 12, 13, 109, 15, 109, 109,
+        109, 19, 20, 21, 109, 74, 109, 109, 26, 109,
+        60, 61, 30, 31, 32, 84, 109, 86, 87, 88,
+        109, 109, 67, 109, 69, 70, 109, 72, 73, 109,
+        75, 76, 77, 109, 109, 109, 109, 82, 109, 109,
+        85, 109, 60, 61, 109, 90, 91, 92, 10, 94,
+        95, 13, 109, 2, 67, 17, 69, 109, 109, 72,
+        109, 109, 75, 76, 77, 27, 109, 29, 109, 82,
+        109, 33, 85, 109, 109, 109, 109, 90, 91, 92,
+        109, 94, 95, 109, 109, 109, 109, 36, 109, 38,
+        39, 40, 105, 106, 109, 67, 109, 69, 109, 48,
+        72, 109, 109, 75, 76, 77, 55, 56, 57, 58,
+        82, 109, 109, 85, 109, 109, 109, 74, 90, 91,
+        92, 78, 94, 95, 67, 27, 69, 84, 109, 72,
+        102, 33, 75, 76, 77, 109, 38, 39, 40, 82,
+        109, 109, 85, 109, 109, 109, 103, 90, 91, 92,
+        109, 94, 95, 55, 56, 57, 58, 109, 109, 102,
+        67, 109, 69, 109, 109, 72, 109, 109, 75, 76,
+        77, 109, 109, 109, 109, 82, 109, 109, 85, 109,
+        109, 109, 109, 90, 91, 92, 109, 94, 95, 109,
+        109, 109, 67, 109, 69, 109, 1, 72, 109, 106,
+        75, 76, 77, 109, 79, 109, 109, 82, 109, 14,
+        85, 74, 109, 18, 109, 90, 91, 92, 109, 94,
+        95, 84, 27, 86, 87, 88, 109, 67, 33, 69,
+        109, 36, 72, 109, 109, 75, 76, 77, 109, 109,
+        109, 109, 82, 48, 109, 85, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 67, 109, 69, 109,
+        109, 72, 102, 109, 75, 76, 77, 67, 79, 69,
+        109, 82, 72, 109, 85, 75, 76, 77, 109, 90,
+        91, 92, 82, 94, 95, 85, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 109, 67, 109, 69,
+        109, 109, 72, 109, 109, 75, 76, 77, 109, 109,
+        109, 109, 82, 109, 109, 85, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 67, 109, 69, 109,
+        109, 72, 109, 109, 75, 76, 77, 67, 109, 69,
+        109, 82, 72, 109, 85, 75, 76, 77, 109, 90,
+        91, 92, 82, 94, 95, 85, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 109, 67, 109, 69,
+        109, 109, 72, 109, 109, 75, 76, 77, 109, 109,
+        109, 109, 82, 109, 109, 85, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 67, 109, 69, 109,
+        109, 72, 109, 109, 75, 76, 77, 67, 109, 69,
+        109, 82, 72, 109, 85, 75, 76, 77, 109, 90,
+        91, 92, 82, 94, 95, 85, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 109, 67, 109, 69,
+        109, 109, 72, 109, 109, 75, 76, 77, 109, 109,
+        109, 109, 82, 109, 109, 85, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 67, 109, 69, 109,
+        109, 72, 109, 109, 75, 76, 77, 67, 109, 69,
+        109, 82, 72, 109, 85, 75, 76, 77, 109, 90,
+        91, 92, 82, 94, 95, 85, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 109, 67, 109, 69,
+        109, 109, 72, 109, 109, 75, 76, 77, 109, 109,
+        109, 109, 82, 109, 109, 85, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 67, 109, 69, 109,
+        109, 72, 109, 109, 75, 76, 77, 67, 109, 69,
+        109, 82, 72, 109, 85, 75, 76, 77, 109, 90,
+        91, 92, 82, 94, 95, 85, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 109, 67, 109, 69,
+        109, 109, 72, 109, 109, 75, 76, 77, 109, 109,
+        109, 109, 82, 109, 109, 85, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 67, 109, 69, 109,
+        109, 72, 109, 109, 75, 76, 77, 67, 109, 69,
+        109, 82, 72, 109, 85, 75, 76, 77, 109, 90,
+        91, 92, 82, 94, 95, 85, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 109, 67, 109, 69,
+        109, 109, 72, 109, 109, 75, 76, 77, 109, 109,
+        109, 109, 82, 109, 109, 85, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 67, 109, 69, 109,
+        109, 72, 109, 109, 75, 76, 77, 67, 109, 69,
+        109, 82, 72, 109, 85, 75, 76, 77, 109, 90,
+        91, 92, 82, 94, 95, 85, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 109, 67, 109, 69,
+        109, 109, 72, 109, 109, 75, 76, 77, 109, 109,
+        109, 109, 82, 109, 109, 85, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 67, 109, 69, 109,
+        109, 72, 109, 109, 75, 76, 77, 67, 109, 69,
+        109, 82, 72, 109, 85, 75, 76, 77, 109, 90,
+        91, 92, 82, 94, 95, 85, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 109, 67, 109, 69,
+        109, 109, 72, 109, 109, 75, 76, 77, 109, 109,
+        109, 109, 82, 109, 109, 85, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 67, 109, 69, 109,
+        109, 72, 109, 109, 75, 76, 77, 67, 109, 69,
+        109, 82, 72, 109, 85, 75, 76, 77, 109, 90,
+        91, 92, 82, 94, 95, 85, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 109, 67, 109, 69,
+        109, 109, 72, 109, 109, 75, 76, 109, 109, 109,
+        109, 109, 82, 109, 109, 109, 109, 109, 109, 89,
+        90, 91, 92, 109, 94, 95, 67, 109, 69, 109,
+        109, 72, 109, 109, 75, 76, 109, 67, 109, 69,
+        109, 82, 72, 109, 109, 75, 76, 109, 89, 90,
+        91, 92, 82, 94, 95, 109, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 109, 67, 109, 69,
+        109, 109, 72, 109, 109, 75, 76, 109, 109, 109,
+        109, 109, 82, 109, 109, 109, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 67, 109, 69, 109,
+        109, 72, 109, 109, 75, 76, 109, 67, 109, 69,
+        109, 82, 72, 109, 109, 75, 76, 109, 109, 90,
+        91, 92, 82, 94, 95, 109, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 109, 67, 109, 69,
+        109, 109, 72, 109, 109, 75, 76, 109, 109, 109,
+        109, 109, 82, 109, 109, 109, 109, 109, 109, 109,
+        90, 91, 92, 109, 94, 95, 67, 109, 69, 109,
+        109, 72, 109, 109, 75, 76, 109, 67, 109, 69,
+        109, 82, 72, 109, 109, 75, 76, 109, 109, 90,
+        91, 92, 82, 94, 95, 109, 109, 109, 109, 109,
+        90, 91, 92, 2, 94, 95, 109, 25, 109, 27,
+        109, 10, 109, 109, 13, 33, 109, 16, 17, 18,
+        38, 39, 40, 37, 38, 39, 40, 109, 109, 109,
+        109, 109, 109, 109, 109, 109, 109, 55, 56, 57,
+        58, 55, 56, 57, 58, 109, 45, 109, 109, 48,
+        109, 50, 2, 52, 10, 109, 109, 13, 109, 109,
+        10, 17, 18, 13, 109, 109, 2, 17, 18, 109,
+        109, 109, 109, 109, 10, 109, 109, 13, 109, 109,
+        16, 17, 18, 109, 109, 109, 109, 109, 109, 45,
+        109, 109, 48, 109, 50, 45, 52, 109, 48, 109,
+        50, 109, 52, 53, 109, 109, 109, 109, 109, 45,
+        109, 109, 48, 109, 50, 2, 52, 109, 109, 109,
+        109, 109, 109, 10, 109, 109, 13, 109, 109, 2,
+        17, 18, 2, 37, 38, 39, 40, 10, 109, 109,
+        13, 109, 109, 109, 17, 18, 109, 109, 109, 109,
+        109, 55, 56, 57, 58, 109, 109, 109, 45, 109,
+        109, 48, 109, 50, 109, 52, 14, 109, 38, 39,
+        40, 109, 45, 109, 109, 48, 109, 50, 109, 52,
+        14, 109, 109, 109, 109, 55, 56, 57, 58, 109,
+        38, 39, 40, 109, 109, 22, 109, 38, 39, 40,
+        109, 14, 109, 109, 38, 39, 40, 55, 56, 57,
+        58, 38, 39, 40, 55, 56, 57, 58, 109, 109,
+        61, 55, 56, 57, 58, 38, 39, 40, 55, 56,
+        57, 58, 14, 109, 109, 109, 28, 109, 109, 109,
+        109, 109, 55, 56, 57, 58, 38, 39, 40, 109,
+        109, 109, 38, 39, 40, 109, 38, 39, 40, 109,
+        38, 39, 40, 55, 56, 57, 58, 53, 109, 55,
+        56, 57, 58, 55, 56, 57, 58, 55, 56, 57,
+        58,
+    );
+
+    public static $yy_shift_ofst    = array(
+        -31, 406, 406, 458, 458, 94, 510, 94, 94, 94,
+        510, 458, -10, 94, 94, 354, 146, 94, 94, 94,
+        94, 146, 94, 94, 94, 94, 250, 94, 94, 94,
+        94, 94, 94, 302, 94, 94, 94, 198, 42, 42,
+        42, 42, 42, 42, 42, 42, 1772, 828, 828, 80,
+        712, 925, 301, 65, 272, 680, 1942, 1920, 1886, 1776,
+        647, 1949, 1977, 2008, 2004, 1963, 1998, 1956, 2012, 2012,
+        2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012,
+        2012, 2012, 2012, 768, 650, 272, 65, 272, 65, 134,
+        126, 479, 597, 1854, 154, 290, 95, 55, 258, 366,
+        248, 366, 282, 443, 437, 38, 38, 437, 7, 481,
+        410, 38, 461, 621, 596, 596, 261, 596, 596, 261,
+        596, 596, 596, 596, 596, -31, -31, 1840, 1791, 1917,
+        1903, 1834, 158, 238, 394, 446, 38, 25, 147, 169,
+        147, 25, 169, 25, 38, 38, 25, 25, 38, 25,
+        307, 38, 38, 25, 527, 38, 38, 25, 38, 38,
+        38, 38, 38, 596, 624, 261, 624, 327, 596, 596,
+        261, 596, 261, -31, -31, -31, -31, -31, -31, 781,
+        3, 31, 193, 137, -30, 186, -17, 522, 349, 469,
+        322, 30, 82, 316, 346, 376, 190, 358, 393, 152,
+        209, 380, 385, 245, 315, 523, 585, 554, 576, 575,
+        537, 573, 569, 529, 525, 546, 500, 526, 531, 325,
+        530, 487, 494, 502, 470, 433, 430, 408, 383, 327,
+        374,
+    );
+
+    public static $yy_reduce_ofst   = array(
+        471, 504, 563, 717, 574, 685, 919, 890, 787, 758,
+        855, 823, 1240, 1199, 1140, 1100, 1070, 1129, 1170, 1210,
+        1269, 1280, 1310, 1339, 1350, 1380, 1409, 1420, 1450, 1479,
+        1490, 1059, 1030, 1000, 930, 960, 989, 1520, 1549, 1700,
+        1619, 1689, 1660, 1630, 1590, 1560, 633, 661, 867, 8,
+        166, 773, 255, 541, 174, 262, 35, 35, 35, 35,
+        35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+        35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+        35, 35, 35, 294, -70, 196, 120, 68, 274, 19,
+        206, 331, 444, 428, 257, 400, 382, 257, 257, 400,
+        386, 397, 257, 386, 381, 388, 359, 314, 257, 442,
+        482, 491, 484, 257, 257, 455, 386, 257, 257, 438,
+        257, 257, 257, 257, 257, 257, 365, 509, 509, 509,
+        509, 509, 524, 536, 509, 509, 528, 514, 539, 551,
+        538, 514, 556, 514, 528, 528, 514, 514, 528, 514,
+        518, 528, 528, 514, 532, 528, 528, 514, 528, 528,
+        528, 528, 528, -90, 520, 122, 520, 566, -90, -90,
+        122, -90, 122, -45, 36, 155, 101, 61, 17,
+    );
+
+    public static $yyExpectedTokens = array(
+        array(),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 53, 54, 59,
+            60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(
+            10, 11, 12, 13, 15, 17, 19, 20, 21, 26, 30, 31, 32, 34, 36, 39, 42, 43, 44, 45, 47, 49, 51, 52, 54, 59, 60,
+        ),
+        array(25, 27, 33, 38, 39, 40, 55, 56, 57, 58,),
+        array(27, 33, 38, 39, 40, 55, 56, 57, 58,),
+        array(27, 33, 38, 39, 40, 55, 56, 57, 58,),
+        array(15, 17, 49, 51, 54,),
+        array(4, 10, 11, 12, 13, 15, 19, 20, 21, 26, 30, 31, 32, 60, 61,),
+        array(1, 14, 18, 27, 33, 36, 48,),
+        array(15, 17, 51, 54,),
+        array(1, 27, 33,),
+        array(15, 36, 54,),
+        array(4, 10, 11, 12, 13, 15, 19, 20, 21, 26, 30, 31, 32, 60, 61,),
+        array(14, 38, 39, 40, 55, 56, 57, 58,),
+        array(2, 38, 39, 40, 55, 56, 57, 58,),
+        array(37, 38, 39, 40, 55, 56, 57, 58,),
+        array(37, 38, 39, 40, 55, 56, 57, 58,),
+        array(14, 38, 39, 40, 55, 56, 57, 58,),
+        array(38, 39, 40, 55, 56, 57, 58, 61,),
+        array(14, 38, 39, 40, 55, 56, 57, 58,),
+        array(14, 38, 39, 40, 55, 56, 57, 58,),
+        array(38, 39, 40, 53, 55, 56, 57, 58,),
+        array(22, 38, 39, 40, 55, 56, 57, 58,),
+        array(28, 38, 39, 40, 55, 56, 57, 58,),
+        array(14, 38, 39, 40, 55, 56, 57, 58,),
+        array(38, 39, 40, 55, 56, 57, 58,),
+        array(38, 39, 40, 55, 56, 57, 58,),
+        array(38, 39, 40, 55, 56, 57, 58,),
+        array(38, 39, 40, 55, 56, 57, 58,),
+        array(38, 39, 40, 55, 56, 57, 58,),
+        array(38, 39, 40, 55, 56, 57, 58,),
+        array(38, 39, 40, 55, 56, 57, 58,),
+        array(38, 39, 40, 55, 56, 57, 58,),
+        array(38, 39, 40, 55, 56, 57, 58,),
+        array(38, 39, 40, 55, 56, 57, 58,),
+        array(38, 39, 40, 55, 56, 57, 58,),
+        array(38, 39, 40, 55, 56, 57, 58,),
+        array(38, 39, 40, 55, 56, 57, 58,),
+        array(38, 39, 40, 55, 56, 57, 58,),
+        array(38, 39, 40, 55, 56, 57, 58,),
+        array(10, 13, 17, 27, 29, 33,),
+        array(10, 13, 17, 27, 33,),
+        array(15, 36, 54,),
+        array(1, 27, 33,),
+        array(15, 36, 54,),
+        array(1, 27, 33,),
+        array(18, 45, 52,),
+        array(16, 18, 48,),
+        array(1, 2,),
+        array(3, 4, 5, 6, 7, 10, 11, 12, 13, 19, 20, 21, 26, 30, 31, 32,),
+        array(2, 10, 13, 16, 17, 18, 45, 48, 50, 52,),
+        array(1, 14, 27, 33,),
+        array(10, 13, 17, 50,),
+        array(13, 15, 17, 54,),
+        array(1, 14, 27, 33,),
+        array(1, 14, 27, 33,),
+        array(10, 13, 17,),
+        array(16, 18, 48,),
+        array(10, 13, 17,),
+        array(1, 29,),
+        array(18, 48,),
+        array(15, 17,),
+        array(27, 33,),
+        array(27, 33,),
+        array(15, 17,),
+        array(1, 53,),
+        array(27, 33,),
+        array(1, 18,),
+        array(27, 33,),
+        array(15, 54,),
+        array(1,),
+        array(1,),
+        array(1,),
+        array(18,),
+        array(1,),
+        array(1,),
+        array(18,),
+        array(1,),
+        array(1,),
+        array(1,),
+        array(1,),
+        array(1,),
+        array(),
+        array(),
+        array(2, 10, 13, 17, 18, 45, 48, 50, 52, 53,),
+        array(2, 10, 13, 16, 17, 18, 45, 48, 50, 52,),
+        array(2, 10, 13, 17, 18, 45, 48, 50, 52,),
+        array(2, 10, 13, 17, 18, 45, 48, 50, 52,),
+        array(10, 13, 17, 18, 45, 48, 50, 52,),
+        array(13, 15, 17, 34, 54,),
+        array(10, 13, 17, 50,),
+        array(16, 45, 52,),
+        array(10, 13, 17,),
+        array(27, 33,),
+        array(45, 52,),
+        array(15, 54,),
+        array(45, 52,),
+        array(15, 54,),
+        array(45, 52,),
+        array(45, 52,),
+        array(45, 52,),
+        array(27, 33,),
+        array(27, 33,),
+        array(45, 52,),
+        array(45, 52,),
+        array(27, 33,),
+        array(45, 52,),
+        array(13, 36,),
+        array(27, 33,),
+        array(27, 33,),
+        array(45, 52,),
+        array(16, 23,),
+        array(27, 33,),
+        array(27, 33,),
+        array(45, 52,),
+        array(27, 33,),
+        array(27, 33,),
+        array(27, 33,),
+        array(27, 33,),
+        array(27, 33,),
+        array(1,),
+        array(2,),
+        array(18,),
+        array(2,),
+        array(36,),
+        array(1,),
+        array(1,),
+        array(18,),
+        array(1,),
+        array(18,),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(2, 36, 38, 39, 40, 48, 55, 56, 57, 58,),
+        array(14, 22, 24, 27, 33, 35, 37, 45,),
+        array(14, 16, 27, 33, 36, 48,),
+        array(14, 23, 27, 33, 46,),
+        array(14, 23, 27, 33, 46,),
+        array(36, 45, 48, 53,),
+        array(10, 13, 17, 50,),
+        array(29, 36, 48,),
+        array(23, 46, 61,),
+        array(23, 46, 53,),
+        array(35, 37,),
+        array(35, 37,),
+        array(16, 45,),
+        array(35, 53,),
+        array(8, 9,),
+        array(36, 48,),
+        array(36, 48,),
+        array(35, 37,),
+        array(23, 46,),
+        array(36, 48,),
+        array(17, 50,),
+        array(22, 35,),
+        array(7, 9,),
+        array(35, 37,),
+        array(45, 53,),
+        array(24,),
+        array(16,),
+        array(8,),
+        array(37,),
+        array(14,),
+        array(17,),
+        array(51,),
+        array(14,),
+        array(15,),
+        array(53,),
+        array(53,),
+        array(17,),
+        array(51,),
+        array(41,),
+        array(17,),
+        array(17,),
+        array(17,),
+        array(45,),
+        array(34,),
+        array(17,),
+        array(17,),
+        array(34,),
+        array(17,),
+        array(36,),
+        array(17,),
+        array(36,),
+        array(17,),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+        array(),
+    );
+
+    public static $yy_default       = array(
+        338, 514, 514, 499, 499, 514, 514, 476, 476, 476,
+        514, 514, 514, 514, 514, 514, 514, 514, 514, 514,
+        514, 514, 514, 514, 514, 514, 514, 514, 514, 514,
+        514, 514, 514, 514, 514, 514, 514, 514, 514, 514,
+        514, 514, 514, 514, 514, 514, 379, 358, 379, 514,
+        514, 415, 514, 379, 514, 514, 351, 514, 514, 514,
+        514, 514, 514, 514, 514, 514, 384, 514, 399, 475,
+        351, 403, 390, 474, 500, 502, 384, 501, 363, 381,
+        404, 386, 391, 379, 379, 514, 379, 514, 379, 489,
+        431, 370, 327, 430, 393, 441, 514, 393, 393, 441,
+        431, 441, 393, 431, 514, 379, 360, 514, 393, 379,
+        373, 379, 514, 406, 402, 375, 431, 396, 398, 486,
+        393, 408, 397, 407, 406, 483, 336, 430, 430, 430,
+        430, 430, 514, 443, 457, 441, 367, 438, 514, 436,
+        514, 435, 434, 466, 368, 348, 439, 437, 361, 467,
+        441, 356, 354, 468, 514, 366, 355, 469, 362, 359,
+        352, 369, 365, 371, 478, 463, 477, 441, 374, 376,
+        490, 424, 487, 441, 441, 482, 482, 336, 482, 415,
+        411, 415, 405, 405, 415, 442, 415, 405, 405, 514,
+        514, 411, 514, 514, 425, 514, 514, 405, 415, 514,
+        514, 334, 514, 411, 387, 514, 514, 514, 514, 514,
+        514, 514, 514, 420, 514, 514, 514, 417, 514, 514,
+        514, 411, 413, 514, 514, 514, 514, 488, 514, 457,
+        514, 421, 364, 420, 340, 422, 357, 341, 409, 400,
+        480, 457, 462, 401, 485, 423, 426, 342, 447, 380,
+        416, 339, 428, 329, 330, 444, 445, 446, 394, 331,
+        395, 429, 419, 388, 332, 418, 410, 392, 412, 333,
+        335, 414, 337, 472, 417, 479, 427, 497, 347, 461,
+        460, 459, 378, 346, 464, 510, 495, 511, 498, 473,
+        377, 496, 503, 506, 513, 512, 509, 507, 504, 508,
+        345, 458, 471, 448, 505, 454, 452, 455, 456, 450,
+        491, 449, 492, 493, 494, 470, 451, 328, 453, 343,
+        344, 372, 481, 432, 433, 465, 440,
+    );
+
+    public static $yyFallback       = array();
+
+    public static $yyRuleName       = array(
+        'start ::= template',
+        'template ::= template PHP',
+        'template ::= template TEXT',
+        'template ::= template STRIPON',
+        'template ::= template STRIPOFF',
+        'template ::= template LITERALSTART literal_e2 LITERALEND',
+        'literal_e2 ::= literal_e1 LITERALSTART literal_e1 LITERALEND',
+        'literal_e2 ::= literal_e1',
+        'literal_e1 ::= literal_e1 LITERAL',
+        'literal_e1 ::=',
+        'template ::= template smartytag',
+        'template ::=',
+        'smartytag ::= SIMPELOUTPUT',
+        'smartytag ::= SIMPLETAG',
+        'smartytag ::= SMARTYBLOCKCHILDPARENT',
+        'smartytag ::= LDEL tagbody RDEL',
+        'smartytag ::= tag RDEL',
+        'tagbody ::= outattr',
+        'tagbody ::= DOLLARID eqoutattr',
+        'tagbody ::= varindexed eqoutattr',
+        'eqoutattr ::= EQUAL outattr',
+        'outattr ::= output attributes',
+        'output ::= variable',
+        'output ::= value',
+        'output ::= expr',
+        'tag ::= LDEL ID attributes',
+        'tag ::= LDEL ID',
+        'tag ::= LDEL ID modifierlist attributes',
+        'tag ::= LDEL ID PTR ID attributes',
+        'tag ::= LDEL ID PTR ID modifierlist attributes',
+        'tag ::= LDELMAKENOCACHE DOLLARID',
+        'tag ::= LDELIF expr',
+        'tag ::= LDELIF expr attributes',
+        'tag ::= LDELIF statement',
+        'tag ::= LDELIF statement attributes',
+        'tag ::= LDELFOR statements SEMICOLON expr SEMICOLON varindexed foraction attributes',
+        'foraction ::= EQUAL expr',
+        'foraction ::= INCDEC',
+        'tag ::= LDELFOR statement TO expr attributes',
+        'tag ::= LDELFOR statement TO expr STEP expr attributes',
+        'tag ::= LDELFOREACH SPACE expr AS varvar attributes',
+        'tag ::= LDELFOREACH SPACE expr AS varvar APTR varvar attributes',
+        'tag ::= LDELFOREACH attributes',
+        'tag ::= LDELSETFILTER ID modparameters',
+        'tag ::= LDELSETFILTER ID modparameters modifierlist',
+        'smartytag ::= CLOSETAG',
+        'tag ::= LDELSLASH ID',
+        'tag ::= LDELSLASH ID modifierlist',
+        'tag ::= LDELSLASH ID PTR ID',
+        'tag ::= LDELSLASH ID PTR ID modifierlist',
+        'attributes ::= attributes attribute',
+        'attributes ::= attribute',
+        'attributes ::=',
+        'attribute ::= SPACE ID EQUAL ID',
+        'attribute ::= ATTR expr',
+        'attribute ::= ATTR value',
+        'attribute ::= SPACE ID',
+        'attribute ::= SPACE expr',
+        'attribute ::= SPACE value',
+        'attribute ::= SPACE INTEGER EQUAL expr',
+        'statements ::= statement',
+        'statements ::= statements COMMA statement',
+        'statement ::= DOLLARID EQUAL INTEGER',
+        'statement ::= DOLLARID EQUAL expr',
+        'statement ::= varindexed EQUAL expr',
+        'statement ::= OPENP statement CLOSEP',
+        'expr ::= value',
+        'expr ::= ternary',
+        'expr ::= DOLLARID COLON ID',
+        'expr ::= expr MATH value',
+        'expr ::= expr UNIMATH value',
+        'expr ::= expr tlop value',
+        'expr ::= expr lop expr',
+        'expr ::= expr scond',
+        'expr ::= expr ISIN array',
+        'expr ::= expr ISIN value',
+        'ternary ::= OPENP expr CLOSEP QMARK DOLLARID COLON expr',
+        'ternary ::= OPENP expr CLOSEP QMARK expr COLON expr',
+        'value ::= variable',
+        'value ::= UNIMATH value',
+        'value ::= NOT value',
+        'value ::= TYPECAST value',
+        'value ::= variable INCDEC',
+        'value ::= HEX',
+        'value ::= INTEGER',
+        'value ::= INTEGER DOT INTEGER',
+        'value ::= INTEGER DOT',
+        'value ::= DOT INTEGER',
+        'value ::= ID',
+        'value ::= function',
+        'value ::= OPENP expr CLOSEP',
+        'value ::= variable INSTANCEOF ns1',
+        'value ::= variable INSTANCEOF variable',
+        'value ::= SINGLEQUOTESTRING',
+        'value ::= doublequoted_with_quotes',
+        'value ::= varindexed DOUBLECOLON static_class_access',
+        'value ::= smartytag',
+        'value ::= value modifierlist',
+        'value ::= NAMESPACE',
+        'value ::= arraydef',
+        'value ::= ns1 DOUBLECOLON static_class_access',
+        'ns1 ::= ID',
+        'ns1 ::= NAMESPACE',
+        'variable ::= DOLLARID',
+        'variable ::= varindexed',
+        'variable ::= varvar AT ID',
+        'variable ::= object',
+        'variable ::= HATCH ID HATCH',
+        'variable ::= HATCH ID HATCH arrayindex',
+        'variable ::= HATCH variable HATCH',
+        'variable ::= HATCH variable HATCH arrayindex',
+        'varindexed ::= DOLLARID arrayindex',
+        'varindexed ::= varvar arrayindex',
+        'arrayindex ::= arrayindex indexdef',
+        'arrayindex ::=',
+        'indexdef ::= DOT DOLLARID',
+        'indexdef ::= DOT varvar',
+        'indexdef ::= DOT varvar AT ID',
+        'indexdef ::= DOT ID',
+        'indexdef ::= DOT INTEGER',
+        'indexdef ::= DOT LDEL expr RDEL',
+        'indexdef ::= OPENB ID CLOSEB',
+        'indexdef ::= OPENB ID DOT ID CLOSEB',
+        'indexdef ::= OPENB SINGLEQUOTESTRING CLOSEB',
+        'indexdef ::= OPENB INTEGER CLOSEB',
+        'indexdef ::= OPENB DOLLARID CLOSEB',
+        'indexdef ::= OPENB variable CLOSEB',
+        'indexdef ::= OPENB value CLOSEB',
+        'indexdef ::= OPENB expr CLOSEB',
+        'indexdef ::= OPENB CLOSEB',
+        'varvar ::= DOLLARID',
+        'varvar ::= DOLLAR',
+        'varvar ::= varvar varvarele',
+        'varvarele ::= ID',
+        'varvarele ::= SIMPELOUTPUT',
+        'varvarele ::= LDEL expr RDEL',
+        'object ::= varindexed objectchain',
+        'objectchain ::= objectelement',
+        'objectchain ::= objectchain objectelement',
+        'objectelement ::= PTR ID arrayindex',
+        'objectelement ::= PTR varvar arrayindex',
+        'objectelement ::= PTR LDEL expr RDEL arrayindex',
+        'objectelement ::= PTR ID LDEL expr RDEL arrayindex',
+        'objectelement ::= PTR method',
+        'function ::= ns1 OPENP params CLOSEP',
+        'method ::= ID OPENP params CLOSEP',
+        'method ::= DOLLARID OPENP params CLOSEP',
+        'params ::= params COMMA expr',
+        'params ::= expr',
+        'params ::=',
+        'modifierlist ::= modifierlist modifier modparameters',
+        'modifierlist ::= modifier modparameters',
+        'modifier ::= VERT AT ID',
+        'modifier ::= VERT ID',
+        'modparameters ::= modparameters modparameter',
+        'modparameters ::=',
+        'modparameter ::= COLON value',
+        'modparameter ::= COLON UNIMATH value',
+        'modparameter ::= COLON array',
+        'static_class_access ::= method',
+        'static_class_access ::= method objectchain',
+        'static_class_access ::= ID',
+        'static_class_access ::= DOLLARID arrayindex',
+        'static_class_access ::= DOLLARID arrayindex objectchain',
+        'lop ::= LOGOP',
+        'lop ::= SLOGOP',
+        'tlop ::= TLOGOP',
+        'scond ::= SINGLECOND',
+        'arraydef ::= OPENB arrayelements CLOSEB',
+        'arraydef ::= ARRAYOPEN arrayelements CLOSEP',
+        'arrayelements ::= arrayelement',
+        'arrayelements ::= arrayelements COMMA arrayelement',
+        'arrayelements ::=',
+        'arrayelement ::= value APTR expr',
+        'arrayelement ::= ID APTR expr',
+        'arrayelement ::= expr',
+        'doublequoted_with_quotes ::= QUOTE QUOTE',
+        'doublequoted_with_quotes ::= QUOTE doublequoted QUOTE',
+        'doublequoted ::= doublequoted doublequotedcontent',
+        'doublequoted ::= doublequotedcontent',
+        'doublequotedcontent ::= BACKTICK variable BACKTICK',
+        'doublequotedcontent ::= BACKTICK expr BACKTICK',
+        'doublequotedcontent ::= DOLLARID',
+        'doublequotedcontent ::= LDEL variable RDEL',
+        'doublequotedcontent ::= LDEL expr RDEL',
+        'doublequotedcontent ::= smartytag',
+        'doublequotedcontent ::= TEXT',
+    );
+
+    public static $yyRuleInfo       = array(
+        array(0 => 63, 1 => 1),
+        array(0 => 64, 1 => 2),
+        array(0 => 64, 1 => 2),
+        array(0 => 64, 1 => 2),
+        array(0 => 64, 1 => 2),
+        array(0 => 64, 1 => 4),
+        array(0 => 65, 1 => 4),
+        array(0 => 65, 1 => 1),
+        array(0 => 66, 1 => 2),
+        array(0 => 66, 1 => 0),
+        array(0 => 64, 1 => 2),
+        array(0 => 64, 1 => 0),
+        array(0 => 67, 1 => 1),
+        array(0 => 67, 1 => 1),
+        array(0 => 67, 1 => 1),
+        array(0 => 67, 1 => 3),
+        array(0 => 67, 1 => 2),
+        array(0 => 68, 1 => 1),
+        array(0 => 68, 1 => 2),
+        array(0 => 68, 1 => 2),
+        array(0 => 71, 1 => 2),
+        array(0 => 70, 1 => 2),
+        array(0 => 73, 1 => 1),
+        array(0 => 73, 1 => 1),
+        array(0 => 73, 1 => 1),
+        array(0 => 69, 1 => 3),
+        array(0 => 69, 1 => 2),
+        array(0 => 69, 1 => 4),
+        array(0 => 69, 1 => 5),
+        array(0 => 69, 1 => 6),
+        array(0 => 69, 1 => 2),
+        array(0 => 69, 1 => 2),
+        array(0 => 69, 1 => 3),
+        array(0 => 69, 1 => 2),
+        array(0 => 69, 1 => 3),
+        array(0 => 69, 1 => 8),
+        array(0 => 81, 1 => 2),
+        array(0 => 81, 1 => 1),
+        array(0 => 69, 1 => 5),
+        array(0 => 69, 1 => 7),
+        array(0 => 69, 1 => 6),
+        array(0 => 69, 1 => 8),
+        array(0 => 69, 1 => 2),
+        array(0 => 69, 1 => 3),
+        array(0 => 69, 1 => 4),
+        array(0 => 67, 1 => 1),
+        array(0 => 69, 1 => 2),
+        array(0 => 69, 1 => 3),
+        array(0 => 69, 1 => 4),
+        array(0 => 69, 1 => 5),
+        array(0 => 74, 1 => 2),
+        array(0 => 74, 1 => 1),
+        array(0 => 74, 1 => 0),
+        array(0 => 84, 1 => 4),
+        array(0 => 84, 1 => 2),
+        array(0 => 84, 1 => 2),
+        array(0 => 84, 1 => 2),
+        array(0 => 84, 1 => 2),
+        array(0 => 84, 1 => 2),
+        array(0 => 84, 1 => 4),
+        array(0 => 80, 1 => 1),
+        array(0 => 80, 1 => 3),
+        array(0 => 79, 1 => 3),
+        array(0 => 79, 1 => 3),
+        array(0 => 79, 1 => 3),
+        array(0 => 79, 1 => 3),
+        array(0 => 77, 1 => 1),
+        array(0 => 77, 1 => 1),
+        array(0 => 77, 1 => 3),
+        array(0 => 77, 1 => 3),
+        array(0 => 77, 1 => 3),
+        array(0 => 77, 1 => 3),
+        array(0 => 77, 1 => 3),
+        array(0 => 77, 1 => 2),
+        array(0 => 77, 1 => 3),
+        array(0 => 77, 1 => 3),
+        array(0 => 85, 1 => 7),
+        array(0 => 85, 1 => 7),
+        array(0 => 76, 1 => 1),
+        array(0 => 76, 1 => 2),
+        array(0 => 76, 1 => 2),
+        array(0 => 76, 1 => 2),
+        array(0 => 76, 1 => 2),
+        array(0 => 76, 1 => 1),
+        array(0 => 76, 1 => 1),
+        array(0 => 76, 1 => 3),
+        array(0 => 76, 1 => 2),
+        array(0 => 76, 1 => 2),
+        array(0 => 76, 1 => 1),
+        array(0 => 76, 1 => 1),
+        array(0 => 76, 1 => 3),
+        array(0 => 76, 1 => 3),
+        array(0 => 76, 1 => 3),
+        array(0 => 76, 1 => 1),
+        array(0 => 76, 1 => 1),
+        array(0 => 76, 1 => 3),
+        array(0 => 76, 1 => 1),
+        array(0 => 76, 1 => 2),
+        array(0 => 76, 1 => 1),
+        array(0 => 76, 1 => 1),
+        array(0 => 76, 1 => 3),
+        array(0 => 91, 1 => 1),
+        array(0 => 91, 1 => 1),
+        array(0 => 75, 1 => 1),
+        array(0 => 75, 1 => 1),
+        array(0 => 75, 1 => 3),
+        array(0 => 75, 1 => 1),
+        array(0 => 75, 1 => 3),
+        array(0 => 75, 1 => 4),
+        array(0 => 75, 1 => 3),
+        array(0 => 75, 1 => 4),
+        array(0 => 72, 1 => 2),
+        array(0 => 72, 1 => 2),
+        array(0 => 96, 1 => 2),
+        array(0 => 96, 1 => 0),
+        array(0 => 97, 1 => 2),
+        array(0 => 97, 1 => 2),
+        array(0 => 97, 1 => 4),
+        array(0 => 97, 1 => 2),
+        array(0 => 97, 1 => 2),
+        array(0 => 97, 1 => 4),
+        array(0 => 97, 1 => 3),
+        array(0 => 97, 1 => 5),
+        array(0 => 97, 1 => 3),
+        array(0 => 97, 1 => 3),
+        array(0 => 97, 1 => 3),
+        array(0 => 97, 1 => 3),
+        array(0 => 97, 1 => 3),
+        array(0 => 97, 1 => 3),
+        array(0 => 97, 1 => 2),
+        array(0 => 82, 1 => 1),
+        array(0 => 82, 1 => 1),
+        array(0 => 82, 1 => 2),
+        array(0 => 98, 1 => 1),
+        array(0 => 98, 1 => 1),
+        array(0 => 98, 1 => 3),
+        array(0 => 95, 1 => 2),
+        array(0 => 99, 1 => 1),
+        array(0 => 99, 1 => 2),
+        array(0 => 100, 1 => 3),
+        array(0 => 100, 1 => 3),
+        array(0 => 100, 1 => 5),
+        array(0 => 100, 1 => 6),
+        array(0 => 100, 1 => 2),
+        array(0 => 90, 1 => 4),
+        array(0 => 101, 1 => 4),
+        array(0 => 101, 1 => 4),
+        array(0 => 102, 1 => 3),
+        array(0 => 102, 1 => 1),
+        array(0 => 102, 1 => 0),
+        array(0 => 78, 1 => 3),
+        array(0 => 78, 1 => 2),
+        array(0 => 103, 1 => 3),
+        array(0 => 103, 1 => 2),
+        array(0 => 83, 1 => 2),
+        array(0 => 83, 1 => 0),
+        array(0 => 104, 1 => 2),
+        array(0 => 104, 1 => 3),
+        array(0 => 104, 1 => 2),
+        array(0 => 93, 1 => 1),
+        array(0 => 93, 1 => 2),
+        array(0 => 93, 1 => 1),
+        array(0 => 93, 1 => 2),
+        array(0 => 93, 1 => 3),
+        array(0 => 87, 1 => 1),
+        array(0 => 87, 1 => 1),
+        array(0 => 86, 1 => 1),
+        array(0 => 88, 1 => 1),
+        array(0 => 94, 1 => 3),
+        array(0 => 94, 1 => 3),
+        array(0 => 105, 1 => 1),
+        array(0 => 105, 1 => 3),
+        array(0 => 105, 1 => 0),
+        array(0 => 106, 1 => 3),
+        array(0 => 106, 1 => 3),
+        array(0 => 106, 1 => 1),
+        array(0 => 92, 1 => 2),
+        array(0 => 92, 1 => 3),
+        array(0 => 107, 1 => 2),
+        array(0 => 107, 1 => 1),
+        array(0 => 108, 1 => 3),
+        array(0 => 108, 1 => 3),
+        array(0 => 108, 1 => 1),
+        array(0 => 108, 1 => 3),
+        array(0 => 108, 1 => 3),
+        array(0 => 108, 1 => 1),
+        array(0 => 108, 1 => 1),
+    );
+
+    public static $yyReduceMap      = array(
+        0   => 0,
+        1   => 1,
+        2   => 2,
+        3   => 3,
+        4   => 4,
+        5   => 5,
+        6   => 6,
+        7   => 7,
+        22  => 7,
+        23  => 7,
+        24  => 7,
+        37  => 7,
+        57  => 7,
+        58  => 7,
+        66  => 7,
+        67  => 7,
+        78  => 7,
+        83  => 7,
+        84  => 7,
+        89  => 7,
+        93  => 7,
+        94  => 7,
+        98  => 7,
+        99  => 7,
+        101 => 7,
+        106 => 7,
+        170 => 7,
+        175 => 7,
+        8   => 8,
+        9   => 9,
+        10  => 10,
+        12  => 12,
+        13  => 13,
+        14  => 14,
+        15  => 15,
+        16  => 16,
+        17  => 17,
+        18  => 18,
+        19  => 19,
+        20  => 20,
+        21  => 21,
+        25  => 25,
+        26  => 26,
+        27  => 27,
+        28  => 28,
+        29  => 29,
+        30  => 30,
+        31  => 31,
+        32  => 32,
+        34  => 32,
+        33  => 33,
+        35  => 35,
+        36  => 36,
+        38  => 38,
+        39  => 39,
+        40  => 40,
+        41  => 41,
+        42  => 42,
+        43  => 43,
+        44  => 44,
+        45  => 45,
+        46  => 46,
+        47  => 47,
+        48  => 48,
+        49  => 49,
+        50  => 50,
+        51  => 51,
+        60  => 51,
+        148 => 51,
+        152 => 51,
+        156 => 51,
+        158 => 51,
+        52  => 52,
+        149 => 52,
+        155 => 52,
+        53  => 53,
+        54  => 54,
+        55  => 54,
+        56  => 56,
+        133 => 56,
+        59  => 59,
+        61  => 61,
+        62  => 62,
+        63  => 62,
+        64  => 64,
+        65  => 65,
+        68  => 68,
+        69  => 69,
+        70  => 69,
+        71  => 71,
+        72  => 72,
+        73  => 73,
+        74  => 74,
+        75  => 75,
+        76  => 76,
+        77  => 77,
+        79  => 79,
+        81  => 79,
+        82  => 79,
+        113 => 79,
+        80  => 80,
+        85  => 85,
+        86  => 86,
+        87  => 87,
+        88  => 88,
+        90  => 90,
+        91  => 91,
+        92  => 91,
+        95  => 95,
+        96  => 96,
+        97  => 97,
+        100 => 100,
+        102 => 102,
+        103 => 103,
+        104 => 104,
+        105 => 105,
+        107 => 107,
+        108 => 108,
+        109 => 109,
+        110 => 110,
+        111 => 111,
+        112 => 112,
+        114 => 114,
+        172 => 114,
+        115 => 115,
+        116 => 116,
+        117 => 117,
+        118 => 118,
+        119 => 119,
+        120 => 120,
+        128 => 120,
+        121 => 121,
+        122 => 122,
+        123 => 123,
+        124 => 123,
+        126 => 123,
+        127 => 123,
+        125 => 125,
+        129 => 129,
+        130 => 130,
+        131 => 131,
+        176 => 131,
+        132 => 132,
+        134 => 134,
+        135 => 135,
+        136 => 136,
+        137 => 137,
+        138 => 138,
+        139 => 139,
+        140 => 140,
+        141 => 141,
+        142 => 142,
+        143 => 143,
+        144 => 144,
+        145 => 145,
+        146 => 146,
+        147 => 147,
+        150 => 150,
+        151 => 151,
+        153 => 153,
+        154 => 154,
+        157 => 157,
+        159 => 159,
+        160 => 160,
+        161 => 161,
+        162 => 162,
+        163 => 163,
+        164 => 164,
+        165 => 165,
+        166 => 166,
+        167 => 167,
+        168 => 168,
+        169 => 168,
+        171 => 171,
+        173 => 173,
+        174 => 174,
+        177 => 177,
+        178 => 178,
+        179 => 179,
+        180 => 180,
+        183 => 180,
+        181 => 181,
+        184 => 181,
+        182 => 182,
+        185 => 185,
+        186 => 186,
+    );
+
+    /**
+     * result status
+     *
+     * @var bool
+     */
+    public $successful = true;
+
+    /**
+     * return value
+     *
+     * @var mixed
+     */
+    public $retvalue = 0;
+
+    /**
+     * @var
+     */
+    public $yymajor;
+
+    /**
+     * last index of array variable
+     *
+     * @var mixed
+     */
+    public $last_index;
+
+    /**
+     * last variable name
+     *
+     * @var string
+     */
+    public $last_variable;
+
+    /**
+     * root parse tree buffer
+     *
+     * @var Smarty_Internal_ParseTree_Template
+     */
+    public $root_buffer;
+
+    /**
+     * current parse tree object
+     *
+     * @var Smarty_Internal_ParseTree
+     */
+    public $current_buffer;
+
+    /**
+     * lexer object
+     *
+     * @var Smarty_Internal_Templatelexer
+     */
+    public $lex;
+
+    /**
+     * {strip} status
+     *
+     * @var bool
+     */
+    public $strip = false;
+
+    /**
+     * compiler object
+     *
+     * @var Smarty_Internal_TemplateCompilerBase
+     */
+    public $compiler = null;
+
+    /**
+     * smarty object
+     *
+     * @var Smarty
+     */
+    public $smarty = null;
+
+    /**
+     * template object
+     *
+     * @var Smarty_Internal_Template
+     */
+    public $template = null;
+
+    /**
+     * block nesting level
+     *
+     * @var int
+     */
+    public $block_nesting_level = 0;
+
+    /**
+     * security object
+     *
+     * @var Smarty_Security
+     */
+    public $security = null;
+
+    /**
+     * template prefix array
+     *
+     * @var \Smarty_Internal_ParseTree[]
+     */
+    public $template_prefix = array();
+
+    /**
+     * template prefix array
+     *
+     * @var \Smarty_Internal_ParseTree[]
+     */
+    public $template_postfix = array();
+
+    public $yyTraceFILE;
+
+    public $yyTracePrompt;
+
+    public $yyidx;
+
+    public $yyerrcnt;
+
+    public $yystack          = array();
+
+    public $yyTokenName      = array(
+        '$', 'VERT', 'COLON', 'PHP',
+        'TEXT', 'STRIPON', 'STRIPOFF', 'LITERALSTART',
+        'LITERALEND', 'LITERAL', 'SIMPELOUTPUT', 'SIMPLETAG',
+        'SMARTYBLOCKCHILDPARENT', 'LDEL', 'RDEL', 'DOLLARID',
+        'EQUAL', 'ID', 'PTR', 'LDELMAKENOCACHE',
+        'LDELIF', 'LDELFOR', 'SEMICOLON', 'INCDEC',
+        'TO', 'STEP', 'LDELFOREACH', 'SPACE',
+        'AS', 'APTR', 'LDELSETFILTER', 'CLOSETAG',
+        'LDELSLASH', 'ATTR', 'INTEGER', 'COMMA',
+        'OPENP', 'CLOSEP', 'MATH', 'UNIMATH',
+        'ISIN', 'QMARK', 'NOT', 'TYPECAST',
+        'HEX', 'DOT', 'INSTANCEOF', 'SINGLEQUOTESTRING',
+        'DOUBLECOLON', 'NAMESPACE', 'AT', 'HATCH',
+        'OPENB', 'CLOSEB', 'DOLLAR', 'LOGOP',
+        'SLOGOP', 'TLOGOP', 'SINGLECOND', 'ARRAYOPEN',
+        'QUOTE', 'BACKTICK', 'error', 'start',
+        'template', 'literal_e2', 'literal_e1', 'smartytag',
+        'tagbody', 'tag', 'outattr', 'eqoutattr',
+        'varindexed', 'output', 'attributes', 'variable',
+        'value', 'expr', 'modifierlist', 'statement',
+        'statements', 'foraction', 'varvar', 'modparameters',
+        'attribute', 'ternary', 'tlop', 'lop',
+        'scond', 'array', 'function', 'ns1',
+        'doublequoted_with_quotes', 'static_class_access', 'arraydef', 'object',
+        'arrayindex', 'indexdef', 'varvarele', 'objectchain',
+        'objectelement', 'method', 'params', 'modifier',
+        'modparameter', 'arrayelements', 'arrayelement', 'doublequoted',
+        'doublequotedcontent',
+    );
+
+    /**
+     * internal error flag
+     *
+     * @var bool
+     */
+    private $internalError = false;                    /* Index of top element in stack */
+    private $_retvalue;                 /* Shifts left before out of the error */
+    /**
+     * constructor
+     *
+     * @param Smarty_Internal_Templatelexer        $lex
+     * @param Smarty_Internal_TemplateCompilerBase $compiler
+     */
+    public function __construct(Smarty_Internal_Templatelexer $lex, Smarty_Internal_TemplateCompilerBase $compiler)
+    {
+        $this->lex = $lex;
+        $this->compiler = $compiler;
+        $this->template = $this->compiler->template;
+        $this->smarty = $this->template->smarty;
+        $this->security = isset($this->smarty->security_policy) ? $this->smarty->security_policy : false;
+        $this->current_buffer = $this->root_buffer = new Smarty_Internal_ParseTree_Template();
+    }  /* The parser's stack */
+    public static function yy_destructor($yymajor, $yypminor)
+    {
+        switch ($yymajor) {
+            default:
+                break;   /* If no destructor action specified: do nothing */
+        }
+    }
+
+    /**
+     * insert PHP code in current buffer
+     *
+     * @param string $code
+     */
+    public function insertPhpCode($code)
+    {
+        $this->current_buffer->append_subtree($this, new Smarty_Internal_ParseTree_Tag($this, $code));
+    }
+
+    /**
+     * error rundown
+     *
+     */
+    public function errorRunDown()
+    {
+        while ($this->yystack !== array()) {
+            $this->yy_pop_parser_stack();
+        }
+        if (is_resource($this->yyTraceFILE)) {
+            fclose($this->yyTraceFILE);
+        }
+    }
+
+    /**
+     *  merge PHP code with prefix code and return parse tree tag object
+     *
+     * @param string $code
+     *
+     * @return Smarty_Internal_ParseTree_Tag
+     */
+    public function mergePrefixCode($code)
+    {
+        $tmp = '';
+        foreach ($this->compiler->prefix_code as $preCode) {
+            $tmp .= $preCode;
+        }
+        $this->compiler->prefix_code = array();
+        $tmp .= $code;
+        return new Smarty_Internal_ParseTree_Tag($this, $this->compiler->processNocacheCode($tmp, true));
+    }
+
+    public function Trace($TraceFILE, $zTracePrompt)
+    {
+        if (!$TraceFILE) {
+            $zTracePrompt = 0;
+        } elseif (!$zTracePrompt) {
+            $TraceFILE = 0;
+        }
+        $this->yyTraceFILE = $TraceFILE;
+        $this->yyTracePrompt = $zTracePrompt;
+    }
+
+    public function PrintTrace()
+    {
+        $this->yyTraceFILE = fopen('php://output', 'w');
+        $this->yyTracePrompt = '<br>';
+    }
+
+    public function tokenName($tokenType)
+    {
+        if ($tokenType === 0) {
+            return 'End of Input';
+        }
+        if ($tokenType > 0 && $tokenType < count($this->yyTokenName)) {
+            return $this->yyTokenName[ $tokenType ];
+        } else {
+            return 'Unknown';
+        }
+    }
+
+    public function yy_pop_parser_stack()
+    {
+        if (empty($this->yystack)) {
+            return;
+        }
+        $yytos = array_pop($this->yystack);
+        if ($this->yyTraceFILE && $this->yyidx >= 0) {
+            fwrite($this->yyTraceFILE,
+                $this->yyTracePrompt . 'Popping ' . $this->yyTokenName[ $yytos->major ] .
+                "\n");
+        }
+        $yymajor = $yytos->major;
+        self::yy_destructor($yymajor, $yytos->minor);
+        $this->yyidx--;
+        return $yymajor;
+    }
+
+    public function __destruct()
+    {
+        while ($this->yystack !== array()) {
+            $this->yy_pop_parser_stack();
+        }
+        if (is_resource($this->yyTraceFILE)) {
+            fclose($this->yyTraceFILE);
+        }
+    }
+
+    public function yy_get_expected_tokens($token)
+    {
+        static $res3 = array();
+        static $res4 = array();
+        $state = $this->yystack[ $this->yyidx ]->stateno;
+        $expected = self::$yyExpectedTokens[ $state ];
+        if (isset($res3[ $state ][ $token ])) {
+            if ($res3[ $state ][ $token ]) {
+                return $expected;
+            }
+        } else {
+            if ($res3[ $state ][ $token ] = in_array($token, self::$yyExpectedTokens[ $state ], true)) {
+                return $expected;
+            }
+        }
+        $stack = $this->yystack;
+        $yyidx = $this->yyidx;
+        do {
+            $yyact = $this->yy_find_shift_action($token);
+            if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) {
+                // reduce action
+                $done = 0;
+                do {
+                    if ($done++ === 100) {
+                        $this->yyidx = $yyidx;
+                        $this->yystack = $stack;
+                        // too much recursion prevents proper detection
+                        // so give up
+                        return array_unique($expected);
+                    }
+                    $yyruleno = $yyact - self::YYNSTATE;
+                    $this->yyidx -= self::$yyRuleInfo[ $yyruleno ][ 1 ];
+                    $nextstate = $this->yy_find_reduce_action(
+                        $this->yystack[ $this->yyidx ]->stateno,
+                        self::$yyRuleInfo[ $yyruleno ][ 0 ]);
+                    if (isset(self::$yyExpectedTokens[ $nextstate ])) {
+                        $expected = array_merge($expected, self::$yyExpectedTokens[ $nextstate ]);
+                        if (isset($res4[ $nextstate ][ $token ])) {
+                            if ($res4[ $nextstate ][ $token ]) {
+                                $this->yyidx = $yyidx;
+                                $this->yystack = $stack;
+                                return array_unique($expected);
+                            }
+                        } else {
+                            if ($res4[ $nextstate ][ $token ] =
+                                in_array($token, self::$yyExpectedTokens[ $nextstate ], true)) {
+                                $this->yyidx = $yyidx;
+                                $this->yystack = $stack;
+                                return array_unique($expected);
+                            }
+                        }
+                    }
+                    if ($nextstate < self::YYNSTATE) {
+                        // we need to shift a non-terminal
+                        $this->yyidx++;
+                        $x = new TP_yyStackEntry;
+                        $x->stateno = $nextstate;
+                        $x->major = self::$yyRuleInfo[ $yyruleno ][ 0 ];
+                        $this->yystack[ $this->yyidx ] = $x;
+                        continue 2;
+                    } elseif ($nextstate === self::YYNSTATE + self::YYNRULE + 1) {
+                        $this->yyidx = $yyidx;
+                        $this->yystack = $stack;
+                        // the last token was just ignored, we can't accept
+                        // by ignoring input, this is in essence ignoring a
+                        // syntax error!
+                        return array_unique($expected);
+                    } elseif ($nextstate === self::YY_NO_ACTION) {
+                        $this->yyidx = $yyidx;
+                        $this->yystack = $stack;
+                        // input accepted, but not shifted (I guess)
+                        return $expected;
+                    } else {
+                        $yyact = $nextstate;
+                    }
+                } while (true);
+            }
+            break;
+        } while (true);
+        $this->yyidx = $yyidx;
+        $this->yystack = $stack;
+        return array_unique($expected);
+    }
+
+    public function yy_is_expected_token($token)
+    {
+        static $res = array();
+        static $res2 = array();
+        if ($token === 0) {
+            return true; // 0 is not part of this
+        }
+        $state = $this->yystack[ $this->yyidx ]->stateno;
+        if (isset($res[ $state ][ $token ])) {
+            if ($res[ $state ][ $token ]) {
+                return true;
+            }
+        } else {
+            if ($res[ $state ][ $token ] = in_array($token, self::$yyExpectedTokens[ $state ], true)) {
+                return true;
+            }
+        }
+        $stack = $this->yystack;
+        $yyidx = $this->yyidx;
+        do {
+            $yyact = $this->yy_find_shift_action($token);
+            if ($yyact >= self::YYNSTATE && $yyact < self::YYNSTATE + self::YYNRULE) {
+                // reduce action
+                $done = 0;
+                do {
+                    if ($done++ === 100) {
+                        $this->yyidx = $yyidx;
+                        $this->yystack = $stack;
+                        // too much recursion prevents proper detection
+                        // so give up
+                        return true;
+                    }
+                    $yyruleno = $yyact - self::YYNSTATE;
+                    $this->yyidx -= self::$yyRuleInfo[ $yyruleno ][ 1 ];
+                    $nextstate = $this->yy_find_reduce_action(
+                        $this->yystack[ $this->yyidx ]->stateno,
+                        self::$yyRuleInfo[ $yyruleno ][ 0 ]);
+                    if (isset($res2[ $nextstate ][ $token ])) {
+                        if ($res2[ $nextstate ][ $token ]) {
+                            $this->yyidx = $yyidx;
+                            $this->yystack = $stack;
+                            return true;
+                        }
+                    } else {
+                        if ($res2[ $nextstate ][ $token ] =
+                            (isset(self::$yyExpectedTokens[ $nextstate ]) &&
+                             in_array($token, self::$yyExpectedTokens[ $nextstate ], true))) {
+                            $this->yyidx = $yyidx;
+                            $this->yystack = $stack;
+                            return true;
+                        }
+                    }
+                    if ($nextstate < self::YYNSTATE) {
+                        // we need to shift a non-terminal
+                        $this->yyidx++;
+                        $x = new TP_yyStackEntry;
+                        $x->stateno = $nextstate;
+                        $x->major = self::$yyRuleInfo[ $yyruleno ][ 0 ];
+                        $this->yystack[ $this->yyidx ] = $x;
+                        continue 2;
+                    } elseif ($nextstate === self::YYNSTATE + self::YYNRULE + 1) {
+                        $this->yyidx = $yyidx;
+                        $this->yystack = $stack;
+                        if (!$token) {
+                            // end of input: this is valid
+                            return true;
+                        }
+                        // the last token was just ignored, we can't accept
+                        // by ignoring input, this is in essence ignoring a
+                        // syntax error!
+                        return false;
+                    } elseif ($nextstate === self::YY_NO_ACTION) {
+                        $this->yyidx = $yyidx;
+                        $this->yystack = $stack;
+                        // input accepted, but not shifted (I guess)
+                        return true;
+                    } else {
+                        $yyact = $nextstate;
+                    }
+                } while (true);
+            }
+            break;
+        } while (true);
+        $this->yyidx = $yyidx;
+        $this->yystack = $stack;
+        return true;
+    }
+
+    public function yy_find_shift_action($iLookAhead)
+    {
+        $stateno = $this->yystack[ $this->yyidx ]->stateno;
+        /* if ($this->yyidx < 0) return self::YY_NO_ACTION;  */
+        if (!isset(self::$yy_shift_ofst[ $stateno ])) {
+            // no shift actions
+            return self::$yy_default[ $stateno ];
+        }
+        $i = self::$yy_shift_ofst[ $stateno ];
+        if ($i === self::YY_SHIFT_USE_DFLT) {
+            return self::$yy_default[ $stateno ];
+        }
+        if ($iLookAhead === self::YYNOCODE) {
+            return self::YY_NO_ACTION;
+        }
+        $i += $iLookAhead;
+        if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
+            self::$yy_lookahead[ $i ] != $iLookAhead) {
+            if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback)
+                && ($iFallback = self::$yyFallback[ $iLookAhead ]) != 0) {
+                if ($this->yyTraceFILE) {
+                    fwrite($this->yyTraceFILE, $this->yyTracePrompt . 'FALLBACK ' .
+                                               $this->yyTokenName[ $iLookAhead ] . ' => ' .
+                                               $this->yyTokenName[ $iFallback ] . "\n");
+                }
+                return $this->yy_find_shift_action($iFallback);
+            }
+            return self::$yy_default[ $stateno ];
+        } else {
+            return self::$yy_action[ $i ];
+        }
+    }
+
+    public function yy_find_reduce_action($stateno, $iLookAhead)
+    {
+        /* $stateno = $this->yystack[$this->yyidx]->stateno; */
+        if (!isset(self::$yy_reduce_ofst[ $stateno ])) {
+            return self::$yy_default[ $stateno ];
+        }
+        $i = self::$yy_reduce_ofst[ $stateno ];
+        if ($i === self::YY_REDUCE_USE_DFLT) {
+            return self::$yy_default[ $stateno ];
+        }
+        if ($iLookAhead === self::YYNOCODE) {
+            return self::YY_NO_ACTION;
+        }
+        $i += $iLookAhead;
+        if ($i < 0 || $i >= self::YY_SZ_ACTTAB ||
+            self::$yy_lookahead[ $i ] != $iLookAhead) {
+            return self::$yy_default[ $stateno ];
+        } else {
+            return self::$yy_action[ $i ];
+        }
+    }
+
+    // line 234 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_shift($yyNewState, $yyMajor, $yypMinor)
+    {
+        $this->yyidx++;
+        if ($this->yyidx >= self::YYSTACKDEPTH) {
+            $this->yyidx--;
+            if ($this->yyTraceFILE) {
+                fprintf($this->yyTraceFILE, "%sStack Overflow!\n", $this->yyTracePrompt);
+            }
+            while ($this->yyidx >= 0) {
+                $this->yy_pop_parser_stack();
+            }
+            // line 221 "../smarty/lexer/smarty_internal_templateparser.y"
+            $this->internalError = true;
+            $this->compiler->trigger_template_error('Stack overflow in template parser');
+            return;
+        }
+        $yytos = new TP_yyStackEntry;
+        $yytos->stateno = $yyNewState;
+        $yytos->major = $yyMajor;
+        $yytos->minor = $yypMinor;
+        $this->yystack[] = $yytos;
+        if ($this->yyTraceFILE && $this->yyidx > 0) {
+            fprintf($this->yyTraceFILE, "%sShift %d\n", $this->yyTracePrompt,
+                $yyNewState);
+            fprintf($this->yyTraceFILE, "%sStack:", $this->yyTracePrompt);
+            for ($i = 1; $i <= $this->yyidx; $i++) {
+                fprintf($this->yyTraceFILE, " %s",
+                    $this->yyTokenName[ $this->yystack[ $i ]->major ]);
+            }
+            fwrite($this->yyTraceFILE, "\n");
+        }
+    }
+
+    // line 242 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r0()
+    {
+        $this->root_buffer->prepend_array($this, $this->template_prefix);
+        $this->root_buffer->append_array($this, $this->template_postfix);
+        $this->_retvalue = $this->root_buffer->to_smarty_php($this);
+    }
+
+    // line 251 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r1()
+    {
+        $code =
+            $this->compiler->compileTag('private_php',
+                array(array('code' => $this->yystack[ $this->yyidx + 0 ]->minor), array('type' => $this->lex->phpType)),
+                array());
+        if ($this->compiler->has_code && !empty($code)) {
+            $tmp = '';
+            foreach ($this->compiler->prefix_code as $code) {
+                $tmp .= $code;
+            }
+            $this->compiler->prefix_code = array();
+            $this->current_buffer->append_subtree($this,
+                new Smarty_Internal_ParseTree_Tag($this, $this->compiler->processNocacheCode($tmp . $code, true)));
+        }
+    }
+
+    // line 255 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r2()
+    {
+    	$text = $this->yystack[ $this->yyidx + 0 ]->minor;
+
+	    if ((string)$text == '') {
+	    	$this->current_buffer->append_subtree($this, null);
+	    }
+
+	    $this->current_buffer->append_subtree($this, new Smarty_Internal_ParseTree_Text($text, $this->strip));
+    }
+
+    // line 259 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r3()
+    {
+        $this->strip = true;
+    }
+
+    // line 264 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r4()
+    {
+        $this->strip = false;
+    }
+
+    // line 269 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r5()
+    {
+        $this->current_buffer->append_subtree($this,
+            new Smarty_Internal_ParseTree_Text($this->yystack[ $this->yyidx + -1 ]->minor));
+    }
+
+    // line 272 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r6()
+    {
+        $this->_retvalue = $this->yystack[ $this->yyidx + -3 ]->minor . $this->yystack[ $this->yyidx + -1 ]->minor;
+    }
+
+    // line 276 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r7()
+    {
+        $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 281 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r8()
+    {
+        $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 285 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r9()
+    {
+        $this->_retvalue = '';
+    }
+
+    // line 297 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r10()
+    {
+        if ($this->compiler->has_code) {
+            $this->current_buffer->append_subtree($this,
+                $this->mergePrefixCode($this->yystack[ $this->yyidx + 0 ]->minor));
+        }
+        $this->compiler->has_variable_string = false;
+        $this->block_nesting_level = count($this->compiler->_tag_stack);
+    }
+
+    // line 307 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r12()
+    {
+        $var =
+            trim(substr($this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler->getLdelLength(),
+                -$this->compiler->getRdelLength()), ' $');
+        if (preg_match('/^(.*)(\s+nocache)$/', $var, $match)) {
+            $this->_retvalue =
+                $this->compiler->compileTag('private_print_expression', array('nocache'),
+                    array('value' => $this->compiler->compileVariable('\'' . $match[ 1 ] . '\'')));
+        } else {
+            $this->_retvalue =
+                $this->compiler->compileTag('private_print_expression', array(),
+                    array('value' => $this->compiler->compileVariable('\'' . $var . '\'')));
+        }
+    }
+
+    // line 328 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r13()
+    {
+        $tag =
+            trim(substr($this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler->getLdelLength(),
+                -$this->compiler->getRdelLength()));
+        if ($tag == 'strip') {
+            $this->strip = true;
+            $this->_retvalue = null;
+        } else {
+            if (defined($tag)) {
+                if ($this->security) {
+                    $this->security->isTrustedConstant($tag, $this->compiler);
+                }
+                $this->_retvalue =
+                    $this->compiler->compileTag('private_print_expression', array(), array('value' => $tag));
+            } else {
+                if (preg_match('/^(.*)(\s+nocache)$/', $tag, $match)) {
+                    $this->_retvalue = $this->compiler->compileTag($match[ 1 ], array('\'nocache\''));
+                } else {
+                    $this->_retvalue = $this->compiler->compileTag($tag, array());
+                }
+            }
+        }
+    }
+
+    // line 339 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r14()
+    {
+        $j = strrpos($this->yystack[ $this->yyidx + 0 ]->minor, '.');
+        if ($this->yystack[ $this->yyidx + 0 ]->minor[ $j + 1 ] == 'c') {
+            // {$smarty.block.child}
+            $this->_retvalue =
+                $this->compiler->compileTag('child', array(), array($this->yystack[ $this->yyidx + 0 ]->minor));
+        } else {
+            // {$smarty.block.parent}
+            $this->_retvalue =
+                $this->compiler->compileTag('parent', array(), array($this->yystack[ $this->yyidx + 0 ]->minor));
+        }
+    }
+
+    // line 343 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r15()
+    {
+        $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor;
+    }
+
+    // line 347 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r16()
+    {
+        $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor;
+    }
+
+    // line 356 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r17()
+    {
+        $this->_retvalue =
+            $this->compiler->compileTag('private_print_expression', $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ],
+                array('value' => $this->yystack[ $this->yyidx + 0 ]->minor[ 0 ]));
+    }
+
+    // line 360 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r18()
+    {
+        $this->_retvalue =
+            $this->compiler->compileTag('assign', array_merge(array(
+                array('value' => $this->yystack[ $this->yyidx + 0 ]->minor[ 0 ]),
+                array('var' => '\'' . substr($this->yystack[ $this->yyidx + -1 ]->minor, 1) . '\'')
+            ), $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ]));
+    }
+
+    // line 364 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r19()
+    {
+        $this->_retvalue =
+            $this->compiler->compileTag('assign', array_merge(array(
+                array('value' => $this->yystack[ $this->yyidx + 0 ]->minor[ 0 ]),
+                array('var' => $this->yystack[ $this->yyidx + -1 ]->minor[ 'var' ])
+            ), $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ]), array(
+                'smarty_internal_index' => $this->yystack[ $this->yyidx +
+                                                           -1 ]->minor[ 'smarty_internal_index' ]
+            ));
+    }
+
+    // line 368 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r20()
+    {
+        $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 383 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r21()
+    {
+        $this->_retvalue = array($this->yystack[ $this->yyidx + -1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor);
+    }
+
+    // line 393 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r25()
+    {
+        if (defined($this->yystack[ $this->yyidx + -1 ]->minor)) {
+            if ($this->security) {
+                $this->security->isTrustedConstant($this->yystack[ $this->yyidx + -1 ]->minor, $this->compiler);
+            }
+            $this->_retvalue =
+                $this->compiler->compileTag('private_print_expression', $this->yystack[ $this->yyidx + 0 ]->minor,
+                    array('value' => $this->yystack[ $this->yyidx + -1 ]->minor));
+        } else {
+            $this->_retvalue =
+                $this->compiler->compileTag($this->yystack[ $this->yyidx + -1 ]->minor,
+                    $this->yystack[ $this->yyidx + 0 ]->minor);
+        }
+    }
+
+    // line 406 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r26()
+    {
+        if (defined($this->yystack[ $this->yyidx + 0 ]->minor)) {
+            if ($this->security) {
+                $this->security->isTrustedConstant($this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler);
+            }
+            $this->_retvalue =
+                $this->compiler->compileTag('private_print_expression', array(),
+                    array('value' => $this->yystack[ $this->yyidx + 0 ]->minor));
+        } else {
+            $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + 0 ]->minor, array());
+        }
+    }
+
+    // line 418 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r27()
+    {
+        if (defined($this->yystack[ $this->yyidx + -2 ]->minor)) {
+            if ($this->security) {
+                $this->security->isTrustedConstant($this->yystack[ $this->yyidx + -2 ]->minor, $this->compiler);
+            }
+            $this->_retvalue =
+                $this->compiler->compileTag('private_print_expression', $this->yystack[ $this->yyidx + 0 ]->minor,
+                    array(
+                        'value'        => $this->yystack[ $this->yyidx + -2 ]->minor,
+                        'modifierlist' => $this->yystack[ $this->yyidx + -1 ]->minor
+                    ));
+        } else {
+            $this->_retvalue =
+                $this->compiler->compileTag($this->yystack[ $this->yyidx + -2 ]->minor,
+                    $this->yystack[ $this->yyidx + 0 ]->minor,
+                    array('modifierlist' => $this->yystack[ $this->yyidx + -1 ]->minor));
+        }
+    }
+
+    // line 423 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r28()
+    {
+        $this->_retvalue =
+            $this->compiler->compileTag($this->yystack[ $this->yyidx + -3 ]->minor,
+                $this->yystack[ $this->yyidx + 0 ]->minor,
+                array('object_method' => $this->yystack[ $this->yyidx + -1 ]->minor));
+    }
+
+    // line 428 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r29()
+    {
+        $this->_retvalue =
+            $this->compiler->compileTag($this->yystack[ $this->yyidx + -4 ]->minor,
+                $this->yystack[ $this->yyidx + 0 ]->minor, array(
+                    'modifierlist'  => $this->yystack[ $this->yyidx + -1 ]->minor,
+                    'object_method' => $this->yystack[ $this->yyidx + -2 ]->minor
+                ));
+    }
+
+    // line 433 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r30()
+    {
+        $this->_retvalue =
+            $this->compiler->compileTag('make_nocache',
+                array(array('var' => '\'' . substr($this->yystack[ $this->yyidx + 0 ]->minor, 1) . '\'')));
+    }
+
+    // line 438 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r31()
+    {
+        $tag = trim(substr($this->yystack[ $this->yyidx + -1 ]->minor, $this->compiler->getLdelLength()));
+        $this->_retvalue =
+            $this->compiler->compileTag(($tag === 'else if') ? 'elseif' : $tag, array(),
+                array('if condition' => $this->yystack[ $this->yyidx + 0 ]->minor));
+    }
+
+    // line 443 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r32()
+    {
+        $tag = trim(substr($this->yystack[ $this->yyidx + -2 ]->minor, $this->compiler->getLdelLength()));
+        $this->_retvalue =
+            $this->compiler->compileTag(($tag === 'else if') ? 'elseif' : $tag,
+                $this->yystack[ $this->yyidx + 0 ]->minor,
+                array('if condition' => $this->yystack[ $this->yyidx + -1 ]->minor));
+    }
+
+    // line 454 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r33()
+    {
+        $tag = trim(substr($this->yystack[ $this->yyidx + -1 ]->minor, $this->compiler->getLdelLength()));
+        $this->_retvalue =
+            $this->compiler->compileTag(($tag === 'else if') ? 'elseif' : $tag, array(),
+                array('if condition' => $this->yystack[ $this->yyidx + 0 ]->minor));
+    }
+
+    // line 458 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r35()
+    {
+        $this->_retvalue =
+            $this->compiler->compileTag('for', array_merge($this->yystack[ $this->yyidx + 0 ]->minor, array(
+                array('start' => $this->yystack[ $this->yyidx + -6 ]->minor),
+                array('ifexp' => $this->yystack[ $this->yyidx + -4 ]->minor),
+                array('var' => $this->yystack[ $this->yyidx + -2 ]->minor),
+                array('step' => $this->yystack[ $this->yyidx + -1 ]->minor)
+            )), 1);
+    }
+
+    // line 466 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r36()
+    {
+        $this->_retvalue = '=' . $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 470 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r38()
+    {
+        $this->_retvalue =
+            $this->compiler->compileTag('for', array_merge($this->yystack[ $this->yyidx + 0 ]->minor, array(
+                array('start' => $this->yystack[ $this->yyidx + -3 ]->minor),
+                array('to' => $this->yystack[ $this->yyidx + -1 ]->minor)
+            )), 0);
+    }
+
+    // line 475 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r39()
+    {
+        $this->_retvalue =
+            $this->compiler->compileTag('for', array_merge($this->yystack[ $this->yyidx + 0 ]->minor, array(
+                array('start' => $this->yystack[ $this->yyidx + -5 ]->minor),
+                array('to' => $this->yystack[ $this->yyidx + -3 ]->minor),
+                array('step' => $this->yystack[ $this->yyidx + -1 ]->minor)
+            )), 0);
+    }
+
+    // line 479 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r40()
+    {
+        $this->_retvalue =
+            $this->compiler->compileTag('foreach', array_merge($this->yystack[ $this->yyidx + 0 ]->minor, array(
+                array('from' => $this->yystack[ $this->yyidx + -3 ]->minor),
+                array('item' => $this->yystack[ $this->yyidx + -1 ]->minor)
+            )));
+    }
+
+    // line 482 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r41()
+    {
+        $this->_retvalue =
+            $this->compiler->compileTag('foreach', array_merge($this->yystack[ $this->yyidx + 0 ]->minor, array(
+                array('from' => $this->yystack[ $this->yyidx + -5 ]->minor),
+                array('item' => $this->yystack[ $this->yyidx + -1 ]->minor),
+                array('key' => $this->yystack[ $this->yyidx + -3 ]->minor)
+            )));
+    }
+
+    // line 487 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r42()
+    {
+        $this->_retvalue = $this->compiler->compileTag('foreach', $this->yystack[ $this->yyidx + 0 ]->minor);
+    }
+
+    // line 491 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r43()
+    {
+        $this->_retvalue =
+            $this->compiler->compileTag('setfilter', array(), array(
+                'modifier_list' => array(
+                    array_merge(array($this->yystack[ $this->yyidx + -1 ]->minor),
+                        $this->yystack[ $this->yyidx + 0 ]->minor)
+                )
+            ));
+    }
+
+    // line 497 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r44()
+    {
+        $this->_retvalue =
+            $this->compiler->compileTag('setfilter', array(), array(
+                'modifier_list' => array_merge(array(
+                    array_merge(array(
+                        $this->yystack[ $this->yyidx +
+                                        -2 ]->minor
+                    ), $this->yystack[ $this->yyidx + -1 ]->minor)
+                ), $this->yystack[ $this->yyidx + 0 ]->minor)
+            ));
+    }
+
+    // line 506 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r45()
+    {
+        $tag =
+            trim(substr($this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler->getLdelLength(),
+                -$this->compiler->getRdelLength()), ' /');
+        if ($tag === 'strip') {
+            $this->strip = false;
+            $this->_retvalue = null;
+        } else {
+            $this->_retvalue = $this->compiler->compileTag($tag . 'close', array());
+        }
+    }
+
+    // line 510 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r46()
+    {
+        $this->_retvalue = $this->compiler->compileTag($this->yystack[ $this->yyidx + 0 ]->minor . 'close', array());
+    }
+
+    // line 515 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r47()
+    {
+        $this->_retvalue =
+            $this->compiler->compileTag($this->yystack[ $this->yyidx + -1 ]->minor . 'close', array(),
+                array('modifier_list' => $this->yystack[ $this->yyidx + 0 ]->minor));
+    }
+
+    // line 519 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r48()
+    {
+        $this->_retvalue =
+            $this->compiler->compileTag($this->yystack[ $this->yyidx + -2 ]->minor . 'close', array(),
+                array('object_method' => $this->yystack[ $this->yyidx + 0 ]->minor));
+    }
+
+    // line 527 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r49()
+    {
+        $this->_retvalue =
+            $this->compiler->compileTag($this->yystack[ $this->yyidx + -3 ]->minor . 'close', array(), array(
+                'object_method' => $this->yystack[ $this->yyidx + -1 ]->minor,
+                'modifier_list' => $this->yystack[ $this->yyidx + 0 ]->minor
+            ));
+    }
+
+    // line 533 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r50()
+    {
+        $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor;
+        $this->_retvalue[] = $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 538 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r51()
+    {
+        $this->_retvalue = array($this->yystack[ $this->yyidx + 0 ]->minor);
+    }
+
+    // line 543 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r52()
+    {
+        $this->_retvalue = array();
+    }
+
+    // line 554 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r53()
+    {
+        if (defined($this->yystack[ $this->yyidx + 0 ]->minor)) {
+            if ($this->security) {
+                $this->security->isTrustedConstant($this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler);
+            }
+            $this->_retvalue =
+                array($this->yystack[ $this->yyidx + -2 ]->minor => $this->yystack[ $this->yyidx + 0 ]->minor);
+        } else {
+            $this->_retvalue =
+                array(
+                    $this->yystack[ $this->yyidx + -2 ]->minor => '\'' .
+                                                                  $this->yystack[ $this->yyidx + 0 ]->minor .
+                                                                  '\''
+                );
+        }
+    }
+
+    // line 562 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r54()
+    {
+        $this->_retvalue =
+            array(
+                trim($this->yystack[ $this->yyidx + -1 ]->minor, " =\n\r\t") => $this->yystack[ $this->yyidx +
+                                                                                                0 ]->minor
+            );
+    }
+
+    // line 574 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r56()
+    {
+        $this->_retvalue = '\'' . $this->yystack[ $this->yyidx + 0 ]->minor . '\'';
+    }
+
+    // line 587 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r59()
+    {
+        $this->_retvalue =
+            array($this->yystack[ $this->yyidx + -2 ]->minor => $this->yystack[ $this->yyidx + 0 ]->minor);
+    }
+
+    // line 592 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r61()
+    {
+        $this->yystack[ $this->yyidx + -2 ]->minor[] = $this->yystack[ $this->yyidx + 0 ]->minor;
+        $this->_retvalue = $this->yystack[ $this->yyidx + -2 ]->minor;
+    }
+
+    // line 599 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r62()
+    {
+        $this->_retvalue =
+            array(
+                'var'   => '\'' . substr($this->yystack[ $this->yyidx + -2 ]->minor, 1) . '\'',
+                'value' => $this->yystack[ $this->yyidx + 0 ]->minor
+            );
+    }
+
+    // line 603 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r64()
+    {
+        $this->_retvalue =
+            array(
+                'var'   => $this->yystack[ $this->yyidx + -2 ]->minor,
+                'value' => $this->yystack[ $this->yyidx + 0 ]->minor
+            );
+    }
+
+    // line 623 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r65()
+    {
+        $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor;
+    }
+
+    // line 628 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r68()
+    {
+        $this->_retvalue =
+            '$_smarty_tpl->getStreamVariable(\'' .
+            substr($this->yystack[ $this->yyidx + -2 ]->minor, 1) .
+            '://' .
+            $this->yystack[ $this->yyidx + 0 ]->minor .
+            '\')';
+    }
+
+    // line 638 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r69()
+    {
+        $this->_retvalue =
+            $this->yystack[ $this->yyidx + -2 ]->minor .
+            trim($this->yystack[ $this->yyidx + -1 ]->minor) .
+            $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 642 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r71()
+    {
+        $this->_retvalue =
+            $this->yystack[ $this->yyidx + -1 ]->minor[ 'pre' ] .
+            $this->yystack[ $this->yyidx + -2 ]->minor .
+            $this->yystack[ $this->yyidx + -1 ]->minor[ 'op' ] .
+            $this->yystack[ $this->yyidx + 0 ]->minor .
+            ')';
+    }
+
+    // line 646 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r72()
+    {
+        $this->_retvalue =
+            $this->yystack[ $this->yyidx + -2 ]->minor .
+            $this->yystack[ $this->yyidx + -1 ]->minor .
+            $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 650 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r73()
+    {
+        $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor . $this->yystack[ $this->yyidx + -1 ]->minor . ')';
+    }
+
+    // line 654 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r74()
+    {
+        $this->_retvalue =
+            'in_array(' .
+            $this->yystack[ $this->yyidx + -2 ]->minor .
+            ',' .
+            $this->yystack[ $this->yyidx + 0 ]->minor .
+            ')';
+    }
+
+    // line 662 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r75()
+    {
+        $this->_retvalue =
+            'in_array(' .
+            $this->yystack[ $this->yyidx + -2 ]->minor .
+            ',(array)' .
+            $this->yystack[ $this->yyidx + 0 ]->minor .
+            ')';
+    }
+
+    // line 666 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r76()
+    {
+        $this->_retvalue =
+            $this->yystack[ $this->yyidx + -5 ]->minor .
+            ' ? ' .
+            $this->compiler->compileVariable('\'' . substr($this->yystack[ $this->yyidx + -2 ]->minor, 1) . '\'') .
+            ' : ' .
+            $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 676 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r77()
+    {
+        $this->_retvalue =
+            $this->yystack[ $this->yyidx + -5 ]->minor .
+            ' ? ' .
+            $this->yystack[ $this->yyidx + -2 ]->minor .
+            ' : ' .
+            $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 681 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r79()
+    {
+        $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 702 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r80()
+    {
+        $this->_retvalue = '!' . $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 706 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r85()
+    {
+        $this->_retvalue = $this->yystack[ $this->yyidx + -2 ]->minor . '.' . $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 710 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r86()
+    {
+        $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor . '.';
+    }
+
+    // line 715 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r87()
+    {
+        $this->_retvalue = '.' . $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 732 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r88()
+    {
+        if (defined($this->yystack[ $this->yyidx + 0 ]->minor)) {
+            if ($this->security) {
+                $this->security->isTrustedConstant($this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler);
+            }
+            $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor;
+        } else {
+            $this->_retvalue = '\'' . $this->yystack[ $this->yyidx + 0 ]->minor . '\'';
+        }
+    }
+
+    // line 736 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r90()
+    {
+        $this->_retvalue = '(' . $this->yystack[ $this->yyidx + -1 ]->minor . ')';
+    }
+
+    // line 754 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r91()
+    {
+        $this->_retvalue =
+            $this->yystack[ $this->yyidx + -2 ]->minor .
+            $this->yystack[ $this->yyidx + -1 ]->minor .
+            $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 765 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r95()
+    {
+        $prefixVar = $this->compiler->getNewPrefixVariable();
+        if ($this->yystack[ $this->yyidx + -2 ]->minor[ 'var' ] === '\'smarty\'') {
+            $this->compiler->appendPrefixCode("<?php {$prefixVar} = " .
+                                              $this->compiler->compileTag('private_special_variable', array(),
+                                                  $this->yystack[ $this->yyidx +
+                                                                  -2 ]->minor[ 'smarty_internal_index' ]) .
+                                              ';?>');
+        } else {
+            $this->compiler->appendPrefixCode("<?php  {$prefixVar} = " .
+                                              $this->compiler->compileVariable($this->yystack[ $this->yyidx +
+                                                                                               -2 ]->minor[ 'var' ]) .
+                                              $this->yystack[ $this->yyidx + -2 ]->minor[ 'smarty_internal_index' ] .
+                                              ';?>');
+        }
+        $this->_retvalue =
+            $prefixVar .
+            '::' .
+            $this->yystack[ $this->yyidx + 0 ]->minor[ 0 ] .
+            $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ];
+    }
+
+    // line 772 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r96()
+    {
+        $prefixVar = $this->compiler->getNewPrefixVariable();
+        $tmp = $this->compiler->appendCode('<?php ob_start();?>', $this->yystack[ $this->yyidx + 0 ]->minor);
+        $this->compiler->appendPrefixCode($this->compiler->appendCode($tmp, "<?php {$prefixVar} = ob_get_clean();?>"));
+        $this->_retvalue = $prefixVar;
+    }
+
+    // line 785 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r97()
+    {
+        $this->_retvalue =
+            $this->compiler->compileTag('private_modifier', array(), array(
+                'value'        => $this->yystack[ $this->yyidx + -1 ]->minor,
+                'modifierlist' => $this->yystack[ $this->yyidx + 0 ]->minor
+            ));
+    }
+
+    // line 804 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r100()
+    {
+        if (!in_array(strtolower($this->yystack[ $this->yyidx + -2 ]->minor), array('self', 'parent')) &&
+            (!$this->security ||
+             $this->security->isTrustedStaticClassAccess($this->yystack[ $this->yyidx + -2 ]->minor,
+                 $this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler))) {
+            if (isset($this->smarty->registered_classes[ $this->yystack[ $this->yyidx + -2 ]->minor ])) {
+                $this->_retvalue =
+                    $this->smarty->registered_classes[ $this->yystack[ $this->yyidx + -2 ]->minor ] .
+                    '::' .
+                    $this->yystack[ $this->yyidx + 0 ]->minor[ 0 ] .
+                    $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ];
+            } else {
+                $this->_retvalue =
+                    $this->yystack[ $this->yyidx + -2 ]->minor .
+                    '::' .
+                    $this->yystack[ $this->yyidx + 0 ]->minor[ 0 ] .
+                    $this->yystack[ $this->yyidx + 0 ]->minor[ 1 ];
+            }
+        } else {
+            $this->compiler->trigger_template_error('static class \'' .
+                                                    $this->yystack[ $this->yyidx + -2 ]->minor .
+                                                    '\' is undefined or not allowed by security setting');
+        }
+    }
+
+    // line 815 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r102()
+    {
+        $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 818 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r103()
+    {
+        $this->_retvalue =
+            $this->compiler->compileVariable('\'' . substr($this->yystack[ $this->yyidx + 0 ]->minor, 1) . '\'');
+    }
+
+    // line 831 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r104()
+    {
+        if ($this->yystack[ $this->yyidx + 0 ]->minor[ 'var' ] === '\'smarty\'') {
+            $smarty_var =
+                $this->compiler->compileTag('private_special_variable', array(),
+                    $this->yystack[ $this->yyidx + 0 ]->minor[ 'smarty_internal_index' ]);
+            $this->_retvalue = $smarty_var;
+        } else {
+            // used for array reset,next,prev,end,current
+            $this->last_variable = $this->yystack[ $this->yyidx + 0 ]->minor[ 'var' ];
+            $this->last_index = $this->yystack[ $this->yyidx + 0 ]->minor[ 'smarty_internal_index' ];
+            $this->_retvalue =
+                $this->compiler->compileVariable($this->yystack[ $this->yyidx + 0 ]->minor[ 'var' ]) .
+                $this->yystack[ $this->yyidx + 0 ]->minor[ 'smarty_internal_index' ];
+        }
+    }
+
+    // line 841 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r105()
+    {
+        $this->_retvalue =
+            '$_smarty_tpl->tpl_vars[' .
+            $this->yystack[ $this->yyidx + -2 ]->minor .
+            ']->' .
+            $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 845 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r107()
+    {
+        $this->_retvalue =
+            $this->compiler->compileConfigVariable('\'' . $this->yystack[ $this->yyidx + -1 ]->minor . '\'');
+    }
+
+    // line 849 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r108()
+    {
+        $this->_retvalue =
+            '(is_array($tmp = ' .
+            $this->compiler->compileConfigVariable('\'' . $this->yystack[ $this->yyidx + -2 ]->minor . '\'') .
+            ') ? $tmp' .
+            $this->yystack[ $this->yyidx + 0 ]->minor .
+            ' :null)';
+    }
+
+    // line 853 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r109()
+    {
+        $this->_retvalue = $this->compiler->compileConfigVariable($this->yystack[ $this->yyidx + -1 ]->minor);
+    }
+
+    // line 857 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r110()
+    {
+        $this->_retvalue =
+            '(is_array($tmp = ' .
+            $this->compiler->compileConfigVariable($this->yystack[ $this->yyidx + -2 ]->minor) .
+            ') ? $tmp' .
+            $this->yystack[ $this->yyidx + 0 ]->minor .
+            ' : null)';
+    }
+
+    // line 860 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r111()
+    {
+        $this->_retvalue =
+            array(
+                'var'                   => '\'' . substr($this->yystack[ $this->yyidx + -1 ]->minor, 1) . '\'',
+                'smarty_internal_index' => $this->yystack[ $this->yyidx + 0 ]->minor
+            );
+    }
+
+    // line 873 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r112()
+    {
+        $this->_retvalue =
+            array(
+                'var'                   => $this->yystack[ $this->yyidx + -1 ]->minor,
+                'smarty_internal_index' => $this->yystack[ $this->yyidx + 0 ]->minor
+            );
+    }
+
+    // line 879 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r114()
+    {
+        return;
+    }
+
+    // line 882 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r115()
+    {
+        $this->_retvalue =
+            '[' .
+            $this->compiler->compileVariable('\'' . substr($this->yystack[ $this->yyidx + 0 ]->minor, 1) . '\'') .
+            ']';
+    }
+
+    // line 886 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r116()
+    {
+        $this->_retvalue = '[' . $this->compiler->compileVariable($this->yystack[ $this->yyidx + 0 ]->minor) . ']';
+    }
+
+    // line 890 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r117()
+    {
+        $this->_retvalue =
+            '[' .
+            $this->compiler->compileVariable($this->yystack[ $this->yyidx + -2 ]->minor) .
+            '->' .
+            $this->yystack[ $this->yyidx + 0 ]->minor .
+            ']';
+    }
+
+    // line 894 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r118()
+    {
+        $this->_retvalue = '[\'' . $this->yystack[ $this->yyidx + 0 ]->minor . '\']';
+    }
+
+    // line 899 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r119()
+    {
+        $this->_retvalue = '[' . $this->yystack[ $this->yyidx + 0 ]->minor . ']';
+    }
+
+    // line 904 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r120()
+    {
+        $this->_retvalue = '[' . $this->yystack[ $this->yyidx + -1 ]->minor . ']';
+    }
+
+    // line 908 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r121()
+    {
+        $this->_retvalue =
+            '[' .
+            $this->compiler->compileTag('private_special_variable', array(),
+                '[\'section\'][\'' . $this->yystack[ $this->yyidx + -1 ]->minor . '\'][\'index\']') .
+            ']';
+    }
+
+    // line 911 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r122()
+    {
+        $this->_retvalue =
+            '[' .
+            $this->compiler->compileTag('private_special_variable', array(), '[\'section\'][\'' .
+                                                                             $this->yystack[ $this->yyidx +
+                                                                                             -3 ]->minor .
+                                                                             '\'][\'' .
+                                                                             $this->yystack[ $this->yyidx +
+                                                                                             -1 ]->minor .
+                                                                             '\']') .
+            ']';
+    }
+
+    // line 917 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r123()
+    {
+        $this->_retvalue = '[' . $this->yystack[ $this->yyidx + -1 ]->minor . ']';
+    }
+
+    // line 933 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r125()
+    {
+        $this->_retvalue =
+            '[' .
+            $this->compiler->compileVariable('\'' . substr($this->yystack[ $this->yyidx + -1 ]->minor, 1) . '\'') .
+            ']';
+    }
+
+    // line 943 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r129()
+    {
+        $this->_retvalue = '[]';
+    }
+
+    // line 947 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r130()
+    {
+        $this->_retvalue = '\'' . substr($this->yystack[ $this->yyidx + 0 ]->minor, 1) . '\'';
+    }
+
+    // line 952 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r131()
+    {
+        $this->_retvalue = '\'\'';
+    }
+
+    // line 960 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r132()
+    {
+        $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor . '.' . $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 966 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r134()
+    {
+        $var =
+            trim(substr($this->yystack[ $this->yyidx + 0 ]->minor, $this->compiler->getLdelLength(),
+                -$this->compiler->getRdelLength()), ' $');
+        $this->_retvalue = $this->compiler->compileVariable('\'' . $var . '\'');
+    }
+
+    // line 973 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r135()
+    {
+        $this->_retvalue = '(' . $this->yystack[ $this->yyidx + -1 ]->minor . ')';
+    }
+
+    // line 982 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r136()
+    {
+        if ($this->yystack[ $this->yyidx + -1 ]->minor[ 'var' ] === '\'smarty\'') {
+            $this->_retvalue =
+                $this->compiler->compileTag('private_special_variable', array(),
+                    $this->yystack[ $this->yyidx + -1 ]->minor[ 'smarty_internal_index' ]) .
+                $this->yystack[ $this->yyidx + 0 ]->minor;
+        } else {
+            $this->_retvalue =
+                $this->compiler->compileVariable($this->yystack[ $this->yyidx + -1 ]->minor[ 'var' ]) .
+                $this->yystack[ $this->yyidx + -1 ]->minor[ 'smarty_internal_index' ] .
+                $this->yystack[ $this->yyidx + 0 ]->minor;
+        }
+    }
+
+    // line 987 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r137()
+    {
+        $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 992 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r138()
+    {
+        $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 999 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r139()
+    {
+        if ($this->security && substr($this->yystack[ $this->yyidx + -1 ]->minor, 0, 1) === '_') {
+            $this->compiler->trigger_template_error(self::ERR1);
+        }
+        $this->_retvalue =
+            '->' . $this->yystack[ $this->yyidx + -1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 1006 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r140()
+    {
+        if ($this->security) {
+            $this->compiler->trigger_template_error(self::ERR2);
+        }
+        $this->_retvalue =
+            '->{' .
+            $this->compiler->compileVariable($this->yystack[ $this->yyidx + -1 ]->minor) .
+            $this->yystack[ $this->yyidx + 0 ]->minor .
+            '}';
+    }
+
+    // line 1013 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r141()
+    {
+        if ($this->security) {
+            $this->compiler->trigger_template_error(self::ERR2);
+        }
+        $this->_retvalue =
+            '->{' . $this->yystack[ $this->yyidx + -2 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor . '}';
+    }
+
+    // line 1021 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r142()
+    {
+        if ($this->security) {
+            $this->compiler->trigger_template_error(self::ERR2);
+        }
+        $this->_retvalue =
+            '->{\'' .
+            $this->yystack[ $this->yyidx + -4 ]->minor .
+            '\'.' .
+            $this->yystack[ $this->yyidx + -2 ]->minor .
+            $this->yystack[ $this->yyidx + 0 ]->minor .
+            '}';
+    }
+
+    // line 1029 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r143()
+    {
+        $this->_retvalue = '->' . $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 1037 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r144()
+    {
+        $this->_retvalue =
+            $this->compiler->compilePHPFunctionCall($this->yystack[ $this->yyidx + -3 ]->minor,
+                $this->yystack[ $this->yyidx + -1 ]->minor);
+    }
+
+    // line 1044 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r145()
+    {
+        if ($this->security && substr($this->yystack[ $this->yyidx + -3 ]->minor, 0, 1) === '_') {
+            $this->compiler->trigger_template_error(self::ERR1);
+        }
+        $this->_retvalue =
+            $this->yystack[ $this->yyidx + -3 ]->minor .
+            '(' .
+            implode(',', $this->yystack[ $this->yyidx + -1 ]->minor) .
+            ')';
+    }
+
+    // line 1055 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r146()
+    {
+        if ($this->security) {
+            $this->compiler->trigger_template_error(self::ERR2);
+        }
+        $prefixVar = $this->compiler->getNewPrefixVariable();
+        $this->compiler->appendPrefixCode("<?php {$prefixVar} = " .
+                                          $this->compiler->compileVariable('\'' .
+                                                                           substr($this->yystack[ $this->yyidx +
+                                                                                                  -3 ]->minor, 1) .
+                                                                           '\'') .
+                                          ';?>');
+        $this->_retvalue = $prefixVar . '(' . implode(',', $this->yystack[ $this->yyidx + -1 ]->minor) . ')';
+    }
+
+    // line 1072 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r147()
+    {
+        $this->_retvalue =
+            array_merge($this->yystack[ $this->yyidx + -2 ]->minor, array($this->yystack[ $this->yyidx + 0 ]->minor));
+    }
+
+    // line 1076 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r150()
+    {
+        $this->_retvalue =
+            array_merge($this->yystack[ $this->yyidx + -2 ]->minor, array(
+                array_merge($this->yystack[ $this->yyidx + -1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor)
+            ));
+    }
+
+    // line 1084 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r151()
+    {
+        $this->_retvalue =
+            array(array_merge($this->yystack[ $this->yyidx + -1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor));
+    }
+
+    // line 1092 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r153()
+    {
+        $this->_retvalue = array($this->yystack[ $this->yyidx + 0 ]->minor);
+    }
+
+    // line 1105 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r154()
+    {
+        $this->_retvalue =
+            array_merge($this->yystack[ $this->yyidx + -1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor);
+    }
+
+    // line 1114 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r157()
+    {
+        $this->_retvalue =
+            array(trim($this->yystack[ $this->yyidx + -1 ]->minor) . $this->yystack[ $this->yyidx + 0 ]->minor);
+    }
+
+    // line 1119 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r159()
+    {
+        $this->_retvalue = array($this->yystack[ $this->yyidx + 0 ]->minor, '', 'method');
+    }
+
+    // line 1124 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r160()
+    {
+        $this->_retvalue =
+            array($this->yystack[ $this->yyidx + -1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor, 'method');
+    }
+
+    // line 1129 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r161()
+    {
+        $this->_retvalue = array($this->yystack[ $this->yyidx + 0 ]->minor, '');
+    }
+
+    // line 1134 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r162()
+    {
+        $this->_retvalue =
+            array($this->yystack[ $this->yyidx + -1 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor, 'property');
+    }
+
+    // line 1140 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r163()
+    {
+        $this->_retvalue =
+            array(
+                $this->yystack[ $this->yyidx + -2 ]->minor,
+                $this->yystack[ $this->yyidx + -1 ]->minor . $this->yystack[ $this->yyidx + 0 ]->minor, 'property'
+            );
+    }
+
+    // line 1144 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r164()
+    {
+        $this->_retvalue = ' ' . trim($this->yystack[ $this->yyidx + 0 ]->minor) . ' ';
+    }
+
+    // line 1163 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r165()
+    {
+        static $lops = array(
+            'eq'  => ' == ',
+            'ne'  => ' != ',
+            'neq' => ' != ',
+            'gt'  => ' > ',
+            'ge'  => ' >= ',
+            'gte' => ' >= ',
+            'lt'  => ' < ',
+            'le'  => ' <= ',
+            'lte' => ' <= ',
+            'mod' => ' % ',
+            'and' => ' && ',
+            'or'  => ' || ',
+            'xor' => ' xor ',
+        );
+        $op = strtolower(preg_replace('/\s*/', '', $this->yystack[ $this->yyidx + 0 ]->minor));
+        $this->_retvalue = $lops[ $op ];
+    }
+
+    // line 1176 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r166()
+    {
+        static $tlops = array(
+            'isdivby'     => array('op' => ' % ', 'pre' => '!('),
+            'isnotdivby'  => array('op' => ' % ', 'pre' => '('),
+            'isevenby'    => array('op' => ' / ', 'pre' => '!(1 & '),
+            'isnotevenby' => array('op' => ' / ', 'pre' => '(1 & '),
+            'isoddby'     => array('op' => ' / ', 'pre' => '(1 & '),
+            'isnotoddby'  => array('op' => ' / ', 'pre' => '!(1 & '),
+        );
+        $op = strtolower(preg_replace('/\s*/', '', $this->yystack[ $this->yyidx + 0 ]->minor));
+        $this->_retvalue = $tlops[ $op ];
+    }
+
+    // line 1190 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r167()
+    {
+        static $scond = array(
+            'iseven'    => '!(1 & ',
+            'isnoteven' => '(1 & ',
+            'isodd'     => '(1 & ',
+            'isnotodd'  => '!(1 & ',
+        );
+        $op = strtolower(str_replace(' ', '', $this->yystack[ $this->yyidx + 0 ]->minor));
+        $this->_retvalue = $scond[ $op ];
+    }
+
+    // line 1201 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r168()
+    {
+        $this->_retvalue = 'array(' . $this->yystack[ $this->yyidx + -1 ]->minor . ')';
+    }
+
+    // line 1209 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r171()
+    {
+        $this->_retvalue = $this->yystack[ $this->yyidx + -2 ]->minor . ',' . $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 1213 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r173()
+    {
+        $this->_retvalue =
+            $this->yystack[ $this->yyidx + -2 ]->minor . '=>' . $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 1229 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r174()
+    {
+        $this->_retvalue =
+            '\'' . $this->yystack[ $this->yyidx + -2 ]->minor . '\'=>' . $this->yystack[ $this->yyidx + 0 ]->minor;
+    }
+
+    // line 1235 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r177()
+    {
+        $this->compiler->leaveDoubleQuote();
+        $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor->to_smarty_php($this);
+    }
+
+    // line 1240 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r178()
+    {
+        $this->yystack[ $this->yyidx + -1 ]->minor->append_subtree($this, $this->yystack[ $this->yyidx + 0 ]->minor);
+        $this->_retvalue = $this->yystack[ $this->yyidx + -1 ]->minor;
+    }
+
+    // line 1244 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r179()
+    {
+        $this->_retvalue = new Smarty_Internal_ParseTree_Dq($this, $this->yystack[ $this->yyidx + 0 ]->minor);
+    }
+
+    // line 1248 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r180()
+    {
+        $this->_retvalue = new Smarty_Internal_ParseTree_Code('(string)' . $this->yystack[ $this->yyidx + -1 ]->minor);
+    }
+
+    // line 1252 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r181()
+    {
+        $this->_retvalue =
+            new Smarty_Internal_ParseTree_Code('(string)(' . $this->yystack[ $this->yyidx + -1 ]->minor . ')');
+    }
+
+    // line 1264 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r182()
+    {
+        $this->_retvalue =
+            new Smarty_Internal_ParseTree_Code('(string)$_smarty_tpl->tpl_vars[\'' .
+                                               substr($this->yystack[ $this->yyidx + 0 ]->minor, 1) .
+                                               '\']->value');
+    }
+
+    // line 1268 "../smarty/lexer/smarty_internal_templateparser.y"
+    public function yy_r185()
+    {
+        $this->_retvalue = new Smarty_Internal_ParseTree_Tag($this, $this->yystack[ $this->yyidx + 0 ]->minor);
+    }
+
+    public function yy_r186()
+    {
+        $this->_retvalue = new Smarty_Internal_ParseTree_DqContent($this->yystack[ $this->yyidx + 0 ]->minor);
+    }
+
+    public function yy_reduce($yyruleno)
+    {
+        if ($this->yyTraceFILE && $yyruleno >= 0
+            && $yyruleno < count(self::$yyRuleName)) {
+            fprintf($this->yyTraceFILE, "%sReduce (%d) [%s].\n",
+                $this->yyTracePrompt, $yyruleno,
+                self::$yyRuleName[ $yyruleno ]);
+        }
+        $this->_retvalue = $yy_lefthand_side = null;
+        if (isset(self::$yyReduceMap[ $yyruleno ])) {
+            // call the action
+            $this->_retvalue = null;
+            $this->{'yy_r' . self::$yyReduceMap[ $yyruleno ]}();
+            $yy_lefthand_side = $this->_retvalue;
+        }
+        $yygoto = self::$yyRuleInfo[ $yyruleno ][ 0 ];
+        $yysize = self::$yyRuleInfo[ $yyruleno ][ 1 ];
+        $this->yyidx -= $yysize;
+        for ($i = $yysize; $i; $i--) {
+            // pop all of the right-hand side parameters
+            array_pop($this->yystack);
+        }
+        $yyact = $this->yy_find_reduce_action($this->yystack[ $this->yyidx ]->stateno, $yygoto);
+        if ($yyact < self::YYNSTATE) {
+            if (!$this->yyTraceFILE && $yysize) {
+                $this->yyidx++;
+                $x = new TP_yyStackEntry;
+                $x->stateno = $yyact;
+                $x->major = $yygoto;
+                $x->minor = $yy_lefthand_side;
+                $this->yystack[ $this->yyidx ] = $x;
+            } else {
+                $this->yy_shift($yyact, $yygoto, $yy_lefthand_side);
+            }
+        } elseif ($yyact === self::YYNSTATE + self::YYNRULE + 1) {
+            $this->yy_accept();
+        }
+    }
+
+    public function yy_parse_failed()
+    {
+        if ($this->yyTraceFILE) {
+            fprintf($this->yyTraceFILE, "%sFail!\n", $this->yyTracePrompt);
+        }
+        while ($this->yyidx >= 0) {
+            $this->yy_pop_parser_stack();
+        }
+    }
+
+    public function yy_syntax_error($yymajor, $TOKEN)
+    {
+        // line 214 "../smarty/lexer/smarty_internal_templateparser.y"
+        $this->internalError = true;
+        $this->yymajor = $yymajor;
+        $this->compiler->trigger_template_error();
+    }
+
+    public function yy_accept()
+    {
+        if ($this->yyTraceFILE) {
+            fprintf($this->yyTraceFILE, "%sAccept!\n", $this->yyTracePrompt);
+        }
+        while ($this->yyidx >= 0) {
+            $this->yy_pop_parser_stack();
+        }
+        // line 207 "../smarty/lexer/smarty_internal_templateparser.y"
+        $this->successful = !$this->internalError;
+        $this->internalError = false;
+        $this->retvalue = $this->_retvalue;
+    }
+
+    public function doParse($yymajor, $yytokenvalue)
+    {
+        $yyerrorhit = 0;   /* True if yymajor has invoked an error */
+        if ($this->yyidx === null || $this->yyidx < 0) {
+            $this->yyidx = 0;
+            $this->yyerrcnt = -1;
+            $x = new TP_yyStackEntry;
+            $x->stateno = 0;
+            $x->major = 0;
+            $this->yystack = array();
+            $this->yystack[] = $x;
+        }
+        $yyendofinput = ($yymajor == 0);
+        if ($this->yyTraceFILE) {
+            fprintf($this->yyTraceFILE, "%sInput %s\n",
+                $this->yyTracePrompt, $this->yyTokenName[ $yymajor ]);
+        }
+        do {
+            $yyact = $this->yy_find_shift_action($yymajor);
+            if ($yymajor < self::YYERRORSYMBOL &&
+                !$this->yy_is_expected_token($yymajor)) {
+                // force a syntax error
+                $yyact = self::YY_ERROR_ACTION;
+            }
+            if ($yyact < self::YYNSTATE) {
+                $this->yy_shift($yyact, $yymajor, $yytokenvalue);
+                $this->yyerrcnt--;
+                if ($yyendofinput && $this->yyidx >= 0) {
+                    $yymajor = 0;
+                } else {
+                    $yymajor = self::YYNOCODE;
+                }
+            } elseif ($yyact < self::YYNSTATE + self::YYNRULE) {
+                $this->yy_reduce($yyact - self::YYNSTATE);
+            } elseif ($yyact === self::YY_ERROR_ACTION) {
+                if ($this->yyTraceFILE) {
+                    fprintf($this->yyTraceFILE, "%sSyntax Error!\n",
+                        $this->yyTracePrompt);
+                }
+                if (self::YYERRORSYMBOL) {
+                    if ($this->yyerrcnt < 0) {
+                        $this->yy_syntax_error($yymajor, $yytokenvalue);
+                    }
+                    $yymx = $this->yystack[ $this->yyidx ]->major;
+                    if ($yymx === self::YYERRORSYMBOL || $yyerrorhit) {
+                        if ($this->yyTraceFILE) {
+                            fprintf($this->yyTraceFILE, "%sDiscard input token %s\n",
+                                $this->yyTracePrompt, $this->yyTokenName[ $yymajor ]);
+                        }
+                        $this->yy_destructor($yymajor, $yytokenvalue);
+                        $yymajor = self::YYNOCODE;
+                    } else {
+                        while ($this->yyidx >= 0 &&
+                               $yymx !== self::YYERRORSYMBOL &&
+                               ($yyact = $this->yy_find_shift_action(self::YYERRORSYMBOL)) >= self::YYNSTATE
+                        ) {
+                            $this->yy_pop_parser_stack();
+                        }
+                        if ($this->yyidx < 0 || $yymajor == 0) {
+                            $this->yy_destructor($yymajor, $yytokenvalue);
+                            $this->yy_parse_failed();
+                            $yymajor = self::YYNOCODE;
+                        } elseif ($yymx !== self::YYERRORSYMBOL) {
+                            $u2 = 0;
+                            $this->yy_shift($yyact, self::YYERRORSYMBOL, $u2);
+                        }
+                    }
+                    $this->yyerrcnt = 3;
+                    $yyerrorhit = 1;
+                } else {
+                    if ($this->yyerrcnt <= 0) {
+                        $this->yy_syntax_error($yymajor, $yytokenvalue);
+                    }
+                    $this->yyerrcnt = 3;
+                    $this->yy_destructor($yymajor, $yytokenvalue);
+                    if ($yyendofinput) {
+                        $this->yy_parse_failed();
+                    }
+                    $yymajor = self::YYNOCODE;
+                }
+            } else {
+                $this->yy_accept();
+                $yymajor = self::YYNOCODE;
+            }
+        } while ($yymajor !== self::YYNOCODE && $this->yyidx >= 0);
+    }
+}
+
diff --git a/sysplugins/smarty_internal_testinstall.php b/sysplugins/smarty_internal_testinstall.php
new file mode 100644
index 0000000000000000000000000000000000000000..504a4582c3614cf302ef1d9bfa890b7b185da8ed
--- /dev/null
+++ b/sysplugins/smarty_internal_testinstall.php
@@ -0,0 +1,609 @@
+<?php
+/**
+ * Smarty Internal TestInstall
+ * Test Smarty installation
+ *
+ * @package    Smarty
+ * @subpackage Utilities
+ * @author     Uwe Tews
+ */
+
+/**
+ * TestInstall class
+ *
+ * @package    Smarty
+ * @subpackage Utilities
+ */
+class Smarty_Internal_TestInstall
+{
+    /**
+     * diagnose Smarty setup
+     * If $errors is secified, the diagnostic report will be appended to the array, rather than being output.
+     *
+     * @param \Smarty $smarty
+     * @param array   $errors array to push results into rather than outputting them
+     *
+     * @return bool status, true if everything is fine, false else
+     */
+    public static function testInstall(Smarty $smarty, &$errors = null)
+    {
+        $status = true;
+        if ($errors === null) {
+            echo "<PRE>\n";
+            echo "Smarty Installation test...\n";
+            echo "Testing template directory...\n";
+        }
+        $_stream_resolve_include_path = function_exists('stream_resolve_include_path');
+        // test if all registered template_dir are accessible
+        foreach ($smarty->getTemplateDir() as $template_dir) {
+            $_template_dir = $template_dir;
+            $template_dir = realpath($template_dir);
+            // resolve include_path or fail existence
+            if (!$template_dir) {
+                if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_template_dir)) {
+                    // try PHP include_path
+                    if ($_stream_resolve_include_path) {
+                        $template_dir = stream_resolve_include_path($_template_dir);
+                    } else {
+                        $template_dir = $smarty->ext->_getIncludePath->getIncludePath($_template_dir, null, $smarty);
+                    }
+                    if ($template_dir !== false) {
+                        if ($errors === null) {
+                            echo "$template_dir is OK.\n";
+                        }
+                        continue;
+                    } else {
+                        $status = false;
+                        $message =
+                            "FAILED: $_template_dir does not exist (and couldn't be found in include_path either)";
+                        if ($errors === null) {
+                            echo $message . ".\n";
+                        } else {
+                            $errors[ 'template_dir' ] = $message;
+                        }
+                        continue;
+                    }
+                } else {
+                    $status = false;
+                    $message = "FAILED: $_template_dir does not exist";
+                    if ($errors === null) {
+                        echo $message . ".\n";
+                    } else {
+                        $errors[ 'template_dir' ] = $message;
+                    }
+                    continue;
+                }
+            }
+            if (!is_dir($template_dir)) {
+                $status = false;
+                $message = "FAILED: $template_dir is not a directory";
+                if ($errors === null) {
+                    echo $message . ".\n";
+                } else {
+                    $errors[ 'template_dir' ] = $message;
+                }
+            } elseif (!is_readable($template_dir)) {
+                $status = false;
+                $message = "FAILED: $template_dir is not readable";
+                if ($errors === null) {
+                    echo $message . ".\n";
+                } else {
+                    $errors[ 'template_dir' ] = $message;
+                }
+            } else {
+                if ($errors === null) {
+                    echo "$template_dir is OK.\n";
+                }
+            }
+        }
+        if ($errors === null) {
+            echo "Testing compile directory...\n";
+        }
+        // test if registered compile_dir is accessible
+        $__compile_dir = $smarty->getCompileDir();
+        $_compile_dir = realpath($__compile_dir);
+        if (!$_compile_dir) {
+            $status = false;
+            $message = "FAILED: {$__compile_dir} does not exist";
+            if ($errors === null) {
+                echo $message . ".\n";
+            } else {
+                $errors[ 'compile_dir' ] = $message;
+            }
+        } elseif (!is_dir($_compile_dir)) {
+            $status = false;
+            $message = "FAILED: {$_compile_dir} is not a directory";
+            if ($errors === null) {
+                echo $message . ".\n";
+            } else {
+                $errors[ 'compile_dir' ] = $message;
+            }
+        } elseif (!is_readable($_compile_dir)) {
+            $status = false;
+            $message = "FAILED: {$_compile_dir} is not readable";
+            if ($errors === null) {
+                echo $message . ".\n";
+            } else {
+                $errors[ 'compile_dir' ] = $message;
+            }
+        } elseif (!is_writable($_compile_dir)) {
+            $status = false;
+            $message = "FAILED: {$_compile_dir} is not writable";
+            if ($errors === null) {
+                echo $message . ".\n";
+            } else {
+                $errors[ 'compile_dir' ] = $message;
+            }
+        } else {
+            if ($errors === null) {
+                echo "{$_compile_dir} is OK.\n";
+            }
+        }
+        if ($errors === null) {
+            echo "Testing plugins directory...\n";
+        }
+        // test if all registered plugins_dir are accessible
+        // and if core plugins directory is still registered
+        $_core_plugins_dir = realpath(dirname(__FILE__) . '/../plugins');
+        $_core_plugins_available = false;
+        foreach ($smarty->getPluginsDir() as $plugin_dir) {
+            $_plugin_dir = $plugin_dir;
+            $plugin_dir = realpath($plugin_dir);
+            // resolve include_path or fail existence
+            if (!$plugin_dir) {
+                if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_plugin_dir)) {
+                    // try PHP include_path
+                    if ($_stream_resolve_include_path) {
+                        $plugin_dir = stream_resolve_include_path($_plugin_dir);
+                    } else {
+                        $plugin_dir = $smarty->ext->_getIncludePath->getIncludePath($_plugin_dir, null, $smarty);
+                    }
+                    if ($plugin_dir !== false) {
+                        if ($errors === null) {
+                            echo "$plugin_dir is OK.\n";
+                        }
+                        continue;
+                    } else {
+                        $status = false;
+                        $message = "FAILED: $_plugin_dir does not exist (and couldn't be found in include_path either)";
+                        if ($errors === null) {
+                            echo $message . ".\n";
+                        } else {
+                            $errors[ 'plugins_dir' ] = $message;
+                        }
+                        continue;
+                    }
+                } else {
+                    $status = false;
+                    $message = "FAILED: $_plugin_dir does not exist";
+                    if ($errors === null) {
+                        echo $message . ".\n";
+                    } else {
+                        $errors[ 'plugins_dir' ] = $message;
+                    }
+                    continue;
+                }
+            }
+            if (!is_dir($plugin_dir)) {
+                $status = false;
+                $message = "FAILED: $plugin_dir is not a directory";
+                if ($errors === null) {
+                    echo $message . ".\n";
+                } else {
+                    $errors[ 'plugins_dir' ] = $message;
+                }
+            } elseif (!is_readable($plugin_dir)) {
+                $status = false;
+                $message = "FAILED: $plugin_dir is not readable";
+                if ($errors === null) {
+                    echo $message . ".\n";
+                } else {
+                    $errors[ 'plugins_dir' ] = $message;
+                }
+            } elseif ($_core_plugins_dir && $_core_plugins_dir == realpath($plugin_dir)) {
+                $_core_plugins_available = true;
+                if ($errors === null) {
+                    echo "$plugin_dir is OK.\n";
+                }
+            } else {
+                if ($errors === null) {
+                    echo "$plugin_dir is OK.\n";
+                }
+            }
+        }
+        if (!$_core_plugins_available) {
+            $status = false;
+            $message = "WARNING: Smarty's own libs/plugins is not available";
+            if ($errors === null) {
+                echo $message . ".\n";
+            } elseif (!isset($errors[ 'plugins_dir' ])) {
+                $errors[ 'plugins_dir' ] = $message;
+            }
+        }
+        if ($errors === null) {
+            echo "Testing cache directory...\n";
+        }
+        // test if all registered cache_dir is accessible
+        $__cache_dir = $smarty->getCacheDir();
+        $_cache_dir = realpath($__cache_dir);
+        if (!$_cache_dir) {
+            $status = false;
+            $message = "FAILED: {$__cache_dir} does not exist";
+            if ($errors === null) {
+                echo $message . ".\n";
+            } else {
+                $errors[ 'cache_dir' ] = $message;
+            }
+        } elseif (!is_dir($_cache_dir)) {
+            $status = false;
+            $message = "FAILED: {$_cache_dir} is not a directory";
+            if ($errors === null) {
+                echo $message . ".\n";
+            } else {
+                $errors[ 'cache_dir' ] = $message;
+            }
+        } elseif (!is_readable($_cache_dir)) {
+            $status = false;
+            $message = "FAILED: {$_cache_dir} is not readable";
+            if ($errors === null) {
+                echo $message . ".\n";
+            } else {
+                $errors[ 'cache_dir' ] = $message;
+            }
+        } elseif (!is_writable($_cache_dir)) {
+            $status = false;
+            $message = "FAILED: {$_cache_dir} is not writable";
+            if ($errors === null) {
+                echo $message . ".\n";
+            } else {
+                $errors[ 'cache_dir' ] = $message;
+            }
+        } else {
+            if ($errors === null) {
+                echo "{$_cache_dir} is OK.\n";
+            }
+        }
+        if ($errors === null) {
+            echo "Testing configs directory...\n";
+        }
+        // test if all registered config_dir are accessible
+        foreach ($smarty->getConfigDir() as $config_dir) {
+            $_config_dir = $config_dir;
+            // resolve include_path or fail existence
+            if (!$config_dir) {
+                if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_config_dir)) {
+                    // try PHP include_path
+                    if ($_stream_resolve_include_path) {
+                        $config_dir = stream_resolve_include_path($_config_dir);
+                    } else {
+                        $config_dir = $smarty->ext->_getIncludePath->getIncludePath($_config_dir, null, $smarty);
+                    }
+                    if ($config_dir !== false) {
+                        if ($errors === null) {
+                            echo "$config_dir is OK.\n";
+                        }
+                        continue;
+                    } else {
+                        $status = false;
+                        $message = "FAILED: $_config_dir does not exist (and couldn't be found in include_path either)";
+                        if ($errors === null) {
+                            echo $message . ".\n";
+                        } else {
+                            $errors[ 'config_dir' ] = $message;
+                        }
+                        continue;
+                    }
+                } else {
+                    $status = false;
+                    $message = "FAILED: $_config_dir does not exist";
+                    if ($errors === null) {
+                        echo $message . ".\n";
+                    } else {
+                        $errors[ 'config_dir' ] = $message;
+                    }
+                    continue;
+                }
+            }
+            if (!is_dir($config_dir)) {
+                $status = false;
+                $message = "FAILED: $config_dir is not a directory";
+                if ($errors === null) {
+                    echo $message . ".\n";
+                } else {
+                    $errors[ 'config_dir' ] = $message;
+                }
+            } elseif (!is_readable($config_dir)) {
+                $status = false;
+                $message = "FAILED: $config_dir is not readable";
+                if ($errors === null) {
+                    echo $message . ".\n";
+                } else {
+                    $errors[ 'config_dir' ] = $message;
+                }
+            } else {
+                if ($errors === null) {
+                    echo "$config_dir is OK.\n";
+                }
+            }
+        }
+        if ($errors === null) {
+            echo "Testing sysplugin files...\n";
+        }
+        // test if sysplugins are available
+        $source = SMARTY_SYSPLUGINS_DIR;
+        if (is_dir($source)) {
+            $expectedSysplugins = array(
+                'smartycompilerexception.php'                               => true,
+                'smartyexception.php'                                       => true,
+                'smarty_cacheresource.php'                                  => true,
+                'smarty_cacheresource_custom.php'                           => true,
+                'smarty_cacheresource_keyvaluestore.php'                    => true,
+                'smarty_data.php'                                           => true,
+                'smarty_internal_block.php'                                 => true,
+                'smarty_internal_cacheresource_file.php'                    => true,
+                'smarty_internal_compilebase.php'                           => true,
+                'smarty_internal_compile_append.php'                        => true,
+                'smarty_internal_compile_assign.php'                        => true,
+                'smarty_internal_compile_block.php'                         => true,
+                'smarty_internal_compile_block_child.php'                   => true,
+                'smarty_internal_compile_block_parent.php'                  => true,
+                'smarty_internal_compile_child.php'                         => true,
+                'smarty_internal_compile_parent.php'                        => true,
+                'smarty_internal_compile_break.php'                         => true,
+                'smarty_internal_compile_call.php'                          => true,
+                'smarty_internal_compile_capture.php'                       => true,
+                'smarty_internal_compile_config_load.php'                   => true,
+                'smarty_internal_compile_continue.php'                      => true,
+                'smarty_internal_compile_debug.php'                         => true,
+                'smarty_internal_compile_eval.php'                          => true,
+                'smarty_internal_compile_extends.php'                       => true,
+                'smarty_internal_compile_for.php'                           => true,
+                'smarty_internal_compile_foreach.php'                       => true,
+                'smarty_internal_compile_function.php'                      => true,
+                'smarty_internal_compile_if.php'                            => true,
+                'smarty_internal_compile_include.php'                       => true,
+                'smarty_internal_compile_include_php.php'                   => true,
+                'smarty_internal_compile_insert.php'                        => true,
+                'smarty_internal_compile_ldelim.php'                        => true,
+                'smarty_internal_compile_make_nocache.php'                  => true,
+                'smarty_internal_compile_nocache.php'                       => true,
+                'smarty_internal_compile_private_block_plugin.php'          => true,
+                'smarty_internal_compile_private_foreachsection.php'        => true,
+                'smarty_internal_compile_private_function_plugin.php'       => true,
+                'smarty_internal_compile_private_modifier.php'              => true,
+                'smarty_internal_compile_private_object_block_function.php' => true,
+                'smarty_internal_compile_private_object_function.php'       => true,
+                'smarty_internal_compile_private_php.php'                   => true,
+                'smarty_internal_compile_private_print_expression.php'      => true,
+                'smarty_internal_compile_private_registered_block.php'      => true,
+                'smarty_internal_compile_private_registered_function.php'   => true,
+                'smarty_internal_compile_private_special_variable.php'      => true,
+                'smarty_internal_compile_rdelim.php'                        => true,
+                'smarty_internal_compile_section.php'                       => true,
+                'smarty_internal_compile_setfilter.php'                     => true,
+                'smarty_internal_compile_shared_inheritance.php'            => true,
+                'smarty_internal_compile_while.php'                         => true,
+                'smarty_internal_configfilelexer.php'                       => true,
+                'smarty_internal_configfileparser.php'                      => true,
+                'smarty_internal_config_file_compiler.php'                  => true,
+                'smarty_internal_data.php'                                  => true,
+                'smarty_internal_debug.php'                                 => true,
+                'smarty_internal_errorhandler.php'                          => true,
+                'smarty_internal_extension_handler.php'                     => true,
+                'smarty_internal_method_addautoloadfilters.php'             => true,
+                'smarty_internal_method_adddefaultmodifiers.php'            => true,
+                'smarty_internal_method_append.php'                         => true,
+                'smarty_internal_method_appendbyref.php'                    => true,
+                'smarty_internal_method_assignbyref.php'                    => true,
+                'smarty_internal_method_assignglobal.php'                   => true,
+                'smarty_internal_method_clearallassign.php'                 => true,
+                'smarty_internal_method_clearallcache.php'                  => true,
+                'smarty_internal_method_clearassign.php'                    => true,
+                'smarty_internal_method_clearcache.php'                     => true,
+                'smarty_internal_method_clearcompiledtemplate.php'          => true,
+                'smarty_internal_method_clearconfig.php'                    => true,
+                'smarty_internal_method_compileallconfig.php'               => true,
+                'smarty_internal_method_compilealltemplates.php'            => true,
+                'smarty_internal_method_configload.php'                     => true,
+                'smarty_internal_method_createdata.php'                     => true,
+                'smarty_internal_method_getautoloadfilters.php'             => true,
+                'smarty_internal_method_getconfigvariable.php'              => true,
+                'smarty_internal_method_getconfigvars.php'                  => true,
+                'smarty_internal_method_getdebugtemplate.php'               => true,
+                'smarty_internal_method_getdefaultmodifiers.php'            => true,
+                'smarty_internal_method_getglobal.php'                      => true,
+                'smarty_internal_method_getregisteredobject.php'            => true,
+                'smarty_internal_method_getstreamvariable.php'              => true,
+                'smarty_internal_method_gettags.php'                        => true,
+                'smarty_internal_method_gettemplatevars.php'                => true,
+                'smarty_internal_method_literals.php'                       => true,
+                'smarty_internal_method_loadfilter.php'                     => true,
+                'smarty_internal_method_loadplugin.php'                     => true,
+                'smarty_internal_method_mustcompile.php'                    => true,
+                'smarty_internal_method_registercacheresource.php'          => true,
+                'smarty_internal_method_registerclass.php'                  => true,
+                'smarty_internal_method_registerdefaultconfighandler.php'   => true,
+                'smarty_internal_method_registerdefaultpluginhandler.php'   => true,
+                'smarty_internal_method_registerdefaulttemplatehandler.php' => true,
+                'smarty_internal_method_registerfilter.php'                 => true,
+                'smarty_internal_method_registerobject.php'                 => true,
+                'smarty_internal_method_registerplugin.php'                 => true,
+                'smarty_internal_method_registerresource.php'               => true,
+                'smarty_internal_method_setautoloadfilters.php'             => true,
+                'smarty_internal_method_setdebugtemplate.php'               => true,
+                'smarty_internal_method_setdefaultmodifiers.php'            => true,
+                'smarty_internal_method_unloadfilter.php'                   => true,
+                'smarty_internal_method_unregistercacheresource.php'        => true,
+                'smarty_internal_method_unregisterfilter.php'               => true,
+                'smarty_internal_method_unregisterobject.php'               => true,
+                'smarty_internal_method_unregisterplugin.php'               => true,
+                'smarty_internal_method_unregisterresource.php'             => true,
+                'smarty_internal_nocache_insert.php'                        => true,
+                'smarty_internal_parsetree.php'                             => true,
+                'smarty_internal_parsetree_code.php'                        => true,
+                'smarty_internal_parsetree_dq.php'                          => true,
+                'smarty_internal_parsetree_dqcontent.php'                   => true,
+                'smarty_internal_parsetree_tag.php'                         => true,
+                'smarty_internal_parsetree_template.php'                    => true,
+                'smarty_internal_parsetree_text.php'                        => true,
+                'smarty_internal_resource_eval.php'                         => true,
+                'smarty_internal_resource_extends.php'                      => true,
+                'smarty_internal_resource_file.php'                         => true,
+                'smarty_internal_resource_php.php'                          => true,
+                'smarty_internal_resource_registered.php'                   => true,
+                'smarty_internal_resource_stream.php'                       => true,
+                'smarty_internal_resource_string.php'                       => true,
+                'smarty_internal_runtime_cachemodify.php'                   => true,
+                'smarty_internal_runtime_cacheresourcefile.php'             => true,
+                'smarty_internal_runtime_capture.php'                       => true,
+                'smarty_internal_runtime_codeframe.php'                     => true,
+                'smarty_internal_runtime_filterhandler.php'                 => true,
+                'smarty_internal_runtime_foreach.php'                       => true,
+                'smarty_internal_runtime_getincludepath.php'                => true,
+                'smarty_internal_runtime_inheritance.php'                   => true,
+                'smarty_internal_runtime_make_nocache.php'                  => true,
+                'smarty_internal_runtime_tplfunction.php'                   => true,
+                'smarty_internal_runtime_updatecache.php'                   => true,
+                'smarty_internal_runtime_updatescope.php'                   => true,
+                'smarty_internal_runtime_writefile.php'                     => true,
+                'smarty_internal_smartytemplatecompiler.php'                => true,
+                'smarty_internal_template.php'                              => true,
+                'smarty_internal_templatebase.php'                          => true,
+                'smarty_internal_templatecompilerbase.php'                  => true,
+                'smarty_internal_templatelexer.php'                         => true,
+                'smarty_internal_templateparser.php'                        => true,
+                'smarty_internal_testinstall.php'                           => true,
+                'smarty_internal_undefined.php'                             => true,
+                'smarty_resource.php'                                       => true,
+                'smarty_resource_custom.php'                                => true,
+                'smarty_resource_recompiled.php'                            => true,
+                'smarty_resource_uncompiled.php'                            => true,
+                'smarty_security.php'                                       => true,
+                'smarty_template_cached.php'                                => true,
+                'smarty_template_compiled.php'                              => true,
+                'smarty_template_config.php'                                => true,
+                'smarty_template_resource_base.php'                         => true,
+                'smarty_template_source.php'                                => true,
+                'smarty_undefined_variable.php'                             => true,
+                'smarty_variable.php'                                       => true,
+            );
+            $iterator = new DirectoryIterator($source);
+            foreach ($iterator as $file) {
+                if (!$file->isDot()) {
+                    $filename = $file->getFilename();
+                    if (isset($expectedSysplugins[ $filename ])) {
+                        unset($expectedSysplugins[ $filename ]);
+                    }
+                }
+            }
+            if ($expectedSysplugins) {
+                $status = false;
+                $message = "FAILED: files missing from libs/sysplugins: " . join(', ', array_keys($expectedSysplugins));
+                if ($errors === null) {
+                    echo $message . ".\n";
+                } else {
+                    $errors[ 'sysplugins' ] = $message;
+                }
+            } elseif ($errors === null) {
+                echo "... OK\n";
+            }
+        } else {
+            $status = false;
+            $message = "FAILED: " . SMARTY_SYSPLUGINS_DIR . ' is not a directory';
+            if ($errors === null) {
+                echo $message . ".\n";
+            } else {
+                $errors[ 'sysplugins_dir_constant' ] = $message;
+            }
+        }
+        if ($errors === null) {
+            echo "Testing plugin files...\n";
+        }
+        // test if core plugins are available
+        $source = SMARTY_PLUGINS_DIR;
+        if (is_dir($source)) {
+            $expectedPlugins = array(
+                'block.textformat.php'                  => true,
+                'function.counter.php'                  => true,
+                'function.cycle.php'                    => true,
+                'function.fetch.php'                    => true,
+                'function.html_checkboxes.php'          => true,
+                'function.html_image.php'               => true,
+                'function.html_options.php'             => true,
+                'function.html_radios.php'              => true,
+                'function.html_select_date.php'         => true,
+                'function.html_select_time.php'         => true,
+                'function.html_table.php'               => true,
+                'function.mailto.php'                   => true,
+                'function.math.php'                     => true,
+                'modifier.capitalize.php'               => true,
+                'modifier.date_format.php'              => true,
+                'modifier.debug_print_var.php'          => true,
+                'modifier.escape.php'                   => true,
+                'modifier.mb_wordwrap.php'              => true,
+                'modifier.regex_replace.php'            => true,
+                'modifier.replace.php'                  => true,
+                'modifier.spacify.php'                  => true,
+                'modifier.truncate.php'                 => true,
+                'modifiercompiler.cat.php'              => true,
+                'modifiercompiler.count_characters.php' => true,
+                'modifiercompiler.count_paragraphs.php' => true,
+                'modifiercompiler.count_sentences.php'  => true,
+                'modifiercompiler.count_words.php'      => true,
+                'modifiercompiler.default.php'          => true,
+                'modifiercompiler.escape.php'           => true,
+                'modifiercompiler.from_charset.php'     => true,
+                'modifiercompiler.indent.php'           => true,
+                'modifiercompiler.lower.php'            => true,
+                'modifiercompiler.noprint.php'          => true,
+                'modifiercompiler.string_format.php'    => true,
+                'modifiercompiler.strip.php'            => true,
+                'modifiercompiler.strip_tags.php'       => true,
+                'modifiercompiler.to_charset.php'       => true,
+                'modifiercompiler.unescape.php'         => true,
+                'modifiercompiler.upper.php'            => true,
+                'modifiercompiler.wordwrap.php'         => true,
+                'outputfilter.trimwhitespace.php'       => true,
+                'shared.escape_special_chars.php'       => true,
+                'shared.literal_compiler_param.php'     => true,
+                'shared.make_timestamp.php'             => true,
+                'shared.mb_str_replace.php'             => true,
+                'shared.mb_unicode.php'                 => true,
+                'variablefilter.htmlspecialchars.php'   => true,
+            );
+            $iterator = new DirectoryIterator($source);
+            foreach ($iterator as $file) {
+                if (!$file->isDot()) {
+                    $filename = $file->getFilename();
+                    if (isset($expectedPlugins[ $filename ])) {
+                        unset($expectedPlugins[ $filename ]);
+                    }
+                }
+            }
+            if ($expectedPlugins) {
+                $status = false;
+                $message = "FAILED: files missing from libs/plugins: " . join(', ', array_keys($expectedPlugins));
+                if ($errors === null) {
+                    echo $message . ".\n";
+                } else {
+                    $errors[ 'plugins' ] = $message;
+                }
+            } elseif ($errors === null) {
+                echo "... OK\n";
+            }
+        } else {
+            $status = false;
+            $message = "FAILED: " . SMARTY_PLUGINS_DIR . ' is not a directory';
+            if ($errors === null) {
+                echo $message . ".\n";
+            } else {
+                $errors[ 'plugins_dir_constant' ] = $message;
+            }
+        }
+        if ($errors === null) {
+            echo "Tests complete.\n";
+            echo "</PRE>\n";
+        }
+        return $status;
+    }
+}
diff --git a/sysplugins/smarty_internal_undefined.php b/sysplugins/smarty_internal_undefined.php
new file mode 100644
index 0000000000000000000000000000000000000000..7df0acc2d0948cc7ed3b35a792180d21424832c9
--- /dev/null
+++ b/sysplugins/smarty_internal_undefined.php
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * Smarty Internal Undefined
+ *
+ * Class to handle undefined method calls or calls to obsolete runtime extensions
+ *
+ * @package    Smarty
+ * @subpackage PluginsInternal
+ * @author     Uwe Tews
+ */
+class Smarty_Internal_Undefined
+{
+    /**
+     * Name of undefined extension class
+     *
+     * @var string|null
+     */
+    public $class = null;
+
+    /**
+     * Smarty_Internal_Undefined constructor.
+     *
+     * @param null|string $class name of undefined extension class
+     */
+    public function __construct($class = null)
+    {
+        $this->class = $class;
+    }
+
+    /**
+     * Wrapper for obsolete class Smarty_Internal_Runtime_ValidateCompiled
+     *
+     * @param \Smarty_Internal_Template $tpl
+     * @param array                     $properties special template properties
+     * @param bool                      $cache      flag if called from cache file
+     *
+     * @return bool false
+     */
+    public function decodeProperties(Smarty_Internal_Template $tpl, $properties, $cache = false)
+    {
+        if ($cache) {
+            $tpl->cached->valid = false;
+        } else {
+            $tpl->mustCompile = true;
+        }
+        return false;
+    }
+
+    /**
+     * Call error handler for undefined method
+     *
+     * @param string $name unknown method-name
+     * @param array  $args argument array
+     *
+     * @return mixed
+     * @throws SmartyException
+     */
+    public function __call($name, $args)
+    {
+        if (isset($this->class)) {
+            throw new SmartyException("undefined extension class '{$this->class}'");
+        } else {
+            throw new SmartyException(get_class($args[ 0 ]) . "->{$name}() undefined method");
+        }
+    }
+}
diff --git a/sysplugins/smarty_resource.php b/sysplugins/smarty_resource.php
new file mode 100644
index 0000000000000000000000000000000000000000..aae7e42f708bd6f226eab04dd314ed5afaabe595
--- /dev/null
+++ b/sysplugins/smarty_resource.php
@@ -0,0 +1,262 @@
+<?php
+/**
+ * Smarty Resource Plugin
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ * @author     Rodney Rehm
+ */
+
+/**
+ * Smarty Resource Plugin
+ * Base implementation for resource plugins
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ *
+ * @method renderUncompiled(Smarty_Template_Source $source, Smarty_Internal_Template $_template)
+ * @method populateCompiledFilepath(Smarty_Template_Compiled $compiled, Smarty_Internal_Template $_template)
+ * @method process(Smarty_Internal_Template $_smarty_tpl)
+ */
+abstract class Smarty_Resource
+{
+    /**
+     * resource types provided by the core
+     *
+     * @var array
+     */
+    public static $sysplugins = array(
+        'file'    => 'smarty_internal_resource_file.php',
+        'string'  => 'smarty_internal_resource_string.php',
+        'extends' => 'smarty_internal_resource_extends.php',
+        'stream'  => 'smarty_internal_resource_stream.php',
+        'eval'    => 'smarty_internal_resource_eval.php',
+        'php'     => 'smarty_internal_resource_php.php'
+    );
+
+    /**
+     * Source is bypassing compiler
+     *
+     * @var boolean
+     */
+    public $uncompiled = false;
+
+    /**
+     * Source must be recompiled on every occasion
+     *
+     * @var boolean
+     */
+    public $recompiled = false;
+
+    /**
+     * Flag if resource does implement populateCompiledFilepath() method
+     *
+     * @var bool
+     */
+    public $hasCompiledHandler = false;
+
+    /**
+     * Load Resource Handler
+     *
+     * @param Smarty $smarty smarty object
+     * @param string $type   name of the resource
+     *
+     * @throws SmartyException
+     * @return Smarty_Resource Resource Handler
+     */
+    public static function load(Smarty $smarty, $type)
+    {
+        // try smarty's cache
+        if (isset($smarty->_cache[ 'resource_handlers' ][ $type ])) {
+            return $smarty->_cache[ 'resource_handlers' ][ $type ];
+        }
+        // try registered resource
+        if (isset($smarty->registered_resources[ $type ])) {
+            return $smarty->_cache[ 'resource_handlers' ][ $type ] =
+                $smarty->registered_resources[ $type ] instanceof Smarty_Resource ?
+                    $smarty->registered_resources[ $type ] : new Smarty_Internal_Resource_Registered();
+        }
+        // try sysplugins dir
+        if (isset(self::$sysplugins[ $type ])) {
+            $_resource_class = 'Smarty_Internal_Resource_' . ucfirst($type);
+            return $smarty->_cache[ 'resource_handlers' ][ $type ] = new $_resource_class();
+        }
+        // try plugins dir
+        $_resource_class = 'Smarty_Resource_' . ucfirst($type);
+        if ($smarty->loadPlugin($_resource_class)) {
+            if (class_exists($_resource_class, false)) {
+                return $smarty->_cache[ 'resource_handlers' ][ $type ] = new $_resource_class();
+            } else {
+                $smarty->registerResource(
+                    $type,
+                    array(
+                        "smarty_resource_{$type}_source", "smarty_resource_{$type}_timestamp",
+                        "smarty_resource_{$type}_secure", "smarty_resource_{$type}_trusted"
+                    )
+                );
+                // give it another try, now that the resource is registered properly
+                return self::load($smarty, $type);
+            }
+        }
+        // try streams
+        $_known_stream = stream_get_wrappers();
+        if (in_array($type, $_known_stream)) {
+            // is known stream
+            if (is_object($smarty->security_policy)) {
+                $smarty->security_policy->isTrustedStream($type);
+            }
+            return $smarty->_cache[ 'resource_handlers' ][ $type ] = new Smarty_Internal_Resource_Stream();
+        }
+        // TODO: try default_(template|config)_handler
+        // give up
+        throw new SmartyException("Unknown resource type '{$type}'");
+    }
+
+    /**
+     * extract resource_type and resource_name from template_resource and config_resource
+     *
+     * @note "C:/foo.tpl" was forced to file resource up till Smarty 3.1.3 (including).
+     *
+     * @param string $resource_name    template_resource or config_resource to parse
+     * @param string $default_resource the default resource_type defined in $smarty
+     *
+     * @return array with parsed resource name and type
+     */
+    public static function parseResourceName($resource_name, $default_resource)
+    {
+        if (preg_match('/^([A-Za-z0-9_\-]{2,})[:]/', $resource_name, $match)) {
+            $type = $match[ 1 ];
+            $name = substr($resource_name, strlen($match[ 0 ]));
+        } else {
+            // no resource given, use default
+            // or single character before the colon is not a resource type, but part of the filepath
+            $type = $default_resource;
+            $name = $resource_name;
+        }
+        return array($name, $type);
+    }
+
+    /**
+     * modify template_resource according to resource handlers specifications
+     *
+     * @param \Smarty_Internal_Template|\Smarty $obj               Smarty instance
+     * @param string                            $template_resource template_resource to extract resource handler and
+     *                                                             name of
+     *
+     * @return string unique resource name
+     * @throws \SmartyException
+     */
+    public static function getUniqueTemplateName($obj, $template_resource)
+    {
+        $smarty = $obj->_getSmartyObj();
+        list($name, $type) = self::parseResourceName($template_resource, $smarty->default_resource_type);
+        // TODO: optimize for Smarty's internal resource types
+        $resource = Smarty_Resource::load($smarty, $type);
+        // go relative to a given template?
+        $_file_is_dotted = $name[ 0 ] === '.' && ($name[ 1 ] === '.' || $name[ 1 ] === '/');
+        if ($obj->_isTplObj() && $_file_is_dotted
+            && ($obj->source->type === 'file' || $obj->parent->source->type === 'extends')
+        ) {
+            $name = $smarty->_realpath(dirname($obj->parent->source->filepath) . DIRECTORY_SEPARATOR . $name);
+        }
+        return $resource->buildUniqueResourceName($smarty, $name);
+    }
+
+    /**
+     * initialize Source Object for given resource
+     * wrapper for backward compatibility to versions < 3.1.22
+     * Either [$_template] or [$smarty, $template_resource] must be specified
+     *
+     * @param Smarty_Internal_Template $_template         template object
+     * @param Smarty                   $smarty            smarty object
+     * @param string                   $template_resource resource identifier
+     *
+     * @return \Smarty_Template_Source Source Object
+     * @throws \SmartyException
+     */
+    public static function source(
+        Smarty_Internal_Template $_template = null,
+        Smarty $smarty = null,
+        $template_resource = null
+    ) {
+        return Smarty_Template_Source::load($_template, $smarty, $template_resource);
+    }
+
+    /**
+     * Load template's source into current template object
+     *
+     * @param Smarty_Template_Source $source source object
+     *
+     * @return string                 template source
+     * @throws SmartyException        if source cannot be loaded
+     */
+    abstract public function getContent(Smarty_Template_Source $source);
+
+    /**
+     * populate Source Object with meta data from Resource
+     *
+     * @param Smarty_Template_Source   $source    source object
+     * @param Smarty_Internal_Template $_template template object
+     */
+    abstract public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null);
+
+    /**
+     * populate Source Object with timestamp and exists from Resource
+     *
+     * @param Smarty_Template_Source $source source object
+     */
+    public function populateTimestamp(Smarty_Template_Source $source)
+    {
+        // intentionally left blank
+    }
+
+    /**
+     * modify resource_name according to resource handlers specifications
+     *
+     * @param Smarty  $smarty        Smarty instance
+     * @param string  $resource_name resource_name to make unique
+     * @param boolean $isConfig      flag for config resource
+     *
+     * @return string unique resource name
+     */
+    public function buildUniqueResourceName(Smarty $smarty, $resource_name, $isConfig = false)
+    {
+        if ($isConfig) {
+            if (!isset($smarty->_joined_config_dir)) {
+                $smarty->getTemplateDir(null, true);
+            }
+            return get_class($this) . '#' . $smarty->_joined_config_dir . '#' . $resource_name;
+        } else {
+            if (!isset($smarty->_joined_template_dir)) {
+                $smarty->getTemplateDir();
+            }
+            return get_class($this) . '#' . $smarty->_joined_template_dir . '#' . $resource_name;
+        }
+    }
+
+    /*
+     * Check if resource must check time stamps when when loading complied or cached templates.
+     * Resources like 'extends' which use source components my disable timestamp checks on own resource.
+     *
+     * @return bool
+     */
+    /**
+     * Determine basename for compiled filename
+     *
+     * @param Smarty_Template_Source $source source object
+     *
+     * @return string                 resource's basename
+     */
+    public function getBasename(Smarty_Template_Source $source)
+    {
+        return basename(preg_replace('![^\w]+!', '_', $source->name));
+    }
+
+    /**
+     * @return bool
+     */
+    public function checkTimestamps()
+    {
+        return true;
+    }
+}
diff --git a/sysplugins/smarty_resource_custom.php b/sysplugins/smarty_resource_custom.php
new file mode 100644
index 0000000000000000000000000000000000000000..8d66be3ae18abeb543c4dfb72926ce939bbd6041
--- /dev/null
+++ b/sysplugins/smarty_resource_custom.php
@@ -0,0 +1,93 @@
+<?php
+/**
+ * Smarty Resource Plugin
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ * @author     Rodney Rehm
+ */
+
+/**
+ * Smarty Resource Plugin
+ * Wrapper Implementation for custom resource plugins
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ */
+abstract class Smarty_Resource_Custom extends Smarty_Resource
+{
+    /**
+     * fetch template and its modification time from data source
+     *
+     * @param string  $name    template name
+     * @param string  &$source template source
+     * @param integer &$mtime  template modification timestamp (epoch)
+     */
+    abstract protected function fetch($name, &$source, &$mtime);
+
+    /**
+     * Fetch template's modification timestamp from data source
+     * {@internal implementing this method is optional.
+     *  Only implement it if modification times can be accessed faster than loading the complete template source.}}
+     *
+     * @param string $name template name
+     *
+     * @return integer|boolean timestamp (epoch) the template was modified, or false if not found
+     */
+    protected function fetchTimestamp($name)
+    {
+        return null;
+    }
+
+    /**
+     * populate Source Object with meta data from Resource
+     *
+     * @param Smarty_Template_Source   $source    source object
+     * @param Smarty_Internal_Template $_template template object
+     */
+    public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template = null)
+    {
+        $source->filepath = $source->type . ':' . substr(preg_replace('/[^A-Za-z0-9.]/', '', $source->name), 0, 25);
+        $source->uid = sha1($source->type . ':' . $source->name);
+        $mtime = $this->fetchTimestamp($source->name);
+        if ($mtime !== null) {
+            $source->timestamp = $mtime;
+        } else {
+            $this->fetch($source->name, $content, $timestamp);
+            $source->timestamp = isset($timestamp) ? $timestamp : false;
+            if (isset($content)) {
+                $source->content = $content;
+            }
+        }
+        $source->exists = !!$source->timestamp;
+    }
+
+    /**
+     * Load template's source into current template object
+     *
+     * @param Smarty_Template_Source $source source object
+     *
+     * @return string                 template source
+     * @throws SmartyException        if source cannot be loaded
+     */
+    public function getContent(Smarty_Template_Source $source)
+    {
+        $this->fetch($source->name, $content, $timestamp);
+        if (isset($content)) {
+            return $content;
+        }
+        throw new SmartyException("Unable to read template {$source->type} '{$source->name}'");
+    }
+
+    /**
+     * Determine basename for compiled filename
+     *
+     * @param Smarty_Template_Source $source source object
+     *
+     * @return string                 resource's basename
+     */
+    public function getBasename(Smarty_Template_Source $source)
+    {
+        return basename(substr(preg_replace('/[^A-Za-z0-9.]/', '', $source->name), 0, 25));
+    }
+}
diff --git a/sysplugins/smarty_resource_recompiled.php b/sysplugins/smarty_resource_recompiled.php
new file mode 100644
index 0000000000000000000000000000000000000000..760c4dd338ed45f80f14385b6a96b3503de882a3
--- /dev/null
+++ b/sysplugins/smarty_resource_recompiled.php
@@ -0,0 +1,94 @@
+<?php
+/**
+ * Smarty Resource Plugin
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ * @author     Rodney Rehm
+ */
+
+/**
+ * Smarty Resource Plugin
+ * Base implementation for resource plugins that don't compile cache
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ */
+abstract class Smarty_Resource_Recompiled extends Smarty_Resource
+{
+    /**
+     * Flag that it's an recompiled resource
+     *
+     * @var bool
+     */
+    public $recompiled = true;
+
+    /**
+     * Resource does implement populateCompiledFilepath() method
+     *
+     * @var bool
+     */
+    public $hasCompiledHandler = true;
+
+    /**
+     * compile template from source
+     *
+     * @param Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template
+     *
+     * @throws Exception
+     */
+    public function process(Smarty_Internal_Template $_smarty_tpl)
+    {
+        $compiled = &$_smarty_tpl->compiled;
+        $compiled->file_dependency = array();
+        $compiled->includes = array();
+        $compiled->nocache_hash = null;
+        $compiled->unifunc = null;
+        $level = ob_get_level();
+        ob_start();
+        $_smarty_tpl->loadCompiler();
+        // call compiler
+        try {
+            eval('?>' . $_smarty_tpl->compiler->compileTemplate($_smarty_tpl));
+        } catch (Exception $e) {
+            unset($_smarty_tpl->compiler);
+            while (ob_get_level() > $level) {
+                ob_end_clean();
+            }
+            throw $e;
+        }
+        // release compiler object to free memory
+        unset($_smarty_tpl->compiler);
+        ob_get_clean();
+        $compiled->timestamp = time();
+        $compiled->exists = true;
+    }
+
+    /**
+     * populate Compiled Object with compiled filepath
+     *
+     * @param Smarty_Template_Compiled $compiled  compiled object
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @return void
+     */
+    public function populateCompiledFilepath(Smarty_Template_Compiled $compiled, Smarty_Internal_Template $_template)
+    {
+        $compiled->filepath = false;
+        $compiled->timestamp = false;
+        $compiled->exists = false;
+    }
+
+    /*
+       * Disable timestamp checks for recompiled resource.
+       *
+       * @return bool
+       */
+    /**
+     * @return bool
+     */
+    public function checkTimestamps()
+    {
+        return false;
+    }
+}
diff --git a/sysplugins/smarty_resource_uncompiled.php b/sysplugins/smarty_resource_uncompiled.php
new file mode 100644
index 0000000000000000000000000000000000000000..a11e2c14c7c2e60d03bef659557376f40b2b4579
--- /dev/null
+++ b/sysplugins/smarty_resource_uncompiled.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Smarty Resource Plugin
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ * @author     Rodney Rehm
+ */
+
+/**
+ * Smarty Resource Plugin
+ * Base implementation for resource plugins that don't use the compiler
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ */
+abstract class Smarty_Resource_Uncompiled extends Smarty_Resource
+{
+    /**
+     * Flag that it's an uncompiled resource
+     *
+     * @var bool
+     */
+    public $uncompiled = true;
+
+    /**
+     * Resource does implement populateCompiledFilepath() method
+     *
+     * @var bool
+     */
+    public $hasCompiledHandler = true;
+
+    /**
+     * populate compiled object with compiled filepath
+     *
+     * @param Smarty_Template_Compiled $compiled  compiled object
+     * @param Smarty_Internal_Template $_template template object
+     */
+    public function populateCompiledFilepath(Smarty_Template_Compiled $compiled, Smarty_Internal_Template $_template)
+    {
+        $compiled->filepath = $_template->source->filepath;
+        $compiled->timestamp = $_template->source->timestamp;
+        $compiled->exists = $_template->source->exists;
+        if ($_template->smarty->merge_compiled_includes || $_template->source->handler->checkTimestamps()) {
+            $compiled->file_dependency[ $_template->source->uid ] =
+                array($compiled->filepath, $compiled->timestamp, $_template->source->type,);
+        }
+    }
+}
diff --git a/sysplugins/smarty_security.php b/sysplugins/smarty_security.php
new file mode 100644
index 0000000000000000000000000000000000000000..441a7e28409ff959ed543acbf609a828d3b31fcb
--- /dev/null
+++ b/sysplugins/smarty_security.php
@@ -0,0 +1,721 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package    Smarty
+ * @subpackage Security
+ * @author     Uwe Tews
+ */
+/**
+ * FIXME: Smarty_Security API
+ *      - getter and setter instead of public properties would allow cultivating an internal cache properly
+ *      - current implementation of isTrustedResourceDir() assumes that Smarty::$template_dir and Smarty::$config_dir
+ *      are immutable the cache is killed every time either of the variables change. That means that two distinct
+ *      Smarty objects with differing
+ *        $template_dir or $config_dir should NOT share the same Smarty_Security instance,
+ *        as this would lead to (severe) performance penalty! how should this be handled?
+ */
+
+/**
+ * This class does contain the security settings
+ */
+class Smarty_Security
+{
+    /**
+     * This determines how Smarty handles "<?php ... ?>" tags in templates.
+     * possible values:
+     * <ul>
+     *   <li>Smarty::PHP_PASSTHRU -> echo PHP tags as they are</li>
+     *   <li>Smarty::PHP_QUOTE    -> escape tags as entities</li>
+     *   <li>Smarty::PHP_REMOVE   -> remove php tags</li>
+     *   <li>Smarty::PHP_ALLOW    -> execute php tags</li>
+     * </ul>
+     *
+     * @var integer
+     */
+    public $php_handling = Smarty::PHP_PASSTHRU;
+
+    /**
+     * This is the list of template directories that are considered secure.
+     * $template_dir is in this list implicitly.
+     *
+     * @var array
+     */
+    public $secure_dir = array();
+
+    /**
+     * This is an array of directories where trusted php scripts reside.
+     * {@link $security} is disabled during their inclusion/execution.
+     *
+     * @var array
+     */
+    public $trusted_dir = array();
+
+    /**
+     * List of regular expressions (PCRE) that include trusted URIs
+     *
+     * @var array
+     */
+    public $trusted_uri = array();
+
+    /**
+     * List of trusted constants names
+     *
+     * @var array
+     */
+    public $trusted_constants = array();
+
+    /**
+     * This is an array of trusted static classes.
+     * If empty access to all static classes is allowed.
+     * If set to 'none' none is allowed.
+     *
+     * @var array
+     */
+    public $static_classes = array();
+
+    /**
+     * This is an nested array of trusted classes and static methods.
+     * If empty access to all static classes and methods is allowed.
+     * Format:
+     * array (
+     *         'class_1' => array('method_1', 'method_2'), // allowed methods listed
+     *         'class_2' => array(),                       // all methods of class allowed
+     *       )
+     * If set to null none is allowed.
+     *
+     * @var array
+     */
+    public $trusted_static_methods = array();
+
+    /**
+     * This is an array of trusted static properties.
+     * If empty access to all static classes and properties is allowed.
+     * Format:
+     * array (
+     *         'class_1' => array('prop_1', 'prop_2'), // allowed properties listed
+     *         'class_2' => array(),                   // all properties of class allowed
+     *       )
+     * If set to null none is allowed.
+     *
+     * @var array
+     */
+    public $trusted_static_properties = array();
+
+    /**
+     * This is an array of trusted PHP functions.
+     * If empty all functions are allowed.
+     * To disable all PHP functions set $php_functions = null.
+     *
+     * @var array
+     */
+    public $php_functions = array('isset', 'empty', 'count', 'sizeof', 'in_array', 'is_array', 'time',);
+
+    /**
+     * This is an array of trusted PHP modifiers.
+     * If empty all modifiers are allowed.
+     * To disable all modifier set $php_modifiers = null.
+     *
+     * @var array
+     */
+    public $php_modifiers = array('escape', 'count', 'nl2br',);
+
+    /**
+     * This is an array of allowed tags.
+     * If empty no restriction by allowed_tags.
+     *
+     * @var array
+     */
+    public $allowed_tags = array();
+
+    /**
+     * This is an array of disabled tags.
+     * If empty no restriction by disabled_tags.
+     *
+     * @var array
+     */
+    public $disabled_tags = array();
+
+    /**
+     * This is an array of allowed modifier plugins.
+     * If empty no restriction by allowed_modifiers.
+     *
+     * @var array
+     */
+    public $allowed_modifiers = array();
+
+    /**
+     * This is an array of disabled modifier plugins.
+     * If empty no restriction by disabled_modifiers.
+     *
+     * @var array
+     */
+    public $disabled_modifiers = array();
+
+    /**
+     * This is an array of disabled special $smarty variables.
+     *
+     * @var array
+     */
+    public $disabled_special_smarty_vars = array();
+
+    /**
+     * This is an array of trusted streams.
+     * If empty all streams are allowed.
+     * To disable all streams set $streams = null.
+     *
+     * @var array
+     */
+    public $streams = array('file');
+
+    /**
+     * + flag if constants can be accessed from template
+     *
+     * @var boolean
+     */
+    public $allow_constants = true;
+
+    /**
+     * + flag if super globals can be accessed from template
+     *
+     * @var boolean
+     */
+    public $allow_super_globals = true;
+
+    /**
+     * max template nesting level
+     *
+     * @var int
+     */
+    public $max_template_nesting = 0;
+
+    /**
+     * current template nesting level
+     *
+     * @var int
+     */
+    private $_current_template_nesting = 0;
+
+    /**
+     * Cache for $resource_dir lookup
+     *
+     * @var array
+     */
+    protected $_resource_dir = array();
+
+    /**
+     * Cache for $template_dir lookup
+     *
+     * @var array
+     */
+    protected $_template_dir = array();
+
+    /**
+     * Cache for $config_dir lookup
+     *
+     * @var array
+     */
+    protected $_config_dir = array();
+
+    /**
+     * Cache for $secure_dir lookup
+     *
+     * @var array
+     */
+    protected $_secure_dir = array();
+
+    /**
+     * Cache for $php_resource_dir lookup
+     *
+     * @var array
+     */
+    protected $_php_resource_dir = null;
+
+    /**
+     * Cache for $trusted_dir lookup
+     *
+     * @var array
+     */
+    protected $_trusted_dir = null;
+
+    /**
+     * Cache for include path status
+     *
+     * @var bool
+     */
+    protected $_include_path_status = false;
+
+    /**
+     * Cache for $_include_array lookup
+     *
+     * @var array
+     */
+    protected $_include_dir = array();
+
+    /**
+     * @param Smarty $smarty
+     */
+    public function __construct($smarty)
+    {
+        $this->smarty = $smarty;
+    }
+
+    /**
+     * Check if PHP function is trusted.
+     *
+     * @param string $function_name
+     * @param object $compiler compiler object
+     *
+     * @return boolean                 true if function is trusted
+     */
+    public function isTrustedPhpFunction($function_name, $compiler)
+    {
+        if (isset($this->php_functions)
+            && (empty($this->php_functions) || in_array($function_name, $this->php_functions))
+        ) {
+            return true;
+        }
+        $compiler->trigger_template_error("PHP function '{$function_name}' not allowed by security setting");
+        return false; // should not, but who knows what happens to the compiler in the future?
+    }
+
+    /**
+     * Check if static class is trusted.
+     *
+     * @param string $class_name
+     * @param object $compiler compiler object
+     *
+     * @return boolean                 true if class is trusted
+     */
+    public function isTrustedStaticClass($class_name, $compiler)
+    {
+        if (isset($this->static_classes)
+            && (empty($this->static_classes) || in_array($class_name, $this->static_classes))
+        ) {
+            return true;
+        }
+        $compiler->trigger_template_error("access to static class '{$class_name}' not allowed by security setting");
+        return false; // should not, but who knows what happens to the compiler in the future?
+    }
+
+    /**
+     * Check if static class method/property is trusted.
+     *
+     * @param string $class_name
+     * @param string $params
+     * @param object $compiler compiler object
+     *
+     * @return boolean                 true if class method is trusted
+     */
+    public function isTrustedStaticClassAccess($class_name, $params, $compiler)
+    {
+        if (!isset($params[ 2 ])) {
+            // fall back
+            return $this->isTrustedStaticClass($class_name, $compiler);
+        }
+        if ($params[ 2 ] === 'method') {
+            $allowed = $this->trusted_static_methods;
+            $name = substr($params[ 0 ], 0, strpos($params[ 0 ], '('));
+        } else {
+            $allowed = $this->trusted_static_properties;
+            // strip '$'
+            $name = substr($params[ 0 ], 1);
+        }
+        if (isset($allowed)) {
+            if (empty($allowed)) {
+                // fall back
+                return $this->isTrustedStaticClass($class_name, $compiler);
+            }
+            if (isset($allowed[ $class_name ])
+                && (empty($allowed[ $class_name ]) || in_array($name, $allowed[ $class_name ]))
+            ) {
+                return true;
+            }
+        }
+        $compiler->trigger_template_error("access to static class '{$class_name}' {$params[2]} '{$name}' not allowed by security setting");
+        return false; // should not, but who knows what happens to the compiler in the future?
+    }
+
+    /**
+     * Check if PHP modifier is trusted.
+     *
+     * @param string $modifier_name
+     * @param object $compiler compiler object
+     *
+     * @return boolean                 true if modifier is trusted
+     */
+    public function isTrustedPhpModifier($modifier_name, $compiler)
+    {
+        if (isset($this->php_modifiers)
+            && (empty($this->php_modifiers) || in_array($modifier_name, $this->php_modifiers))
+        ) {
+            return true;
+        }
+        $compiler->trigger_template_error("modifier '{$modifier_name}' not allowed by security setting");
+        return false; // should not, but who knows what happens to the compiler in the future?
+    }
+
+    /**
+     * Check if tag is trusted.
+     *
+     * @param string $tag_name
+     * @param object $compiler compiler object
+     *
+     * @return boolean                 true if tag is trusted
+     */
+    public function isTrustedTag($tag_name, $compiler)
+    {
+        // check for internal always required tags
+        if (in_array(
+            $tag_name,
+            array(
+                'assign', 'call', 'private_filter', 'private_block_plugin', 'private_function_plugin',
+                'private_object_block_function', 'private_object_function', 'private_registered_function',
+                'private_registered_block', 'private_special_variable', 'private_print_expression',
+                'private_modifier'
+            )
+        )
+        ) {
+            return true;
+        }
+        // check security settings
+        if (empty($this->allowed_tags)) {
+            if (empty($this->disabled_tags) || !in_array($tag_name, $this->disabled_tags)) {
+                return true;
+            } else {
+                $compiler->trigger_template_error("tag '{$tag_name}' disabled by security setting", null, true);
+            }
+        } elseif (in_array($tag_name, $this->allowed_tags) && !in_array($tag_name, $this->disabled_tags)) {
+            return true;
+        } else {
+            $compiler->trigger_template_error("tag '{$tag_name}' not allowed by security setting", null, true);
+        }
+        return false; // should not, but who knows what happens to the compiler in the future?
+    }
+
+    /**
+     * Check if special $smarty variable is trusted.
+     *
+     * @param string $var_name
+     * @param object $compiler compiler object
+     *
+     * @return boolean                 true if tag is trusted
+     */
+    public function isTrustedSpecialSmartyVar($var_name, $compiler)
+    {
+        if (!in_array($var_name, $this->disabled_special_smarty_vars)) {
+            return true;
+        } else {
+            $compiler->trigger_template_error(
+                "special variable '\$smarty.{$var_name}' not allowed by security setting",
+                null,
+                true
+            );
+        }
+        return false; // should not, but who knows what happens to the compiler in the future?
+    }
+
+    /**
+     * Check if modifier plugin is trusted.
+     *
+     * @param string $modifier_name
+     * @param object $compiler compiler object
+     *
+     * @return boolean                 true if tag is trusted
+     */
+    public function isTrustedModifier($modifier_name, $compiler)
+    {
+        // check for internal always allowed modifier
+        if (in_array($modifier_name, array('default'))) {
+            return true;
+        }
+        // check security settings
+        if (empty($this->allowed_modifiers)) {
+            if (empty($this->disabled_modifiers) || !in_array($modifier_name, $this->disabled_modifiers)) {
+                return true;
+            } else {
+                $compiler->trigger_template_error(
+                    "modifier '{$modifier_name}' disabled by security setting",
+                    null,
+                    true
+                );
+            }
+        } elseif (in_array($modifier_name, $this->allowed_modifiers)
+                  && !in_array($modifier_name, $this->disabled_modifiers)
+        ) {
+            return true;
+        } else {
+            $compiler->trigger_template_error(
+                "modifier '{$modifier_name}' not allowed by security setting",
+                null,
+                true
+            );
+        }
+        return false; // should not, but who knows what happens to the compiler in the future?
+    }
+
+    /**
+     * Check if constants are enabled or trusted
+     *
+     * @param string $const    constant name
+     * @param object $compiler compiler object
+     *
+     * @return bool
+     */
+    public function isTrustedConstant($const, $compiler)
+    {
+        if (in_array($const, array('true', 'false', 'null'))) {
+            return true;
+        }
+        if (!empty($this->trusted_constants)) {
+            if (!in_array(strtolower($const), $this->trusted_constants)) {
+                $compiler->trigger_template_error("Security: access to constant '{$const}' not permitted");
+                return false;
+            }
+            return true;
+        }
+        if ($this->allow_constants) {
+            return true;
+        }
+        $compiler->trigger_template_error("Security: access to constants not permitted");
+        return false;
+    }
+
+    /**
+     * Check if stream is trusted.
+     *
+     * @param string $stream_name
+     *
+     * @return boolean         true if stream is trusted
+     * @throws SmartyException if stream is not trusted
+     */
+    public function isTrustedStream($stream_name)
+    {
+        if (isset($this->streams) && (empty($this->streams) || in_array($stream_name, $this->streams))) {
+            return true;
+        }
+        throw new SmartyException("stream '{$stream_name}' not allowed by security setting");
+    }
+
+    /**
+     * Check if directory of file resource is trusted.
+     *
+     * @param string    $filepath
+     * @param null|bool $isConfig
+     *
+     * @return bool true if directory is trusted
+     * @throws \SmartyException if directory is not trusted
+     */
+    public function isTrustedResourceDir($filepath, $isConfig = null)
+    {
+        if ($this->_include_path_status !== $this->smarty->use_include_path) {
+            $_dir =
+                $this->smarty->use_include_path ? $this->smarty->ext->_getIncludePath->getIncludePathDirs($this->smarty) : array();
+            if ($this->_include_dir !== $_dir) {
+                $this->_updateResourceDir($this->_include_dir, $_dir);
+                $this->_include_dir = $_dir;
+            }
+            $this->_include_path_status = $this->smarty->use_include_path;
+        }
+        $_dir = $this->smarty->getTemplateDir();
+        if ($this->_template_dir !== $_dir) {
+            $this->_updateResourceDir($this->_template_dir, $_dir);
+            $this->_template_dir = $_dir;
+        }
+        $_dir = $this->smarty->getConfigDir();
+        if ($this->_config_dir !== $_dir) {
+            $this->_updateResourceDir($this->_config_dir, $_dir);
+            $this->_config_dir = $_dir;
+        }
+        if ($this->_secure_dir !== $this->secure_dir) {
+            $this->secure_dir = (array)$this->secure_dir;
+            foreach ($this->secure_dir as $k => $d) {
+                $this->secure_dir[ $k ] = $this->smarty->_realpath($d . DIRECTORY_SEPARATOR, true);
+            }
+            $this->_updateResourceDir($this->_secure_dir, $this->secure_dir);
+            $this->_secure_dir = $this->secure_dir;
+        }
+        $addPath = $this->_checkDir($filepath, $this->_resource_dir);
+        if ($addPath !== false) {
+            $this->_resource_dir = array_merge($this->_resource_dir, $addPath);
+        }
+        return true;
+    }
+
+    /**
+     * Check if URI (e.g. {fetch} or {html_image}) is trusted
+     * To simplify things, isTrustedUri() resolves all input to "{$PROTOCOL}://{$HOSTNAME}".
+     * So "http://username:password@hello.world.example.org:8080/some-path?some=query-string"
+     * is reduced to "http://hello.world.example.org" prior to applying the patters from {@link $trusted_uri}.
+     *
+     * @param string $uri
+     *
+     * @return boolean         true if URI is trusted
+     * @throws SmartyException if URI is not trusted
+     * @uses   $trusted_uri for list of patterns to match against $uri
+     */
+    public function isTrustedUri($uri)
+    {
+        $_uri = parse_url($uri);
+        if (!empty($_uri[ 'scheme' ]) && !empty($_uri[ 'host' ])) {
+            $_uri = $_uri[ 'scheme' ] . '://' . $_uri[ 'host' ];
+            foreach ($this->trusted_uri as $pattern) {
+                if (preg_match($pattern, $_uri)) {
+                    return true;
+                }
+            }
+        }
+        throw new SmartyException("URI '{$uri}' not allowed by security setting");
+    }
+
+    /**
+     * Check if directory of file resource is trusted.
+     *
+     * @param string $filepath
+     *
+     * @return boolean         true if directory is trusted
+     * @throws SmartyException if PHP directory is not trusted
+     */
+    public function isTrustedPHPDir($filepath)
+    {
+        if (empty($this->trusted_dir)) {
+            throw new SmartyException("directory '{$filepath}' not allowed by security setting (no trusted_dir specified)");
+        }
+        // check if index is outdated
+        if (!$this->_trusted_dir || $this->_trusted_dir !== $this->trusted_dir) {
+            $this->_php_resource_dir = array();
+            $this->_trusted_dir = $this->trusted_dir;
+            foreach ((array)$this->trusted_dir as $directory) {
+                $directory = $this->smarty->_realpath($directory . '/', true);
+                $this->_php_resource_dir[ $directory ] = true;
+            }
+        }
+        $addPath = $this->_checkDir($filepath, $this->_php_resource_dir);
+        if ($addPath !== false) {
+            $this->_php_resource_dir = array_merge($this->_php_resource_dir, $addPath);
+        }
+        return true;
+    }
+
+    /**
+     * Remove old directories and its sub folders, add new directories
+     *
+     * @param array $oldDir
+     * @param array $newDir
+     */
+    private function _updateResourceDir($oldDir, $newDir)
+    {
+        foreach ($oldDir as $directory) {
+            //           $directory = $this->smarty->_realpath($directory, true);
+            $length = strlen($directory);
+            foreach ($this->_resource_dir as $dir) {
+                if (substr($dir, 0, $length) === $directory) {
+                    unset($this->_resource_dir[ $dir ]);
+                }
+            }
+        }
+        foreach ($newDir as $directory) {
+            //           $directory = $this->smarty->_realpath($directory, true);
+            $this->_resource_dir[ $directory ] = true;
+        }
+    }
+
+    /**
+     * Check if file is inside a valid directory
+     *
+     * @param string $filepath
+     * @param array  $dirs valid directories
+     *
+     * @return array|bool
+     * @throws \SmartyException
+     */
+    private function _checkDir($filepath, $dirs)
+    {
+        $directory = dirname($this->smarty->_realpath($filepath, true)) . DIRECTORY_SEPARATOR;
+        $_directory = array();
+        if (!preg_match('#[\\\\/][.][.][\\\\/]#', $directory)) {
+            while (true) {
+                // test if the directory is trusted
+                if (isset($dirs[ $directory ])) {
+                    return $_directory;
+                }
+                // abort if we've reached root
+                if (!preg_match('#[\\\\/][^\\\\/]+[\\\\/]$#', $directory)) {
+                    // give up
+                    break;
+                }
+                // remember the directory to add it to _resource_dir in case we're successful
+                $_directory[ $directory ] = true;
+                // bubble up one level
+                $directory = preg_replace('#[\\\\/][^\\\\/]+[\\\\/]$#', DIRECTORY_SEPARATOR, $directory);
+            }
+        }
+        // give up
+        throw new SmartyException(sprintf('Smarty Security: not trusted file path \'%s\' ', $filepath));
+    }
+
+    /**
+     * Loads security class and enables security
+     *
+     * @param \Smarty                $smarty
+     * @param string|Smarty_Security $security_class if a string is used, it must be class-name
+     *
+     * @return \Smarty current Smarty instance for chaining
+     * @throws \SmartyException when an invalid class name is provided
+     */
+    public static function enableSecurity(Smarty $smarty, $security_class)
+    {
+        if ($security_class instanceof Smarty_Security) {
+            $smarty->security_policy = $security_class;
+            return $smarty;
+        } elseif (is_object($security_class)) {
+            throw new SmartyException("Class '" . get_class($security_class) . "' must extend Smarty_Security.");
+        }
+        if ($security_class === null) {
+            $security_class = $smarty->security_class;
+        }
+        if (!class_exists($security_class)) {
+            throw new SmartyException("Security class '$security_class' is not defined");
+        } elseif ($security_class !== 'Smarty_Security' && !is_subclass_of($security_class, 'Smarty_Security')) {
+            throw new SmartyException("Class '$security_class' must extend Smarty_Security.");
+        } else {
+            $smarty->security_policy = new $security_class($smarty);
+        }
+        return $smarty;
+    }
+
+    /**
+     * Start template processing
+     *
+     * @param $template
+     *
+     * @throws SmartyException
+     */
+    public function startTemplate($template)
+    {
+        if ($this->max_template_nesting > 0 && $this->_current_template_nesting++ >= $this->max_template_nesting) {
+            throw new SmartyException("maximum template nesting level of '{$this->max_template_nesting}' exceeded when calling '{$template->template_resource}'");
+        }
+    }
+
+    /**
+     * Exit template processing
+     */
+    public function endTemplate()
+    {
+        if ($this->max_template_nesting > 0) {
+            $this->_current_template_nesting--;
+        }
+    }
+
+    /**
+     * Register callback functions call at start/end of template rendering
+     *
+     * @param \Smarty_Internal_Template $template
+     */
+    public function registerCallBacks(Smarty_Internal_Template $template)
+    {
+        $template->startRenderCallbacks[] = array($this, 'startTemplate');
+        $template->endRenderCallbacks[] = array($this, 'endTemplate');
+    }
+}
diff --git a/sysplugins/smarty_template_cached.php b/sysplugins/smarty_template_cached.php
new file mode 100644
index 0000000000000000000000000000000000000000..508d27f3669d39b5372d7c5c5782cecb6814b554
--- /dev/null
+++ b/sysplugins/smarty_template_cached.php
@@ -0,0 +1,257 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Uwe Tews
+ * Date: 04.12.2014
+ * Time: 06:08
+ */
+
+/**
+ * Smarty Resource Data Object
+ * Cache Data Container for Template Files
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ * @author     Rodney Rehm
+ */
+class Smarty_Template_Cached extends Smarty_Template_Resource_Base
+{
+    /**
+     * Cache Is Valid
+     *
+     * @var boolean
+     */
+    public $valid = null;
+
+    /**
+     * CacheResource Handler
+     *
+     * @var Smarty_CacheResource
+     */
+    public $handler = null;
+
+    /**
+     * Template Cache Id (Smarty_Internal_Template::$cache_id)
+     *
+     * @var string
+     */
+    public $cache_id = null;
+
+    /**
+     * saved cache lifetime in seconds
+     *
+     * @var integer
+     */
+    public $cache_lifetime = 0;
+
+    /**
+     * Id for cache locking
+     *
+     * @var string
+     */
+    public $lock_id = null;
+
+    /**
+     * flag that cache is locked by this instance
+     *
+     * @var bool
+     */
+    public $is_locked = false;
+
+    /**
+     * Source Object
+     *
+     * @var Smarty_Template_Source
+     */
+    public $source = null;
+
+    /**
+     * Nocache hash codes of processed compiled templates
+     *
+     * @var array
+     */
+    public $hashes = array();
+
+    /**
+     * Flag if this is a cache resource
+     *
+     * @var bool
+     */
+    public $isCache = true;
+
+    /**
+     * create Cached Object container
+     *
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @throws \SmartyException
+     */
+    public function __construct(Smarty_Internal_Template $_template)
+    {
+        $this->compile_id = $_template->compile_id;
+        $this->cache_id = $_template->cache_id;
+        $this->source = $_template->source;
+        if (!class_exists('Smarty_CacheResource', false)) {
+            include SMARTY_SYSPLUGINS_DIR . 'smarty_cacheresource.php';
+        }
+        $this->handler = Smarty_CacheResource::load($_template->smarty);
+    }
+
+    /**
+     * @param Smarty_Internal_Template $_template
+     *
+     * @return Smarty_Template_Cached
+     */
+    public static function load(Smarty_Internal_Template $_template)
+    {
+        $_template->cached = new Smarty_Template_Cached($_template);
+        $_template->cached->handler->populate($_template->cached, $_template);
+        // caching enabled ?
+        if (!$_template->caching || $_template->source->handler->recompiled
+        ) {
+            $_template->cached->valid = false;
+        }
+        return $_template->cached;
+    }
+
+    /**
+     * Render cache template
+     *
+     * @param \Smarty_Internal_Template $_template
+     * @param bool                      $no_output_filter
+     *
+     * @throws \Exception
+     */
+    public function render(Smarty_Internal_Template $_template, $no_output_filter = true)
+    {
+        if ($this->isCached($_template)) {
+            if ($_template->smarty->debugging) {
+                if (!isset($_template->smarty->_debug)) {
+                    $_template->smarty->_debug = new Smarty_Internal_Debug();
+                }
+                $_template->smarty->_debug->start_cache($_template);
+            }
+            if (!$this->processed) {
+                $this->process($_template);
+            }
+            $this->getRenderedTemplateCode($_template);
+            if ($_template->smarty->debugging) {
+                $_template->smarty->_debug->end_cache($_template);
+            }
+            return;
+        } else {
+            $_template->smarty->ext->_updateCache->updateCache($this, $_template, $no_output_filter);
+        }
+    }
+
+    /**
+     * Check if cache is valid, lock cache if required
+     *
+     * @param \Smarty_Internal_Template $_template
+     *
+     * @return bool flag true if cache is valid
+     */
+    public function isCached(Smarty_Internal_Template $_template)
+    {
+        if ($this->valid !== null) {
+            return $this->valid;
+        }
+        while (true) {
+            while (true) {
+                if ($this->exists === false || $_template->smarty->force_compile || $_template->smarty->force_cache) {
+                    $this->valid = false;
+                } else {
+                    $this->valid = true;
+                }
+                if ($this->valid && $_template->caching === Smarty::CACHING_LIFETIME_CURRENT
+                    && $_template->cache_lifetime >= 0 && time() > ($this->timestamp + $_template->cache_lifetime)
+                ) {
+                    // lifetime expired
+                    $this->valid = false;
+                }
+                if ($this->valid && $_template->compile_check === Smarty::COMPILECHECK_ON
+                    && $_template->source->getTimeStamp() > $this->timestamp
+                ) {
+                    $this->valid = false;
+                }
+                if ($this->valid || !$_template->smarty->cache_locking) {
+                    break;
+                }
+                if (!$this->handler->locked($_template->smarty, $this)) {
+                    $this->handler->acquireLock($_template->smarty, $this);
+                    break 2;
+                }
+                $this->handler->populate($this, $_template);
+            }
+            if ($this->valid) {
+                if (!$_template->smarty->cache_locking || $this->handler->locked($_template->smarty, $this) === null) {
+                    // load cache file for the following checks
+                    if ($_template->smarty->debugging) {
+                        $_template->smarty->_debug->start_cache($_template);
+                    }
+                    if ($this->handler->process($_template, $this) === false) {
+                        $this->valid = false;
+                    } else {
+                        $this->processed = true;
+                    }
+                    if ($_template->smarty->debugging) {
+                        $_template->smarty->_debug->end_cache($_template);
+                    }
+                } else {
+                    $this->is_locked = true;
+                    continue;
+                }
+            } else {
+                return $this->valid;
+            }
+            if ($this->valid && $_template->caching === Smarty::CACHING_LIFETIME_SAVED
+                && $_template->cached->cache_lifetime >= 0
+                && (time() > ($_template->cached->timestamp + $_template->cached->cache_lifetime))
+            ) {
+                $this->valid = false;
+            }
+            if ($_template->smarty->cache_locking) {
+                if (!$this->valid) {
+                    $this->handler->acquireLock($_template->smarty, $this);
+                } elseif ($this->is_locked) {
+                    $this->handler->releaseLock($_template->smarty, $this);
+                }
+            }
+            return $this->valid;
+        }
+        return $this->valid;
+    }
+
+    /**
+     * Process cached template
+     *
+     * @param Smarty_Internal_Template $_template template object
+     * @param bool                     $update    flag if called because cache update
+     */
+    public function process(Smarty_Internal_Template $_template, $update = false)
+    {
+        if ($this->handler->process($_template, $this, $update) === false) {
+            $this->valid = false;
+        }
+        if ($this->valid) {
+            $this->processed = true;
+        } else {
+            $this->processed = false;
+        }
+    }
+
+    /**
+     * Read cache content from handler
+     *
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @return string|false content
+     */
+    public function read(Smarty_Internal_Template $_template)
+    {
+        if (!$_template->source->handler->recompiled) {
+            return $this->handler->readCachedContent($_template);
+        }
+        return false;
+    }
+}
diff --git a/sysplugins/smarty_template_compiled.php b/sysplugins/smarty_template_compiled.php
new file mode 100644
index 0000000000000000000000000000000000000000..37d8f0a9efe2e931148873654c2e11c86ffd33a4
--- /dev/null
+++ b/sysplugins/smarty_template_compiled.php
@@ -0,0 +1,257 @@
+<?php
+
+/**
+ * Smarty Resource Data Object
+ * Meta Data Container for Template Files
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ * @author     Rodney Rehm
+ * @property   string $content compiled content
+ */
+class Smarty_Template_Compiled extends Smarty_Template_Resource_Base
+{
+    /**
+     * nocache hash
+     *
+     * @var string|null
+     */
+    public $nocache_hash = null;
+
+    /**
+     * get a Compiled Object of this source
+     *
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @return Smarty_Template_Compiled compiled object
+     */
+    public static function load($_template)
+    {
+        $compiled = new Smarty_Template_Compiled();
+        if ($_template->source->handler->hasCompiledHandler) {
+            $_template->source->handler->populateCompiledFilepath($compiled, $_template);
+        } else {
+            $compiled->populateCompiledFilepath($_template);
+        }
+        return $compiled;
+    }
+
+    /**
+     * populate Compiled Object with compiled filepath
+     *
+     * @param Smarty_Internal_Template $_template template object
+     **/
+    public function populateCompiledFilepath(Smarty_Internal_Template $_template)
+    {
+        $source = &$_template->source;
+        $smarty = &$_template->smarty;
+        $this->filepath = $smarty->getCompileDir();
+        if (isset($_template->compile_id)) {
+            $this->filepath .= preg_replace('![^\w]+!', '_', $_template->compile_id) .
+                               ($smarty->use_sub_dirs ? DIRECTORY_SEPARATOR : '^');
+        }
+        // if use_sub_dirs, break file into directories
+        if ($smarty->use_sub_dirs) {
+            $this->filepath .= $source->uid[ 0 ] . $source->uid[ 1 ] . DIRECTORY_SEPARATOR . $source->uid[ 2 ] .
+                               $source->uid[ 3 ] . DIRECTORY_SEPARATOR . $source->uid[ 4 ] . $source->uid[ 5 ] .
+                               DIRECTORY_SEPARATOR;
+        }
+        $this->filepath .= $source->uid . '_';
+        if ($source->isConfig) {
+            $this->filepath .= (int)$smarty->config_read_hidden + (int)$smarty->config_booleanize * 2 +
+                               (int)$smarty->config_overwrite * 4;
+        } else {
+            $this->filepath .= (int)$smarty->merge_compiled_includes + (int)$smarty->escape_html * 2 +
+                               (($smarty->merge_compiled_includes && $source->type === 'extends') ?
+                                   (int)$smarty->extends_recursion * 4 : 0);
+        }
+        $this->filepath .= '.' . $source->type;
+        $basename = $source->handler->getBasename($source);
+        if (!empty($basename)) {
+            $this->filepath .= '.' . $basename;
+        }
+        if ($_template->caching) {
+            $this->filepath .= '.cache';
+        }
+        $this->filepath .= '.php';
+        $this->timestamp = $this->exists = is_file($this->filepath);
+        if ($this->exists) {
+            $this->timestamp = filemtime($this->filepath);
+        }
+    }
+
+    /**
+     * render compiled template code
+     *
+     * @param Smarty_Internal_Template $_template
+     *
+     * @return string
+     * @throws Exception
+     */
+    public function render(Smarty_Internal_Template $_template)
+    {
+        // checks if template exists
+        if (!$_template->source->exists) {
+            $type = $_template->source->isConfig ? 'config' : 'template';
+            throw new SmartyException("Unable to load {$type} '{$_template->source->type}:{$_template->source->name}'");
+        }
+        if ($_template->smarty->debugging) {
+            if (!isset($_template->smarty->_debug)) {
+                $_template->smarty->_debug = new Smarty_Internal_Debug();
+            }
+            $_template->smarty->_debug->start_render($_template);
+        }
+        if (!$this->processed) {
+            $this->process($_template);
+        }
+        if (isset($_template->cached)) {
+            $_template->cached->file_dependency =
+                array_merge($_template->cached->file_dependency, $this->file_dependency);
+        }
+        if ($_template->source->handler->uncompiled) {
+            $_template->source->handler->renderUncompiled($_template->source, $_template);
+        } else {
+            $this->getRenderedTemplateCode($_template);
+        }
+        if ($_template->caching && $this->has_nocache_code) {
+            $_template->cached->hashes[ $this->nocache_hash ] = true;
+        }
+        if ($_template->smarty->debugging) {
+            $_template->smarty->_debug->end_render($_template);
+        }
+    }
+
+    /**
+     * load compiled template or compile from source
+     *
+     * @param Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template
+     *
+     * @throws Exception
+     */
+    public function process(Smarty_Internal_Template $_smarty_tpl)
+    {
+        $source = &$_smarty_tpl->source;
+        $smarty = &$_smarty_tpl->smarty;
+        if ($source->handler->recompiled) {
+            $source->handler->process($_smarty_tpl);
+        } elseif (!$source->handler->uncompiled) {
+            if (!$this->exists || $smarty->force_compile
+                || ($_smarty_tpl->compile_check && $source->getTimeStamp() > $this->getTimeStamp())
+            ) {
+                $this->compileTemplateSource($_smarty_tpl);
+                $compileCheck = $_smarty_tpl->compile_check;
+                $_smarty_tpl->compile_check = Smarty::COMPILECHECK_OFF;
+                $this->loadCompiledTemplate($_smarty_tpl);
+                $_smarty_tpl->compile_check = $compileCheck;
+            } else {
+                $_smarty_tpl->mustCompile = true;
+                @include $this->filepath;
+                if ($_smarty_tpl->mustCompile) {
+                    $this->compileTemplateSource($_smarty_tpl);
+                    $compileCheck = $_smarty_tpl->compile_check;
+                    $_smarty_tpl->compile_check = Smarty::COMPILECHECK_OFF;
+                    $this->loadCompiledTemplate($_smarty_tpl);
+                    $_smarty_tpl->compile_check = $compileCheck;
+                }
+            }
+            $_smarty_tpl->_subTemplateRegister();
+            $this->processed = true;
+        }
+    }
+
+    /**
+     * compile template from source
+     *
+     * @param Smarty_Internal_Template $_template
+     *
+     * @throws Exception
+     */
+    public function compileTemplateSource(Smarty_Internal_Template $_template)
+    {
+        $this->file_dependency = array();
+        $this->includes = array();
+        $this->nocache_hash = null;
+        $this->unifunc = null;
+        // compile locking
+        if ($saved_timestamp = (!$_template->source->handler->recompiled && is_file($this->filepath))) {
+            $saved_timestamp = $this->getTimeStamp();
+            touch($this->filepath);
+        }
+        // compile locking
+        try {
+            // call compiler
+            $_template->loadCompiler();
+            $this->write($_template, $_template->compiler->compileTemplate($_template));
+        } catch (Exception $e) {
+            // restore old timestamp in case of error
+            if ($saved_timestamp && is_file($this->filepath)) {
+                touch($this->filepath, $saved_timestamp);
+            }
+            unset($_template->compiler);
+            throw $e;
+        }
+        // release compiler object to free memory
+        unset($_template->compiler);
+    }
+
+    /**
+     * Write compiled code by handler
+     *
+     * @param Smarty_Internal_Template $_template template object
+     * @param string                   $code      compiled code
+     *
+     * @return bool success
+     * @throws \SmartyException
+     */
+    public function write(Smarty_Internal_Template $_template, $code)
+    {
+        if (!$_template->source->handler->recompiled) {
+            if ($_template->smarty->ext->_writeFile->writeFile($this->filepath, $code, $_template->smarty) === true) {
+                $this->timestamp = $this->exists = is_file($this->filepath);
+                if ($this->exists) {
+                    $this->timestamp = filemtime($this->filepath);
+                    return true;
+                }
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Read compiled content from handler
+     *
+     * @param Smarty_Internal_Template $_template template object
+     *
+     * @return string content
+     */
+    public function read(Smarty_Internal_Template $_template)
+    {
+        if (!$_template->source->handler->recompiled) {
+            return file_get_contents($this->filepath);
+        }
+        return isset($this->content) ? $this->content : false;
+    }
+
+    /**
+     * Load fresh compiled template by including the PHP file
+     * HHVM requires a work around because of a PHP incompatibility
+     *
+     * @param \Smarty_Internal_Template $_smarty_tpl do not change variable name, is used by compiled template
+     */
+    private function loadCompiledTemplate(Smarty_Internal_Template $_smarty_tpl)
+    {
+        if (function_exists('opcache_invalidate')
+            && (!function_exists('ini_get') || strlen(ini_get("opcache.restrict_api")) < 1)
+        ) {
+            opcache_invalidate($this->filepath, true);
+        } elseif (function_exists('apc_compile_file')) {
+            apc_compile_file($this->filepath);
+        }
+        if (defined('HHVM_VERSION')) {
+            eval('?>' . file_get_contents($this->filepath));
+        } else {
+            include $this->filepath;
+        }
+    }
+}
diff --git a/sysplugins/smarty_template_config.php b/sysplugins/smarty_template_config.php
new file mode 100644
index 0000000000000000000000000000000000000000..850ae32e7c992ff9691acf4c0b110518c981e287
--- /dev/null
+++ b/sysplugins/smarty_template_config.php
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Smarty Config Source Plugin
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Config Resource Data Object
+ * Meta Data Container for Template Files
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ * @author     Uwe Tews
+ */
+class Smarty_Template_Config extends Smarty_Template_Source
+{
+    /**
+     * array of section names, single section or null
+     *
+     * @var null|string|array
+     */
+    public $config_sections = null;
+
+    /**
+     * scope into which the config variables shall be loaded
+     *
+     * @var int
+     */
+    public $scope = 0;
+
+    /**
+     * Flag that source is a config file
+     *
+     * @var bool
+     */
+    public $isConfig = true;
+
+    /**
+     * Name of the Class to compile this resource's contents with
+     *
+     * @var string
+     */
+    public $compiler_class = 'Smarty_Internal_Config_File_Compiler';
+
+    /**
+     * Name of the Class to tokenize this resource's contents with
+     *
+     * @var string
+     */
+    public $template_lexer_class = 'Smarty_Internal_Configfilelexer';
+
+    /**
+     * Name of the Class to parse this resource's contents with
+     *
+     * @var string
+     */
+    public $template_parser_class = 'Smarty_Internal_Configfileparser';
+
+    /**
+     * initialize Source Object for given resource
+     * Either [$_template] or [$smarty, $template_resource] must be specified
+     *
+     * @param Smarty_Internal_Template $_template         template object
+     * @param Smarty                   $smarty            smarty object
+     * @param string                   $template_resource resource identifier
+     *
+     * @return Smarty_Template_Config Source Object
+     * @throws SmartyException
+     */
+    public static function load(
+        Smarty_Internal_Template $_template = null,
+        Smarty $smarty = null,
+        $template_resource = null
+    ) {
+        static $_incompatible_resources = array('extends' => true, 'php' => true);
+        if ($_template) {
+            $smarty = $_template->smarty;
+            $template_resource = $_template->template_resource;
+        }
+        if (empty($template_resource)) {
+            throw new SmartyException('Source: Missing  name');
+        }
+        // parse resource_name, load resource handler
+        list($name, $type) = Smarty_Resource::parseResourceName($template_resource, $smarty->default_config_type);
+        // make sure configs are not loaded via anything smarty can't handle
+        if (isset($_incompatible_resources[ $type ])) {
+            throw new SmartyException("Unable to use resource '{$type}' for config");
+        }
+        $source = new Smarty_Template_Config($smarty, $template_resource, $type, $name);
+        $source->handler->populate($source, $_template);
+        if (!$source->exists && isset($smarty->default_config_handler_func)) {
+            Smarty_Internal_Method_RegisterDefaultTemplateHandler::_getDefaultTemplate($source);
+            $source->handler->populate($source, $_template);
+        }
+        return $source;
+    }
+}
diff --git a/sysplugins/smarty_template_resource_base.php b/sysplugins/smarty_template_resource_base.php
new file mode 100644
index 0000000000000000000000000000000000000000..52bfba2525bd2d059bb1cb63ad9ee19c20322e25
--- /dev/null
+++ b/sysplugins/smarty_template_resource_base.php
@@ -0,0 +1,152 @@
+<?php
+
+/**
+ * Smarty Template Resource Base Object
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ * @author     Rodney Rehm
+ */
+abstract class Smarty_Template_Resource_Base
+{
+    /**
+     * Compiled Filepath
+     *
+     * @var string
+     */
+    public $filepath = null;
+
+    /**
+     * Compiled Timestamp
+     *
+     * @var integer|bool
+     */
+    public $timestamp = false;
+
+    /**
+     * Compiled Existence
+     *
+     * @var boolean
+     */
+    public $exists = false;
+
+    /**
+     * Template Compile Id (Smarty_Internal_Template::$compile_id)
+     *
+     * @var string
+     */
+    public $compile_id = null;
+
+    /**
+     * Compiled Content Loaded
+     *
+     * @var boolean
+     */
+    public $processed = false;
+
+    /**
+     * unique function name for compiled template code
+     *
+     * @var string
+     */
+    public $unifunc = '';
+
+    /**
+     * flag if template does contain nocache code sections
+     *
+     * @var bool
+     */
+    public $has_nocache_code = false;
+
+    /**
+     * resource file dependency
+     *
+     * @var array
+     */
+    public $file_dependency = array();
+
+    /**
+     * Content buffer
+     *
+     * @var string
+     */
+    public $content = null;
+
+    /**
+     * Included sub templates
+     * - index name
+     * - value use count
+     *
+     * @var int[]
+     */
+    public $includes = array();
+
+    /**
+     * Flag if this is a cache resource
+     *
+     * @var bool
+     */
+    public $isCache = false;
+
+    /**
+     * Process resource
+     *
+     * @param Smarty_Internal_Template $_template template object
+     */
+    abstract public function process(Smarty_Internal_Template $_template);
+
+    /**
+     * get rendered template content by calling compiled or cached template code
+     *
+     * @param \Smarty_Internal_Template $_template
+     * @param string                    $unifunc function with template code
+     *
+     * @throws \Exception
+     */
+    public function getRenderedTemplateCode(Smarty_Internal_Template $_template, $unifunc = null)
+    {
+        $smarty = &$_template->smarty;
+        $_template->isRenderingCache = $this->isCache;
+        $level = ob_get_level();
+        try {
+            if (!isset($unifunc)) {
+                $unifunc = $this->unifunc;
+            }
+            if (empty($unifunc) || !function_exists($unifunc)) {
+                throw new SmartyException("Invalid compiled template for '{$_template->template_resource}'");
+            }
+            if ($_template->startRenderCallbacks) {
+                foreach ($_template->startRenderCallbacks as $callback) {
+                    call_user_func($callback, $_template);
+                }
+            }
+            $unifunc($_template);
+            foreach ($_template->endRenderCallbacks as $callback) {
+                call_user_func($callback, $_template);
+            }
+            $_template->isRenderingCache = false;
+        } catch (Exception $e) {
+            $_template->isRenderingCache = false;
+            while (ob_get_level() > $level) {
+                ob_end_clean();
+            }
+            if (isset($smarty->security_policy)) {
+                $smarty->security_policy->endTemplate();
+            }
+            throw $e;
+        }
+    }
+
+    /**
+     * Get compiled time stamp
+     *
+     * @return int
+     */
+    public function getTimeStamp()
+    {
+        if ($this->exists && !$this->timestamp) {
+            $this->timestamp = filemtime($this->filepath);
+        }
+        return $this->timestamp;
+    }
+}
diff --git a/sysplugins/smarty_template_source.php b/sysplugins/smarty_template_source.php
new file mode 100644
index 0000000000000000000000000000000000000000..16b47f23c13f0473ca2b25a7cb43c86ea25cf8b2
--- /dev/null
+++ b/sysplugins/smarty_template_source.php
@@ -0,0 +1,213 @@
+<?php
+
+/**
+ * Smarty Resource Data Object
+ * Meta Data Container for Template Files
+ *
+ * @package    Smarty
+ * @subpackage TemplateResources
+ * @author     Rodney Rehm
+ */
+class Smarty_Template_Source
+{
+    /**
+     * Unique Template ID
+     *
+     * @var string
+     */
+    public $uid = null;
+
+    /**
+     * Template Resource (Smarty_Internal_Template::$template_resource)
+     *
+     * @var string
+     */
+    public $resource = null;
+
+    /**
+     * Resource Type
+     *
+     * @var string
+     */
+    public $type = null;
+
+    /**
+     * Resource Name
+     *
+     * @var string
+     */
+    public $name = null;
+
+    /**
+     * Source Filepath
+     *
+     * @var string
+     */
+    public $filepath = null;
+
+    /**
+     * Source Timestamp
+     *
+     * @var integer
+     */
+    public $timestamp = null;
+
+    /**
+     * Source Existence
+     *
+     * @var boolean
+     */
+    public $exists = false;
+
+    /**
+     * Source File Base name
+     *
+     * @var string
+     */
+    public $basename = null;
+
+    /**
+     * The Components an extended template is made of
+     *
+     * @var \Smarty_Template_Source[]
+     */
+    public $components = null;
+
+    /**
+     * Resource Handler
+     *
+     * @var \Smarty_Resource
+     */
+    public $handler = null;
+
+    /**
+     * Smarty instance
+     *
+     * @var Smarty
+     */
+    public $smarty = null;
+
+    /**
+     * Resource is source
+     *
+     * @var bool
+     */
+    public $isConfig = false;
+
+    /**
+     * Template source content eventually set by default handler
+     *
+     * @var string
+     */
+    public $content = null;
+
+    /**
+     * Name of the Class to compile this resource's contents with
+     *
+     * @var string
+     */
+    public $compiler_class = 'Smarty_Internal_SmartyTemplateCompiler';
+
+    /**
+     * Name of the Class to tokenize this resource's contents with
+     *
+     * @var string
+     */
+    public $template_lexer_class = 'Smarty_Internal_Templatelexer';
+
+    /**
+     * Name of the Class to parse this resource's contents with
+     *
+     * @var string
+     */
+    public $template_parser_class = 'Smarty_Internal_Templateparser';
+
+    /**
+     * create Source Object container
+     *
+     * @param Smarty $smarty   Smarty instance this source object belongs to
+     * @param string $resource full template_resource
+     * @param string $type     type of resource
+     * @param string $name     resource name
+     *
+     * @throws   \SmartyException
+     * @internal param \Smarty_Resource $handler Resource Handler this source object communicates with
+     */
+    public function __construct(Smarty $smarty, $resource, $type, $name)
+    {
+        $this->handler =
+            isset($smarty->_cache[ 'resource_handlers' ][ $type ]) ? $smarty->_cache[ 'resource_handlers' ][ $type ] :
+                Smarty_Resource::load($smarty, $type);
+        $this->smarty = $smarty;
+        $this->resource = $resource;
+        $this->type = $type;
+        $this->name = $name;
+    }
+
+    /**
+     * initialize Source Object for given resource
+     * Either [$_template] or [$smarty, $template_resource] must be specified
+     *
+     * @param Smarty_Internal_Template $_template         template object
+     * @param Smarty                   $smarty            smarty object
+     * @param string                   $template_resource resource identifier
+     *
+     * @return Smarty_Template_Source Source Object
+     * @throws SmartyException
+     */
+    public static function load(
+        Smarty_Internal_Template $_template = null,
+        Smarty $smarty = null,
+        $template_resource = null
+    ) {
+        if ($_template) {
+            $smarty = $_template->smarty;
+            $template_resource = $_template->template_resource;
+        }
+        if (empty($template_resource)) {
+            throw new SmartyException('Source: Missing  name');
+        }
+        // parse resource_name, load resource handler, identify unique resource name
+        if (preg_match('/^([A-Za-z0-9_\-]{2,})[:]([\s\S]*)$/', $template_resource, $match)) {
+            $type = $match[ 1 ];
+            $name = $match[ 2 ];
+        } else {
+            // no resource given, use default
+            // or single character before the colon is not a resource type, but part of the filepath
+            $type = $smarty->default_resource_type;
+            $name = $template_resource;
+        }
+        // create new source  object
+        $source = new Smarty_Template_Source($smarty, $template_resource, $type, $name);
+        $source->handler->populate($source, $_template);
+        if (!$source->exists && isset($_template->smarty->default_template_handler_func)) {
+            Smarty_Internal_Method_RegisterDefaultTemplateHandler::_getDefaultTemplate($source);
+            $source->handler->populate($source, $_template);
+        }
+        return $source;
+    }
+
+    /**
+     * Get source time stamp
+     *
+     * @return int
+     */
+    public function getTimeStamp()
+    {
+        if (!isset($this->timestamp)) {
+            $this->handler->populateTimestamp($this);
+        }
+        return $this->timestamp;
+    }
+
+    /**
+     * Get source content
+     *
+     * @return string
+     * @throws \SmartyException
+     */
+    public function getContent()
+    {
+        return isset($this->content) ? $this->content : $this->handler->getContent($this);
+    }
+}
diff --git a/sysplugins/smarty_undefined_variable.php b/sysplugins/smarty_undefined_variable.php
new file mode 100644
index 0000000000000000000000000000000000000000..6d31a8a05552ef49ae7f0e52c2f95c9c4ddbb68d
--- /dev/null
+++ b/sysplugins/smarty_undefined_variable.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * class for undefined variable object
+ * This class defines an object for undefined variable handling
+ *
+ * @package    Smarty
+ * @subpackage Template
+ */
+class Smarty_Undefined_Variable extends Smarty_Variable
+{
+    /**
+     * Returns null for not existing properties
+     *
+     * @param string $name
+     *
+     * @return null
+     */
+    public function __get($name)
+    {
+        return null;
+    }
+
+    /**
+     * Always returns an empty string.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return '';
+    }
+}
diff --git a/sysplugins/smarty_variable.php b/sysplugins/smarty_variable.php
new file mode 100644
index 0000000000000000000000000000000000000000..914d99bd72dc0f1961fc850ec11d9a66f87392e9
--- /dev/null
+++ b/sysplugins/smarty_variable.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * class for the Smarty variable object
+ * This class defines the Smarty variable object
+ *
+ * @package    Smarty
+ * @subpackage Template
+ */
+class Smarty_Variable
+{
+    /**
+     * template variable
+     *
+     * @var mixed
+     */
+    public $value = null;
+
+    /**
+     * if true any output of this variable will be not cached
+     *
+     * @var boolean
+     */
+    public $nocache = false;
+
+    /**
+     * create Smarty variable object
+     *
+     * @param mixed   $value   the value to assign
+     * @param boolean $nocache if true any output of this variable will be not cached
+     */
+    public function __construct($value = null, $nocache = false)
+    {
+        $this->value = $value;
+        $this->nocache = $nocache;
+    }
+
+    /**
+     * <<magic>> String conversion
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return (string)$this->value;
+    }
+}
diff --git a/sysplugins/smartycompilerexception.php b/sysplugins/smartycompilerexception.php
new file mode 100644
index 0000000000000000000000000000000000000000..f7ad39b93124e862df4dad8fb04b2bb770593598
--- /dev/null
+++ b/sysplugins/smartycompilerexception.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * Smarty compiler exception class
+ *
+ * @package Smarty
+ */
+class SmartyCompilerException extends SmartyException
+{
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return ' --> Smarty Compiler: ' . $this->message . ' <-- ';
+    }
+
+    /**
+     * The line number of the template error
+     *
+     * @type int|null
+     */
+    public $line = null;
+
+    /**
+     * The template source snippet relating to the error
+     *
+     * @type string|null
+     */
+    public $source = null;
+
+    /**
+     * The raw text of the error message
+     *
+     * @type string|null
+     */
+    public $desc = null;
+
+    /**
+     * The resource identifier or template name
+     *
+     * @type string|null
+     */
+    public $template = null;
+}
diff --git a/sysplugins/smartyexception.php b/sysplugins/smartyexception.php
new file mode 100644
index 0000000000000000000000000000000000000000..7f7b9aa435d19818b744e3c63f832000d95d7a8e
--- /dev/null
+++ b/sysplugins/smartyexception.php
@@ -0,0 +1,19 @@
+<?php
+
+/**
+ * Smarty exception class
+ *
+ * @package Smarty
+ */
+class SmartyException extends Exception
+{
+    public static $escape = false;
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return ' --> Smarty: ' . (self::$escape ? htmlentities($this->message) : $this->message) . ' <-- ';
+    }
+}
diff --git a/templates/add_eti.tpl b/templates/add_eti.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..ff6a305d58b67ceb1a241c951bab0ae382911c9b
--- /dev/null
+++ b/templates/add_eti.tpl
@@ -0,0 +1,117 @@
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	{include file="head.tpl"}
+	<!-- Barra de menu -->
+	{include file="barra.tpl"}
+	
+	<!-- Zona Central -->
+<script type="text/javascript">
+
+	function limita(maximoCaracteres) {
+	  var elemento = document.getElementById("texto");
+	  if(elemento.value.length >= maximoCaracteres ) {
+	    return false;
+	  }
+	  else {
+	    return true;
+	  }
+	}
+	
+</script> 
+
+<div class="" role="main">
+	<div class="">
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+				<h2 style = "text-align: center;">{$mensaje}</h2>
+				<div class="clearfix"></div>
+					<div class="x_content">
+						<form class="form-horizontal form-label-left" action="add_eti.php?variable={$id_admin}&accion=1&id={$sujeto[0]}" method="post">
+
+							<!-- DNI -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="10" name="dni" disabled type="text" 
+									value="{$sujeto[0]}">
+								</div>
+							</div>
+							
+							<div class="x_panel">
+							<h2 style = "text-align: center;">Etiología</h2>
+							<div class="clearfix"></div>
+							<!-- Etiologia -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Etiología *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="50" name="etiologia" required type="text">
+								</div>
+							</div>
+
+							<!-- Fecha lesion -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Fecha lesión * 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12"   name="fecha_lesion" required type="date">
+								</div>
+							</div>
+
+							<!-- Cuadrantes -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Cuadrantes afectados 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="50"  name="cuadrantes"  type="text">
+								</div>
+							</div>
+
+							<!-- Comentarios -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Comentarios 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500"  name="comentarios"  type="text">
+								</div>
+							</div>
+
+
+							<!-- Patologia -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Patología *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12" >
+									<select class="select2_single form-control" required name="patologia">
+										<option value=""></option>
+										{foreach item=element from=$patologias} 
+										<option value="{$element}">{$element}</option>
+										{/foreach}
+									</select>
+								</div>
+							</div>
+
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button>
+									<button id="send" type="submit" class="btn btn-success">Guardar</button>
+								</div>
+							</div>
+
+						</form>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<script type="text/javascript">
+	function cancel() {
+		window.location.href="pac_reg.php?variable={$id_admin}&id={$sujeto[0]}";
+	}
+
+</script>
+{include file="footer.tpl"}
diff --git a/templates/add_gestor.tpl b/templates/add_gestor.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..63b1e1bd17f54743f7827c3681196f5b0db459c0
--- /dev/null
+++ b/templates/add_gestor.tpl
@@ -0,0 +1,121 @@
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	{include file="head.tpl"}
+	<!-- Barra de menu -->
+	{include file="barra.tpl"}
+	
+	<!-- Zona Central -->
+
+<div class="" role="main">
+	<div class="">
+		<div class="page-title"> 
+			<div class="title_left">
+			</div>
+
+		</div>
+		<div class="clearfix"></div>
+
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+					<div class="x_title">
+						<h2> {$mensaje}<small></small></h2>
+						<div class="clearfix"></div>
+					</div>
+					<div class="x_content">
+
+						<form class="form-horizontal form-label-left" action="add_gestor.php?variable={$id_admin}" method="post">
+{literal}
+							<!-- id_admin -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="select2_single form-control" pattern="[0-9]{8}[A-Z]" required maxlength="30" name="dni_trabajador" placeholder="Introduzca un número válido 8 num + Letra">
+								</div>
+							</div> 
+
+							<!-- Nombre -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="select2_single form-control" required maxlength="100" type="text" name="nombre">
+								</div>
+							</div>
+
+							<!-- Apellidos -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Apellidos *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="select2_single form-control" required maxlength="200" type="text" name="apellidos">
+								</div>
+							</div>
+
+							<!-- login -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Login *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="select2_single form-control" required maxlength="15" type="text" name="login">
+								</div>
+							</div>
+
+							<!-- titulacion -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Titulación *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="select2_single form-control" required maxlength="20" type="text" name="titulacion">
+								</div>
+							</div>
+
+							<!-- Pass -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Contraseña *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="select2_single form-control" required maxlength="40" type="password" placeholder="Mínimo 6 carácteres" pattern=".{6,25}" name="pass">
+								</div>
+							</div>
+
+							<!-- Repass -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Repita contraseña *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="select2_single form-control" required maxlength="40" type="password" placeholder="Mínimo 6 carácteres" pattern=".{6,25}" name="passrw">
+								</div>
+							</div>
+
+							<!-- Permisos -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Permisos *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="select2_single form-control" pattern="[01]{1}" required type="text" name="permisos" placeholder="0:Trabajador - 1:Administrador">
+								</div>
+							</div>
+{/literal}
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button  type="button" onclick="cancel()" class="btn btn-warning">Cancelar</button>
+									<button id="send" type="submit" class="btn btn-success">Validar</button>
+								</div>
+							</div>
+						</form>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<script type="text/javascript">
+	function cancel() {
+		window.location.href="result.php?variable={$id_admin}";
+	}
+
+</script>
+{include file="footer.tpl"}
diff --git a/templates/add_pac.tpl b/templates/add_pac.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..742c4d6ada92a383021ad52d428fcab813d4262c
--- /dev/null
+++ b/templates/add_pac.tpl
@@ -0,0 +1,177 @@
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	{include file="head.tpl"}
+	<!-- Barra de menu -->
+	{include file="barra.tpl"}
+	
+	<!-- Zona Central -->
+<script type="text/javascript">
+
+	function limita(maximoCaracteres) {
+	  var elemento = document.getElementById("texto");
+	  if(elemento.value.length >= maximoCaracteres ) {
+	    return false;
+	  }
+	  else {
+	    return true;
+	  }
+	}
+	
+</script> 
+
+<div class="" role="main">
+	<div class="">
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+				<h2 style = "text-align: center;">{$mensaje}</h2>
+				<div class="clearfix"></div>
+					<div class="x_content">
+						<form class="form-horizontal form-label-left" action="add_pac.php?variable={$id_admin}" method="post">
+
+							<!-- DNI -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="10" name="dni" required type="text" 
+									value="{$sujeto[0]}">
+								</div>
+							</div>
+
+							<!-- Nombre -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="100" data-validate-words="2" name="nombre" required type="text" value="{$sujeto[1]}"
+									{* <span class="fa fa-clock-o form-control-feedback right" aria-hidden="true"></span> *}>
+								</div>
+							</div>
+
+							<!-- Apellidos -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Apellidos *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="200"  name="apellidos" required type="text" value="{$sujeto[2]}">
+								</div>
+							</div>
+
+							<!-- Edad -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Fecha nacimiento *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="200"  name="edad" required type="date" value="{$sujeto[4]}">
+								</div>
+							</div>
+
+
+							<!-- Sexo -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name" >Sexo Masculino* 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<div class="radio">
+										<input type="radio" {if $sujeto[3] == "M"}  checked=""  value="{$sujeto[3]}" {else} value="M" {/if} name="sexo" style="margin-left: 0px;">  
+									</div>
+								</div>
+							</div>
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name" >Sexo Femenino*
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<div class="radio">
+										<input type="radio"   {if $sujeto[3] == "F"}  checked=""  value="{$sujeto[3]}" {else} value="F" {/if}  name="sexo" style="margin-left: 0px;" >  
+									</div>
+								</div>
+							</div>
+
+							<!-- Anotaciones -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Anotaciones
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="anotaciones" type="text" value="{$sujeto[5]}">
+								</div>
+							</div>
+
+							
+							<div class="x_panel">
+							<h2 style = "text-align: center;">Etiología</h2>
+							<div class="clearfix"></div>
+							<!-- Etiologia -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Etiología *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="50" name="etiologia" required type="text">
+								</div>
+							</div>
+
+							<!-- Fecha lesion -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Fecha lesión * 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12"   name="fecha_lesion" required type="date">
+								</div>
+							</div>
+
+							<!-- Cuadrantes -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Cuadrantes afectados 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="50"  name="cuadrantes"  type="text">
+								</div>
+							</div>
+
+							<!-- Comentarios -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Comentarios 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500"  name="comentarios"  type="text">
+								</div>
+							</div>
+
+
+							<!-- Patologia -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Patología *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12" >
+									<select class="select2_single form-control" required name="patologia">
+										<option value=""></option>
+										{foreach item=element from=$patologias} 
+										<option value="{$element}">{$element}</option>
+										{/foreach}
+									</select>
+								</div>
+							</div>
+
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button>
+									<button id="send" type="submit" class="btn btn-success">Guardar</button>
+								</div>
+							</div>
+
+						</form>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<script type="text/javascript">
+	//estado();
+	function cancel() {
+		window.location.href="result.php?variable={$id_admin}";
+	}
+
+</script>
+{include file="footer.tpl"}
diff --git a/templates/add_reg.tpl b/templates/add_reg.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..c9711fb376f7ca49c9dc4928abdb589bdce69555
--- /dev/null
+++ b/templates/add_reg.tpl
@@ -0,0 +1,175 @@
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	{include file="head.tpl"}
+	<!-- Barra de menu -->
+	{include file="barra.tpl"}
+	
+	<!-- Zona Central -->
+<script type="text/javascript">
+
+	function limita(maximoCaracteres) {
+	  var elemento = document.getElementById("texto");
+	  if(elemento.value.length >= maximoCaracteres ) {
+	    return false;
+	  }
+	  else {
+	    return true;
+	  }
+	}
+	
+</script> 
+
+<div class="" role="main">
+	<div class="">
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+					<div class="x_content">
+						
+
+						<!-- tabla para seleccionar sujeto -->
+						<div class="x_content">
+							<h4 style = "text-align: center;">{$mensaje}</h4>
+							<div class="tablas">
+								<table id="example" class="table table-striped table-bordered" cellspacing="0" width="100%" role="grid" data-order="[[ 2, &quot;asc&quot; ]]">
+
+									<thead>
+										<tr>
+											<td>DNI</td>
+											<td>Nombre</td>
+											<td>Apellidos</td>
+											<td>Sexo</td>
+											<td >Edad</td>
+											<td>Anotaciones del paciente</td>
+
+										</tr>
+									</thead>
+
+									<tbody>
+										{foreach from=$campos item=element}
+											<tr >
+												<td>{$element[0]}</td>
+												<td>{$element[1]}</td>
+												<td>{$element[2]}</td>
+												<td>{$element[3]}</td>
+												<td>{$element[4]} ({$element[6]|date_format:"%d/%m/%Y"})</td>
+												<td>{$element[5]}</td>
+											</tr>
+										{/foreach}
+									</tbody>
+								</table>
+							</div>
+						</div>
+						<h2 style = "text-align: center;">Información del paciente</h2>
+						<form class="form-horizontal form-label-left" action="add_reg_val.php?variable={$id_admin}" method="post">
+							<!-- DNI -->
+														
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" name="dni_paciente" type="text" value="{$sujeto[0]}" readonly="readonly" >
+								</div>
+							</div>
+
+							<!-- Nombre -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12"  name="nombre" type="text" value="{$sujeto[1]}" readonly="readonly">
+								</div>
+							</div>
+
+							<!-- Apellidos -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Apellidos
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" name="apellidos" type="text" value="{$sujeto[2]}" readonly="readonly" >
+								</div>
+							</div>
+
+							<!-- Edad -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Fecha nacimiento
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" name="edad" type="date" value="{$sujeto[4]}" readonly="readonly" >
+								</div>
+							</div>
+
+							
+							
+							<!-- ensayo -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Tipo de ensayo *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12" >
+									<select class="select2_single form-control" name="ensayo" required>
+										<option value=""></option>
+										{foreach item=element from=$ensayos} 
+										<option value="{$element}">{$element}</option>
+										{/foreach}
+									</select>
+								</div>
+							</div>
+
+							<!-- Simetria -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Simetria de la prueba
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="10" name="simetria" type="text">
+								</div>
+							</div>
+
+							<!-- Anotaciones -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Anotaciones de la prueba
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="anotaciones" type="text">
+								</div>
+							</div>
+
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button>
+									{if $sujeto[0]!=""}<button id="send" type="submit" class="btn btn-success">Iniciar</button>{/if}
+									{if $sujeto[0]!=""}<button onclick="limpiar()" type="button" class="btn btn-info">Limpiar</button>{/if}
+								</div>
+							</div>
+						</form>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<script type="text/javascript">
+	//estado();
+	function cancel() {
+			window.location.href="pac_reg.php?variable={$id_admin}&id={$sujeto[0]}";
+	}
+	function limpiar() {
+		window.location.href="add_reg.php?variable={$id_admin}";
+	}
+	$(document).ready(function() {
+	    $('#example').DataTable({
+   	        lengthMenu: [
+					[ 10, 25, 100, -1 ],
+					[ '10 filas', '25 filas', '100 filas', 'Todas las filas' ]
+        ]
+ 	    });
+	    var table = $('#example').DataTable();
+	 
+	    $('#example tbody').on( 'click', 'tr', function () {
+	        $(this).toggleClass('selected');
+			window.location.href="add_reg.php?variable={$id_admin}&id="+table.rows('.selected').data()[0][0];
+	    } );
+	} );
+
+</script>
+{include file="footer.tpl"}
diff --git a/templates/add_reg_val.tpl b/templates/add_reg_val.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..e0ba8c6d583b39636d144a4f48bc9e48fdd1c49a
--- /dev/null
+++ b/templates/add_reg_val.tpl
@@ -0,0 +1,196 @@
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	{include file="head.tpl"}
+	<!-- Barra de menu -->
+	{include file="barra.tpl"}
+
+	<!-- Zona Central -->
+
+<div class="" role="main">
+	<div class="">
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+					<div class="x_content">
+						<form action="http://arduiacob.i234.me:8240/{$get}" target="esp">
+							<button type="submit" formmethod="get" id="init" onclick="inicio()" formnovalidate>Iniciar</button>
+						</form>
+					</div>					
+				</div>
+			</div>
+
+			<div class="col-md-4 col-sm-4 col-xs-4">
+				
+				<div class="x_panel">
+					<div class="x_content">
+						<iframe name="esp" id="esp" src="http://arduiacob.i234.me:8240/{$get}" ></iframe>
+					</div>
+				</div>
+			</div>
+			<div class="col-md-4 col-sm-4 col-xs-4">
+				<div class="x_panel">
+					<div class="x_content">
+						<form action="http://arduiacob.i234.me:8240/{$get}" target="esp">
+							<button type="submit" formmethod="get"  formnovalidate>Reset ESP</button>
+						</form>
+						<div >
+							<img style='height: 300px;' src="{$imagen}">
+						</div>
+					</div>					
+				</div>
+			</div>
+			<div class="col-md-4 col-sm-4 col-xs-4">
+				<div class="x_panel">
+					<div class="x_content">
+						<div >
+							<h2><strong>Colocación sensores:</strong></h2>
+							<h2>{$coloc_sensores}</h2>
+						</div>
+					</div>					
+				</div>
+			</div>
+
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+					<div class="x_content">
+					</div>					
+				</div>
+			</div>
+
+			<div class="col-md-6 col-6 col-xs-6">
+				<div class="x_panel">
+					<div class="x_content">
+						<h1>{$segundos}:00</h1>
+					</div>					
+				</div>
+				<div class="x_panel">
+					<div class="x_content">
+						<button type="submit" formmethod="get"  id="done" class="btn btn-success" onclick="done()" formnovalidate>Ver resultados</button>
+						<button type="submit" formmethod="get"  id="salir" class="btn btn-danger" onclick="salir()" formnovalidate>Salir</button>
+					</div>					
+				</div>
+			</div>
+			<div class="col-md-6 col-sm-6 col-xs-6">
+				<div class="x_panel">
+					<div class="x_content">
+						<div id="foto">
+						Aviso
+						</div>
+					</div>					
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script type="text/javascript">
+window.onload = function() {
+    var oFrame = document.getElementById("esp");
+    oFrame.contentWindow.document.onclick = function() {
+        alert("frame contents clicked");
+    };
+};
+</script>
+
+<script type="text/javascript">
+	let h1 = document.querySelector("h1");
+
+	let centesimas = 0;
+	let segundos = {$segundos};
+
+	var snd1 = new Audio("data:audio/wav;base64,//uQRAAAAWMSLwUIYAAsYkXgoQwAEaYLWfkWgAI0wWs/ItAAAGDgYtAgAyN+QWaAAihwMWm4G8QQRDiMcCBcH3Cc+CDv/7xA4Tvh9Rz/y8QADBwMWgQAZG/ILNAARQ4GLTcDeIIIhxGOBAuD7hOfBB3/94gcJ3w+o5/5eIAIAAAVwWgQAVQ2ORaIQwEMAJiDg95G4nQL7mQVWI6GwRcfsZAcsKkJvxgxEjzFUgfHoSQ9Qq7KNwqHwuB13MA4a1q/DmBrHgPcmjiGoh//EwC5nGPEmS4RcfkVKOhJf+WOgoxJclFz3kgn//dBA+ya1GhurNn8zb//9NNutNuhz31f////9vt///z+IdAEAAAK4LQIAKobHItEIYCGAExBwe8jcToF9zIKrEdDYIuP2MgOWFSE34wYiR5iqQPj0JIeoVdlG4VD4XA67mAcNa1fhzA1jwHuTRxDUQ//iYBczjHiTJcIuPyKlHQkv/LHQUYkuSi57yQT//uggfZNajQ3Vmz+Zt//+mm3Wm3Q576v////+32///5/EOgAAADVghQAAAAA//uQZAUAB1WI0PZugAAAAAoQwAAAEk3nRd2qAAAAACiDgAAAAAAABCqEEQRLCgwpBGMlJkIz8jKhGvj4k6jzRnqasNKIeoh5gI7BJaC1A1AoNBjJgbyApVS4IDlZgDU5WUAxEKDNmmALHzZp0Fkz1FMTmGFl1FMEyodIavcCAUHDWrKAIA4aa2oCgILEBupZgHvAhEBcZ6joQBxS76AgccrFlczBvKLC0QI2cBoCFvfTDAo7eoOQInqDPBtvrDEZBNYN5xwNwxQRfw8ZQ5wQVLvO8OYU+mHvFLlDh05Mdg7BT6YrRPpCBznMB2r//xKJjyyOh+cImr2/4doscwD6neZjuZR4AgAABYAAAABy1xcdQtxYBYYZdifkUDgzzXaXn98Z0oi9ILU5mBjFANmRwlVJ3/6jYDAmxaiDG3/6xjQQCCKkRb/6kg/wW+kSJ5//rLobkLSiKmqP/0ikJuDaSaSf/6JiLYLEYnW/+kXg1WRVJL/9EmQ1YZIsv/6Qzwy5qk7/+tEU0nkls3/zIUMPKNX/6yZLf+kFgAfgGyLFAUwY//uQZAUABcd5UiNPVXAAAApAAAAAE0VZQKw9ISAAACgAAAAAVQIygIElVrFkBS+Jhi+EAuu+lKAkYUEIsmEAEoMeDmCETMvfSHTGkF5RWH7kz/ESHWPAq/kcCRhqBtMdokPdM7vil7RG98A2sc7zO6ZvTdM7pmOUAZTnJW+NXxqmd41dqJ6mLTXxrPpnV8avaIf5SvL7pndPvPpndJR9Kuu8fePvuiuhorgWjp7Mf/PRjxcFCPDkW31srioCExivv9lcwKEaHsf/7ow2Fl1T/9RkXgEhYElAoCLFtMArxwivDJJ+bR1HTKJdlEoTELCIqgEwVGSQ+hIm0NbK8WXcTEI0UPoa2NbG4y2K00JEWbZavJXkYaqo9CRHS55FcZTjKEk3NKoCYUnSQ0rWxrZbFKbKIhOKPZe1cJKzZSaQrIyULHDZmV5K4xySsDRKWOruanGtjLJXFEmwaIbDLX0hIPBUQPVFVkQkDoUNfSoDgQGKPekoxeGzA4DUvnn4bxzcZrtJyipKfPNy5w+9lnXwgqsiyHNeSVpemw4bWb9psYeq//uQZBoABQt4yMVxYAIAAAkQoAAAHvYpL5m6AAgAACXDAAAAD59jblTirQe9upFsmZbpMudy7Lz1X1DYsxOOSWpfPqNX2WqktK0DMvuGwlbNj44TleLPQ+Gsfb+GOWOKJoIrWb3cIMeeON6lz2umTqMXV8Mj30yWPpjoSa9ujK8SyeJP5y5mOW1D6hvLepeveEAEDo0mgCRClOEgANv3B9a6fikgUSu/DmAMATrGx7nng5p5iimPNZsfQLYB2sDLIkzRKZOHGAaUyDcpFBSLG9MCQALgAIgQs2YunOszLSAyQYPVC2YdGGeHD2dTdJk1pAHGAWDjnkcLKFymS3RQZTInzySoBwMG0QueC3gMsCEYxUqlrcxK6k1LQQcsmyYeQPdC2YfuGPASCBkcVMQQqpVJshui1tkXQJQV0OXGAZMXSOEEBRirXbVRQW7ugq7IM7rPWSZyDlM3IuNEkxzCOJ0ny2ThNkyRai1b6ev//3dzNGzNb//4uAvHT5sURcZCFcuKLhOFs8mLAAEAt4UWAAIABAAAAAB4qbHo0tIjVkUU//uQZAwABfSFz3ZqQAAAAAngwAAAE1HjMp2qAAAAACZDgAAAD5UkTE1UgZEUExqYynN1qZvqIOREEFmBcJQkwdxiFtw0qEOkGYfRDifBui9MQg4QAHAqWtAWHoCxu1Yf4VfWLPIM2mHDFsbQEVGwyqQoQcwnfHeIkNt9YnkiaS1oizycqJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU=");  
+	var snd2 = new Audio("media/audio/check.mp3");
+
+	var intervalo = 0;
+	var intervaloBase = segundos/{$repeticiones};
+	var repSg = segundos-1;
+	var repCnt = 99;
+	var estado = 0;
+	$('#done').hide();
+
+	console.log(estado, "Intervalo repetición: ", intervaloBase, "-", intervalo, "(",repSg,":",repCnt,")", "Repeticiones totales:", {$repeticiones});
+	function run(){
+		if (estado ==0){
+			if((centesimas == 0) &&( segundos == 0)){
+			check();
+			h1.style.color = 'red';
+			$("#foto").html("<h1><strong>FIN</strong></h1>");
+			$('#done').show();
+			estado = 1;
+			// función para hacer un delay antes del windows location
+			// esperamos 2 segundos
+			function stateChange(newState) {
+				setTimeout(function () {
+					if (newState == -1) {
+						/*
+						 * Comprobamos que el sensor ha enviado los datos y ponemos un mensaje acorde.
+						 * /
+						$.post("comprobar_post.php", {literal} {
+								recarga:'info' , 
+								puesto: {/literal}{$puesto}{literal}, 
+								linea: '{/literal}{$linea}{literal}',
+								cambio: {/literal}{$prox_cambio}{literal},
+								serie: '{/literal}{$serie}{literal}',
+								foto: '{/literal}{$imagen}{literal}',
+								posicion_ant: {/literal}{$posicion}{literal}
+								} {/literal} , 
+								function(data){
+									//recarga titulo y barcode
+									$("#resultado").html(data);
+								});	
+						//*/
+						alert("Saliendo");
+						window.location.href="result.php?variable={$id_admin}";
+					}
+				}, 2000);
+			}
+			
+			}else{
+				// Comprobamos que llegamos a una repetición y ponemos un aviso
+				if(centesimas == repCnt && segundos == repSg) {
+					console.log("intervalo = ", repSg,":",repCnt);
+					$("#foto").html("<h1><strong>{$ensayo}</strong></h1>");   
+					beep(); 
+				}
+				// quitamos el aviso 1seg despues y preparamos la siguiente repeticion
+				if(centesimas == repCnt && segundos == repSg - 1) {
+					intervalo = intervalo + intervaloBase;
+					repSg = {$segundos} - Math.trunc(intervalo) - 1;
+					repCnt = 99 - Math.trunc((intervalo - Math.trunc(intervalo))*100);
+					console.log("Nuevo intervalo:",intervalo,"Proxima Repeticion:", repSg, ":", repCnt, "Tiempo:", segundos +':'+centesimas);
+					$("#foto").html("<h1><strong>Reposo</strong></h1>"); 
+				}
+
+				if(centesimas == 0){
+					--segundos;
+					centesimas = 99;
+				}else{
+					--centesimas;
+				}
+				h1.innerHTML = segundos +':'+centesimas;
+
+			}
+		
+		}
+	}
+		
+	function inicio(){
+		$('#salir').hide();
+		$('#init').hide();
+		segundos = {$segundos};
+		setInterval(run, 10);
+	}
+	function done() {
+		window.location.href="ver_datos_paciente.php?variable={$id_admin}&id={$id_prueba}";
+	}
+	function salir() {
+		window.location.href="add_reg.php?variable={$id_admin}&id={$dni_paciente}&id_prueba={$id_prueba}&accion=1";	
+	}
+	function beep() {
+		snd1.play();
+	}
+	function check(){
+		snd2.play();
+	}
+</script>
+{include file="footer.tpl"}
diff --git a/templates/barra.tpl b/templates/barra.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..fcff28b81721e6ec7b07929ff1c057dcf74ba469
--- /dev/null
+++ b/templates/barra.tpl
@@ -0,0 +1,149 @@
+<!-- Barra de menu -->
+{if $id_admin == 4100001}
+<body class="nav-sm">
+{else}
+<body class="nav-md">
+{/if}
+  <div class="container body">
+    <div class="main_container">
+
+      <!-- Contenedor total -->
+      <div class="col-md-3 left_col menu_fixed">
+        <div class="left_col scroll-view">
+          <div class="navbar nav_title" style="border: 0;">
+            <a  data-toggle="tooltip" data-placement="bottom" title="Inicio" href="result.php?variable={$id_admin}" class="site_title"><i class="fa fa-home"></i> <span style="font-size: 0.8em; ">Sensores de presión</span></a>
+          </div>
+          <div class="clearfix"></div>
+
+          <!-- menu profile quick info -->
+          <div class="profile clearfix">
+            <div class="profile_pic">
+              <img src="{$imagen_id}" alt="Foto trabajador" class="img-circle profile_img">
+            </div>
+            <div class="profile_info">
+              <span>Bienvenido,</span>
+              <h2>{$nombre}</h2>
+            </div>
+          </div>
+          <!-- /menu profile quick info -->
+
+          <br/>
+
+         <!-- sidebar menu -->
+          <div id="sidebar-menu" class="main_menu_side hidden-print main_menu">
+            <div class="menu_section">
+<!-- GENERAL -->
+          <h3>General</h3>
+              <ul class="nav side-menu">
+              <!-- AÑADIR PACIENTES -->
+              <li><a href="add_pac.php?variable={$id_admin}">Añadir pacientes</a></li>
+              <!-- REALIZAR PRUEBA -->
+              <li><a href="add_reg.php?variable={$id_admin}">Realizar prueba</a></li>
+              <!-- GESTIONAR ENSAYOS -->
+              <li><a href="ges_ens.php?variable={$id_admin}">Gestionar ensayos</a></li>
+              <!-- GESTIONAR PATOLOGIAS -->
+              <li><a href="ges_pat.php?variable={$id_admin}">Gestionar patologías</a></li>
+              
+             
+<!-- OTROS -->
+            <h3>Otros</h3>
+              <ul class="nav side-menu">
+             
+<!-- PAGINAS ADICIONALES -->
+                
+                <li><a data-toggle="tooltip" data-placement="top" title="Gestión de Sujetos Sanos"><i class="fa fa-bug"  ></i> Gestión de sujetos <span class="fa fa-chevron-down"></span></a>
+                  <ul class="nav child_menu">
+                    <li><a href="prueba_sujeto.php?variable={$id_admin}">Añadir prueba a sujeto</a></li>
+                    <li><a href="ver_pruebas_sujetos.php?variable={$id_admin}">Ver pruebas de sujetos</a></li>
+                    </li>
+                  </ul>
+                </li>
+              </ul>
+            </div>
+          </div>
+          
+          <!-- /sidebar menu -->
+
+          <!-- /menu footer buttons -->
+          <div class="sidebar-footer hidden-small">
+            <!-- Quito la configuración de perfil
+            <a data-toggle="tooltip" data-placement="top" title="Settings" href="mod_perfil.php?variable={$id_admin}">
+              <span class="glyphicon glyphicon-cog" aria-hidden="true"></span>
+            </a> Quito la pantalla completa
+            <a data-toggle="tooltip" data-placement="top" title="FullScreen">
+              <span class="glyphicon glyphicon-fullscreen" aria-hidden="true" onclick="fullscreen()"></span>
+            </a> -->
+            <!-- Quito el bloqueo
+            <a data-toggle="tooltip" data-placement="top" title="Lock">
+              <span class="glyphicon glyphicon-eye-close" aria-hidden="true"></span>
+            </a> -->
+            <a data-toggle="tooltip" data-placement="top" title="Logout" href="log_out.php">
+              <span class="glyphicon glyphicon-off" aria-hidden="true"></span>
+            </a>
+          </div>
+          <!-- /menu footer buttons -->
+        </div>
+      </div>
+
+      <!-- top navigation -->
+      <div class="top_nav">
+        <div class="nav_menu">
+          <nav>
+            <div class="nav toggle">
+              <a id="menu_toggle"><i class="fa fa-bars"></i></a>
+            </div> 
+            <!-- Aquí se muestra la información de cargando que habrá que modificar-->
+            <ul class="nav navbar-nav navbar-left"><h4 id="titulo" style="margin-top: 19px;" ><!-- <i class="fa fa-spinner fa-spin fa-fw"></i> Cargando. Espere --> </h4></ul>
+            <ul class="nav navbar-nav navbar-right">
+            <!-- Aquí se muestra la información de cargando que habrá que modificar-->
+              <li class="">
+                <a href="javascript:;" class="user-profile dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
+                  <img src="{$imagen_id}" alt="Foto trabajador">
+                  <span class=" fa fa-angle-down"></span>
+                </a>
+                <ul class="dropdown-menu dropdown-usermenu pull-right">
+                  <li><a href="mod_pass.php?variable={$id_admin}"><i class="fa fa-cogs pull-right"></i>Cambiar contraseña</a></li>
+                  
+                  <li><a href="log_out.php"><i class="fa fa-sign-out pull-right"></i> Cerrar sesión</a></li>
+                  
+                </ul>
+              </li>
+              <!-- Modificar Usuarios si se tiene permiso-->
+              {if $permisos == 1 }
+                <li class="">
+                <a href="javascript:;" class="user-profile dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
+                Gestión
+                <span class=" fa fa-angle-down"></span>
+                </a>
+                <ul class="dropdown-menu dropdown-usermenu pull-right">
+                    <li><a href="add_gestor.php?variable={$id_admin}">Añadir trabajador</a></li>
+                    <li><a href="mod_gestor.php?variable={$id_admin}">Modificar trabajador</a></li>
+
+                </ul> 
+                </li> 
+               {/if}
+              
+            </ul>
+          </nav>
+        </div>
+      </div>
+      <!-- /top navigation -->
+
+			<!-- page content -->
+			<div class="right_col" role="main" id="contenido">
+
+<!--
+<script type="text/javascript">
+	$(document).ready(function(){
+    /**
+     * Determinar si una imagen existe por la propiedad naturalHeight
+     * la cual sera diferente de 0 si esta existe
+     **/
+    $('img').each(function(){
+        if($(this)[0].naturalHeight == 0){
+            $(this).attr('src','media/images/no_image/no_image.png');
+        }
+    }); 
+});	
+</script>
+-->
\ No newline at end of file
diff --git a/templates/endTabla.tpl b/templates/endTabla.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..28dcd7919b8dabee174591841b1eb2f6e3f6b0fe
--- /dev/null
+++ b/templates/endTabla.tpl
@@ -0,0 +1,88 @@
+    <!-- Se cierra la tabla -->
+
+    <!-- Ahora hay que cerrar las etiquetas-->
+		</table>
+
+<script type="text/javascript">
+
+	$(document).ready(function() {
+      var columnas= [
+              { width: '7%', targets: 0 },
+              { width: '7%', targets: 1 },
+              { width: '46%', targets: 2 },
+              { width: '10%', targets: 3 },
+              { width: '10%', targets: 4 },
+              { width: '10%',  targets: 5 , render: $.fn.dataTable.render.moment('YYYY-MM-DD hh:mm:ss', 'DD-MM-YYYY hh:mm:ss')},//hora
+              { width: '10%', targets: 6 }
+        ];
+	    $('#datatable').DataTable({
+        dom: 'Bfrtip',
+        lengthMenu: [
+            [ 100, 250, 500, -1 ],
+            [ '100 filas', '250 filas', '500 filas', 'Todas las filas' ]
+        ],
+        autoWidth: true,
+        fixedHeader: false,
+        columnDefs: columnas,
+        FixedColumns: true  ,
+        buttons: [
+            'pageLength',
+            {
+                extend: 'collection',
+                text: 'Exportar',
+                buttons: [
+            	    'copy',
+                    {
+                       extend: 'pdf',
+                       text: 'PDF',
+                       exportOptions: {
+                          modifier: {
+                             page: 'current'
+                          }
+                       },
+                       message: 'PDF creado por Paula & co.',
+                       header: true,
+                       title: 'Prioridades del Kaizen',
+                       //orientation: 'landscape',
+                       download: 'open',
+                       customize: function(doc) {
+                          doc.defaultStyle.fontSize = 6; //<-- set fontsize to 16 instead of 10 
+                          doc.pageOrientation = 'landscape';
+                          doc.styles.tableHeader.fontSize = 7;
+                          doc.styles.tableHeader.color ='white';
+                          doc.styles.title.fontSize = 10;
+                          //console.log(doc.content.table.margin);
+
+                          //doc.styles.table.alignment = 'center';
+                          // NO VA doc.styles.table.width = 50;
+                       }  
+                    },
+                    'csv', 'excel',
+                    {
+                        extend: 'print',
+                        text: 'Imprimir',
+                        autoPrint: true,
+                        exportOptions: {
+                            columns: ':visible',
+                        },
+                        customize: function (win) {
+                            $(win.document.body).find('table').addClass('display').css('font-size', '7px');
+                            $(win.document.body).find('tr:nth-child(odd) td').each(function(index){
+                                $(this).css('background-color','#D0D0D0');
+                            });
+                                //mio
+                            $(win.document.body).find('h1').css('font-size','20px');
+                            $(win.document.body).find('h1').css('margin-bottom','20px');
+                            $(win.document.body).find('h1').css('text-align','center');
+                        }
+
+                    }
+                ]
+            }
+        ]
+       
+	    });
+
+	} );
+
+</script>
diff --git a/templates/footer.tpl b/templates/footer.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..6ecec10e03720a88abfd20bad1da436ca79f1ce4
--- /dev/null
+++ b/templates/footer.tpl
@@ -0,0 +1,33 @@
+      <!-- Java Script... -->
+
+
+        <!--********************************************************
+    <script type="text/javascript" src="/sources/dropzone/dist/dropzone.js"></script>-->
+
+
+    <script type="text/javascript" src="/sources/js/custom.min.iacob.js"></script>
+    <!-- ECharts -->
+    <script type="text/javascript" src="/sources/echarts/dist/echarts.min.js"></script>
+
+
+        <!-- hemos traducido parte del fichero para la barra de búsqueda  -->
+        <script type="text/javascript" src="/sources/js/jquery.dataTables.es.min.js"></script>
+
+
+      <!-- para datatables -->
+
+        <script type="text/javascript" src="/sources/js/dataTables.bootstrap.min.js"></script>
+        <script type="text/javascript" src="/sources/js/dataTables.fixedColumns.min.js"></script>
+
+      <!-- para los botones pdf excel csv print... -->
+
+        <!-- hemos traducido parte del fichero para el boton "show"  -->
+    <script type="text/javascript" src="/sources/Buttons-1.3.1/js/dataTables.buttons.es.min.js"></script>
+    <script type="text/javascript" src="/sources/Buttons-1.3.1/js/buttons.flash.min.js"></script>
+    <script type="text/javascript" src="/sources/JSZip-3.1.3/jszip.min.js"></script>
+
+    <script type="text/javascript" src="/sources/Buttons-1.3.1/js/buttons.html5.min.js"></script>
+    <script type="text/javascript" src="/sources/Buttons-1.3.1/js/buttons.print.min.js"></script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/templates/ges_ens.tpl b/templates/ges_ens.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..001fbbe5914a91e6ac6dcc90547c4354daa8dbeb
--- /dev/null
+++ b/templates/ges_ens.tpl
@@ -0,0 +1,198 @@
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	{include file="head.tpl"}
+	<!-- Barra de menu -->
+	{include file="barra.tpl"}
+	
+	<!-- Zona Central -->
+<script type="text/javascript">
+
+	function limita(maximoCaracteres) {
+	  var elemento = document.getElementById("texto");
+	  if(elemento.value.length >= maximoCaracteres ) {
+	    return false;
+	  }
+	  else {
+	    return true;
+	  }
+	}
+	 	
+</script> 
+
+<div class="" role="main">
+	<div class="">
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+				{if $mod_campos} 
+					<div class="x_content">
+						<h4 style = "text-align: center;">{$mensaje}</h4>
+						<div class="clearfix"></div>
+						<form class="form-horizontal form-label-left" action="ges_ens_val.php?variable={$id_admin}&id={$mod_campos[0]}" method="post">
+{literal}
+							<!-- id_ensayo -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">id_ensayo *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="11" name="id_ensayo" required disabled type="text" 
+									{/literal}value="{$mod_campos[0]}" >{literal}
+								</div>
+							</div>
+
+							<!-- Tipo/Nombre -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Tipo *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="50" name="tipo" required type="text" {/literal}value="{$mod_campos[1]}" >{literal}	
+								</div>
+							</div>
+
+							<!-- Colocacion Sensores -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Colocación sensores *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<textarea class="form-control col-md-7 col-xs-12" rows="3" data-validate-length-range="300" name="coloc_sensores" required type="text">{/literal}{$mod_campos[2]}{literal}</textarea>
+								</div>
+							</div>
+
+							<!-- Duracion -->
+							<!--<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Duracion *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="11" name="duracion" required type="decimal" {/literal}value="{$mod_campos[3]}" >{literal}	
+								</div>
+							</div>-->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Duración *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12" >
+									<select class="select2_single form-control" required name="duracion">
+										<option value=""></option>
+										<option value="10">10</option>
+										<option value="30">30</option>
+										<option value="45">45</option>
+										<option value="60">60</option>
+										<option value="75">75</option>
+										<option value="90">90</option>
+									</select>
+								</div>
+							</div>
+
+							<!-- Repeticiones -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Repeticiones *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="11" name="repeticiones" required type="decimal" {/literal}value="{$mod_campos[4]}" >{literal}	
+								</div>
+							</div>
+
+							<!-- Comentarios -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Comentarios 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<textarea class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="comentarios" type="text" {/literal}value="{$mod_campos[5]}" >{literal}</textarea>
+								</div>
+							</div>
+{/literal}
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button>
+									<button id="send" type="submit" class="btn btn-success">Guardar</button>
+									<button onclick="eliminar()" type="button" class="btn btn-danger">Eliminar</button>	
+								</div>
+							</div>
+						</form>
+						
+					</div>
+					{else}
+						
+						<!-- tabla para seleccionar patologia -->
+						<div class="x_content">
+						<h4 style = "text-align: center;">{$mensaje}</h4>
+						<div class="clearfix"></div>
+							<div class="tablas">
+								<table id="example" class="table table-striped table-bordered" cellspacing="0" width="99%" role="grid" data-order="[[ 1, &quot;asc&quot; ]]">
+
+									<thead>
+										<tr>
+											<td>id_ensayo</td>
+											<td>Tipo / Nombre</td>
+											<td>Colocación Sensores</td>
+											<td>Duración</td>
+											<td>Repeticiones</td>
+											<td>Comentarios</td>
+											<td>Fecha creación</td>
+											<td>Fecha modificación</td>
+										</tr>
+									</thead>
+
+									<tbody>
+										{foreach from=$campos item=element}
+											<tr >
+												<td>{$element[0]}</td>
+												<td>{$element[1]}</td>
+												<td>{$element[2]}</td>
+												<td>{$element[3]}</td>
+												<td>{$element[4]}</td>
+												<td>{$element[5]}</td>
+												<td>{$element[6]|date_format:"%d/%m/%Y"}</td>
+												<td>{$element[7]|date_format:"%d/%m/%Y"}</td>
+											</tr>
+										{/foreach}
+									</tbody>
+								</table>
+							</div>
+							<div class="col-md-6 col-md-offset-3">
+									<button onclick="n_ensayo()" type="button" class="btn btn-primary">Nuevo ensayo</button>
+							</div>
+						</div>
+					{/if}
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<script type="text/javascript">
+	//estado();
+	function cancel() {
+		window.location.href="ges_ens.php?variable={$id_admin}";
+	}
+	function eliminar() {
+		var reply=confirm("¿Seguro que desea borrar el ensayo? \nSe borrarán todas las pruebas asociadas a este ensayo.")
+		if (reply==true) 
+		{
+		window.location.href="ges_ens.php?variable={$id_admin}&id={$mod_campos[0]}&accion=1";
+		}
+		else 
+		{
+		//AQUI NO HARIA NADA, SE CERRARIA EL POPUP Y SEGUIRIA EN LA PAGINA ACTUAL
+		}
+		
+	}
+	function n_ensayo() {
+		window.location.href="ges_ens_nuevo.php?variable={$id_admin}";
+	}
+	$(document).ready(function() {
+	    $('#example').DataTable({
+   	        lengthMenu: [
+					[ 10, 25, 100, -1 ],
+					[ '10 filas', '25 filas', '100 filas', 'Todas las filas' ]
+        ]
+ 	    });
+	    var table = $('#example').DataTable();
+	 
+	    $('#example tbody').on( 'click', 'tr', function () {
+	        $(this).toggleClass('selected');
+			window.location.href="ges_ens.php?variable={$id_admin}&id="+table.rows('.selected').data()[0][0];
+	    } );
+	} );
+
+</script>
+	{include file="footer.tpl"}
diff --git a/templates/ges_ens_nuevo.tpl b/templates/ges_ens_nuevo.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..cbc3f75631bfedd749375ad8fe7834305dc68e59
--- /dev/null
+++ b/templates/ges_ens_nuevo.tpl
@@ -0,0 +1,108 @@
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	{include file="head.tpl"}
+	<!-- Barra de menu -->
+	{include file="barra.tpl"}
+	
+	<!-- Zona Central -->
+<script type="text/javascript">
+
+	function limita(maximoCaracteres) {
+	  var elemento = document.getElementById("texto");
+	  if(elemento.value.length >= maximoCaracteres ) {
+	    return false;
+	  }
+	  else {
+	    return true;
+	  }
+	}
+	 	
+</script> 
+<div class="" role="main">
+	<div class="">
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+				<div class="x_title">
+							<h2> {$mensaje}<small></small></h2>
+				<div class="clearfix"></div>
+						</div>
+					<div class="x_content">
+						<form class="form-horizontal form-label-left" action="ges_ens_nuevo.php?variable={$id_admin}" method="post">
+							
+							<!-- Tipo / Nombre -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Tipo (Nombre) *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="50" name="tipo" required type="text" >
+								</div>
+							</div>
+
+							<!-- Colocacion sensores -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Colocación Sensores *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="300" name="coloc_sensores" required type="text" >
+								</div>
+							</div>
+
+							
+							<!-- Duracion -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Duración *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12" >
+									<select class="select2_single form-control" required name="duracion">
+										<option value=""></option>
+										<option value="10">10</option>
+										<option value="30">30</option>
+										<option value="45">45</option>
+										<option value="60">60</option>
+										<option value="75">75</option>
+										<option value="90">90</option>
+									</select>
+								</div>
+							</div>
+
+							<!-- Repeticiones -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Repeticiones *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="11" name="repeticiones" required type="number" placeholder="Número de repeticiones">
+								</div>
+							</div>
+
+							<!-- Comentarios -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Comentarios 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="comentarios" type="textarea" >
+								</div>
+							</div>
+
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button>
+									<button id="send" type="submit" class="btn btn-success">Guardar</button>
+								</div>
+							</div>
+						</form>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<script type="text/javascript">
+	//estado();
+	function cancel() {
+		window.location.href="ges_ens.php?variable={$id_admin}";
+	}
+
+</script>
+{include file="footer.tpl"}
diff --git a/templates/ges_pat.tpl b/templates/ges_pat.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..1f8dfecf14ceafef44cb577b56fe36f34cb0f9b5
--- /dev/null
+++ b/templates/ges_pat.tpl
@@ -0,0 +1,134 @@
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	{include file="head.tpl"}
+	<!-- Barra de menu -->
+	{include file="barra.tpl"}
+	
+	<!-- Zona Central -->
+
+
+<div class="" role="main">
+	<div class="">
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+				{if $mod_campos} 
+					<div class="x_content">
+						<h4 style = "text-align: center;">{$mensaje}</h4>
+						<div class="clearfix"></div>
+						<form class="form-horizontal form-label-left" action="ges_pat_val.php?variable={$id_admin}&id={$mod_campos[0]}" method="post">
+{literal}
+							<!-- id_patologia -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">id_patologia
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="10" name="id_patologia" required disabled type="text" 
+									{/literal}value="{$mod_campos[0]}" >{literal}
+								</div>
+							</div>
+
+							<!-- Nombre -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="100" name="nombre" required type="text" {/literal}value="{$mod_campos[1]}" >{literal}	
+								</div>
+							</div>
+
+							<!-- Descripción -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Descripción
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="200" name="descripcion" type="text" {/literal}value="{$mod_campos[2]}" >{literal}
+								</div>
+							</div>
+{/literal}
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button>
+									<button id="send" type="submit" class="btn btn-success">Guardar</button>
+									<button onclick="eliminar()" type="button" class="btn btn-danger">Eliminar</button>	
+								</div>
+							</div>
+						</form>
+						
+					</div>
+					{else}
+						
+						<!-- tabla para seleccionar patologia -->
+						<div class="x_content">
+						<h4 style = "text-align: center;">{$mensaje}</h4>
+						<div class="clearfix"></div>
+							<div class="tablas">
+								<table id="example" class="table table-striped table-bordered" cellspacing="0" width="99%" role="grid" data-order="[[ 1, &quot;asc&quot; ]]">
+
+									<thead>
+										<tr>
+											<td>id_patologia</td>
+											<td>Nombre</td>
+											<td>Descripción</td>
+										</tr>
+									</thead>
+
+									<tbody>
+										{foreach from=$campos item=element}
+											<tr >
+												<td>{$element[0]}</td>
+												<td>{$element[1]}</td>
+												<td>{$element[2]}</td>
+											</tr>
+										{/foreach}
+									</tbody>
+								</table>
+							</div>
+							<div class="col-md-6 col-md-offset-3">
+									<button onclick="n_patologia()" type="button" class="btn btn-primary">Nueva patologia</button>
+							</div>
+						</div>
+					{/if}
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<script type="text/javascript">
+
+	function cancel() {
+		window.location.href="ges_pat.php?variable={$id_admin}";
+	}
+	function eliminar() {
+		var reply=confirm("¿Seguro que desea borrar la patologia?")
+		if (reply==true) 
+		{
+		window.location.href="ges_pat.php?variable={$id_admin}&id={$mod_campos[0]}&accion=1";
+		}
+		else 
+		{
+		//AQUI NO HARIA NADA, SE CERRARIA EL POPUP Y SEGUIRIA EN LA PAGINA ACTUAL
+		}
+		
+	}
+	function n_patologia() {
+		window.location.href="ges_pat_nueva.php?variable={$id_admin}";
+	}
+	$(document).ready(function() {
+	    $('#example').DataTable({
+   	        lengthMenu: [
+					[ 10, 25, 100, -1 ],
+					[ '10 filas', '25 filas', '100 filas', 'Todas las filas' ]
+        ]
+ 	    });
+	    var table = $('#example').DataTable();
+	 
+	    $('#example tbody').on( 'click', 'tr', function () {
+	        $(this).toggleClass('selected');
+			window.location.href="ges_pat.php?variable={$id_admin}&id="+table.rows('.selected').data()[0][0];
+	    } );
+	} );
+
+</script>
+{include file="footer.tpl"}
diff --git a/templates/ges_pat_nueva.tpl b/templates/ges_pat_nueva.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..9d29034a215da1d44714ca7f8d6afcd3d9769ad4
--- /dev/null
+++ b/templates/ges_pat_nueva.tpl
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	{include file="head.tpl"}
+	<!-- Barra de menu -->
+	{include file="barra.tpl"}
+	
+	<!-- Zona Central -->
+<script type="text/javascript">
+
+	function limita(maximoCaracteres) {
+	  var elemento = document.getElementById("texto");
+	  if(elemento.value.length >= maximoCaracteres ) {
+	    return false;
+	  }
+	  else {
+	    return true;
+	  }
+	}
+	 	
+</script> 
+<div class="" role="main">
+	<div class="">
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+				<div class="x_title">
+							<h2> {$mensaje}<small></small></h2>
+				<div class="clearfix"></div>
+						</div>
+					<div class="x_content">
+						<form class="form-horizontal form-label-left" action="ges_pat_nueva.php?variable={$id_admin}" method="post">
+							
+							<!-- Nombre -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="100" name="nombre" required type="text" >
+								</div>
+							</div>
+
+							<!-- Descripción -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Descripción
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="200" name="descripcion" type="text" >
+								</div>
+							</div>
+
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button>
+									<button id="send" type="submit" class="btn btn-success">Guardar</button>
+								</div>
+							</div>
+						</form>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<script type="text/javascript">
+	//estado();
+	function cancel() {
+		window.location.href="ges_pat.php?variable={$id_admin}";
+	}
+
+</script>
+{include file="footer.tpl"}
diff --git a/templates/head.tpl b/templates/head.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..5c5e0384e63b61512675945ee76c618c6408cbe2
--- /dev/null
+++ b/templates/head.tpl
@@ -0,0 +1,67 @@
+<html lang="es">
+<head>
+    <link rel="icon" href="media/images/favicon/sensor.png">
+    <title>TFG. Sensor de presi&oacuten</title>
+
+	<title>{$titulo}</title>
+		<meta charset="utf-8">
+			<!-- Al ser un entorno Mobile first, tendremos que corregir la escala y ancho de inicio del dispositivo -->
+		<meta name="viewport" content="width=device-width, initial-scale=1"> 
+    
+
+      <!-- Estilo bootstrap...-->
+		
+		<link rel="stylesheet" type="text/css" href="/sources/css/bootstrap-datetimepicker.min.css"/>
+		<link rel="stylesheet" type="text/css" href="/sources/bootstrap/dist/css/bootstrap.css"/>
+		<link rel="stylesheet" type="text/css" href="/sources/css/daterangepicker.css"/>
+
+    	<!-- para datatables -->
+        <link rel="stylesheet" type="text/css" href="/sources/css/dataTables.bootstrap.min.css"/>
+        <link rel="stylesheet" type="text/css" href="/sources/css/fixedColumns.dataTables.min.css"/>
+ 
+    	<!-- para los botones pdf excel... -->
+
+		<link rel="stylesheet" type="text/css" href="/sources/Buttons-1.3.1/css/buttons.dataTables.min.css"/>
+
+	    <!-- ******************************************************-->
+
+	    <!-- Font Awesome -->
+	    <link rel="stylesheet" type="text/css" href="/sources/font-awesome/css/font-awesome.min.css">
+ 		
+        <!-- Teclado virtual -->
+        
+        <link rel="stylesheet" href="css/styles.css">
+
+		<!-- Custom Theme Style -->
+		<link rel="stylesheet" type="text/css" href="/sources/css/custom.iacob.css">
+
+
+      <!-- ******************************************************** -->
+
+      <!-- Nuestro estilo propio... -->
+
+		<link rel="stylesheet" type="text/css" href="/sources/css/estilo.css"/>
+    
+      <!-- jquery  
+    <script type="text/javascript" src="/sources/jQuery-3.2.1/jquery-3.2.1.js"></script>-->
+      <!--      -->
+      <script type="text/javascript" src="/sources/jquery/dist/jquery.min.js"></script>
+    <script type="text/javascript" src="/sources/js/bootstrap.js"></script>
+    <!-- Select2 ->
+    <script type="text/javascript" src="/sources/select2/dist/js/select2.full.min.js"></script>
+ 
+      <!-- Graficos... -->
+
+    <script src="/sources/Chart.js/dist/Chart.bundle.js"></script>
+    <!-- including ECharts file -->
+    <script type="text/javascript" src="/sources/echarts/dist/echarts.min.js"></script>
+
+    <style>
+    canvas {
+        -moz-user-select: none;
+        -webkit-user-select: none;
+        -ms-user-select: none;
+    }
+    </style>
+    <!-- -->
+</head>
diff --git a/templates/inicio.tpl b/templates/inicio.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..814a4c53f8e9e81c350fa6e273a719c9e5c14286
--- /dev/null
+++ b/templates/inicio.tpl
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	{include file="head.tpl"}
+<div class="row">
+	<div class="x_panel">
+		<div class="x_title">
+		<h2> Bienvenido a la {$titulo}<small></small></h2>
+		<div class="clearfix"></div>
+		</div>
+		
+		<div class="x_content">
+			<form class="form-horizontal form-label-left" action="login.php" method="post">
+
+				<!-- Mensaje en caso de error de autenticación -->
+				<div class="x_title">
+				<p style="color:red;">{$mensaje}</p>
+				<div class="clearfix"></div>
+				</div>
+
+				<!-- Usuario -->
+				<div class="item form-group">
+					<label class="control-label col-md-6 col-sm-6 col-xs-12" for="name">Nick de usuario
+					</label>
+					<div class="col-md-3 col-sm-3 col-xs-3">
+						<input class="select2_single form-control" name="login">
+					</div>
+				</div>
+
+				<!-- Pass -->
+				<div class="item form-group">
+					<label class="control-label col-md-6 col-sm-6 col-xs-12" for="name">Contraseña
+					</label>
+					<div class="col-md-3 col-sm-3 col-xs-3">
+						<input class="select2_single form-control" required maxlength="40" type="password" name="pass">
+					</div>
+				</div>
+				<div class="item form-group">
+					<div class="col-md-6 col-sm-6 col-xs-12"></div>
+					<div class="col-md-3 col-sm-3 col-xs-3">
+						<button type="submit" class="p1" class="btn btn-success">Enviar</button>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+</div>
+	{include file="footer.tpl"}
diff --git a/templates/login.tpl b/templates/login.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..7395fc054e4ecebb2c1f0cd06ce3788496c74ab2
--- /dev/null
+++ b/templates/login.tpl
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html lang="es">
+<head>
+	<meta charset="UTF-8">
+	<title>{$titulo}</title>
+</head>
+<body>
+	<script> 
+        window.location.href='result.php?variable={$id_admin}'; 
+	</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/templates/mod_gestor.tpl b/templates/mod_gestor.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..5038accdb8342ba731db6bb037c8ef6a518c3d5d
--- /dev/null
+++ b/templates/mod_gestor.tpl
@@ -0,0 +1,186 @@
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	{include file="head.tpl"}
+	<!-- Barra de menu -->
+	{include file="barra.tpl"}
+	
+	<!-- Zona Central -->
+
+<div class="" role="main">
+	<div class="">
+		<div class="page-title"> 
+			<div class="title_left">
+			</div>
+
+		</div>
+		<div class="clearfix"></div>
+
+		<div class="row">
+			{if $mod_campos} 
+			<div class="col-md-4 col-sm-4 col-xs-12">
+				<div class="x_panel">
+					<div class="x_content">
+						<div class="x_title">
+							<h2> {$mensaje}<small></small></h2>
+							<div class="clearfix"></div>
+						</div>
+
+			            <div class="profile_pic">
+	    		        	<img src="{$mod_campos[6]}" alt="..." class="img-circle profile_img">
+	            		</div>
+					</div>
+				</div>
+			</div>
+			<div class="col-md-8 col-sm-8 col-xs-12">
+			{else}
+			<div class="col-md-12 col-sm-12 col-xs-12">
+			{/if}
+				<div class="x_panel">
+				{if $mod_campos} 
+					<div class="x_content">
+						<form class="form-horizontal form-label-left" action="mod_gestor_val.php?variable={$id_admin}&id={$mod_campos[0]}" method="post">
+						{literal}
+							<!-- dni_trabajador -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI Trabajador *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="9" name="id_ensayo" required disabled type="text" 
+									{/literal}value="{$mod_campos[0]}" >{literal}
+								</div>
+							</div>
+
+							<!-- Nombre -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control" required maxlength="40" type="text"  name="nombre" {/literal} value="{$mod_campos[2]}">{literal}
+								</div>
+							</div>
+
+							<!-- Apellidos -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Apellidos *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control" required maxlength="50" type="text" name="apellidos" {/literal} value="{$mod_campos[3]}">{literal}
+								</div>
+							</div>
+
+							<!-- login -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Login *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control"  required maxlength="10" type="text" name="login" {/literal} value="{$mod_campos[1]}">{literal}
+								</div>
+							</div>
+
+							<!-- titulacion -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Titulación *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control" required maxlength="20" type="text" name="titulacion" {/literal} value="{$mod_campos[4]}">{literal}
+								</div>
+							</div>
+
+							<!-- Pass -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Contraseña
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control" maxlength="40" minlength="6" type="password" placeholder="Mínimo 6 carácteres" name="pass">
+								</div>
+							</div>
+
+							<!-- Repass -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Repita contraseña
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control" maxlength="40" minlength="6" type="password" placeholder="Mínimo 6 carácteres"  name="passrw">
+								</div>
+							</div>
+
+							<!-- Permisos -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Permisos *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control" maxlength="1" required type="text" name="permisos" placeholder="0:R - 1:RW - 2:RWX" {/literal} value="{$mod_campos[5]}">{literal}
+								</div>
+							</div>
+							{/literal}
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button type="button" onclick="cancel()" class="btn btn-warning">Cancelar</button>
+									<button id="send" type="submit" class="btn btn-success">Validar</button>
+								</div>
+							</div>
+						</form>
+					</div>
+
+				{else}
+					<div class="x_content">
+						<h4 style = "text-align: center;">{$mensaje}</h4>
+						<div class="tablas">
+						    <table id="example" class="table table-striped table-bordered" cellspacing="0" width="100%" role="grid" data-order="[[ 2, &quot;asc&quot; ]]">
+
+								<thead>
+									<tr>
+										<td>DNI</td>
+										<td>Foto</td>
+										<td>Login</td>
+										<td>Nombre</td>
+										<td>Apellidos</td>
+									</tr>
+								</thead>
+
+								<tbody>
+									{foreach from=$campos item=element}
+										<tr >
+											<td>{$element[0]}</td>
+											<td>
+								            <div class="profile_pic">
+						    		        	<img  style="padding: 0; margin-top: 0;" src="{$element[6]}" alt="..." class="img-circle profile_img">
+						            		</div>
+											</td>
+											<td>{$element[1]}</td>
+											<td>{$element[2]}</td>
+											<td>{$element[3]}</td>
+										</tr>
+									{/foreach}
+								</tbody>
+							</table>
+						</div>
+					</div>
+				{/if}
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script type="text/javascript">
+	function cancel() {
+		window.location.href="result.php?variable={$id_admin}";
+	}
+	$(document).ready(function() {
+	    $('#example').DataTable({
+   	        lengthMenu: [
+            [  -1 ],
+            [  'Todas las filas' ]
+        ]
+ 	    });
+	    var table = $('#example').DataTable();
+	 
+	    $('#example tbody').on( 'click', 'tr', function () {
+	        $(this).toggleClass('selected');
+			window.location.href="mod_gestor.php?variable={$id_admin}&nombre="+table.rows('.selected').data()[0][0];
+	    } );
+	} );
+</script>
+{include file="footer.tpl"}
diff --git a/templates/mod_pass.tpl b/templates/mod_pass.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..a92dd55873981cf809326eba8034381142178795
--- /dev/null
+++ b/templates/mod_pass.tpl
@@ -0,0 +1,88 @@
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	{include file="head.tpl"}
+	<!-- Barra de menu -->
+	{include file="barra.tpl"}
+	
+	<!-- Zona Central -->
+
+<div class="" role="main">
+	<div class="">
+		<div class="page-title"> 
+			<div class="title_left">
+			</div>
+
+		</div>
+		<div class="clearfix"></div>
+
+		<div class="row">
+			<div class="col-md-4 col-sm-4 col-xs-12">
+				<div class="x_panel">
+					<div class="x_content">
+						<div class="x_title">
+							<h2> {$mensaje}<small></small></h2>
+							<div class="clearfix"></div>
+						</div>
+
+			            <div class="profile_pic">
+	    		        	<img src="{$imagen}" alt="..." class="img-circle profile_img">
+	            		</div>
+					</div>
+				</div>
+			</div>
+			<div class="col-md-8 col-sm-8 col-xs-12">
+				<div class="x_panel"> 
+					<div class="x_content">
+						<form class="form-horizontal form-label-left" action="mod_pass.php?variable={$id_admin}" method="post">
+						{literal}
+							
+							<!-- Old Pass -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Contraseña antigua *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control" maxlength="40" minlength="6" required type="password" placeholder="Mínimo 6 carácteres" name="oldpass">
+								</div>
+							</div>
+
+							<!-- Pass -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Contraseña nueva *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control" maxlength="40" minlength="6" required type="password" placeholder="Mínimo 6 carácteres" name="pass">
+								</div>
+							</div>
+
+							<!-- Repass -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Repita nueva contraseña *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control" maxlength="40" minlength="6" required type="password" placeholder="Mínimo 6 carácteres"  name="passrw">
+								</div>
+							</div>
+
+							{/literal}
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button type="button" onclick="cancel()" class="btn btn-warning">Cancelar</button>
+									<button id="send" type="submit" class="btn btn-success">Guardar</button>
+								</div>
+							</div>
+						</form>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script type="text/javascript">
+	function cancel() {
+		window.location.href="result.php?variable={$id_admin}";
+	}
+	
+</script>
+{include file="footer.tpl"}
\ No newline at end of file
diff --git a/templates/pac_reg.tpl b/templates/pac_reg.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..3d3aa2e42b67a70dc88ed7256216eb3f8b854ee9
--- /dev/null
+++ b/templates/pac_reg.tpl
@@ -0,0 +1,190 @@
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	{include file="head.tpl"}
+	<!-- Barra de menu -->
+	{include file="barra.tpl"}
+
+	<!-- Zona Central -->
+<div class="" role="main">
+	<form class="form-horizontal form-label-left" action="mod_pac.php?variable={$id_admin}" method="post">
+
+		<!-- tabla para seleccionar sujeto -->
+		<div class="x_content">
+			<h4 style = "text-align: center;">{$mensaje}</h4>
+		</div>
+
+		<div class="row">
+			<div class="col-md-6 col-sm-6 col-xs-24">
+			<!-- DNI -->
+			<div class="item form-group">
+				<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI *<span class="required"></span>
+				</label>
+				<div class="col-md-6 col-sm-6 ">
+					<input id="name" class="form-control col-md-10 col-xs-15" pattern="[0-9]{8}[A-Z]" data-validate-length-range="10" name="dni" readonly="readonly" type="text" 
+					value="{$sujeto[0]}">
+				</div>
+			</div>
+
+			<!-- Nombre -->
+			<div class="item form-group">
+				<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre *<span class="required"></span>
+				</label>
+				<div class="col-md-6 col-sm-6 col-xs-12">
+					<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="100" data-validate-words="2" name="nombre" required type="text" value="{$sujeto[1]}">
+				</div>
+			</div>
+
+			<!-- Apellidos -->
+			<div class="item form-group">
+				<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Apellidos *<span class="required"></span>
+				</label>
+				<div class="col-md-6 col-sm-6 col-xs-12">
+					<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="200"  name="apellidos" required type="text" value="{$sujeto[2]}">
+				</div>
+			</div>
+			</div>
+				
+			<div class="col-md-6 col-sm-6 col-xs-24">
+			<!-- Edad -->
+			<div class="item form-group">
+				<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Fecha nacimiento *<span class="required"></span>
+				</label>
+				<div class="col-md-6 col-sm-6 col-xs-12">
+					<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="200" data-validate-words="1"  name="edad" required type="date" value="{$sujeto[4]}">
+				</div>
+			</div>
+			<!-- Sexo -->
+			<div class="item form-group">
+				<div class="col-md-6 col-sm-6 col-xs-12" >
+					<div class="radio">
+						<label for="name" style="margin-left: 50px;"><b>Sexo Masculino &nbsp</b>
+						<input type="radio" {if $sujeto[3] == "M"}  checked=""  value="{$sujeto[3]}" {else} value="M" {/if} name="sexo" style="margin-left: 15px;"></label>
+						<label for="name" style="margin-left: 50px;"><b>Sexo Femenino &nbsp</b>
+						<input type="radio"   {if $sujeto[3] == "F"}  checked=""  value="{$sujeto[3]}" {else} value="F" {/if}  name="sexo"  style="margin-left: 15px;"> </label>
+					</div>
+				</div>
+			</div>
+				
+			<!-- Anotaciones -->
+					<div class="item form-group">
+						<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Anotaciones del paciente
+						</label>
+						<div class="col-md-6 col-sm-6 col-xs-12">
+							<textarea id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="anotaciones" type="text">{$sujeto[5]}</textarea>
+						</div>
+					</div>
+			</div>
+		</div>
+		<div class="form-group">
+			<div class="col-md-7 col-md-offset-4">
+				<button id="send" type="submit" class="btn btn-success">Guardar cambios</button>
+				<button onclick="eliminar()" type="button" class="btn btn-danger">Eliminar paciente</button>
+				<button onclick="realizar_prueba()" type="button" class="btn btn-info">Realizar prueba</button>
+				<button onclick="n_etiologia()" type="button" class="btn btn-info">Añadir etiología</button>
+			</div>
+		</div>
+	</form>
+		
+	<div class="ln_solid"></div>
+
+	<div class="x_content">
+		<div class="">
+			<h4 style = "text-align: center;">LISTADO DE PRUEBAS</h4>
+			<table id="example" class="table table-striped table-bordered" cellspacing="0" width="99%" role="grid" data-order="[[ 0, &quot;desc&quot; ]]" style="font-size:13px; ">
+				<thead>
+					<tr>
+						<td>id_prueba</td>
+						<td>Prueba</td>
+						<td>Fecha - Hora</td>
+						<td>Simetría</td>
+						<td>Anotaciones</td>
+					</tr>
+				</thead>
+
+				<tbody>
+					{foreach from=$entrada item=element}
+						<tr data-toggle="tooltip" data-placement="top" title="Click para ver documentación relaccionada" >
+							<td>{$element[0]}</td>
+							<td>{$element[1]}</td>
+							<td>{$element[2]|date_format:"%d/%m/%Y %H:%M:%S"}</td>
+							<td>{$element[3]}</td>
+							<td>{$element[4]}</td>
+						</tr>
+					{/foreach}
+				</tbody>
+			</table>
+		</div>
+	</div>
+	<div class="x_content">
+		<div class="">
+			<h4 style = "text-align: center;">LISTADO DE ETIOLOGÍAS</h4>
+			<table id="etiologias" class="table table-striped table-bordered" cellspacing="0" width="99%" role="grid" data-order="[[ 2, &quot;desc&quot; ]]" style="font-size:13px; ">
+				<thead>
+					<tr>
+						<td>id_etiologia</td>
+						<td>Descripción</td>
+						<td>Fecha aparición parálisis</td>
+						<td>Cuadrantes afectados</td>
+						<td>Comentarios de la etiología</td>
+						<td>Patología asociada</td>
+					</tr>
+				</thead>
+
+				<tbody>
+					{foreach from=$etiologia item=element}
+						<tr data-toggle="tooltip" data-placement="top" >
+							<td>{$element[0]}</td>
+							<td>{$element[1]}</td>
+							<td>{$element[2]|date_format:"%d/%m/%Y"}</td>
+							<td>{$element[3]}</td>
+							<td>{$element[4]}</td>
+							<td>{$element[5]}</td>
+						</tr>
+					{/foreach}
+				</tbody>
+			</table>
+		</div>
+	</div>
+</div>
+
+	
+<script type="text/javascript">
+	
+	function eliminar() {
+		var reply=confirm("¿Seguro que desea borrar el paciente, se borrarán las pruebas y etiologías asociadas?")
+		if (reply==true) 
+		{
+		window.location.href="result.php?variable={$id_admin}&id={$sujeto[0]}&accion=1";
+		}
+		else 
+		{
+		//AQUI NO HARIA NADA, SE CERRARIA EL POPUP Y SEGUIRIA EN LA PAGINA ACTUAL
+		}
+		
+	}
+	
+	function realizar_prueba(){
+		window.location.href="add_reg.php?variable={$id_admin}&id={$sujeto[0]}";
+	}
+
+	function n_etiologia(){
+		window.location.href="add_eti.php?variable={$id_admin}&id={$sujeto[0]}";
+	}
+	
+
+	$(document).ready(function() {
+	    $('#example').DataTable({
+   	    lengthMenu: [
+					[ 10, 25, 100, -1 ],
+					[ '10 filas', '25 filas', '100 filas', 'Todas las filas' ]
+        ]
+ 	    });
+	    var table = $('#example').DataTable();
+	 
+	    $('#example tbody').on( 'click', 'tr', function () {
+	        $(this).toggleClass('selected');
+			window.location.href="ver_datos_paciente.php?variable={$id_admin}&id="+table.rows('.selected').data()[0][0];
+	    } );
+	} );
+</script>
+{include file="footer.tpl"}
diff --git a/templates/prueba_sujeto.tpl b/templates/prueba_sujeto.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..890094636bc671931a2704ef0fde918d548cc8ac
--- /dev/null
+++ b/templates/prueba_sujeto.tpl
@@ -0,0 +1,130 @@
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	{include file="head.tpl"}
+	<!-- Barra de menu -->
+	{include file="barra.tpl"}
+	
+	<!-- Zona Central -->
+<script type="text/javascript">
+
+	function limita(maximoCaracteres) {
+	  var elemento = document.getElementById("texto");
+	  if(elemento.value.length >= maximoCaracteres ) {
+	    return false;
+	  }
+	  else {
+	    return true;
+	  }
+	}
+	
+</script> 
+
+<div class="" role="main">
+	<div class="">
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+					<div class="x_content">
+						
+
+						<h2 style = "text-align: center;">Información del sujeto {$mensaje}</h2>
+						<form class="form-horizontal form-label-left" action="prueba_sujeto_val.php?variable={$id_admin}" method="post">
+
+							<!-- Edad -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Edad*
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" name="edad" type="number" required placeholder="En años">
+								</div>
+							</div>
+
+							<!-- Sexo -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name" >Sexo Masculino* 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<div class="radio">
+										<input type="radio" name="sexo"  value="M" required style="margin-left: 0px;">  
+									</div>
+								</div>
+							</div>
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name" >Sexo Femenino*
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<div class="radio">
+										<input type="radio" name="sexo" value="F" style="margin-left: 0px;">  
+									</div>
+								</div>
+							</div>
+
+							<!-- Anotaciones Sujeto-->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Comentarios del sujeto
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<textarea id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="anotaciones_sujeto" type="text"></textarea>
+								</div>
+							</div>
+
+							
+							
+							<!-- ensayo -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Tipo de ensayo *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12" >
+									<select class="select2_single form-control" name="ensayo" required>
+										<option value=""></option>
+										{foreach item=element from=$ensayos} 
+										<option value="{$element}">{$element}</option>
+										{/foreach}
+									</select>
+								</div>
+							</div>
+
+							<!-- Simetria -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Simetria de la prueba
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="10" name="simetria" type="text">
+								</div>
+							</div>
+
+							<!-- Anotaciones prueba-->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Anotaciones de la prueba
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<textarea id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="anotaciones_prueba" type="text"></textarea>
+								</div>
+							</div>
+
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button>
+									<button id="send" type="submit" class="btn btn-success">Iniciar</button>
+									<button onclick="limpiar()" type="button" class="btn btn-info">Limpiar</button>
+								</div>
+							</div>
+						</form>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<script type="text/javascript">
+	//estado();
+	function cancel() {
+		window.location.href="result.php?variable={$id_admin}";
+	}
+	function limpiar() {
+		window.location.href="prueba_sujeto.php?variable={$id_admin}";
+	}
+
+</script>
+{include file="footer.tpl"}
diff --git a/templates/prueba_sujeto_val.tpl b/templates/prueba_sujeto_val.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..708f01a051e117164d103f05cc1e81e374bed02a
--- /dev/null
+++ b/templates/prueba_sujeto_val.tpl
@@ -0,0 +1,197 @@
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	{include file="head.tpl"}
+	<!-- Barra de menu -->
+	{include file="barra.tpl"}
+
+	<!-- Zona Central -->
+
+<div class="" role="main">
+	<div class="">
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+					<div class="x_content">
+						<form action="http://192.168.1.240/{$get}" target="esp">
+							<button type="submit" formmethod="get" id="init" onclick="inicio()" formnovalidate>Iniciar</button>
+						</form>
+					</div>					
+				</div>
+			</div>
+
+			<div class="col-md-4 col-sm-4 col-xs-4">
+				
+				<div class="x_panel">
+					<div class="x_content">
+						<iframe name="esp" id="esp" src="http://192.168.1.240/" ></iframe>
+					</div>
+				</div>
+			</div>
+			<div class="col-md-4 col-sm-4 col-xs-4">
+				<div class="x_panel">
+					<div class="x_content">
+						<form action="http://192.168.1.240/" target="esp">
+							<button type="submit" formmethod="get"  formnovalidate>Reset ESP</button>
+						</form>
+						<div >
+							<img style='height: 300px;' src="{$imagen}">
+						</div>
+					</div>					
+				</div>
+			</div>
+			<div class="col-md-4 col-sm-4 col-xs-4">
+				<div class="x_panel">
+					<div class="x_content">
+						<div >
+							<h2><strong>Colocación sensores:</strong></h2>
+							<h2>{$coloc_sensores}</h2>
+						</div>
+					</div>					
+				</div>
+			</div>
+
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+					<div class="x_content">
+					</div>					
+				</div>
+			</div>
+
+			<div class="col-md-6 col-6 col-xs-6">
+				<div class="x_panel">
+					<div class="x_content">
+						<h1>{$segundos}:00</h1>
+					</div>					
+				</div>
+				<div class="x_panel">
+					<div class="x_content">
+						<button type="submit" formmethod="get"  id="done" class="btn btn-success" onclick="done()" formnovalidate>Ver resultados</button>
+						<button type="submit" formmethod="get"  id="salir" class="btn btn-danger" onclick="salir_sujeto()" formnovalidate>Salir</button>
+					</div>					
+				</div>
+			</div>
+			<div class="col-md-6 col-sm-6 col-xs-6">
+				<div class="x_panel">
+					<div class="x_content">
+						<div id="foto">
+						Aviso
+						</div>
+					</div>					
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script type="text/javascript">
+window.onload = function() {
+    var oFrame = document.getElementById("esp");
+    oFrame.contentWindow.document.onclick = function() {
+        alert("frame contents clicked");
+    };
+};
+</script>
+
+<script type="text/javascript">
+	let h1 = document.querySelector("h1");
+
+	let centesimas = 0;
+	let segundos = {$segundos};
+
+	var snd1 = new Audio("data:audio/wav;base64,//uQRAAAAWMSLwUIYAAsYkXgoQwAEaYLWfkWgAI0wWs/ItAAAGDgYtAgAyN+QWaAAihwMWm4G8QQRDiMcCBcH3Cc+CDv/7xA4Tvh9Rz/y8QADBwMWgQAZG/ILNAARQ4GLTcDeIIIhxGOBAuD7hOfBB3/94gcJ3w+o5/5eIAIAAAVwWgQAVQ2ORaIQwEMAJiDg95G4nQL7mQVWI6GwRcfsZAcsKkJvxgxEjzFUgfHoSQ9Qq7KNwqHwuB13MA4a1q/DmBrHgPcmjiGoh//EwC5nGPEmS4RcfkVKOhJf+WOgoxJclFz3kgn//dBA+ya1GhurNn8zb//9NNutNuhz31f////9vt///z+IdAEAAAK4LQIAKobHItEIYCGAExBwe8jcToF9zIKrEdDYIuP2MgOWFSE34wYiR5iqQPj0JIeoVdlG4VD4XA67mAcNa1fhzA1jwHuTRxDUQ//iYBczjHiTJcIuPyKlHQkv/LHQUYkuSi57yQT//uggfZNajQ3Vmz+Zt//+mm3Wm3Q576v////+32///5/EOgAAADVghQAAAAA//uQZAUAB1WI0PZugAAAAAoQwAAAEk3nRd2qAAAAACiDgAAAAAAABCqEEQRLCgwpBGMlJkIz8jKhGvj4k6jzRnqasNKIeoh5gI7BJaC1A1AoNBjJgbyApVS4IDlZgDU5WUAxEKDNmmALHzZp0Fkz1FMTmGFl1FMEyodIavcCAUHDWrKAIA4aa2oCgILEBupZgHvAhEBcZ6joQBxS76AgccrFlczBvKLC0QI2cBoCFvfTDAo7eoOQInqDPBtvrDEZBNYN5xwNwxQRfw8ZQ5wQVLvO8OYU+mHvFLlDh05Mdg7BT6YrRPpCBznMB2r//xKJjyyOh+cImr2/4doscwD6neZjuZR4AgAABYAAAABy1xcdQtxYBYYZdifkUDgzzXaXn98Z0oi9ILU5mBjFANmRwlVJ3/6jYDAmxaiDG3/6xjQQCCKkRb/6kg/wW+kSJ5//rLobkLSiKmqP/0ikJuDaSaSf/6JiLYLEYnW/+kXg1WRVJL/9EmQ1YZIsv/6Qzwy5qk7/+tEU0nkls3/zIUMPKNX/6yZLf+kFgAfgGyLFAUwY//uQZAUABcd5UiNPVXAAAApAAAAAE0VZQKw9ISAAACgAAAAAVQIygIElVrFkBS+Jhi+EAuu+lKAkYUEIsmEAEoMeDmCETMvfSHTGkF5RWH7kz/ESHWPAq/kcCRhqBtMdokPdM7vil7RG98A2sc7zO6ZvTdM7pmOUAZTnJW+NXxqmd41dqJ6mLTXxrPpnV8avaIf5SvL7pndPvPpndJR9Kuu8fePvuiuhorgWjp7Mf/PRjxcFCPDkW31srioCExivv9lcwKEaHsf/7ow2Fl1T/9RkXgEhYElAoCLFtMArxwivDJJ+bR1HTKJdlEoTELCIqgEwVGSQ+hIm0NbK8WXcTEI0UPoa2NbG4y2K00JEWbZavJXkYaqo9CRHS55FcZTjKEk3NKoCYUnSQ0rWxrZbFKbKIhOKPZe1cJKzZSaQrIyULHDZmV5K4xySsDRKWOruanGtjLJXFEmwaIbDLX0hIPBUQPVFVkQkDoUNfSoDgQGKPekoxeGzA4DUvnn4bxzcZrtJyipKfPNy5w+9lnXwgqsiyHNeSVpemw4bWb9psYeq//uQZBoABQt4yMVxYAIAAAkQoAAAHvYpL5m6AAgAACXDAAAAD59jblTirQe9upFsmZbpMudy7Lz1X1DYsxOOSWpfPqNX2WqktK0DMvuGwlbNj44TleLPQ+Gsfb+GOWOKJoIrWb3cIMeeON6lz2umTqMXV8Mj30yWPpjoSa9ujK8SyeJP5y5mOW1D6hvLepeveEAEDo0mgCRClOEgANv3B9a6fikgUSu/DmAMATrGx7nng5p5iimPNZsfQLYB2sDLIkzRKZOHGAaUyDcpFBSLG9MCQALgAIgQs2YunOszLSAyQYPVC2YdGGeHD2dTdJk1pAHGAWDjnkcLKFymS3RQZTInzySoBwMG0QueC3gMsCEYxUqlrcxK6k1LQQcsmyYeQPdC2YfuGPASCBkcVMQQqpVJshui1tkXQJQV0OXGAZMXSOEEBRirXbVRQW7ugq7IM7rPWSZyDlM3IuNEkxzCOJ0ny2ThNkyRai1b6ev//3dzNGzNb//4uAvHT5sURcZCFcuKLhOFs8mLAAEAt4UWAAIABAAAAAB4qbHo0tIjVkUU//uQZAwABfSFz3ZqQAAAAAngwAAAE1HjMp2qAAAAACZDgAAAD5UkTE1UgZEUExqYynN1qZvqIOREEFmBcJQkwdxiFtw0qEOkGYfRDifBui9MQg4QAHAqWtAWHoCxu1Yf4VfWLPIM2mHDFsbQEVGwyqQoQcwnfHeIkNt9YnkiaS1oizycqJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU=");  
+	var snd2 = new Audio("media/audio/check.mp3");
+
+	var intervalo = 0;
+	var intervaloBase = segundos/{$repeticiones};
+	var repSg = segundos-1;
+	var repCnt = 99;
+	var estado = 0;
+	$('#done').hide();
+
+	console.log(estado, "Intervalo repetición: ", intervaloBase, "-", intervalo, "(",repSg,":",repCnt,")", "Repeticiones totales:", {$repeticiones});
+	function run(){
+		if (estado ==0){
+			if((centesimas == 0) &&( segundos == 0)){
+			check();
+			h1.style.color = 'red';
+			$("#foto").html("<h1><strong>FIN</strong></h1>");
+			$('#done').show();
+			estado = 1;
+			// función para hacer un delay antes del windows location
+			// esperamos 2 segundos
+			function stateChange(newState) {
+				setTimeout(function () {
+					if (newState == -1) {
+						/*
+						 * Comprobamos que el sensor ha enviado los datos y ponemos un mensaje acorde.
+						 * /
+						$.post("comprobar_post.php", {literal} {
+								recarga:'info' , 
+								puesto: {/literal}{$puesto}{literal}, 
+								linea: '{/literal}{$linea}{literal}',
+								cambio: {/literal}{$prox_cambio}{literal},
+								serie: '{/literal}{$serie}{literal}',
+								foto: '{/literal}{$imagen}{literal}',
+								posicion_ant: {/literal}{$posicion}{literal}
+								} {/literal} , 
+								function(data){
+									//recarga titulo y barcode
+									$("#resultado").html(data);
+								});	
+						//*/
+						alert("Saliendo");
+						window.location.href="result.php?variable={$id_admin}";
+					}
+				}, 2000);
+			}
+			
+			}else{
+				// Comprobamos que llegamos a una repetición y ponemos un aviso
+				if(centesimas == repCnt && segundos == repSg) {
+					console.log("intervalo = ", repSg,":",repCnt);
+					$("#foto").html("<h1><strong>{$ensayo}</strong></h1>");   
+					beep(); 
+				}
+				// quitamos el aviso 1seg despues y preparamos la siguiente repeticion
+				if(centesimas == repCnt && segundos == repSg - 1) {
+					intervalo = intervalo + intervaloBase;
+					repSg = {$segundos} - Math.trunc(intervalo) - 1;
+					repCnt = 99 - Math.trunc((intervalo - Math.trunc(intervalo))*100);
+					console.log("Nuevo intervalo:",intervalo,"Proxima Repeticion:", repSg, ":", repCnt, "Tiempo:", segundos +':'+centesimas);
+					$("#foto").html("<h1><strong>Reposo</strong></h1>"); 
+				}
+
+				if(centesimas == 0){
+					--segundos;
+					centesimas = 99;
+				}else{
+					--centesimas;
+				}
+				h1.innerHTML = segundos +':'+centesimas;
+
+			}
+		
+		}
+	}
+		
+	function inicio(){
+		$('#salir').hide();
+		$('#init').hide();
+		segundos = {$segundos};
+		setInterval(run, 10);
+	}
+	function done() {
+		window.location.href="ver_datos_sujeto.php?variable={$id_admin}&id={$id_prueba}";
+	}
+	function salir_sujeto() {
+		window.location.href="prueba_sujeto.php?variable={$id_admin}&id_prueba={$id_prueba}&accion=1";
+		history.back();	
+	}
+	function beep() {
+		snd1.play();
+	}
+	function check(){
+		snd2.play();
+	}
+</script>
+{include file="footer.tpl"}
diff --git a/templates/result.tpl b/templates/result.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..a6d7b77f6d5b5e8f85cd55b24bc259ba6cc1b851
--- /dev/null
+++ b/templates/result.tpl
@@ -0,0 +1,138 @@
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	{include file="head.tpl"}
+	<!-- Barra de menu -->
+	{include file="barra.tpl"}
+
+	<!-- Zona Central -->
+<div class="" role="main">
+	<div class="tablas" id="recarga">
+		<h4 style = "text-align: center;">LISTADO DE PACIENTES</h4>
+		<div class="clearfix"></div>
+		<table id="datatable" class="table table-striped table-condensed table-bordered" cellspacing="0" width="100%" data-order="[[ 1, &quot;asc&quot; ]]" style="font-size:13px; ">
+			<thead>
+				<tr>
+					<td>DNI</td>
+					<td>Nombre</td>
+					<td>Apellidos</td>
+					<td>Sexo</td>
+					<td>Edad</td>
+					<td>Anotaciones</td>
+				</tr>
+			</thead>
+
+			<tbody>
+				{foreach from=$entrada item=element}
+					<tr onclick="selecion()" data-toggle="tooltip" data-placement="top" title="Click para ver documentación relaccionada" >
+						<td>{$element[0]}</td>
+						<td>{$element[1]}</td>
+						<td>{$element[2]}</td>
+						<td>{$element[3]}</td>
+						<td>{$element[4]} ({$element[6]|date_format:"%d/%m/%Y"})</td>
+						<td>{$element[5]}</td>
+					</tr>
+				{/foreach}
+			</tbody>
+		</table>    <!-- Se cierra la tabla -->
+
+		<script type="text/javascript">
+
+		$(document).ready(function() {
+		var columnas;
+		if (window.innerWidth > 280) {
+			columnas= [
+					{ width: '10%', targets: 0 },
+					{ width: '10%', targets: 1 },
+					{ width: '10%', targets: 2 },
+					{ width: '10%', targets: 3 },
+					{ width: '10%', targets: 4 },
+					{ width: '10%', targets: 5 }
+			];
+		} else {
+		columnas= [
+			//no hago nada dejo que el tamaño se auto ajuste
+			];
+		}
+			$('#datatable').DataTable({
+			dom: 'Bfrtip',
+			lengthMenu: [
+				[ 100, 250, 500, -1 ],
+				[ '100 filas', '250 filas', '500 filas', 'Todas las filas' ]
+			],
+			autoWidth: false,
+			fixedHeader: false,
+			columnDefs: columnas,
+			FixedColumns: true  ,
+			buttons: [
+				'pageLength',
+				{
+					extend: 'collection',
+					text: 'Exportar',
+					buttons: [
+						'copy',
+						{
+						extend: 'pdf',
+						text: 'PDF',
+						exportOptions: {
+							modifier: {
+								page: 'current'
+							}
+						},
+						message: 'PDF creado por Mantenimiento M3.',
+						header: true,
+						title: 'Prioridades del Kaizen',
+						//orientation: 'landscape',
+						download: 'open',
+						customize: function(doc) {
+							doc.defaultStyle.fontSize = 6; 
+							doc.pageOrientation = 'landscape';
+							doc.styles.tableHeader.fontSize = 7;
+							doc.styles.tableHeader.color ='white';
+							doc.styles.title.fontSize = 10;
+						}  
+						},
+						'csv', 'excel',
+						{
+							extend: 'print',
+							text: 'Imprimir',
+							autoPrint: true,
+							exportOptions: {
+								columns: ':visible',
+							},
+							customize: function (win) {
+								$(win.document.body).find('table').addClass('display').css('font-size', '7px');
+								$(win.document.body).find('tr:nth-child(odd) td').each(function(index){
+									$(this).css('background-color','#D0D0D0');
+								});
+									//mio
+								$(win.document.body).find('h1').css('font-size','20px');
+								$(win.document.body).find('h1').css('margin-bottom','20px');
+								$(win.document.body).find('h1').css('text-align','center');
+							}
+
+						}
+					]
+				}
+			]
+			
+			});
+
+		} );
+
+	</script>
+	</div>
+</div>
+
+
+	<script type="text/javascript">
+		function selecion(){
+			$(document).ready(function() {
+			    var table = $('#datatable').DataTable();
+			    $('#datatable tbody').on( 'click', 'tr',  function () {
+			        $(this).toggleClass('selected');
+					window.location.href="pac_reg.php?variable={$id_admin}&id="+table.rows('.selected').data()[0][0] ;
+			    } );
+			} );
+    	}
+	</script>
+	{include file="footer.tpl"}
diff --git a/templates/ver_datos_paciente.tpl b/templates/ver_datos_paciente.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..d5cd7681f8e69544d5fa1a2627b1958f86040cf6
--- /dev/null
+++ b/templates/ver_datos_paciente.tpl
@@ -0,0 +1,151 @@
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	{include file="head.tpl"}
+	<!-- Barra de menu -->
+	{include file="barra.tpl"}
+
+	<!-- Zona Central -->
+<div class="" role="main">
+	<div class="x_content">
+		<canvas id="myChart"></canvas>
+		<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
+		<script>
+			const labels = [{$etiquetas}];
+			const tension = 0.3;
+			const data = {
+				labels: labels,
+				datasets: [{
+					label: 'Sensor 1',
+					data: [{$s1}],
+					fill: false,
+					borderColor: 'rgb(75, 192, 192)',
+					tension: tension
+				},{
+					label: 'Sensor 2',
+					data: [{$s2}],
+					fill: false,
+					borderColor: 'rgb(255, 45, 0)',
+					tension: tension
+				},{
+					label: 'Sensor 3',
+					data: [{$s3}],
+					fill: false,
+					borderColor: 'rgb(255, 255, 0 )',
+					tension: tension
+				},{
+					label: 'Sensor 4',
+					data: [{$s4}],
+					fill: false,
+					borderColor: 'rgb(0, 255, 46 )',
+					tension: tension
+				},{
+					label: 'Sensor 5',
+					data: [{$s5}],
+					fill: false,
+					borderColor: 'rgb(0, 27, 255 )',
+					tension: tension
+				},{
+					label: 'Sensor 6',
+					data: [{$s6}],
+					fill: false,
+					borderColor: 'rgb(255, 0, 240 )',
+					tension: tension
+				}]
+			};
+		
+			const config = {
+				type: 'line',
+				data,
+				options: {
+					responsive: true,
+					elements: {
+						point:{
+							pointBorderWidth:0.1,
+							pointHitRadius:0.1,
+							pointBorderColor:'rgba(0, 0, 0, 0)',
+							pointBackgroundColor:'rgba(0, 0, 0, 0)',
+
+						}
+					},
+					plugins: {
+						title: {
+							display: true,
+							text: '{$tipo} de {$nombre}, a fecha de: {$fecha|date_format:"%d/%m/%Y %H:%M:%S"} ',
+							color: '#9',
+								font: {
+									family: 'Helvetica Neue',
+									size: 30,
+									weight: 'bold',
+									lineHeight: 1.5,
+								}
+						}
+					},
+					scales: {
+						x: {
+							display: true,
+							title:{
+								display: true,
+								text: 'Tiempo (ms)',
+								color: '#9',
+								font: {
+									family: 'Helvetica Neue',
+									size: 20,
+									weight: 'bold',
+									lineHeight: 1.2,
+								}
+							}
+						},
+						y: {
+							display: true,
+							title:{
+								display: true,
+								text: 'Señal',
+								color: '#9',
+								font: {
+									family: 'Helvetica Neue',
+									size: 20,
+									weight: 'bold',
+									lineHeight: 1.2,
+								}
+							}
+						}
+					}
+				}
+			};
+
+			var myChart = new Chart(
+			document.getElementById('myChart'),
+			config
+			);
+		</script>
+		<div class="form-group">
+			<div class="col-md-7 col-md-offset-4">
+				<button onclick="salir()" type="button" class="btn btn-warning">Salir</button>
+				<button onclick="borrar()" type="button" class="btn btn-danger">Borrar prueba</button>
+			</div>
+		</div>
+	</div>
+</div>
+
+	
+<script type="text/javascript">
+	function salir(){
+		window.location.href="pac_reg.php?variable={$id_admin}&id={$dni_paciente}";
+	}	
+
+	function borrar(){
+		var reply=confirm("¿Seguro que desea borrar la prueba?")
+		if (reply==true) 
+		{
+		window.location.href="borrar_prueba.php?variable={$id_admin}&id={$id_prueba}";
+		}
+		else 
+		{
+		//AQUI NO HARIA NADA, SE CERRARIA EL POPUP Y SEGUIRIA EN LA PAGINA ACTUAL
+		}
+		
+	}
+
+</script>
+	
+{include file="footer.tpl"}
diff --git a/templates/ver_datos_sujeto.tpl b/templates/ver_datos_sujeto.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..25c595ed7a04e4dec9746531c5baf8e2e3fcf00f
--- /dev/null
+++ b/templates/ver_datos_sujeto.tpl
@@ -0,0 +1,151 @@
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	{include file="head.tpl"}
+	<!-- Barra de menu -->
+	{include file="barra.tpl"}
+
+	<!-- Zona Central -->
+<div class="" role="main">
+	<div class="x_content">
+		<canvas id="myChart"></canvas>
+		<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
+		<script>
+			const labels = [{$etiquetas}];
+			const tension = 0.3;
+			const data = {
+				labels: labels,
+				datasets: [{
+					label: 'Sensor 1',
+					data: [{$s1}],
+					fill: false,
+					borderColor: 'rgb(75, 192, 192)',
+					tension: tension
+				},{
+					label: 'Sensor 2',
+					data: [{$s2}],
+					fill: false,
+					borderColor: 'rgb(255, 45, 0)',
+					tension: tension
+				},{
+					label: 'Sensor 3',
+					data: [{$s3}],
+					fill: false,
+					borderColor: 'rgb(255, 255, 0 )',
+					tension: tension
+				},{
+					label: 'Sensor 4',
+					data: [{$s4}],
+					fill: false,
+					borderColor: 'rgb(0, 255, 46 )',
+					tension: tension
+				},{
+					label: 'Sensor 5',
+					data: [{$s5}],
+					fill: false,
+					borderColor: 'rgb(0, 27, 255 )',
+					tension: tension
+				},{
+					label: 'Sensor 6',
+					data: [{$s6}],
+					fill: false,
+					borderColor: 'rgb(255, 0, 240 )',
+					tension: tension
+				}]
+			};
+		
+			const config = {
+				type: 'line',
+				data,
+				options: {
+					responsive: true,
+					elements: {
+						point:{
+							pointBorderWidth:0.1,
+							pointHitRadius:0.1,
+							pointBorderColor:'rgba(0, 0, 0, 0)',
+							pointBackgroundColor:'rgba(0, 0, 0, 0)',
+
+						}
+					},
+					plugins: {
+						title: {
+							display: true,
+							text: '{$tipo} de {$nombre}, a fecha de: {$fecha|date_format:"%d/%m/%Y %H:%M:%S"} ',
+							color: '#9',
+								font: {
+									family: 'Helvetica Neue',
+									size: 30,
+									weight: 'bold',
+									lineHeight: 1.5,
+								}
+						}
+					},
+					scales: {
+						x: {
+							display: true,
+							title:{
+								display: true,
+								text: 'Tiempo (ms)',
+								color: '#9',
+								font: {
+									family: 'Helvetica Neue',
+									size: 20,
+									weight: 'bold',
+									lineHeight: 1.2,
+								}
+							}
+						},
+						y: {
+							display: true,
+							title:{
+								display: true,
+								text: 'Señal',
+								color: '#9',
+								font: {
+									family: 'Helvetica Neue',
+									size: 20,
+									weight: 'bold',
+									lineHeight: 1.2,
+								}
+							}
+						}
+					}
+				}
+			};
+
+			var myChart = new Chart(
+			document.getElementById('myChart'),
+			config
+			);
+		</script>
+		<div class="form-group">
+			<div class="col-md-7 col-md-offset-4">
+				<button onclick="salir()" type="button" class="btn btn-warning">Salir</button>
+				<button onclick="borrar()" type="button" class="btn btn-danger">Borrar prueba</button>
+			</div>
+		</div>
+	</div>
+</div>
+
+	
+<script type="text/javascript">
+	function salir(){
+		window.location.href="ver_pruebas_sujetos.php?variable={$id_admin}";
+	}	
+
+	function borrar(){
+		var reply=confirm("¿Seguro que desea borrar la prueba?")
+		if (reply==true) 
+		{
+		window.location.href="borrar_prueba_sujeto.php?variable={$id_admin}&id={$id_prueba}";
+		}
+		else 
+		{
+		//AQUI NO HARIA NADA, SE CERRARIA EL POPUP Y SEGUIRIA EN LA PAGINA ACTUAL
+		}
+		
+	}
+
+</script>
+	
+{include file="footer.tpl"}
diff --git a/templates/ver_pruebas_sujetos.tpl b/templates/ver_pruebas_sujetos.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..af6204f8af5776fe1988dbcb671040d0c478f7b6
--- /dev/null
+++ b/templates/ver_pruebas_sujetos.tpl
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	{include file="head.tpl"}
+	<!-- Barra de menu -->
+	{include file="barra.tpl"}
+
+	<!-- Zona Central -->
+<div class="" role="main">
+	<h4 style = "text-align: center;">{$mensaje}</h4>
+			
+	<div class="ln_solid"></div>
+
+	<div class="x_content">
+		<div class="">
+			<h4 style = "text-align: center;">LISTADO DE PRUEBAS</h4>
+			<table id="example" class="table table-striped table-bordered" cellspacing="0" width="99%" role="grid" data-order="[[ 2, &quot;desc&quot; ]]" style="font-size:13px;">
+				<thead>
+					<tr>
+						<td width="80">id_prueba</td>
+						<td width="200">Tipo</td>
+						<td width="120">Fecha - Hora</td>
+						<td width="80">Sexo</td>
+						<td width="80">Edad</td>
+						<td>Simetria</td>
+						<td>Anotaciones</td>
+					</tr>
+				</thead>
+
+				<tbody>
+					{foreach from=$entrada item=element}
+						<tr data-toggle="tooltip" data-placement="top" title="Click para ver documentación relaccionada" >
+							<td>{$element[0]}</td>
+							<td>{$element[1]}</td>
+							<td>{$element[2]|date_format:"%d/%m/%Y"}</td>
+							<td>{$element[3]}</td>
+							<td>{$element[4]}</td>
+							<td>{$element[5]}</td>
+							<td>{$element[6]}</td>
+						</tr>
+					{/foreach}
+				</tbody>
+			</table>
+		</div>
+	</div>
+</div>
+
+	
+<script type="text/javascript">
+	
+
+	$(document).ready(function() {
+	    $('#example').DataTable({
+   	    lengthMenu: [
+					[ 10, 25, 100, -1 ],
+					[ '10 filas', '25 filas', '100 filas', 'Todas las filas' ]
+        ]
+ 	    });
+	    var table = $('#example').DataTable();
+	 
+	    $('#example tbody').on( 'click', 'tr', function () {
+	        $(this).toggleClass('selected');
+			window.location.href="ver_datos_sujeto.php?variable={$id_admin}&id="+table.rows('.selected').data()[0][0];
+	    } );
+	} );
+</script>
+{include file="footer.tpl"}
diff --git a/templates_c/145144529a8d2b4be7493fd8bcedd9b43fc5c59a_0.file.inicio.tpl.php b/templates_c/145144529a8d2b4be7493fd8bcedd9b43fc5c59a_0.file.inicio.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..5402b2b1446c9cbd7082fa4a65f80ee42114c085
--- /dev/null
+++ b/templates_c/145144529a8d2b4be7493fd8bcedd9b43fc5c59a_0.file.inicio.tpl.php
@@ -0,0 +1,76 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-06-01 10:51:06
+  from '/volume1/web/velostat/templates/inicio.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_6297287ae0f201_59560290',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    '145144529a8d2b4be7493fd8bcedd9b43fc5c59a' => 
+    array (
+      0 => '/volume1/web/velostat/templates/inicio.tpl',
+      1 => 1654017270,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+    'file:head.tpl' => 1,
+    'file:footer.tpl' => 1,
+  ),
+),false)) {
+function content_6297287ae0f201_59560290 (Smarty_Internal_Template $_smarty_tpl) {
+?><!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	<?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+<div class="row">
+	<div class="x_panel">
+		<div class="x_title">
+		<h2> Bienvenido a la <?php echo $_smarty_tpl->tpl_vars['titulo']->value;?>
+<small></small></h2>
+		<div class="clearfix"></div>
+		</div>
+		
+		<div class="x_content">
+			<form class="form-horizontal form-label-left" action="login.php" method="post">
+
+				<!-- Mensaje en caso de error de autenticación -->
+				<div class="x_title">
+				<p style="color:red;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?>
+</p>
+				<div class="clearfix"></div>
+				</div>
+
+				<!-- Usuario -->
+				<div class="item form-group">
+					<label class="control-label col-md-6 col-sm-6 col-xs-12" for="name">Nick de usuario
+					</label>
+					<div class="col-md-3 col-sm-3 col-xs-3">
+						<input class="select2_single form-control" name="login">
+					</div>
+				</div>
+
+				<!-- Pass -->
+				<div class="item form-group">
+					<label class="control-label col-md-6 col-sm-6 col-xs-12" for="name">Contraseña
+					</label>
+					<div class="col-md-3 col-sm-3 col-xs-3">
+						<input class="select2_single form-control" required maxlength="40" type="password" name="pass">
+					</div>
+				</div>
+				<div class="item form-group">
+					<div class="col-md-6 col-sm-6 col-xs-12"></div>
+					<div class="col-md-3 col-sm-3 col-xs-3">
+						<button type="submit" class="p1" class="btn btn-success">Enviar</button>
+					</div>
+				</div>
+			</form>
+		</div>
+	</div>
+	<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+}
+}
diff --git a/templates_c/15ac0ec4075859219bc813f249c66f9ae8e25cd3_0.file.result.tpl.php b/templates_c/15ac0ec4075859219bc813f249c66f9ae8e25cd3_0.file.result.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..5d1aee9e0d412e04cd55ae4b06150d0f0ab343b7
--- /dev/null
+++ b/templates_c/15ac0ec4075859219bc813f249c66f9ae8e25cd3_0.file.result.tpl.php
@@ -0,0 +1,189 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-06-07 19:35:32
+  from '/volume1/web/velostat/templates/result.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_629f8c6448db59_66315122',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    '15ac0ec4075859219bc813f249c66f9ae8e25cd3' => 
+    array (
+      0 => '/volume1/web/velostat/templates/result.tpl',
+      1 => 1654623318,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+    'file:head.tpl' => 1,
+    'file:barra.tpl' => 1,
+    'file:footer.tpl' => 1,
+  ),
+),false)) {
+function content_629f8c6448db59_66315122 (Smarty_Internal_Template $_smarty_tpl) {
+$_smarty_tpl->_checkPlugins(array(0=>array('file'=>'/volume1/web/velostat/plugins/modifier.date_format.php','function'=>'smarty_modifier_date_format',),));
+?>
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	<?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	<!-- Barra de menu -->
+	<?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+
+	<!-- Zona Central -->
+<div class="" role="main">
+	<div class="tablas" id="recarga">
+		<h4 style = "text-align: center;">LISTADO DE PACIENTES</h4>
+		<div class="clearfix"></div>
+		<table id="datatable" class="table table-striped table-condensed table-bordered" cellspacing="0" width="100%" data-order="[[ 1, &quot;asc&quot; ]]" style="font-size:13px; ">
+			<thead>
+				<tr>
+					<td>DNI</td>
+					<td>Nombre</td>
+					<td>Apellidos</td>
+					<td>Sexo</td>
+					<td>Edad</td>
+					<td>Anotaciones</td>
+				</tr>
+			</thead>
+
+			<tbody>
+				<?php
+$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['entrada']->value, 'element');
+$_smarty_tpl->tpl_vars['element']->do_else = true;
+if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) {
+$_smarty_tpl->tpl_vars['element']->do_else = false;
+?>
+					<tr onclick="selecion()" data-toggle="tooltip" data-placement="top" title="Click para ver documentación relaccionada" >
+						<td><?php echo $_smarty_tpl->tpl_vars['element']->value[0];?>
+</td>
+						<td><?php echo $_smarty_tpl->tpl_vars['element']->value[1];?>
+</td>
+						<td><?php echo $_smarty_tpl->tpl_vars['element']->value[2];?>
+</td>
+						<td><?php echo $_smarty_tpl->tpl_vars['element']->value[3];?>
+</td>
+						<td><?php echo $_smarty_tpl->tpl_vars['element']->value[4];?>
+ (<?php echo smarty_modifier_date_format($_smarty_tpl->tpl_vars['element']->value[6],"%d/%m/%Y");?>
+)</td>
+						<td><?php echo $_smarty_tpl->tpl_vars['element']->value[5];?>
+</td>
+					</tr>
+				<?php
+}
+$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?>
+			</tbody>
+		</table>    <!-- Se cierra la tabla -->
+
+		<?php echo '<script'; ?>
+ type="text/javascript">
+
+		$(document).ready(function() {
+		var columnas;
+		if (window.innerWidth > 280) {
+			columnas= [
+					{ width: '10%', targets: 0 },
+					{ width: '10%', targets: 1 },
+					{ width: '10%', targets: 2 },
+					{ width: '10%', targets: 3 },
+					{ width: '10%', targets: 4 },
+					{ width: '10%', targets: 5 }
+			];
+		} else {
+		columnas= [
+			//no hago nada dejo que el tamaño se auto ajuste
+			];
+		}
+			$('#datatable').DataTable({
+			dom: 'Bfrtip',
+			lengthMenu: [
+				[ 100, 250, 500, -1 ],
+				[ '100 filas', '250 filas', '500 filas', 'Todas las filas' ]
+			],
+			autoWidth: false,
+			fixedHeader: false,
+			columnDefs: columnas,
+			FixedColumns: true  ,
+			buttons: [
+				'pageLength',
+				{
+					extend: 'collection',
+					text: 'Exportar',
+					buttons: [
+						'copy',
+						{
+						extend: 'pdf',
+						text: 'PDF',
+						exportOptions: {
+							modifier: {
+								page: 'current'
+							}
+						},
+						message: 'PDF creado por Mantenimiento M3.',
+						header: true,
+						title: 'Prioridades del Kaizen',
+						//orientation: 'landscape',
+						download: 'open',
+						customize: function(doc) {
+							doc.defaultStyle.fontSize = 6; 
+							doc.pageOrientation = 'landscape';
+							doc.styles.tableHeader.fontSize = 7;
+							doc.styles.tableHeader.color ='white';
+							doc.styles.title.fontSize = 10;
+						}  
+						},
+						'csv', 'excel',
+						{
+							extend: 'print',
+							text: 'Imprimir',
+							autoPrint: true,
+							exportOptions: {
+								columns: ':visible',
+							},
+							customize: function (win) {
+								$(win.document.body).find('table').addClass('display').css('font-size', '7px');
+								$(win.document.body).find('tr:nth-child(odd) td').each(function(index){
+									$(this).css('background-color','#D0D0D0');
+								});
+									//mio
+								$(win.document.body).find('h1').css('font-size','20px');
+								$(win.document.body).find('h1').css('margin-bottom','20px');
+								$(win.document.body).find('h1').css('text-align','center');
+							}
+
+						}
+					]
+				}
+			]
+			
+			});
+
+		} );
+
+	<?php echo '</script'; ?>
+>
+	</div>
+</div>
+
+
+	<?php echo '<script'; ?>
+ type="text/javascript">
+		function selecion(){
+			$(document).ready(function() {
+			    var table = $('#datatable').DataTable();
+			    $('#datatable tbody').on( 'click', 'tr',  function () {
+			        $(this).toggleClass('selected');
+					window.location.href="pac_reg.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id="+table.rows('.selected').data()[0][0] ;
+			    } );
+			} );
+    	}
+	<?php echo '</script'; ?>
+>
+	<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+}
+}
diff --git a/templates_c/15bc92026fa23060a308aa78bb9dfe52e6927371_0.file.ges_ens.tpl.php b/templates_c/15bc92026fa23060a308aa78bb9dfe52e6927371_0.file.ges_ens.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..1c290323eceafdfdb52c7828c7b2e3cfecedef2b
--- /dev/null
+++ b/templates_c/15bc92026fa23060a308aa78bb9dfe52e6927371_0.file.ges_ens.tpl.php
@@ -0,0 +1,249 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-06-07 19:47:46
+  from '/volume1/web/velostat/templates/ges_ens.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_629f8f42b6d300_18587096',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    '15bc92026fa23060a308aa78bb9dfe52e6927371' => 
+    array (
+      0 => '/volume1/web/velostat/templates/ges_ens.tpl',
+      1 => 1654624063,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+    'file:head.tpl' => 1,
+    'file:barra.tpl' => 1,
+    'file:footer.tpl' => 1,
+  ),
+),false)) {
+function content_629f8f42b6d300_18587096 (Smarty_Internal_Template $_smarty_tpl) {
+$_smarty_tpl->_checkPlugins(array(0=>array('file'=>'/volume1/web/velostat/plugins/modifier.date_format.php','function'=>'smarty_modifier_date_format',),));
+?>
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	<?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	<!-- Barra de menu -->
+	<?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	
+	<!-- Zona Central -->
+<?php echo '<script'; ?>
+ type="text/javascript">
+
+	function limita(maximoCaracteres) {
+	  var elemento = document.getElementById("texto");
+	  if(elemento.value.length >= maximoCaracteres ) {
+	    return false;
+	  }
+	  else {
+	    return true;
+	  }
+	}
+	 	
+<?php echo '</script'; ?>
+> 
+
+<div class="" role="main">
+	<div class="">
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+				<?php if ($_smarty_tpl->tpl_vars['mod_campos']->value) {?> 
+					<div class="x_content">
+						<h4 style = "text-align: center;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?>
+</h4>
+						<div class="clearfix"></div>
+						<form class="form-horizontal form-label-left" action="ges_ens_val.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id=<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[0];?>
+" method="post">
+
+							<!-- id_ensayo -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">id_ensayo *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="11" name="id_ensayo" required disabled type="text" 
+									value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[0];?>
+" >
+								</div>
+							</div>
+
+							<!-- Tipo/Nombre -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Tipo *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="50" name="tipo" required type="text" value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[1];?>
+" >	
+								</div>
+							</div>
+
+							<!-- Colocacion Sensores -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Colocación sensores *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<textarea class="form-control col-md-7 col-xs-12" rows="3" data-validate-length-range="300" name="coloc_sensores" required type="text"><?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[2];?>
+</textarea>
+								</div>
+							</div>
+
+							<!-- Duracion -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Duracion *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="11" name="duracion" required type="decimal" value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[3];?>
+" >	
+								</div>
+							</div>
+
+							<!-- Repeticiones -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Repeticiones *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="11" name="repeticiones" required type="decimal" value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[4];?>
+" >	
+								</div>
+							</div>
+
+							<!-- Comentarios -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Comentarios 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<textarea class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="comentarios" type="text" value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[5];?>
+" ></textarea>
+								</div>
+							</div>
+
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button>
+									<button id="send" type="submit" class="btn btn-success">Guardar</button>
+									<button onclick="eliminar()" type="button" class="btn btn-danger">Eliminar</button>	
+								</div>
+							</div>
+						</form>
+						
+					</div>
+					<?php } else { ?>
+						
+						<!-- tabla para seleccionar patologia -->
+						<div class="x_content">
+						<h4 style = "text-align: center;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?>
+</h4>
+						<div class="clearfix"></div>
+							<div class="tablas">
+								<table id="example" class="table table-striped table-bordered" cellspacing="0" width="99%" role="grid" data-order="[[ 1, &quot;asc&quot; ]]">
+
+									<thead>
+										<tr>
+											<td>id_ensayo</td>
+											<td>Tipo / Nombre</td>
+											<td>Colocación Sensores</td>
+											<td>Duración</td>
+											<td>Repeticiones</td>
+											<td>Comentarios</td>
+											<td>Fecha creación</td>
+											<td>Fecha modificación</td>
+										</tr>
+									</thead>
+
+									<tbody>
+										<?php
+$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['campos']->value, 'element');
+$_smarty_tpl->tpl_vars['element']->do_else = true;
+if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) {
+$_smarty_tpl->tpl_vars['element']->do_else = false;
+?>
+											<tr >
+												<td><?php echo $_smarty_tpl->tpl_vars['element']->value[0];?>
+</td>
+												<td><?php echo $_smarty_tpl->tpl_vars['element']->value[1];?>
+</td>
+												<td><?php echo $_smarty_tpl->tpl_vars['element']->value[2];?>
+</td>
+												<td><?php echo $_smarty_tpl->tpl_vars['element']->value[3];?>
+</td>
+												<td><?php echo $_smarty_tpl->tpl_vars['element']->value[4];?>
+</td>
+												<td><?php echo $_smarty_tpl->tpl_vars['element']->value[5];?>
+</td>
+												<td><?php echo smarty_modifier_date_format($_smarty_tpl->tpl_vars['element']->value[6],"%d/%m/%Y");?>
+</td>
+												<td><?php echo smarty_modifier_date_format($_smarty_tpl->tpl_vars['element']->value[7],"%d/%m/%Y");?>
+</td>
+											</tr>
+										<?php
+}
+$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?>
+									</tbody>
+								</table>
+							</div>
+							<div class="col-md-6 col-md-offset-3">
+									<button onclick="n_ensayo()" type="button" class="btn btn-primary">Nuevo ensayo</button>
+							</div>
+						</div>
+					<?php }?>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<?php echo '<script'; ?>
+ type="text/javascript">
+	//estado();
+	function cancel() {
+		window.location.href="ges_ens.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+";
+	}
+	function eliminar() {
+		var reply=confirm("¿Seguro que desea borrar el ensayo? \nSe borrarán todas las pruebas asociadas a este ensayo.")
+		if (reply==true) 
+		{
+		window.location.href="ges_ens.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id=<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[0];?>
+&accion=1";
+		}
+		else 
+		{
+		//AQUI NO HARIA NADA, SE CERRARIA EL POPUP Y SEGUIRIA EN LA PAGINA ACTUAL
+		}
+		
+	}
+	function n_ensayo() {
+		window.location.href="ges_ens_nuevo.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+";
+	}
+	$(document).ready(function() {
+	    $('#example').DataTable({
+   	        lengthMenu: [
+					[ 10, 25, 100, -1 ],
+					[ '10 filas', '25 filas', '100 filas', 'Todas las filas' ]
+        ]
+ 	    });
+	    var table = $('#example').DataTable();
+	 
+	    $('#example tbody').on( 'click', 'tr', function () {
+	        $(this).toggleClass('selected');
+			window.location.href="ges_ens.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id="+table.rows('.selected').data()[0][0];
+	    } );
+	} );
+
+<?php echo '</script'; ?>
+>
+	<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+}
+}
diff --git a/templates_c/26155bdc414dedbfe8097c8bcba8253443b04dbf_0.file.mod_gestor.tpl.php b/templates_c/26155bdc414dedbfe8097c8bcba8253443b04dbf_0.file.mod_gestor.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..d76c7c2aa0233a1163c5bf34fe5074061dc8a818
--- /dev/null
+++ b/templates_c/26155bdc414dedbfe8097c8bcba8253443b04dbf_0.file.mod_gestor.tpl.php
@@ -0,0 +1,243 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-05-31 19:14:46
+  from '/volume1/web/velostat/templates/mod_gestor.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_62964d06dbdfd6_75887266',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    '26155bdc414dedbfe8097c8bcba8253443b04dbf' => 
+    array (
+      0 => '/volume1/web/velostat/templates/mod_gestor.tpl',
+      1 => 1654017270,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+    'file:head.tpl' => 1,
+    'file:barra.tpl' => 1,
+    'file:footer.tpl' => 1,
+  ),
+),false)) {
+function content_62964d06dbdfd6_75887266 (Smarty_Internal_Template $_smarty_tpl) {
+?><!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	<?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	<!-- Barra de menu -->
+	<?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	
+	<!-- Zona Central -->
+
+<div class="" role="main">
+	<div class="">
+		<div class="page-title"> 
+			<div class="title_left">
+			</div>
+
+		</div>
+		<div class="clearfix"></div>
+
+		<div class="row">
+			<?php if ($_smarty_tpl->tpl_vars['mod_campos']->value) {?> 
+			<div class="col-md-4 col-sm-4 col-xs-12">
+				<div class="x_panel">
+					<div class="x_content">
+						<div class="x_title">
+							<h2> <?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?>
+<small></small></h2>
+							<div class="clearfix"></div>
+						</div>
+
+			            <div class="profile_pic">
+	    		        	<img src="media/images/personal/<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[0];?>
+.png" alt="..." class="img-circle profile_img">
+	            		</div>
+					</div>
+				</div>
+			</div>
+			<div class="col-md-8 col-sm-8 col-xs-12">
+			<?php } else { ?>
+			<div class="col-md-12 col-sm-12 col-xs-12">
+			<?php }?>
+				<div class="x_panel">
+				<?php if ($_smarty_tpl->tpl_vars['mod_campos']->value) {?> 
+					<div class="x_content">
+						<form class="form-horizontal form-label-left" action="mod_gestor_val.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id=<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[0];?>
+" method="post">
+						
+							<!-- dni_trabajador -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI Trabajador *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="9" name="id_ensayo" required disabled type="text" 
+									value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[0];?>
+" >
+								</div>
+							</div>
+
+							<!-- Nombre -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control" required maxlength="40" type="text"  name="nombre"  value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[2];?>
+">
+								</div>
+							</div>
+
+							<!-- Apellidos -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Apellidos *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control" required maxlength="50" type="text" name="apellidos"  value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[3];?>
+">
+								</div>
+							</div>
+
+							<!-- login -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Login *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control"  required maxlength="10" type="text" name="login"  value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[1];?>
+">
+								</div>
+							</div>
+
+							<!-- titulacion -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Titulación *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control" required maxlength="20" type="text" name="titulacion"  value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[4];?>
+">
+								</div>
+							</div>
+
+							<!-- Pass -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Contraseña
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control" maxlength="40" minlength="6" type="password" placeholder="Mínimo 6 carácteres" name="pass">
+								</div>
+							</div>
+
+							<!-- Repass -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Repita contraseña
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control" maxlength="40" minlength="6" type="password" placeholder="Mínimo 6 carácteres"  name="passrw">
+								</div>
+							</div>
+
+							<!-- Permisos -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Permisos *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control" maxlength="1" required type="text" name="permisos" placeholder="0:R - 1:RW - 2:RWX"  value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[5];?>
+">
+								</div>
+							</div>
+							
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button type="button" onclick="cancel()" class="btn btn-warning">Cancelar</button>
+									<button id="send" type="submit" class="btn btn-success">Validar</button>
+								</div>
+							</div>
+						</form>
+					</div>
+
+				<?php } else { ?>
+					<div class="x_content">
+						<h4 style = "text-align: center;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?>
+</h4>
+						<div class="tablas">
+						    <table id="example" class="table table-striped table-bordered" cellspacing="0" width="100%" role="grid" data-order="[[ 2, &quot;asc&quot; ]]">
+
+								<thead>
+									<tr>
+										<td>DNI</td>
+										<td>Foto</td>
+										<td>Login</td>
+										<td>Nombre</td>
+										<td>Apellidos</td>
+									</tr>
+								</thead>
+
+								<tbody>
+									<?php
+$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['campos']->value, 'element');
+$_smarty_tpl->tpl_vars['element']->do_else = true;
+if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) {
+$_smarty_tpl->tpl_vars['element']->do_else = false;
+?>
+										<tr >
+											<td><?php echo $_smarty_tpl->tpl_vars['element']->value[0];?>
+</td>
+											<td>
+								            <div class="profile_pic">
+						    		        	<img  style="padding: 0; margin-top: 0;" src="media/images/personal/<?php echo $_smarty_tpl->tpl_vars['element']->value[0];?>
+.png" alt="..." class="img-circle profile_img">
+						            		</div>
+											</td>
+											<td><?php echo $_smarty_tpl->tpl_vars['element']->value[1];?>
+</td>
+											<td><?php echo $_smarty_tpl->tpl_vars['element']->value[2];?>
+</td>
+											<td><?php echo $_smarty_tpl->tpl_vars['element']->value[3];?>
+</td>
+										</tr>
+									<?php
+}
+$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?>
+								</tbody>
+							</table>
+						</div>
+					</div>
+				<?php }?>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<?php echo '<script'; ?>
+ type="text/javascript">
+	function cancel() {
+		window.location.href="result.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+";
+	}
+	$(document).ready(function() {
+	    $('#example').DataTable({
+   	        lengthMenu: [
+            [  -1 ],
+            [  'Todas las filas' ]
+        ]
+ 	    });
+	    var table = $('#example').DataTable();
+	 
+	    $('#example tbody').on( 'click', 'tr', function () {
+	        $(this).toggleClass('selected');
+			window.location.href="mod_gestor.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&nombre="+table.rows('.selected').data()[0][0];
+	    } );
+	} );
+<?php echo '</script'; ?>
+>
+<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+}
+}
diff --git a/templates_c/2fd17bd16b8d4c8a67bf614d2ba8745267e73f3a_0.file.footer.tpl.php b/templates_c/2fd17bd16b8d4c8a67bf614d2ba8745267e73f3a_0.file.footer.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..4701c5ec85c40c97c92a4b6b5b5b916d688fc5cf
--- /dev/null
+++ b/templates_c/2fd17bd16b8d4c8a67bf614d2ba8745267e73f3a_0.file.footer.tpl.php
@@ -0,0 +1,119 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-06-09 13:43:02
+  from '/volume1/web/velostat/templates/footer.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_62a1dcc6296863_93373508',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    '2fd17bd16b8d4c8a67bf614d2ba8745267e73f3a' => 
+    array (
+      0 => '/volume1/web/velostat/templates/footer.tpl',
+      1 => 1654774975,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+  ),
+),false)) {
+function content_62a1dcc6296863_93373508 (Smarty_Internal_Template $_smarty_tpl) {
+?>      <!-- Java Script... -->
+
+
+        <!--********************************************************
+    
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/fastclick/lib/fastclick.js"><?php echo '</script'; ?>
+>
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/nprogress/nprogress.js"><?php echo '</script'; ?>
+>
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.concat.min.js"><?php echo '</script'; ?>
+>
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/dropzone/dist/dropzone.js"><?php echo '</script'; ?>
+>-->
+    <!-- jquery.inputmask 
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/jquery.inputmask/dist/min/jquery.inputmask.bundle.min.js"><?php echo '</script'; ?>
+>-->
+
+
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/js/custom.min.iacob.js"><?php echo '</script'; ?>
+>
+    <!-- ECharts -->
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/echarts/dist/echarts.min.js"><?php echo '</script'; ?>
+>
+
+
+        <!-- hemos traducido parte del fichero para la barra de búsqueda  -->
+        <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/js/jquery.dataTables.es.min.js"><?php echo '</script'; ?>
+>
+
+   <!-- <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/js/moment.js"><?php echo '</script'; ?>
+> 
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/fullcalendar-3.5.1/fullcalendar.min.js"><?php echo '</script'; ?>
+>
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/fullcalendar-3.5.1/locale/es.js"><?php echo '</script'; ?>
+>
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/js/datetime.js"><?php echo '</script'; ?>
+> 
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/js/transition.js"><?php echo '</script'; ?>
+>
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/js/collapse.js"><?php echo '</script'; ?>
+>
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/js/bootstrap-datetimepicker.min.js"><?php echo '</script'; ?>
+>
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/js/daterangepicker.js"><?php echo '</script'; ?>
+>-->
+
+
+
+      <!-- para datatables -->
+
+        <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/js/dataTables.bootstrap.min.js"><?php echo '</script'; ?>
+>
+        <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/js/dataTables.fixedColumns.min.js"><?php echo '</script'; ?>
+>
+
+      <!-- para los botones pdf excel csv print... -->
+
+        <!-- hemos traducido parte del fichero para el boton "show"  -->
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/Buttons-1.3.1/js/dataTables.buttons.es.min.js"><?php echo '</script'; ?>
+>
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/Buttons-1.3.1/js/buttons.flash.min.js"><?php echo '</script'; ?>
+>
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/JSZip-3.1.3/jszip.min.js"><?php echo '</script'; ?>
+>
+
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/Buttons-1.3.1/js/buttons.html5.min.js"><?php echo '</script'; ?>
+>
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/Buttons-1.3.1/js/buttons.print.min.js"><?php echo '</script'; ?>
+>
+
+</body>
+</html><?php }
+}
diff --git a/templates_c/345219ed2de3d5f763786a4b5459439094ef0f62_0.file.add_reg.tpl.php b/templates_c/345219ed2de3d5f763786a4b5459439094ef0f62_0.file.add_reg.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..c80a863835537f7fd31d90e3401952536cf3c224
--- /dev/null
+++ b/templates_c/345219ed2de3d5f763786a4b5459439094ef0f62_0.file.add_reg.tpl.php
@@ -0,0 +1,244 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-06-09 15:25:07
+  from '/volume1/web/velostat/templates/add_reg.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_62a1f4b35fbd58_36987265',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    '345219ed2de3d5f763786a4b5459439094ef0f62' => 
+    array (
+      0 => '/volume1/web/velostat/templates/add_reg.tpl',
+      1 => 1654781102,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+    'file:head.tpl' => 1,
+    'file:barra.tpl' => 1,
+    'file:footer.tpl' => 1,
+  ),
+),false)) {
+function content_62a1f4b35fbd58_36987265 (Smarty_Internal_Template $_smarty_tpl) {
+$_smarty_tpl->_checkPlugins(array(0=>array('file'=>'/volume1/web/velostat/plugins/modifier.date_format.php','function'=>'smarty_modifier_date_format',),));
+?>
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	<?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	<!-- Barra de menu -->
+	<?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	
+	<!-- Zona Central -->
+<?php echo '<script'; ?>
+ type="text/javascript">
+
+	function limita(maximoCaracteres) {
+	  var elemento = document.getElementById("texto");
+	  if(elemento.value.length >= maximoCaracteres ) {
+	    return false;
+	  }
+	  else {
+	    return true;
+	  }
+	}
+	
+<?php echo '</script'; ?>
+> 
+
+<div class="" role="main">
+	<div class="">
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+					<div class="x_content">
+						
+
+						<!-- tabla para seleccionar sujeto -->
+						<div class="x_content">
+							<h4 style = "text-align: center;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?>
+</h4>
+							<div class="tablas">
+								<table id="example" class="table table-striped table-bordered" cellspacing="0" width="100%" role="grid" data-order="[[ 2, &quot;asc&quot; ]]">
+
+									<thead>
+										<tr>
+											<td>DNI</td>
+											<td>Nombre</td>
+											<td>Apellidos</td>
+											<td>Sexo</td>
+											<td >Edad</td>
+											<td>Anotaciones del paciente</td>
+
+										</tr>
+									</thead>
+
+									<tbody>
+										<?php
+$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['campos']->value, 'element');
+$_smarty_tpl->tpl_vars['element']->do_else = true;
+if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) {
+$_smarty_tpl->tpl_vars['element']->do_else = false;
+?>
+											<tr >
+												<td><?php echo $_smarty_tpl->tpl_vars['element']->value[0];?>
+</td>
+												<td><?php echo $_smarty_tpl->tpl_vars['element']->value[1];?>
+</td>
+												<td><?php echo $_smarty_tpl->tpl_vars['element']->value[2];?>
+</td>
+												<td><?php echo $_smarty_tpl->tpl_vars['element']->value[3];?>
+</td>
+												<td><?php echo $_smarty_tpl->tpl_vars['element']->value[4];?>
+ (<?php echo smarty_modifier_date_format($_smarty_tpl->tpl_vars['element']->value[6],"%d/%m/%Y");?>
+)</td>
+												<td><?php echo $_smarty_tpl->tpl_vars['element']->value[5];?>
+</td>
+											</tr>
+										<?php
+}
+$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?>
+									</tbody>
+								</table>
+							</div>
+						</div>
+						<h2 style = "text-align: center;">Información del paciente</h2>
+						<form class="form-horizontal form-label-left" action="add_reg_val.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+" method="post">
+							<!-- DNI -->
+														
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" name="dni_paciente" type="text" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[0];?>
+" readonly="readonly" >
+								</div>
+							</div>
+
+							<!-- Nombre -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12"  name="nombre" type="text" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[1];?>
+" readonly="readonly">
+								</div>
+							</div>
+
+							<!-- Apellidos -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Apellidos
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" name="apellidos" type="text" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[2];?>
+" readonly="readonly" >
+								</div>
+							</div>
+
+							<!-- Edad -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Fecha nacimiento
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" name="edad" type="date" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[4];?>
+" readonly="readonly" >
+								</div>
+							</div>
+
+							
+							
+							<!-- ensayo -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Tipo de ensayo *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12" >
+									<select class="select2_single form-control" name="ensayo" required>
+										<option value=""></option>
+										<?php
+$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['ensayos']->value, 'element');
+$_smarty_tpl->tpl_vars['element']->do_else = true;
+if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) {
+$_smarty_tpl->tpl_vars['element']->do_else = false;
+?> 
+										<option value="<?php echo $_smarty_tpl->tpl_vars['element']->value;?>
+"><?php echo $_smarty_tpl->tpl_vars['element']->value;?>
+</option>
+										<?php
+}
+$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?>
+									</select>
+								</div>
+							</div>
+
+							<!-- Simetria -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Simetria de la prueba
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="10" name="simetria" type="text">
+								</div>
+							</div>
+
+							<!-- Anotaciones -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Anotaciones de la prueba
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="anotaciones" type="text">
+								</div>
+							</div>
+
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button>
+									<?php if ($_smarty_tpl->tpl_vars['sujeto']->value[0] != '') {?><button id="send" type="submit" class="btn btn-success">Iniciar</button><?php }?>
+									<?php if ($_smarty_tpl->tpl_vars['sujeto']->value[0] != '') {?><button onclick="limpiar()" type="button" class="btn btn-info">Limpiar</button><?php }?>
+								</div>
+							</div>
+						</form>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<?php echo '<script'; ?>
+ type="text/javascript">
+	//estado();
+	function cancel() {
+			window.location.href="pac_reg.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id=<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[0];?>
+";
+	}
+	function limpiar() {
+		window.location.href="add_reg.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+";
+	}
+	$(document).ready(function() {
+	    $('#example').DataTable({
+   	        lengthMenu: [
+					[ 10, 25, 100, -1 ],
+					[ '10 filas', '25 filas', '100 filas', 'Todas las filas' ]
+        ]
+ 	    });
+	    var table = $('#example').DataTable();
+	 
+	    $('#example tbody').on( 'click', 'tr', function () {
+	        $(this).toggleClass('selected');
+			window.location.href="add_reg.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id="+table.rows('.selected').data()[0][0];
+	    } );
+	} );
+
+<?php echo '</script'; ?>
+>
+<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+}
+}
diff --git a/templates_c/3d61182dbd577100504984bebb40a5601d3a37a6_0.file.ver_pruebas_sujetos.tpl.php b/templates_c/3d61182dbd577100504984bebb40a5601d3a37a6_0.file.ver_pruebas_sujetos.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..51c0f55e7c4d0c9f413e5a33fc94683269cabf19
--- /dev/null
+++ b/templates_c/3d61182dbd577100504984bebb40a5601d3a37a6_0.file.ver_pruebas_sujetos.tpl.php
@@ -0,0 +1,116 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-06-07 20:03:41
+  from '/volume1/web/velostat/templates/ver_pruebas_sujetos.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_629f92fd5cd7f2_62336760',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    '3d61182dbd577100504984bebb40a5601d3a37a6' => 
+    array (
+      0 => '/volume1/web/velostat/templates/ver_pruebas_sujetos.tpl',
+      1 => 1654625010,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+    'file:head.tpl' => 1,
+    'file:barra.tpl' => 1,
+    'file:footer.tpl' => 1,
+  ),
+),false)) {
+function content_629f92fd5cd7f2_62336760 (Smarty_Internal_Template $_smarty_tpl) {
+$_smarty_tpl->_checkPlugins(array(0=>array('file'=>'/volume1/web/velostat/plugins/modifier.date_format.php','function'=>'smarty_modifier_date_format',),));
+?>
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	<?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	<!-- Barra de menu -->
+	<?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+
+	<!-- Zona Central -->
+<div class="" role="main">
+	<h4 style = "text-align: center;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?>
+</h4>
+			
+	<div class="ln_solid"></div>
+
+	<div class="x_content">
+		<div class="">
+			<h4 style = "text-align: center;">LISTADO DE PRUEBAS</h4>
+			<table id="example" class="table table-striped table-bordered" cellspacing="0" width="99%" role="grid" data-order="[[ 2, &quot;desc&quot; ]]" style="font-size:13px;">
+				<thead>
+					<tr>
+						<td width="80">id_prueba</td>
+						<td width="200">Tipo</td>
+						<td width="120">Fecha - Hora</td>
+						<td width="80">Sexo</td>
+						<td width="80">Edad</td>
+						<td>Simetria</td>
+						<td>Anotaciones</td>
+					</tr>
+				</thead>
+
+				<tbody>
+					<?php
+$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['entrada']->value, 'element');
+$_smarty_tpl->tpl_vars['element']->do_else = true;
+if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) {
+$_smarty_tpl->tpl_vars['element']->do_else = false;
+?>
+						<tr data-toggle="tooltip" data-placement="top" title="Click para ver documentación relaccionada" >
+							<td><?php echo $_smarty_tpl->tpl_vars['element']->value[0];?>
+</td>
+							<td><?php echo $_smarty_tpl->tpl_vars['element']->value[1];?>
+</td>
+							<td><?php echo smarty_modifier_date_format($_smarty_tpl->tpl_vars['element']->value[2],"%d/%m/%Y");?>
+</td>
+							<td><?php echo $_smarty_tpl->tpl_vars['element']->value[3];?>
+</td>
+							<td><?php echo $_smarty_tpl->tpl_vars['element']->value[4];?>
+</td>
+							<td><?php echo $_smarty_tpl->tpl_vars['element']->value[5];?>
+</td>
+							<td><?php echo $_smarty_tpl->tpl_vars['element']->value[6];?>
+</td>
+						</tr>
+					<?php
+}
+$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?>
+				</tbody>
+			</table>
+		</div>
+	</div>
+</div>
+
+	
+<?php echo '<script'; ?>
+ type="text/javascript">
+	
+
+	$(document).ready(function() {
+	    $('#example').DataTable({
+   	    lengthMenu: [
+					[ 10, 25, 100, -1 ],
+					[ '10 filas', '25 filas', '100 filas', 'Todas las filas' ]
+        ]
+ 	    });
+	    var table = $('#example').DataTable();
+	 
+	    $('#example tbody').on( 'click', 'tr', function () {
+	        $(this).toggleClass('selected');
+			window.location.href="ver_datos_sujeto.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id="+table.rows('.selected').data()[0][0];
+	    } );
+	} );
+<?php echo '</script'; ?>
+>
+<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+}
+}
diff --git a/templates_c/478051947e1a0b67b97cd373065cddf4f166d358_0.file.ver_datos.tpl.php b/templates_c/478051947e1a0b67b97cd373065cddf4f166d358_0.file.ver_datos.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..e41ffa845d331ef3530cd321edb8a611aaa9fc2f
--- /dev/null
+++ b/templates_c/478051947e1a0b67b97cd373065cddf4f166d358_0.file.ver_datos.tpl.php
@@ -0,0 +1,204 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-06-07 19:59:32
+  from '/volume1/web/velostat/templates/ver_datos.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_629f9204b67ea6_05958572',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    '478051947e1a0b67b97cd373065cddf4f166d358' => 
+    array (
+      0 => '/volume1/web/velostat/templates/ver_datos.tpl',
+      1 => 1654624764,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+    'file:head.tpl' => 1,
+    'file:barra.tpl' => 1,
+    'file:footer.tpl' => 1,
+  ),
+),false)) {
+function content_629f9204b67ea6_05958572 (Smarty_Internal_Template $_smarty_tpl) {
+$_smarty_tpl->_checkPlugins(array(0=>array('file'=>'/volume1/web/velostat/plugins/modifier.date_format.php','function'=>'smarty_modifier_date_format',),));
+?>
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	<?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	<!-- Barra de menu -->
+	<?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+
+	<!-- Zona Central -->
+<div class="" role="main">
+	<div class="x_content">
+		<canvas id="myChart"></canvas>
+		<?php echo '<script'; ?>
+ src="https://cdn.jsdelivr.net/npm/chart.js"><?php echo '</script'; ?>
+>
+		<?php echo '<script'; ?>
+>
+			const labels = [<?php echo $_smarty_tpl->tpl_vars['etiquetas']->value;?>
+];
+			const tension = 0.3;
+			const data = {
+				labels: labels,
+				datasets: [{
+					label: 'Sensor 1',
+					data: [<?php echo $_smarty_tpl->tpl_vars['s1']->value;?>
+],
+					fill: false,
+					borderColor: 'rgb(75, 192, 192)',
+					tension: tension
+				},{
+					label: 'Sensor 2',
+					data: [<?php echo $_smarty_tpl->tpl_vars['s2']->value;?>
+],
+					fill: false,
+					borderColor: 'rgb(255, 45, 0)',
+					tension: tension
+				},{
+					label: 'Sensor 3',
+					data: [<?php echo $_smarty_tpl->tpl_vars['s3']->value;?>
+],
+					fill: false,
+					borderColor: 'rgb(255, 255, 0 )',
+					tension: tension
+				},{
+					label: 'Sensor 4',
+					data: [<?php echo $_smarty_tpl->tpl_vars['s4']->value;?>
+],
+					fill: false,
+					borderColor: 'rgb(0, 255, 46 )',
+					tension: tension
+				},{
+					label: 'Sensor 5',
+					data: [<?php echo $_smarty_tpl->tpl_vars['s5']->value;?>
+],
+					fill: false,
+					borderColor: 'rgb(0, 27, 255 )',
+					tension: tension
+				},{
+					label: 'Sensor 6',
+					data: [<?php echo $_smarty_tpl->tpl_vars['s6']->value;?>
+],
+					fill: false,
+					borderColor: 'rgb(255, 0, 240 )',
+					tension: tension
+				}]
+			};
+		
+			const config = {
+				type: 'line',
+				data,
+				options: {
+					responsive: true,
+					elements: {
+						point:{
+							pointBorderWidth:0.1,
+							pointHitRadius:0.1,
+							pointBorderColor:'rgba(0, 0, 0, 0)',
+							pointBackgroundColor:'rgba(0, 0, 0, 0)',
+
+						}
+					},
+					plugins: {
+						title: {
+							display: true,
+							text: '<?php echo $_smarty_tpl->tpl_vars['tipo']->value;?>
+ de <?php echo $_smarty_tpl->tpl_vars['nombre']->value;?>
+, a fecha de: <?php echo smarty_modifier_date_format($_smarty_tpl->tpl_vars['fecha']->value,"%d/%m/%Y %H:%M:%S");?>
+ ',
+							color: '#9',
+								font: {
+									family: 'Helvetica Neue',
+									size: 30,
+									weight: 'bold',
+									lineHeight: 1.5,
+								}
+						}
+					},
+					scales: {
+						x: {
+							display: true,
+							title:{
+								display: true,
+								text: 'Tiempo',
+								color: '#9',
+								font: {
+									family: 'Helvetica Neue',
+									size: 20,
+									weight: 'bold',
+									lineHeight: 1.2,
+								}
+							}
+						},
+						y: {
+							display: true,
+							title:{
+								display: true,
+								text: 'Señal',
+								color: '#9',
+								font: {
+									family: 'Helvetica Neue',
+									size: 20,
+									weight: 'bold',
+									lineHeight: 1.2,
+								}
+							}
+						}
+					}
+				}
+			};
+
+			var myChart = new Chart(
+			document.getElementById('myChart'),
+			config
+			);
+		<?php echo '</script'; ?>
+>
+		<div class="form-group">
+			<div class="col-md-7 col-md-offset-4">
+				<button onclick="salir()" type="button" class="btn btn-warning">Salir</button>
+				<button onclick="borrar()" type="button" class="btn btn-danger">Borrar prueba</button>
+			</div>
+		</div>
+	</div>
+</div>
+
+	
+<?php echo '<script'; ?>
+ type="text/javascript">
+	function salir(){
+		history.back();
+		//window.location.href="pac_reg.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id=<?php echo $_smarty_tpl->tpl_vars['dni_paciente']->value;?>
+";
+	}	
+
+	function borrar(){
+		var reply=confirm("¿Seguro que desea borrar la prueba?")
+		if (reply==true) 
+		{
+		window.location.href="borrar_prueba.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id=<?php echo $_smarty_tpl->tpl_vars['id_prueba']->value;?>
+";
+		}
+		else 
+		{
+		//AQUI NO HARIA NADA, SE CERRARIA EL POPUP Y SEGUIRIA EN LA PAGINA ACTUAL
+		}
+		
+	}
+
+<?php echo '</script'; ?>
+>
+	
+<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+}
+}
diff --git a/templates_c/6059d6d227d8662e9e78e3b220f9209dfa254a5e_0.file.login.tpl.php b/templates_c/6059d6d227d8662e9e78e3b220f9209dfa254a5e_0.file.login.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..8e642e55355744795018e324d220db7508e5d129
--- /dev/null
+++ b/templates_c/6059d6d227d8662e9e78e3b220f9209dfa254a5e_0.file.login.tpl.php
@@ -0,0 +1,40 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-06-01 10:54:43
+  from '/volume1/web/velostat/templates/login.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_629729533962a5_63438249',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    '6059d6d227d8662e9e78e3b220f9209dfa254a5e' => 
+    array (
+      0 => '/volume1/web/velostat/templates/login.tpl',
+      1 => 1654017270,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+  ),
+),false)) {
+function content_629729533962a5_63438249 (Smarty_Internal_Template $_smarty_tpl) {
+?><!DOCTYPE html>
+<html lang="es">
+<head>
+	<meta charset="UTF-8">
+	<title><?php echo $_smarty_tpl->tpl_vars['titulo']->value;?>
+</title>
+</head>
+<body>
+	<?php echo '<script'; ?>
+> 
+        window.location.href='result.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+'; 
+	<?php echo '</script'; ?>
+>
+</body>
+</html><?php }
+}
diff --git a/templates_c/6f12640b330c3190e957a7923de4fa93d876fcac_0.file.prueba_sujeto.tpl.php b/templates_c/6f12640b330c3190e957a7923de4fa93d876fcac_0.file.prueba_sujeto.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..801a0e3dc691898c9bdc522badd9ae9e474a7e9f
--- /dev/null
+++ b/templates_c/6f12640b330c3190e957a7923de4fa93d876fcac_0.file.prueba_sujeto.tpl.php
@@ -0,0 +1,177 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-06-09 14:45:55
+  from '/volume1/web/velostat/templates/prueba_sujeto.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_62a1eb83b91f64_59608715',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    '6f12640b330c3190e957a7923de4fa93d876fcac' => 
+    array (
+      0 => '/volume1/web/velostat/templates/prueba_sujeto.tpl',
+      1 => 1654778750,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+    'file:head.tpl' => 1,
+    'file:barra.tpl' => 1,
+    'file:footer.tpl' => 1,
+  ),
+),false)) {
+function content_62a1eb83b91f64_59608715 (Smarty_Internal_Template $_smarty_tpl) {
+?><!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	<?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	<!-- Barra de menu -->
+	<?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	
+	<!-- Zona Central -->
+<?php echo '<script'; ?>
+ type="text/javascript">
+
+	function limita(maximoCaracteres) {
+	  var elemento = document.getElementById("texto");
+	  if(elemento.value.length >= maximoCaracteres ) {
+	    return false;
+	  }
+	  else {
+	    return true;
+	  }
+	}
+	
+<?php echo '</script'; ?>
+> 
+
+<div class="" role="main">
+	<div class="">
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+					<div class="x_content">
+						
+
+						<h2 style = "text-align: center;">Información del sujeto <?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?>
+</h2>
+						<form class="form-horizontal form-label-left" action="prueba_sujeto_val.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+" method="post">
+
+							<!-- Edad -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Edad*
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" name="edad" type="number" required placeholder="En años">
+								</div>
+							</div>
+
+							<!-- Sexo -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name" >Sexo Masculino* 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<div class="radio">
+										<input type="radio" name="sexo"  value="M" required style="margin-left: 0px;">  
+									</div>
+								</div>
+							</div>
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name" >Sexo Femenino*
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<div class="radio">
+										<input type="radio" name="sexo" value="F" style="margin-left: 0px;">  
+									</div>
+								</div>
+							</div>
+
+							<!-- Anotaciones Sujeto-->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Comentarios del sujeto
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<textarea id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="anotaciones_sujeto" type="text"></textarea>
+								</div>
+							</div>
+
+							
+							
+							<!-- ensayo -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Tipo de ensayo *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12" >
+									<select class="select2_single form-control" name="ensayo" required>
+										<option value=""></option>
+										<?php
+$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['ensayos']->value, 'element');
+$_smarty_tpl->tpl_vars['element']->do_else = true;
+if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) {
+$_smarty_tpl->tpl_vars['element']->do_else = false;
+?> 
+										<option value="<?php echo $_smarty_tpl->tpl_vars['element']->value;?>
+"><?php echo $_smarty_tpl->tpl_vars['element']->value;?>
+</option>
+										<?php
+}
+$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?>
+									</select>
+								</div>
+							</div>
+
+							<!-- Simetria -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Simetria de la prueba
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="10" name="simetria" type="text">
+								</div>
+							</div>
+
+							<!-- Anotaciones prueba-->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Anotaciones de la prueba
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<textarea id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="anotaciones_prueba" type="text"></textarea>
+								</div>
+							</div>
+
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button>
+									<button id="send" type="submit" class="btn btn-success">Iniciar</button>
+									<button onclick="limpiar()" type="button" class="btn btn-info">Limpiar</button>
+								</div>
+							</div>
+						</form>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<?php echo '<script'; ?>
+ type="text/javascript">
+	//estado();
+	function cancel() {
+		window.location.href="result.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+";
+	}
+	function limpiar() {
+		window.location.href="prueba_sujeto.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+";
+	}
+
+<?php echo '</script'; ?>
+>
+<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+}
+}
diff --git a/templates_c/83d760623fc7756601facaac13319e4f02e250c9_0.file.add_gestor.tpl.php b/templates_c/83d760623fc7756601facaac13319e4f02e250c9_0.file.add_gestor.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..83697d2d7f3a0d30c21a817983a7fb56dfac1efe
--- /dev/null
+++ b/templates_c/83d760623fc7756601facaac13319e4f02e250c9_0.file.add_gestor.tpl.php
@@ -0,0 +1,156 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-05-31 19:14:42
+  from '/volume1/web/velostat/templates/add_gestor.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_62964d02be5dc6_40683017',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    '83d760623fc7756601facaac13319e4f02e250c9' => 
+    array (
+      0 => '/volume1/web/velostat/templates/add_gestor.tpl',
+      1 => 1654017269,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+    'file:head.tpl' => 1,
+    'file:barra.tpl' => 1,
+    'file:footer.tpl' => 1,
+  ),
+),false)) {
+function content_62964d02be5dc6_40683017 (Smarty_Internal_Template $_smarty_tpl) {
+?><!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	<?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	<!-- Barra de menu -->
+	<?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	
+	<!-- Zona Central -->
+
+<div class="" role="main">
+	<div class="">
+		<div class="page-title"> 
+			<div class="title_left">
+			</div>
+
+		</div>
+		<div class="clearfix"></div>
+
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+					<div class="x_title">
+						<h2> <?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?>
+<small></small></h2>
+						<div class="clearfix"></div>
+					</div>
+					<div class="x_content">
+
+						<form class="form-horizontal form-label-left" action="add_gestor.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+" method="post">
+
+							<!-- id_admin -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="select2_single form-control" pattern="[0-9]{8}[A-Z]" required maxlength="30" name="dni_trabajador" placeholder="Introduzca un número válido 8 num + Letra">
+								</div>
+							</div> 
+
+							<!-- Nombre -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="select2_single form-control" required maxlength="100" type="text" name="nombre">
+								</div>
+							</div>
+
+							<!-- Apellidos -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Apellidos *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="select2_single form-control" required maxlength="200" type="text" name="apellidos">
+								</div>
+							</div>
+
+							<!-- login -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Login *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="select2_single form-control" required maxlength="15" type="text" name="login">
+								</div>
+							</div>
+
+							<!-- titulacion -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Titulación *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="select2_single form-control" required maxlength="20" type="text" name="titulacion">
+								</div>
+							</div>
+
+							<!-- Pass -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Contraseña *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="select2_single form-control" required maxlength="40" type="password" placeholder="Mínimo 6 carácteres" pattern=".{6,25}" name="pass">
+								</div>
+							</div>
+
+							<!-- Repass -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Repita contraseña *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="select2_single form-control" required maxlength="40" type="password" placeholder="Mínimo 6 carácteres" pattern=".{6,25}" name="passrw">
+								</div>
+							</div>
+
+							<!-- Permisos -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Permisos *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="select2_single form-control" pattern="[012]{1}" required type="text" name="permisos" placeholder="0:R - 1:RW - 2:RWX">
+								</div>
+							</div>
+
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button  type="button" onclick="cancel()" class="btn btn-warning">Cancelar</button>
+									<button id="send" type="submit" class="btn btn-success">Validar</button>
+								</div>
+							</div>
+						</form>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<?php echo '<script'; ?>
+ type="text/javascript">
+	function cancel() {
+		window.location.href="result.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+";
+	}
+
+<?php echo '</script'; ?>
+>
+<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+}
+}
diff --git a/templates_c/852385741bddf884fc5ca64b0d046b2e58a8c8e8_0.file.add_reg_val.tpl.php b/templates_c/852385741bddf884fc5ca64b0d046b2e58a8c8e8_0.file.add_reg_val.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..de711ed33ba48971ebb8d940d97c0cb1196d8bf0
--- /dev/null
+++ b/templates_c/852385741bddf884fc5ca64b0d046b2e58a8c8e8_0.file.add_reg_val.tpl.php
@@ -0,0 +1,252 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-06-09 14:53:34
+  from '/volume1/web/velostat/templates/add_reg_val.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_62a1ed4ea943f1_41326319',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    '852385741bddf884fc5ca64b0d046b2e58a8c8e8' => 
+    array (
+      0 => '/volume1/web/velostat/templates/add_reg_val.tpl',
+      1 => 1654779206,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+    'file:head.tpl' => 1,
+    'file:barra.tpl' => 1,
+    'file:footer.tpl' => 1,
+  ),
+),false)) {
+function content_62a1ed4ea943f1_41326319 (Smarty_Internal_Template $_smarty_tpl) {
+?><!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	<?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	<!-- Barra de menu -->
+	<?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+
+	<!-- Zona Central -->
+
+<div class="" role="main">
+	<div class="">
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+					<div class="x_content">
+						<form action="http://192.168.1.240/<?php echo $_smarty_tpl->tpl_vars['get']->value;?>
+" target="esp">
+							<button type="submit" formmethod="get" id="init" onclick="inicio()" formnovalidate>Iniciar</button>
+						</form>
+					</div>					
+				</div>
+			</div>
+
+			<div class="col-md-4 col-sm-4 col-xs-4">
+				
+				<div class="x_panel">
+					<div class="x_content">
+						<iframe name="esp" id="esp" src="http://192.168.1.240/" ></iframe>
+					</div>
+				</div>
+			</div>
+			<div class="col-md-4 col-sm-4 col-xs-4">
+				<div class="x_panel">
+					<div class="x_content">
+						<form action="http://192.168.1.240/" target="esp">
+							<button type="submit" formmethod="get"  formnovalidate>Reset ESP</button>
+						</form>
+						<div >
+							<img style='height: 300px;' src="<?php echo $_smarty_tpl->tpl_vars['imagen']->value;?>
+">
+						</div>
+					</div>					
+				</div>
+			</div>
+			<div class="col-md-4 col-sm-4 col-xs-4">
+				<div class="x_panel">
+					<div class="x_content">
+						<div >
+							<h2><strong>Colocación sensores:</strong></h2>
+							<h2><?php echo $_smarty_tpl->tpl_vars['coloc_sensores']->value;?>
+</h2>
+						</div>
+					</div>					
+				</div>
+			</div>
+
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+					<div class="x_content">
+					</div>					
+				</div>
+			</div>
+
+			<div class="col-md-6 col-6 col-xs-6">
+				<div class="x_panel">
+					<div class="x_content">
+						<h1><?php echo $_smarty_tpl->tpl_vars['segundos']->value;?>
+:00</h1>
+					</div>					
+				</div>
+				<div class="x_panel">
+					<div class="x_content">
+						<button type="submit" formmethod="get"  id="done" class="btn btn-success" onclick="done()" formnovalidate>Ver resultados</button>
+						<button type="submit" formmethod="get"  id="salir" class="btn btn-danger" onclick="salir()" formnovalidate>Salir</button>
+					</div>					
+				</div>
+			</div>
+			<div class="col-md-6 col-sm-6 col-xs-6">
+				<div class="x_panel">
+					<div class="x_content">
+						<div id="foto">
+						Aviso
+						</div>
+					</div>					
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<?php echo '<script'; ?>
+ type="text/javascript">
+window.onload = function() {
+    var oFrame = document.getElementById("esp");
+    oFrame.contentWindow.document.onclick = function() {
+        alert("frame contents clicked");
+    };
+};
+<?php echo '</script'; ?>
+>
+
+<?php echo '<script'; ?>
+ type="text/javascript">
+	let h1 = document.querySelector("h1");
+
+	let centesimas = 0;
+	let segundos = <?php echo $_smarty_tpl->tpl_vars['segundos']->value;?>
+;
+
+	var snd1 = new Audio("data:audio/wav;base64,//uQRAAAAWMSLwUIYAAsYkXgoQwAEaYLWfkWgAI0wWs/ItAAAGDgYtAgAyN+QWaAAihwMWm4G8QQRDiMcCBcH3Cc+CDv/7xA4Tvh9Rz/y8QADBwMWgQAZG/ILNAARQ4GLTcDeIIIhxGOBAuD7hOfBB3/94gcJ3w+o5/5eIAIAAAVwWgQAVQ2ORaIQwEMAJiDg95G4nQL7mQVWI6GwRcfsZAcsKkJvxgxEjzFUgfHoSQ9Qq7KNwqHwuB13MA4a1q/DmBrHgPcmjiGoh//EwC5nGPEmS4RcfkVKOhJf+WOgoxJclFz3kgn//dBA+ya1GhurNn8zb//9NNutNuhz31f////9vt///z+IdAEAAAK4LQIAKobHItEIYCGAExBwe8jcToF9zIKrEdDYIuP2MgOWFSE34wYiR5iqQPj0JIeoVdlG4VD4XA67mAcNa1fhzA1jwHuTRxDUQ//iYBczjHiTJcIuPyKlHQkv/LHQUYkuSi57yQT//uggfZNajQ3Vmz+Zt//+mm3Wm3Q576v////+32///5/EOgAAADVghQAAAAA//uQZAUAB1WI0PZugAAAAAoQwAAAEk3nRd2qAAAAACiDgAAAAAAABCqEEQRLCgwpBGMlJkIz8jKhGvj4k6jzRnqasNKIeoh5gI7BJaC1A1AoNBjJgbyApVS4IDlZgDU5WUAxEKDNmmALHzZp0Fkz1FMTmGFl1FMEyodIavcCAUHDWrKAIA4aa2oCgILEBupZgHvAhEBcZ6joQBxS76AgccrFlczBvKLC0QI2cBoCFvfTDAo7eoOQInqDPBtvrDEZBNYN5xwNwxQRfw8ZQ5wQVLvO8OYU+mHvFLlDh05Mdg7BT6YrRPpCBznMB2r//xKJjyyOh+cImr2/4doscwD6neZjuZR4AgAABYAAAABy1xcdQtxYBYYZdifkUDgzzXaXn98Z0oi9ILU5mBjFANmRwlVJ3/6jYDAmxaiDG3/6xjQQCCKkRb/6kg/wW+kSJ5//rLobkLSiKmqP/0ikJuDaSaSf/6JiLYLEYnW/+kXg1WRVJL/9EmQ1YZIsv/6Qzwy5qk7/+tEU0nkls3/zIUMPKNX/6yZLf+kFgAfgGyLFAUwY//uQZAUABcd5UiNPVXAAAApAAAAAE0VZQKw9ISAAACgAAAAAVQIygIElVrFkBS+Jhi+EAuu+lKAkYUEIsmEAEoMeDmCETMvfSHTGkF5RWH7kz/ESHWPAq/kcCRhqBtMdokPdM7vil7RG98A2sc7zO6ZvTdM7pmOUAZTnJW+NXxqmd41dqJ6mLTXxrPpnV8avaIf5SvL7pndPvPpndJR9Kuu8fePvuiuhorgWjp7Mf/PRjxcFCPDkW31srioCExivv9lcwKEaHsf/7ow2Fl1T/9RkXgEhYElAoCLFtMArxwivDJJ+bR1HTKJdlEoTELCIqgEwVGSQ+hIm0NbK8WXcTEI0UPoa2NbG4y2K00JEWbZavJXkYaqo9CRHS55FcZTjKEk3NKoCYUnSQ0rWxrZbFKbKIhOKPZe1cJKzZSaQrIyULHDZmV5K4xySsDRKWOruanGtjLJXFEmwaIbDLX0hIPBUQPVFVkQkDoUNfSoDgQGKPekoxeGzA4DUvnn4bxzcZrtJyipKfPNy5w+9lnXwgqsiyHNeSVpemw4bWb9psYeq//uQZBoABQt4yMVxYAIAAAkQoAAAHvYpL5m6AAgAACXDAAAAD59jblTirQe9upFsmZbpMudy7Lz1X1DYsxOOSWpfPqNX2WqktK0DMvuGwlbNj44TleLPQ+Gsfb+GOWOKJoIrWb3cIMeeON6lz2umTqMXV8Mj30yWPpjoSa9ujK8SyeJP5y5mOW1D6hvLepeveEAEDo0mgCRClOEgANv3B9a6fikgUSu/DmAMATrGx7nng5p5iimPNZsfQLYB2sDLIkzRKZOHGAaUyDcpFBSLG9MCQALgAIgQs2YunOszLSAyQYPVC2YdGGeHD2dTdJk1pAHGAWDjnkcLKFymS3RQZTInzySoBwMG0QueC3gMsCEYxUqlrcxK6k1LQQcsmyYeQPdC2YfuGPASCBkcVMQQqpVJshui1tkXQJQV0OXGAZMXSOEEBRirXbVRQW7ugq7IM7rPWSZyDlM3IuNEkxzCOJ0ny2ThNkyRai1b6ev//3dzNGzNb//4uAvHT5sURcZCFcuKLhOFs8mLAAEAt4UWAAIABAAAAAB4qbHo0tIjVkUU//uQZAwABfSFz3ZqQAAAAAngwAAAE1HjMp2qAAAAACZDgAAAD5UkTE1UgZEUExqYynN1qZvqIOREEFmBcJQkwdxiFtw0qEOkGYfRDifBui9MQg4QAHAqWtAWHoCxu1Yf4VfWLPIM2mHDFsbQEVGwyqQoQcwnfHeIkNt9YnkiaS1oizycqJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU=");  
+	var snd2 = new Audio("media/audio/check.mp3");
+
+	var intervalo = 0;
+	var intervaloBase = segundos/<?php echo $_smarty_tpl->tpl_vars['repeticiones']->value;?>
+;
+	var repSg = segundos-1;
+	var repCnt = 99;
+	var estado = 0;
+	$('#done').hide();
+
+	console.log(estado, "Intervalo repetición: ", intervaloBase, "-", intervalo, "(",repSg,":",repCnt,")", "Repeticiones totales:", <?php echo $_smarty_tpl->tpl_vars['repeticiones']->value;?>
+);
+	function run(){
+		if (estado ==0){
+			if((centesimas == 0) &&( segundos == 0)){
+			check();
+			h1.style.color = 'red';
+			$("#foto").html("<h1><strong>FIN</strong></h1>");
+			$('#done').show();
+			estado = 1;
+			// función para hacer un delay antes del windows location
+			// esperamos 2 segundos
+			function stateChange(newState) {
+				setTimeout(function () {
+					if (newState == -1) {
+						/*
+						 * Comprobamos que el sensor ha enviado los datos y ponemos un mensaje acorde.
+						 * /
+						$.post("comprobar_post.php",  {
+								recarga:'info' , 
+								puesto: <?php echo $_smarty_tpl->tpl_vars['puesto']->value;?>
+, 
+								linea: '<?php echo $_smarty_tpl->tpl_vars['linea']->value;?>
+',
+								cambio: <?php echo $_smarty_tpl->tpl_vars['prox_cambio']->value;?>
+,
+								serie: '<?php echo $_smarty_tpl->tpl_vars['serie']->value;?>
+',
+								foto: '<?php echo $_smarty_tpl->tpl_vars['imagen']->value;?>
+',
+								posicion_ant: <?php echo $_smarty_tpl->tpl_vars['posicion']->value;?>
+
+								}  , 
+								function(data){
+									//recarga titulo y barcode
+									$("#resultado").html(data);
+								});	
+						//*/
+						alert("Saliendo");
+						window.location.href="result.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+";
+					}
+				}, 2000);
+			}
+			
+			}else{
+				// Comprobamos que llegamos a una repetición y ponemos un aviso
+				if(centesimas == repCnt && segundos == repSg) {
+					console.log("intervalo = ", repSg,":",repCnt);
+					$("#foto").html("<h1><strong><?php echo $_smarty_tpl->tpl_vars['ensayo']->value;?>
+</strong></h1>");   
+					beep(); 
+				}
+				// quitamos el aviso 1seg despues y preparamos la siguiente repeticion
+				if(centesimas == repCnt && segundos == repSg - 1) {
+					intervalo = intervalo + intervaloBase;
+					repSg = <?php echo $_smarty_tpl->tpl_vars['segundos']->value;?>
+ - Math.trunc(intervalo) - 1;
+					repCnt = 99 - Math.trunc((intervalo - Math.trunc(intervalo))*100);
+					console.log("Nuevo intervalo:",intervalo,"Proxima Repeticion:", repSg, ":", repCnt, "Tiempo:", segundos +':'+centesimas);
+					$("#foto").html("<h1><strong>Reposo</strong></h1>"); 
+				}
+
+				if(centesimas == 0){
+					--segundos;
+					centesimas = 99;
+				}else{
+					--centesimas;
+				}
+				h1.innerHTML = segundos +':'+centesimas;
+
+			}
+		
+		}
+	}
+		
+	function inicio(){
+		$('#salir').hide();
+		$('#init').hide();
+		segundos = <?php echo $_smarty_tpl->tpl_vars['segundos']->value;?>
+;
+		setInterval(run, 10);
+	}
+	function done() {
+		window.location.href="ver_datos_paciente.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id=<?php echo $_smarty_tpl->tpl_vars['id_prueba']->value;?>
+";
+	}
+	function salir() {
+		window.location.href="add_reg.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id=<?php echo $_smarty_tpl->tpl_vars['dni_paciente']->value;?>
+&id_prueba=<?php echo $_smarty_tpl->tpl_vars['id_prueba']->value;?>
+&accion=1";	
+	}
+	function beep() {
+		snd1.play();
+	}
+	function check(){
+		snd2.play();
+	}
+<?php echo '</script'; ?>
+>
+<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+}
+}
diff --git a/templates_c/a340c089a3c33d39af545ca1dda6ba4981614187_0.file.mod_pass.tpl.php b/templates_c/a340c089a3c33d39af545ca1dda6ba4981614187_0.file.mod_pass.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..3ba58e8e226a1a8ab01588a63105126502677572
--- /dev/null
+++ b/templates_c/a340c089a3c33d39af545ca1dda6ba4981614187_0.file.mod_pass.tpl.php
@@ -0,0 +1,124 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-05-31 19:14:52
+  from '/volume1/web/velostat/templates/mod_pass.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_62964d0c7647a0_10580964',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    'a340c089a3c33d39af545ca1dda6ba4981614187' => 
+    array (
+      0 => '/volume1/web/velostat/templates/mod_pass.tpl',
+      1 => 1654017270,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+    'file:head.tpl' => 1,
+    'file:barra.tpl' => 1,
+    'file:footer.tpl' => 1,
+  ),
+),false)) {
+function content_62964d0c7647a0_10580964 (Smarty_Internal_Template $_smarty_tpl) {
+?><!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	<?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	<!-- Barra de menu -->
+	<?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	
+	<!-- Zona Central -->
+
+<div class="" role="main">
+	<div class="">
+		<div class="page-title"> 
+			<div class="title_left">
+			</div>
+
+		</div>
+		<div class="clearfix"></div>
+
+		<div class="row">
+			<div class="col-md-4 col-sm-4 col-xs-12">
+				<div class="x_panel">
+					<div class="x_content">
+						<div class="x_title">
+							<h2> <?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?>
+<small></small></h2>
+							<div class="clearfix"></div>
+						</div>
+
+			            <div class="profile_pic">
+	    		        	<img src="media/images/personal/<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+.png" alt="..." class="img-circle profile_img">
+	            		</div>
+					</div>
+				</div>
+			</div>
+			<div class="col-md-8 col-sm-8 col-xs-12">
+				<div class="x_panel"> 
+					<div class="x_content">
+						<form class="form-horizontal form-label-left" action="mod_pass.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+" method="post">
+						
+							
+							<!-- Old Pass -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Contraseña antigua *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control" maxlength="40" minlength="6" required type="password" placeholder="Mínimo 6 carácteres" name="oldpass">
+								</div>
+							</div>
+
+							<!-- Pass -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Contraseña nueva *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control" maxlength="40" minlength="6" required type="password" placeholder="Mínimo 6 carácteres" name="pass">
+								</div>
+							</div>
+
+							<!-- Repass -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Repita nueva contraseña *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control" maxlength="40" minlength="6" required type="password" placeholder="Mínimo 6 carácteres"  name="passrw">
+								</div>
+							</div>
+
+							
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button type="button" onclick="cancel()" class="btn btn-warning">Cancelar</button>
+									<button id="send" type="submit" class="btn btn-success">Guardar</button>
+								</div>
+							</div>
+						</form>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<?php echo '<script'; ?>
+ type="text/javascript">
+	function cancel() {
+		window.location.href="result.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+";
+	}
+	
+<?php echo '</script'; ?>
+>
+<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+}
+}
diff --git a/templates_c/ae3142fe6bbfcbae3a10c25828b494ac93e1b5a7_0.file.ges_pat_nueva.tpl.php b/templates_c/ae3142fe6bbfcbae3a10c25828b494ac93e1b5a7_0.file.ges_pat_nueva.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..3f968c550bfc4a2c5e915ca658b1bf32dc3f8827
--- /dev/null
+++ b/templates_c/ae3142fe6bbfcbae3a10c25828b494ac93e1b5a7_0.file.ges_pat_nueva.tpl.php
@@ -0,0 +1,109 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-06-09 14:58:17
+  from '/volume1/web/velostat/templates/ges_pat_nueva.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_62a1ee6913af94_79641532',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    'ae3142fe6bbfcbae3a10c25828b494ac93e1b5a7' => 
+    array (
+      0 => '/volume1/web/velostat/templates/ges_pat_nueva.tpl',
+      1 => 1654017270,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+    'file:head.tpl' => 1,
+    'file:barra.tpl' => 1,
+    'file:footer.tpl' => 1,
+  ),
+),false)) {
+function content_62a1ee6913af94_79641532 (Smarty_Internal_Template $_smarty_tpl) {
+?><!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	<?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	<!-- Barra de menu -->
+	<?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	
+	<!-- Zona Central -->
+<?php echo '<script'; ?>
+ type="text/javascript">
+
+	function limita(maximoCaracteres) {
+	  var elemento = document.getElementById("texto");
+	  if(elemento.value.length >= maximoCaracteres ) {
+	    return false;
+	  }
+	  else {
+	    return true;
+	  }
+	}
+	 	
+<?php echo '</script'; ?>
+> 
+<div class="" role="main">
+	<div class="">
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+				<div class="x_title">
+							<h2> <?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?>
+<small></small></h2>
+				<div class="clearfix"></div>
+						</div>
+					<div class="x_content">
+						<form class="form-horizontal form-label-left" action="ges_pat_nueva.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+" method="post">
+							
+							<!-- Nombre -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="100" name="nombre" required type="text" >
+								</div>
+							</div>
+
+							<!-- Descripción -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Descripción
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="200" name="descripcion" type="text" >
+								</div>
+							</div>
+
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button>
+									<button id="send" type="submit" class="btn btn-success">Guardar</button>
+								</div>
+							</div>
+						</form>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<?php echo '<script'; ?>
+ type="text/javascript">
+	//estado();
+	function cancel() {
+		window.location.href="ges_pat.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+";
+	}
+
+<?php echo '</script'; ?>
+>
+<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+}
+}
diff --git a/templates_c/b530caa1abef0c4158762b9094485c175b74cac8_0.file.add_pac.tpl.php b/templates_c/b530caa1abef0c4158762b9094485c175b74cac8_0.file.add_pac.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..d0b5522eba2cf97e4cba2417fdc292123c427f91
--- /dev/null
+++ b/templates_c/b530caa1abef0c4158762b9094485c175b74cac8_0.file.add_pac.tpl.php
@@ -0,0 +1,230 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-06-09 15:42:41
+  from '/volume1/web/velostat/templates/add_pac.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_62a1f8d142fbb8_07040983',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    'b530caa1abef0c4158762b9094485c175b74cac8' => 
+    array (
+      0 => '/volume1/web/velostat/templates/add_pac.tpl',
+      1 => 1654782144,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+    'file:head.tpl' => 1,
+    'file:barra.tpl' => 1,
+    'file:footer.tpl' => 1,
+  ),
+),false)) {
+function content_62a1f8d142fbb8_07040983 (Smarty_Internal_Template $_smarty_tpl) {
+?><!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	<?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	<!-- Barra de menu -->
+	<?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	
+	<!-- Zona Central -->
+<?php echo '<script'; ?>
+ type="text/javascript">
+
+	function limita(maximoCaracteres) {
+	  var elemento = document.getElementById("texto");
+	  if(elemento.value.length >= maximoCaracteres ) {
+	    return false;
+	  }
+	  else {
+	    return true;
+	  }
+	}
+	
+<?php echo '</script'; ?>
+> 
+
+<div class="" role="main">
+	<div class="">
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+				<h2 style = "text-align: center;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?>
+</h2>
+				<div class="clearfix"></div>
+					<div class="x_content">
+						<form class="form-horizontal form-label-left" action="add_pac.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+" method="post">
+
+							<!-- DNI -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="10" name="dni" required type="text" 
+									value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[0];?>
+">
+								</div>
+							</div>
+
+							<!-- Nombre -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="100" data-validate-words="2" name="nombre" required type="text" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[1];?>
+"
+									>
+								</div>
+							</div>
+
+							<!-- Apellidos -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Apellidos *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="200"  name="apellidos" required type="text" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[2];?>
+">
+								</div>
+							</div>
+
+							<!-- Edad -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Fecha nacimiento *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="200"  name="edad" required type="date" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[4];?>
+">
+								</div>
+							</div>
+
+
+							<!-- Sexo -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name" >Sexo Masculino* 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<div class="radio">
+										<input type="radio" <?php if ($_smarty_tpl->tpl_vars['sujeto']->value[3] == "M") {?>  checked=""  value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[3];?>
+" <?php } else { ?> value="M" <?php }?> name="sexo" style="margin-left: 0px;">  
+									</div>
+								</div>
+							</div>
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name" >Sexo Femenino*
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<div class="radio">
+										<input type="radio"   <?php if ($_smarty_tpl->tpl_vars['sujeto']->value[3] == "F") {?>  checked=""  value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[3];?>
+" <?php } else { ?> value="F" <?php }?>  name="sexo" style="margin-left: 0px;" >  
+									</div>
+								</div>
+							</div>
+
+							<!-- Anotaciones -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Anotaciones
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="anotaciones" type="text" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[5];?>
+">
+								</div>
+							</div>
+
+							
+							<div class="x_panel">
+							<h2 style = "text-align: center;">Etiología</h2>
+							<div class="clearfix"></div>
+							<!-- Etiologia -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Etiología *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="50" name="etiologia" required type="text">
+								</div>
+							</div>
+
+							<!-- Fecha lesion -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Fecha lesión * 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12"   name="fecha_lesion" required type="date">
+								</div>
+							</div>
+
+							<!-- Cuadrantes -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Cuadrantes afectados 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="50"  name="cuadrantes"  type="text">
+								</div>
+							</div>
+
+							<!-- Comentarios -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Comentarios 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500"  name="comentarios"  type="text">
+								</div>
+							</div>
+
+
+							<!-- Patologia -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Patología *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12" >
+									<select class="select2_single form-control" required name="patologia">
+										<option value=""></option>
+										<?php
+$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['patologias']->value, 'element');
+$_smarty_tpl->tpl_vars['element']->do_else = true;
+if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) {
+$_smarty_tpl->tpl_vars['element']->do_else = false;
+?> 
+										<option value="<?php echo $_smarty_tpl->tpl_vars['element']->value;?>
+"><?php echo $_smarty_tpl->tpl_vars['element']->value;?>
+</option>
+										<?php
+}
+$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?>
+									</select>
+								</div>
+							</div>
+
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button>
+									<button id="send" type="submit" class="btn btn-success">Guardar</button>
+								</div>
+							</div>
+
+						</form>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<?php echo '<script'; ?>
+ type="text/javascript">
+	//estado();
+	function cancel() {
+		window.location.href="result.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+";
+	}
+
+<?php echo '</script'; ?>
+>
+<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+}
+}
diff --git a/templates_c/b56ffecaeb77cc372a48f7469792f42936b73f5f_0.file.prueba_sujeto_val.tpl.php b/templates_c/b56ffecaeb77cc372a48f7469792f42936b73f5f_0.file.prueba_sujeto_val.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..7c9a7401fdef4ad11d07ca23680b62d515f6a550
--- /dev/null
+++ b/templates_c/b56ffecaeb77cc372a48f7469792f42936b73f5f_0.file.prueba_sujeto_val.tpl.php
@@ -0,0 +1,252 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-06-09 14:46:24
+  from '/volume1/web/velostat/templates/prueba_sujeto_val.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_62a1eba0b8f6f9_13894005',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    'b56ffecaeb77cc372a48f7469792f42936b73f5f' => 
+    array (
+      0 => '/volume1/web/velostat/templates/prueba_sujeto_val.tpl',
+      1 => 1654778519,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+    'file:head.tpl' => 1,
+    'file:barra.tpl' => 1,
+    'file:footer.tpl' => 1,
+  ),
+),false)) {
+function content_62a1eba0b8f6f9_13894005 (Smarty_Internal_Template $_smarty_tpl) {
+?><!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	<?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	<!-- Barra de menu -->
+	<?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+
+	<!-- Zona Central -->
+
+<div class="" role="main">
+	<div class="">
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+					<div class="x_content">
+						<form action="http://192.168.1.240/<?php echo $_smarty_tpl->tpl_vars['get']->value;?>
+" target="esp">
+							<button type="submit" formmethod="get" id="init" onclick="inicio()" formnovalidate>Iniciar</button>
+						</form>
+					</div>					
+				</div>
+			</div>
+
+			<div class="col-md-4 col-sm-4 col-xs-4">
+				
+				<div class="x_panel">
+					<div class="x_content">
+						<iframe name="esp" id="esp" src="http://192.168.1.240/" ></iframe>
+					</div>
+				</div>
+			</div>
+			<div class="col-md-4 col-sm-4 col-xs-4">
+				<div class="x_panel">
+					<div class="x_content">
+						<form action="http://192.168.1.240/" target="esp">
+							<button type="submit" formmethod="get"  formnovalidate>Reset ESP</button>
+						</form>
+						<div >
+							<img style='height: 300px;' src="<?php echo $_smarty_tpl->tpl_vars['imagen']->value;?>
+">
+						</div>
+					</div>					
+				</div>
+			</div>
+			<div class="col-md-4 col-sm-4 col-xs-4">
+				<div class="x_panel">
+					<div class="x_content">
+						<div >
+							<h2><strong>Colocación sensores:</strong></h2>
+							<h2><?php echo $_smarty_tpl->tpl_vars['coloc_sensores']->value;?>
+</h2>
+						</div>
+					</div>					
+				</div>
+			</div>
+
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+					<div class="x_content">
+					</div>					
+				</div>
+			</div>
+
+			<div class="col-md-6 col-6 col-xs-6">
+				<div class="x_panel">
+					<div class="x_content">
+						<h1><?php echo $_smarty_tpl->tpl_vars['segundos']->value;?>
+:00</h1>
+					</div>					
+				</div>
+				<div class="x_panel">
+					<div class="x_content">
+						<button type="submit" formmethod="get"  id="done" class="btn btn-success" onclick="done()" formnovalidate>Ver resultados</button>
+						<button type="submit" formmethod="get"  id="salir" class="btn btn-danger" onclick="salir_sujeto()" formnovalidate>Salir</button>
+					</div>					
+				</div>
+			</div>
+			<div class="col-md-6 col-sm-6 col-xs-6">
+				<div class="x_panel">
+					<div class="x_content">
+						<div id="foto">
+						Aviso
+						</div>
+					</div>					
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<?php echo '<script'; ?>
+ type="text/javascript">
+window.onload = function() {
+    var oFrame = document.getElementById("esp");
+    oFrame.contentWindow.document.onclick = function() {
+        alert("frame contents clicked");
+    };
+};
+<?php echo '</script'; ?>
+>
+
+<?php echo '<script'; ?>
+ type="text/javascript">
+	let h1 = document.querySelector("h1");
+
+	let centesimas = 0;
+	let segundos = <?php echo $_smarty_tpl->tpl_vars['segundos']->value;?>
+;
+
+	var snd1 = new Audio("data:audio/wav;base64,//uQRAAAAWMSLwUIYAAsYkXgoQwAEaYLWfkWgAI0wWs/ItAAAGDgYtAgAyN+QWaAAihwMWm4G8QQRDiMcCBcH3Cc+CDv/7xA4Tvh9Rz/y8QADBwMWgQAZG/ILNAARQ4GLTcDeIIIhxGOBAuD7hOfBB3/94gcJ3w+o5/5eIAIAAAVwWgQAVQ2ORaIQwEMAJiDg95G4nQL7mQVWI6GwRcfsZAcsKkJvxgxEjzFUgfHoSQ9Qq7KNwqHwuB13MA4a1q/DmBrHgPcmjiGoh//EwC5nGPEmS4RcfkVKOhJf+WOgoxJclFz3kgn//dBA+ya1GhurNn8zb//9NNutNuhz31f////9vt///z+IdAEAAAK4LQIAKobHItEIYCGAExBwe8jcToF9zIKrEdDYIuP2MgOWFSE34wYiR5iqQPj0JIeoVdlG4VD4XA67mAcNa1fhzA1jwHuTRxDUQ//iYBczjHiTJcIuPyKlHQkv/LHQUYkuSi57yQT//uggfZNajQ3Vmz+Zt//+mm3Wm3Q576v////+32///5/EOgAAADVghQAAAAA//uQZAUAB1WI0PZugAAAAAoQwAAAEk3nRd2qAAAAACiDgAAAAAAABCqEEQRLCgwpBGMlJkIz8jKhGvj4k6jzRnqasNKIeoh5gI7BJaC1A1AoNBjJgbyApVS4IDlZgDU5WUAxEKDNmmALHzZp0Fkz1FMTmGFl1FMEyodIavcCAUHDWrKAIA4aa2oCgILEBupZgHvAhEBcZ6joQBxS76AgccrFlczBvKLC0QI2cBoCFvfTDAo7eoOQInqDPBtvrDEZBNYN5xwNwxQRfw8ZQ5wQVLvO8OYU+mHvFLlDh05Mdg7BT6YrRPpCBznMB2r//xKJjyyOh+cImr2/4doscwD6neZjuZR4AgAABYAAAABy1xcdQtxYBYYZdifkUDgzzXaXn98Z0oi9ILU5mBjFANmRwlVJ3/6jYDAmxaiDG3/6xjQQCCKkRb/6kg/wW+kSJ5//rLobkLSiKmqP/0ikJuDaSaSf/6JiLYLEYnW/+kXg1WRVJL/9EmQ1YZIsv/6Qzwy5qk7/+tEU0nkls3/zIUMPKNX/6yZLf+kFgAfgGyLFAUwY//uQZAUABcd5UiNPVXAAAApAAAAAE0VZQKw9ISAAACgAAAAAVQIygIElVrFkBS+Jhi+EAuu+lKAkYUEIsmEAEoMeDmCETMvfSHTGkF5RWH7kz/ESHWPAq/kcCRhqBtMdokPdM7vil7RG98A2sc7zO6ZvTdM7pmOUAZTnJW+NXxqmd41dqJ6mLTXxrPpnV8avaIf5SvL7pndPvPpndJR9Kuu8fePvuiuhorgWjp7Mf/PRjxcFCPDkW31srioCExivv9lcwKEaHsf/7ow2Fl1T/9RkXgEhYElAoCLFtMArxwivDJJ+bR1HTKJdlEoTELCIqgEwVGSQ+hIm0NbK8WXcTEI0UPoa2NbG4y2K00JEWbZavJXkYaqo9CRHS55FcZTjKEk3NKoCYUnSQ0rWxrZbFKbKIhOKPZe1cJKzZSaQrIyULHDZmV5K4xySsDRKWOruanGtjLJXFEmwaIbDLX0hIPBUQPVFVkQkDoUNfSoDgQGKPekoxeGzA4DUvnn4bxzcZrtJyipKfPNy5w+9lnXwgqsiyHNeSVpemw4bWb9psYeq//uQZBoABQt4yMVxYAIAAAkQoAAAHvYpL5m6AAgAACXDAAAAD59jblTirQe9upFsmZbpMudy7Lz1X1DYsxOOSWpfPqNX2WqktK0DMvuGwlbNj44TleLPQ+Gsfb+GOWOKJoIrWb3cIMeeON6lz2umTqMXV8Mj30yWPpjoSa9ujK8SyeJP5y5mOW1D6hvLepeveEAEDo0mgCRClOEgANv3B9a6fikgUSu/DmAMATrGx7nng5p5iimPNZsfQLYB2sDLIkzRKZOHGAaUyDcpFBSLG9MCQALgAIgQs2YunOszLSAyQYPVC2YdGGeHD2dTdJk1pAHGAWDjnkcLKFymS3RQZTInzySoBwMG0QueC3gMsCEYxUqlrcxK6k1LQQcsmyYeQPdC2YfuGPASCBkcVMQQqpVJshui1tkXQJQV0OXGAZMXSOEEBRirXbVRQW7ugq7IM7rPWSZyDlM3IuNEkxzCOJ0ny2ThNkyRai1b6ev//3dzNGzNb//4uAvHT5sURcZCFcuKLhOFs8mLAAEAt4UWAAIABAAAAAB4qbHo0tIjVkUU//uQZAwABfSFz3ZqQAAAAAngwAAAE1HjMp2qAAAAACZDgAAAD5UkTE1UgZEUExqYynN1qZvqIOREEFmBcJQkwdxiFtw0qEOkGYfRDifBui9MQg4QAHAqWtAWHoCxu1Yf4VfWLPIM2mHDFsbQEVGwyqQoQcwnfHeIkNt9YnkiaS1oizycqJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU=");  
+	var snd2 = new Audio("media/audio/check.mp3");
+
+	var intervalo = 0;
+	var intervaloBase = segundos/<?php echo $_smarty_tpl->tpl_vars['repeticiones']->value;?>
+;
+	var repSg = segundos-1;
+	var repCnt = 99;
+	var estado = 0;
+	$('#done').hide();
+
+	console.log(estado, "Intervalo repetición: ", intervaloBase, "-", intervalo, "(",repSg,":",repCnt,")", "Repeticiones totales:", <?php echo $_smarty_tpl->tpl_vars['repeticiones']->value;?>
+);
+	function run(){
+		if (estado ==0){
+			if((centesimas == 0) &&( segundos == 0)){
+			check();
+			h1.style.color = 'red';
+			$("#foto").html("<h1><strong>FIN</strong></h1>");
+			$('#done').show();
+			estado = 1;
+			// función para hacer un delay antes del windows location
+			// esperamos 2 segundos
+			function stateChange(newState) {
+				setTimeout(function () {
+					if (newState == -1) {
+						/*
+						 * Comprobamos que el sensor ha enviado los datos y ponemos un mensaje acorde.
+						 * /
+						$.post("comprobar_post.php",  {
+								recarga:'info' , 
+								puesto: <?php echo $_smarty_tpl->tpl_vars['puesto']->value;?>
+, 
+								linea: '<?php echo $_smarty_tpl->tpl_vars['linea']->value;?>
+',
+								cambio: <?php echo $_smarty_tpl->tpl_vars['prox_cambio']->value;?>
+,
+								serie: '<?php echo $_smarty_tpl->tpl_vars['serie']->value;?>
+',
+								foto: '<?php echo $_smarty_tpl->tpl_vars['imagen']->value;?>
+',
+								posicion_ant: <?php echo $_smarty_tpl->tpl_vars['posicion']->value;?>
+
+								}  , 
+								function(data){
+									//recarga titulo y barcode
+									$("#resultado").html(data);
+								});	
+						//*/
+						alert("Saliendo");
+						window.location.href="result.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+";
+					}
+				}, 2000);
+			}
+			
+			}else{
+				// Comprobamos que llegamos a una repetición y ponemos un aviso
+				if(centesimas == repCnt && segundos == repSg) {
+					console.log("intervalo = ", repSg,":",repCnt);
+					$("#foto").html("<h1><strong><?php echo $_smarty_tpl->tpl_vars['ensayo']->value;?>
+</strong></h1>");   
+					beep(); 
+				}
+				// quitamos el aviso 1seg despues y preparamos la siguiente repeticion
+				if(centesimas == repCnt && segundos == repSg - 1) {
+					intervalo = intervalo + intervaloBase;
+					repSg = <?php echo $_smarty_tpl->tpl_vars['segundos']->value;?>
+ - Math.trunc(intervalo) - 1;
+					repCnt = 99 - Math.trunc((intervalo - Math.trunc(intervalo))*100);
+					console.log("Nuevo intervalo:",intervalo,"Proxima Repeticion:", repSg, ":", repCnt, "Tiempo:", segundos +':'+centesimas);
+					$("#foto").html("<h1><strong>Reposo</strong></h1>"); 
+				}
+
+				if(centesimas == 0){
+					--segundos;
+					centesimas = 99;
+				}else{
+					--centesimas;
+				}
+				h1.innerHTML = segundos +':'+centesimas;
+
+			}
+		
+		}
+	}
+		
+	function inicio(){
+		$('#salir').hide();
+		$('#init').hide();
+		segundos = <?php echo $_smarty_tpl->tpl_vars['segundos']->value;?>
+;
+		setInterval(run, 10);
+	}
+	function done() {
+		window.location.href="ver_datos_sujeto.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id=<?php echo $_smarty_tpl->tpl_vars['id_prueba']->value;?>
+";
+	}
+	function salir_sujeto() {
+		window.location.href="prueba_sujeto.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id_prueba=<?php echo $_smarty_tpl->tpl_vars['id_prueba']->value;?>
+&accion=1";
+		history.back();	
+	}
+	function beep() {
+		snd1.play();
+	}
+	function check(){
+		snd2.play();
+	}
+<?php echo '</script'; ?>
+>
+<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+}
+}
diff --git a/templates_c/b5f656167d06e27e9ec6ed576a814f80af41a00f_0.file.barra.tpl.php b/templates_c/b5f656167d06e27e9ec6ed576a814f80af41a00f_0.file.barra.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..32f6e082ce620a96c20a6688d49883a2431fab1e
--- /dev/null
+++ b/templates_c/b5f656167d06e27e9ec6ed576a814f80af41a00f_0.file.barra.tpl.php
@@ -0,0 +1,189 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-06-09 13:43:02
+  from '/volume1/web/velostat/templates/barra.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_62a1dcc6280608_32924378',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    'b5f656167d06e27e9ec6ed576a814f80af41a00f' => 
+    array (
+      0 => '/volume1/web/velostat/templates/barra.tpl',
+      1 => 1654774975,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+  ),
+),false)) {
+function content_62a1dcc6280608_32924378 (Smarty_Internal_Template $_smarty_tpl) {
+?><!-- Barra de menu -->
+<?php if ($_smarty_tpl->tpl_vars['id_admin']->value == 4100001) {?>
+<body class="nav-sm">
+<?php } else { ?>
+<body class="nav-md">
+<?php }?>
+  <div class="container body">
+    <div class="main_container">
+
+      <!-- Contenedor total -->
+      <div class="col-md-3 left_col menu_fixed">
+        <div class="left_col scroll-view">
+          <div class="navbar nav_title" style="border: 0;">
+            <a  data-toggle="tooltip" data-placement="bottom" title="Inicio" href="result.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+" class="site_title"><i class="fa fa-home"></i> <span style="font-size: 0.8em; ">Sensores de presión</span></a>
+          </div>
+          <div class="clearfix"></div>
+
+          <!-- menu profile quick info -->
+          <div class="profile clearfix">
+            <div class="profile_pic">
+              <img src="<?php echo $_smarty_tpl->tpl_vars['imagen_id']->value;?>
+" alt="Foto trabajador" class="img-circle profile_img">
+            </div>
+            <div class="profile_info">
+              <span>Bienvenido,</span>
+              <h2><?php echo $_smarty_tpl->tpl_vars['nombre']->value;?>
+</h2>
+            </div>
+          </div>
+          <!-- /menu profile quick info -->
+
+          <br/>
+
+         <!-- sidebar menu -->
+          <div id="sidebar-menu" class="main_menu_side hidden-print main_menu">
+            <div class="menu_section">
+<!-- GENERAL -->
+          <h3>General</h3>
+              <ul class="nav side-menu">
+              <!-- AÑADIR PACIENTES -->
+              <li><a href="add_pac.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+">Añadir pacientes</a></li>
+              <!-- REALIZAR PRUEBA -->
+              <li><a href="add_reg.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+">Realizar prueba</a></li>
+              <!-- GESTIONAR ENSAYOS -->
+              <li><a href="ges_ens.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+">Gestionar ensayos</a></li>
+              <!-- GESTIONAR PATOLOGIAS -->
+              <li><a href="ges_pat.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+">Gestionar patologías</a></li>
+              
+             
+<!-- OTROS -->
+            <h3>Otros</h3>
+              <ul class="nav side-menu">
+             
+<!-- PAGINAS ADICIONALES -->
+                
+                <li><a data-toggle="tooltip" data-placement="top" title="Gestión de Sujetos Sanos"><i class="fa fa-bug"  ></i> Gestión de sujetos <span class="fa fa-chevron-down"></span></a>
+                  <ul class="nav child_menu">
+                    <li><a href="prueba_sujeto.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+">Añadir prueba a sujeto</a></li>
+                    <li><a href="ver_pruebas_sujetos.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+">Ver pruebas de sujetos</a></li>
+                    </li>
+                  </ul>
+                </li>
+              </ul>
+            </div>
+          </div>
+          
+          <!-- /sidebar menu -->
+
+          <!-- /menu footer buttons -->
+          <div class="sidebar-footer hidden-small">
+            <!-- Quito la configuración de perfil
+            <a data-toggle="tooltip" data-placement="top" title="Settings" href="mod_perfil.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+">
+              <span class="glyphicon glyphicon-cog" aria-hidden="true"></span>
+            </a> Quito la pantalla completa
+            <a data-toggle="tooltip" data-placement="top" title="FullScreen">
+              <span class="glyphicon glyphicon-fullscreen" aria-hidden="true" onclick="fullscreen()"></span>
+            </a> -->
+            <!-- Quito el bloqueo
+            <a data-toggle="tooltip" data-placement="top" title="Lock">
+              <span class="glyphicon glyphicon-eye-close" aria-hidden="true"></span>
+            </a> -->
+            <a data-toggle="tooltip" data-placement="top" title="Logout" href="log_out.php">
+              <span class="glyphicon glyphicon-off" aria-hidden="true"></span>
+            </a>
+          </div>
+          <!-- /menu footer buttons -->
+        </div>
+      </div>
+
+      <!-- top navigation -->
+      <div class="top_nav">
+        <div class="nav_menu">
+          <nav>
+            <div class="nav toggle">
+              <a id="menu_toggle"><i class="fa fa-bars"></i></a>
+            </div> 
+            <!-- Aquí se muestra la información de cargando que habrá que modificar-->
+            <ul class="nav navbar-nav navbar-left"><h4 id="titulo" style="margin-top: 19px;" ><!-- <i class="fa fa-spinner fa-spin fa-fw"></i> Cargando. Espere --> </h4></ul>
+            <ul class="nav navbar-nav navbar-right">
+            <!-- Aquí se muestra la información de cargando que habrá que modificar-->
+              <li class="">
+                <a href="javascript:;" class="user-profile dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
+                  <img src="<?php echo $_smarty_tpl->tpl_vars['imagen_id']->value;?>
+" alt="Foto trabajador">
+                  <span class=" fa fa-angle-down"></span>
+                </a>
+                <ul class="dropdown-menu dropdown-usermenu pull-right">
+                  <li><a href="mod_pass.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+"><i class="fa fa-cogs pull-right"></i>Cambiar contraseña</a></li>
+                  
+                  <li><a href="log_out.php"><i class="fa fa-sign-out pull-right"></i> Cerrar sesión</a></li>
+                  
+                </ul>
+              </li>
+              <!-- Modificar Usuarios si se tiene permiso-->
+              <?php if ($_smarty_tpl->tpl_vars['permisos']->value == 1 || $_smarty_tpl->tpl_vars['permisos']->value == 2 || $_smarty_tpl->tpl_vars['permisos']->value == 3 || $_smarty_tpl->tpl_vars['permisos']->value == 4) {?>
+                <li class="">
+                <a href="javascript:;" class="user-profile dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
+                Gestión
+                <span class=" fa fa-angle-down"></span>
+                </a>
+                <ul class="dropdown-menu dropdown-usermenu pull-right">
+                    <li><a href="add_gestor.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+">Añadir trabajador</a></li>
+                    <li><a href="mod_gestor.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+">Modificar trabajador</a></li>
+
+                </ul> 
+                </li> 
+               <?php }?>
+              
+            </ul>
+          </nav>
+        </div>
+      </div>
+      <!-- /top navigation -->
+
+			<!-- page content -->
+			<div class="right_col" role="main" id="contenido">
+
+<!--
+<?php echo '<script'; ?>
+ type="text/javascript">
+	$(document).ready(function(){
+    /**
+     * Determinar si una imagen existe por la propiedad naturalHeight
+     * la cual sera diferente de 0 si esta existe
+     **/
+    $('img').each(function(){
+        if($(this)[0].naturalHeight == 0){
+            $(this).attr('src','media/images/no_image/no_image.png');
+        }
+    }); 
+});	
+<?php echo '</script'; ?>
+>
+--><?php }
+}
diff --git a/templates_c/be38c18a1f6216cb3f0917cd661938f22cc80d66_0.file.ges_pat.tpl.php b/templates_c/be38c18a1f6216cb3f0917cd661938f22cc80d66_0.file.ges_pat.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..c115ecd641c45f5703d179db60ef8067237e6d9a
--- /dev/null
+++ b/templates_c/be38c18a1f6216cb3f0917cd661938f22cc80d66_0.file.ges_pat.tpl.php
@@ -0,0 +1,188 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-05-31 19:15:02
+  from '/volume1/web/velostat/templates/ges_pat.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_62964d1676c609_46537970',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    'be38c18a1f6216cb3f0917cd661938f22cc80d66' => 
+    array (
+      0 => '/volume1/web/velostat/templates/ges_pat.tpl',
+      1 => 1654017270,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+    'file:head.tpl' => 1,
+    'file:barra.tpl' => 1,
+    'file:footer.tpl' => 1,
+  ),
+),false)) {
+function content_62964d1676c609_46537970 (Smarty_Internal_Template $_smarty_tpl) {
+?><!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	<?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	<!-- Barra de menu -->
+	<?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	
+	<!-- Zona Central -->
+
+
+<div class="" role="main">
+	<div class="">
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+				<?php if ($_smarty_tpl->tpl_vars['mod_campos']->value) {?> 
+					<div class="x_content">
+						<h4 style = "text-align: center;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?>
+</h4>
+						<div class="clearfix"></div>
+						<form class="form-horizontal form-label-left" action="ges_pat_val.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id=<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[0];?>
+" method="post">
+
+							<!-- id_patologia -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">id_patologia
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="10" name="id_patologia" required disabled type="text" 
+									value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[0];?>
+" >
+								</div>
+							</div>
+
+							<!-- Nombre -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="100" name="nombre" required type="text" value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[1];?>
+" >	
+								</div>
+							</div>
+
+							<!-- Descripción -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Descripción
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="200" name="descripcion" type="text" value="<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[2];?>
+" >
+								</div>
+							</div>
+
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button>
+									<button id="send" type="submit" class="btn btn-success">Guardar</button>
+									<button onclick="eliminar()" type="button" class="btn btn-danger">Eliminar</button>	
+								</div>
+							</div>
+						</form>
+						
+					</div>
+					<?php } else { ?>
+						
+						<!-- tabla para seleccionar patologia -->
+						<div class="x_content">
+						<h4 style = "text-align: center;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?>
+</h4>
+						<div class="clearfix"></div>
+							<div class="tablas">
+								<table id="example" class="table table-striped table-bordered" cellspacing="0" width="99%" role="grid" data-order="[[ 1, &quot;asc&quot; ]]">
+
+									<thead>
+										<tr>
+											<td>id_patologia</td>
+											<td>Nombre</td>
+											<td>Descripción</td>
+										</tr>
+									</thead>
+
+									<tbody>
+										<?php
+$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['campos']->value, 'element');
+$_smarty_tpl->tpl_vars['element']->do_else = true;
+if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) {
+$_smarty_tpl->tpl_vars['element']->do_else = false;
+?>
+											<tr >
+												<td><?php echo $_smarty_tpl->tpl_vars['element']->value[0];?>
+</td>
+												<td><?php echo $_smarty_tpl->tpl_vars['element']->value[1];?>
+</td>
+												<td><?php echo $_smarty_tpl->tpl_vars['element']->value[2];?>
+</td>
+											</tr>
+										<?php
+}
+$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?>
+									</tbody>
+								</table>
+							</div>
+							<div class="col-md-6 col-md-offset-3">
+									<button onclick="n_patologia()" type="button" class="btn btn-primary">Nueva patologia</button>
+							</div>
+						</div>
+					<?php }?>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<?php echo '<script'; ?>
+ type="text/javascript">
+
+	function cancel() {
+		window.location.href="ges_pat.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+";
+	}
+	function eliminar() {
+		var reply=confirm("¿Seguro que desea borrar la patologia?")
+		if (reply==true) 
+		{
+		window.location.href="ges_pat.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id=<?php echo $_smarty_tpl->tpl_vars['mod_campos']->value[0];?>
+&accion=1";
+		}
+		else 
+		{
+		//AQUI NO HARIA NADA, SE CERRARIA EL POPUP Y SEGUIRIA EN LA PAGINA ACTUAL
+		}
+		
+	}
+	function n_patologia() {
+		window.location.href="ges_pat_nueva.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+";
+	}
+	$(document).ready(function() {
+	    $('#example').DataTable({
+   	        lengthMenu: [
+					[ 10, 25, 100, -1 ],
+					[ '10 filas', '25 filas', '100 filas', 'Todas las filas' ]
+        ]
+ 	    });
+	    var table = $('#example').DataTable();
+	 
+	    $('#example tbody').on( 'click', 'tr', function () {
+	        $(this).toggleClass('selected');
+			window.location.href="ges_pat.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id="+table.rows('.selected').data()[0][0];
+	    } );
+	} );
+
+<?php echo '</script'; ?>
+>
+<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+}
+}
diff --git a/templates_c/ca87c448aeb6614657c25f99529a77ce08340f70_0.file.ges_ens_nuevo.tpl.php b/templates_c/ca87c448aeb6614657c25f99529a77ce08340f70_0.file.ges_ens_nuevo.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..ab972b719e359a1bba498387528c93b35e713f8c
--- /dev/null
+++ b/templates_c/ca87c448aeb6614657c25f99529a77ce08340f70_0.file.ges_ens_nuevo.tpl.php
@@ -0,0 +1,136 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-06-01 19:00:27
+  from '/volume1/web/velostat/templates/ges_ens_nuevo.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_62979b2bbf22b1_34197800',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    'ca87c448aeb6614657c25f99529a77ce08340f70' => 
+    array (
+      0 => '/volume1/web/velostat/templates/ges_ens_nuevo.tpl',
+      1 => 1654017269,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+    'file:head.tpl' => 1,
+    'file:barra.tpl' => 1,
+    'file:footer.tpl' => 1,
+  ),
+),false)) {
+function content_62979b2bbf22b1_34197800 (Smarty_Internal_Template $_smarty_tpl) {
+?><!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	<?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	<!-- Barra de menu -->
+	<?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	
+	<!-- Zona Central -->
+<?php echo '<script'; ?>
+ type="text/javascript">
+
+	function limita(maximoCaracteres) {
+	  var elemento = document.getElementById("texto");
+	  if(elemento.value.length >= maximoCaracteres ) {
+	    return false;
+	  }
+	  else {
+	    return true;
+	  }
+	}
+	 	
+<?php echo '</script'; ?>
+> 
+<div class="" role="main">
+	<div class="">
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+				<div class="x_title">
+							<h2> <?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?>
+<small></small></h2>
+				<div class="clearfix"></div>
+						</div>
+					<div class="x_content">
+						<form class="form-horizontal form-label-left" action="ges_ens_nuevo.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+" method="post">
+							
+							<!-- Tipo / Nombre -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Tipo (Nombre) *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="50" name="tipo" required type="text" >
+								</div>
+							</div>
+
+							<!-- Colocacion sensores -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Colocación Sensores *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="300" name="coloc_sensores" required type="text" >
+								</div>
+							</div>
+
+							<!-- Duracion -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Duración *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="11" name="duracion" required type="number" placeholder="En segundos">
+								</div>
+							</div>
+
+							<!-- Repeticiones -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Repeticiones *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="11" name="repeticiones" required type="number" placeholder="Número de repeticiones">
+								</div>
+							</div>
+
+							<!-- Comentarios -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Comentarios 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="comentarios" type="textarea" >
+								</div>
+							</div>
+
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button>
+									<button id="send" type="submit" class="btn btn-success">Guardar</button>
+								</div>
+							</div>
+						</form>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<?php echo '<script'; ?>
+ type="text/javascript">
+	//estado();
+	function cancel() {
+		window.location.href="ges_ens.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+";
+	}
+
+<?php echo '</script'; ?>
+>
+<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+}
+}
diff --git a/templates_c/cc1a58e3bd70f4cd9c8b31ec555a67aa4278daa0_0.file.head.tpl.php b/templates_c/cc1a58e3bd70f4cd9c8b31ec555a67aa4278daa0_0.file.head.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..f8691fe17f85f269490e927fc40d70b4aa7f0329
--- /dev/null
+++ b/templates_c/cc1a58e3bd70f4cd9c8b31ec555a67aa4278daa0_0.file.head.tpl.php
@@ -0,0 +1,121 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-06-09 13:43:02
+  from '/volume1/web/velostat/templates/head.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_62a1dcc6236938_52152568',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    'cc1a58e3bd70f4cd9c8b31ec555a67aa4278daa0' => 
+    array (
+      0 => '/volume1/web/velostat/templates/head.tpl',
+      1 => 1654774975,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+  ),
+),false)) {
+function content_62a1dcc6236938_52152568 (Smarty_Internal_Template $_smarty_tpl) {
+?><html lang="es">
+<head>
+    <link rel="icon" href="media/images/favicon/sensor.png">
+    <title>TFG. Sensor de presi&oacuten</title>
+
+	<title><?php echo $_smarty_tpl->tpl_vars['titulo']->value;?>
+</title>
+		<meta charset="utf-8">
+			<!-- Al ser un entorno Mobile first, tendremos que corregir la escala y ancho de inicio del dispositivo -->
+		<meta name="viewport" content="width=device-width, initial-scale=1"> 
+    
+
+      <!-- Estilo bootstrap...-->
+		
+		<link rel="stylesheet" type="text/css" href="/sources/css/bootstrap-datetimepicker.min.css"/>
+		<link rel="stylesheet" type="text/css" href="/sources/bootstrap/dist/css/bootstrap.css"/>
+		<link rel="stylesheet" type="text/css" href="/sources/css/daterangepicker.css"/>
+
+    	<!-- para datatables -->
+        <link rel="stylesheet" type="text/css" href="/sources/css/dataTables.bootstrap.min.css"/>
+        <link rel="stylesheet" type="text/css" href="/sources/css/fixedColumns.dataTables.min.css"/>
+ 
+    	<!-- para los botones pdf excel... -->
+
+		<link rel="stylesheet" type="text/css" href="/sources/Buttons-1.3.1/css/buttons.dataTables.min.css"/>
+
+	    <!-- ******************************************************-->
+
+	    <!-- Font Awesome -->
+	    <link rel="stylesheet" type="text/css" href="/sources/font-awesome/css/font-awesome.min.css">
+ 		
+		<!-- NProgress -->
+		<link href="/sources/nprogress/nprogress.css" rel="stylesheet">
+
+        <!-- FullCalendar 
+        <link href="/sources/fullcalendar-3.5.1/fullcalendar.min.css" rel="stylesheet">
+        <link href="/sources/fullcalendar-3.5.1/fullcalendar.print.css" rel="stylesheet" media="print">-->
+
+        <!-- Teclado virtual -->
+        
+        <link rel="stylesheet" href="css/styles.css">
+
+        <!-- Dropzone.js 
+        <link href="/sources/dropzone/dist/min/dropzone.min.css" rel="stylesheet">-->
+
+	    <!-- Select2 -->
+    	<link href="/sources/select2/dist/css/select2.min.css" rel="stylesheet">
+	    
+	    <!-- jQuery custom content scroller -->
+		<link rel="stylesheet" type="text/css" href="/sources/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.min.css"/>
+
+		<!-- Custom Theme Style -->
+		<link rel="stylesheet" type="text/css" href="/sources/css/custom.iacob.css">
+
+
+      <!-- ******************************************************** -->
+
+      <!-- Nuestro estilo propio... -->
+
+		<link rel="stylesheet" type="text/css" href="/sources/css/estilo.css"/>
+    
+      <!-- jquery  
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/jQuery-3.2.1/jquery-3.2.1.js"><?php echo '</script'; ?>
+>-->
+      <!--      -->
+      <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/jquery/dist/jquery.min.js"><?php echo '</script'; ?>
+>
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/js/bootstrap.js"><?php echo '</script'; ?>
+>
+    <!-- Select2 ->
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/select2/dist/js/select2.full.min.js"><?php echo '</script'; ?>
+>
+ 
+      <!-- Graficos... -->
+
+    <?php echo '<script'; ?>
+ src="/sources/Chart.js/dist/Chart.bundle.js"><?php echo '</script'; ?>
+>
+    <!-- including ECharts file -->
+    <?php echo '<script'; ?>
+ type="text/javascript" src="/sources/echarts/dist/echarts.min.js"><?php echo '</script'; ?>
+>
+
+    <style>
+    canvas {
+        -moz-user-select: none;
+        -webkit-user-select: none;
+        -ms-user-select: none;
+    }
+    </style>
+    <!-- -->
+</head>
+<?php }
+}
diff --git a/templates_c/dee8e5acb41e48b79d987651a1a1c9e360905bd7_0.file.add_eti.tpl.php b/templates_c/dee8e5acb41e48b79d987651a1a1c9e360905bd7_0.file.add_eti.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..19210df099fd5abaeaab7c3654f5f2b5eb18c77c
--- /dev/null
+++ b/templates_c/dee8e5acb41e48b79d987651a1a1c9e360905bd7_0.file.add_eti.tpl.php
@@ -0,0 +1,166 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-05-31 19:14:38
+  from '/volume1/web/velostat/templates/add_eti.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_62964cfe3aaeb5_50186086',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    'dee8e5acb41e48b79d987651a1a1c9e360905bd7' => 
+    array (
+      0 => '/volume1/web/velostat/templates/add_eti.tpl',
+      1 => 1654017269,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+    'file:head.tpl' => 1,
+    'file:barra.tpl' => 1,
+    'file:footer.tpl' => 1,
+  ),
+),false)) {
+function content_62964cfe3aaeb5_50186086 (Smarty_Internal_Template $_smarty_tpl) {
+?><!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	<?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	<!-- Barra de menu -->
+	<?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	
+	<!-- Zona Central -->
+<?php echo '<script'; ?>
+ type="text/javascript">
+
+	function limita(maximoCaracteres) {
+	  var elemento = document.getElementById("texto");
+	  if(elemento.value.length >= maximoCaracteres ) {
+	    return false;
+	  }
+	  else {
+	    return true;
+	  }
+	}
+	
+<?php echo '</script'; ?>
+> 
+
+<div class="" role="main">
+	<div class="">
+		<div class="row">
+			<div class="col-md-12 col-sm-12 col-xs-12">
+				<div class="x_panel">
+				<h2 style = "text-align: center;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?>
+</h2>
+				<div class="clearfix"></div>
+					<div class="x_content">
+						<form class="form-horizontal form-label-left" action="add_eti.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&accion=1&id=<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[0];?>
+" method="post">
+
+							<!-- DNI -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="10" name="dni" disabled type="text" 
+									value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[0];?>
+">
+								</div>
+							</div>
+							
+							<div class="x_panel">
+							<h2 style = "text-align: center;">Etiología</h2>
+							<div class="clearfix"></div>
+							<!-- Etiologia -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Etiología *<span class="required"></span>
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="50" name="etiologia" required type="text">
+								</div>
+							</div>
+
+							<!-- Fecha lesion -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Fecha lesión * 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12"   name="fecha_lesion" required type="date">
+								</div>
+							</div>
+
+							<!-- Cuadrantes -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Cuadrantes afectados 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="50"  name="cuadrantes"  type="text">
+								</div>
+							</div>
+
+							<!-- Comentarios -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Comentarios 
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12">
+									<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500"  name="comentarios"  type="text">
+								</div>
+							</div>
+
+
+							<!-- Patologia -->
+							<div class="item form-group">
+								<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Patología *
+								</label>
+								<div class="col-md-6 col-sm-6 col-xs-12" >
+									<select class="select2_single form-control" required name="patologia">
+										<option value=""></option>
+										<?php
+$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['patologias']->value, 'element');
+$_smarty_tpl->tpl_vars['element']->do_else = true;
+if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) {
+$_smarty_tpl->tpl_vars['element']->do_else = false;
+?> 
+										<option value="<?php echo $_smarty_tpl->tpl_vars['element']->value;?>
+"><?php echo $_smarty_tpl->tpl_vars['element']->value;?>
+</option>
+										<?php
+}
+$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?>
+									</select>
+								</div>
+							</div>
+
+							<div class="ln_solid"></div>
+							<div class="form-group">
+								<div class="col-md-6 col-md-offset-3">
+									<button onclick="cancel()" type="button" class="btn btn-warning">Cancelar</button>
+									<button id="send" type="submit" class="btn btn-success">Guardar</button>
+								</div>
+							</div>
+
+						</form>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<?php echo '<script'; ?>
+ type="text/javascript">
+	function cancel() {
+		window.location.href="pac_reg.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id=<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[0];?>
+";
+	}
+
+<?php echo '</script'; ?>
+>
+<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+}
+}
diff --git a/templates_c/f20fa418a5fd1530964bc1ba2ac6d095cf136488_0.file.pac_reg.tpl.php b/templates_c/f20fa418a5fd1530964bc1ba2ac6d095cf136488_0.file.pac_reg.tpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..81740ed6c27f598c37f68ff3a4ef2e2d225720e4
--- /dev/null
+++ b/templates_c/f20fa418a5fd1530964bc1ba2ac6d095cf136488_0.file.pac_reg.tpl.php
@@ -0,0 +1,266 @@
+<?php
+/* Smarty version 3.1.38, created on 2022-06-07 19:56:25
+  from '/volume1/web/velostat/templates/pac_reg.tpl' */
+
+/* @var Smarty_Internal_Template $_smarty_tpl */
+if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
+  'version' => '3.1.38',
+  'unifunc' => 'content_629f9149421806_63465682',
+  'has_nocache_code' => false,
+  'file_dependency' => 
+  array (
+    'f20fa418a5fd1530964bc1ba2ac6d095cf136488' => 
+    array (
+      0 => '/volume1/web/velostat/templates/pac_reg.tpl',
+      1 => 1654624571,
+      2 => 'file',
+    ),
+  ),
+  'includes' => 
+  array (
+    'file:head.tpl' => 1,
+    'file:barra.tpl' => 1,
+    'file:footer.tpl' => 1,
+  ),
+),false)) {
+function content_629f9149421806_63465682 (Smarty_Internal_Template $_smarty_tpl) {
+$_smarty_tpl->_checkPlugins(array(0=>array('file'=>'/volume1/web/velostat/plugins/modifier.date_format.php','function'=>'smarty_modifier_date_format',),));
+?>
+<!DOCTYPE html>
+	<!-- El head con los estilos y el javascript genérico -->
+	<?php $_smarty_tpl->_subTemplateRender("file:head.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+	<!-- Barra de menu -->
+	<?php $_smarty_tpl->_subTemplateRender("file:barra.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+?>
+
+	<!-- Zona Central -->
+<div class="" role="main">
+	<form class="form-horizontal form-label-left" action="mod_pac.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+" method="post">
+
+		<!-- tabla para seleccionar sujeto -->
+		<div class="x_content">
+			<h4 style = "text-align: center;"><?php echo $_smarty_tpl->tpl_vars['mensaje']->value;?>
+</h4>
+		</div>
+
+		<div class="row">
+			<div class="col-md-6 col-sm-6 col-xs-24">
+			<!-- DNI -->
+			<div class="item form-group">
+				<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">DNI *<span class="required"></span>
+				</label>
+				<div class="col-md-6 col-sm-6 ">
+					<input id="name" class="form-control col-md-10 col-xs-15" pattern="[0-9]<?php echo 8;?>
+[A-Z]" data-validate-length-range="10" name="dni" readonly="readonly" type="text" 
+					value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[0];?>
+">
+				</div>
+			</div>
+
+			<!-- Nombre -->
+			<div class="item form-group">
+				<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Nombre *<span class="required"></span>
+				</label>
+				<div class="col-md-6 col-sm-6 col-xs-12">
+					<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="100" data-validate-words="2" name="nombre" required type="text" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[1];?>
+">
+				</div>
+			</div>
+
+			<!-- Apellidos -->
+			<div class="item form-group">
+				<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Apellidos *<span class="required"></span>
+				</label>
+				<div class="col-md-6 col-sm-6 col-xs-12">
+					<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="200"  name="apellidos" required type="text" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[2];?>
+">
+				</div>
+			</div>
+			</div>
+				
+			<div class="col-md-6 col-sm-6 col-xs-24">
+			<!-- Edad -->
+			<div class="item form-group">
+				<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Fecha nacimiento *<span class="required"></span>
+				</label>
+				<div class="col-md-6 col-sm-6 col-xs-12">
+					<input id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="200" data-validate-words="1"  name="edad" required type="date" value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[4];?>
+">
+				</div>
+			</div>
+			<!-- Sexo -->
+			<div class="item form-group">
+				<div class="col-md-6 col-sm-6 col-xs-12" >
+					<div class="radio">
+						<label for="name" style="margin-left: 50px;"><b>Sexo Masculino &nbsp</b>
+						<input type="radio" <?php if ($_smarty_tpl->tpl_vars['sujeto']->value[3] == "M") {?>  checked=""  value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[3];?>
+" <?php } else { ?> value="M" <?php }?> name="sexo" style="margin-left: 15px;"></label>
+						<label for="name" style="margin-left: 50px;"><b>Sexo Femenino &nbsp</b>
+						<input type="radio"   <?php if ($_smarty_tpl->tpl_vars['sujeto']->value[3] == "F") {?>  checked=""  value="<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[3];?>
+" <?php } else { ?> value="F" <?php }?>  name="sexo"  style="margin-left: 15px;"> </label>
+					</div>
+				</div>
+			</div>
+				
+			<!-- Anotaciones -->
+					<div class="item form-group">
+						<label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">Anotaciones del paciente
+						</label>
+						<div class="col-md-6 col-sm-6 col-xs-12">
+							<textarea id="name" class="form-control col-md-7 col-xs-12" data-validate-length-range="500" name="anotaciones" type="text"><?php echo $_smarty_tpl->tpl_vars['sujeto']->value[5];?>
+</textarea>
+						</div>
+					</div>
+			</div>
+		</div>
+		<div class="form-group">
+			<div class="col-md-7 col-md-offset-4">
+				<button id="send" type="submit" class="btn btn-success">Guardar cambios</button>
+				<button onclick="eliminar()" type="button" class="btn btn-danger">Eliminar paciente</button>
+				<button onclick="realizar_prueba()" type="button" class="btn btn-info">Realizar prueba</button>
+				<button onclick="n_etiologia()" type="button" class="btn btn-info">Añadir etiología</button>
+			</div>
+		</div>
+	</form>
+		
+	<div class="ln_solid"></div>
+
+	<div class="x_content">
+		<div class="">
+			<h4 style = "text-align: center;">LISTADO DE PRUEBAS</h4>
+			<table id="example" class="table table-striped table-bordered" cellspacing="0" width="99%" role="grid" data-order="[[ 0, &quot;desc&quot; ]]" style="font-size:13px; ">
+				<thead>
+					<tr>
+						<td>id_prueba</td>
+						<td>Prueba</td>
+						<td>Fecha - Hora</td>
+						<td>Simetría</td>
+						<td>Anotaciones</td>
+					</tr>
+				</thead>
+
+				<tbody>
+					<?php
+$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['entrada']->value, 'element');
+$_smarty_tpl->tpl_vars['element']->do_else = true;
+if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) {
+$_smarty_tpl->tpl_vars['element']->do_else = false;
+?>
+						<tr data-toggle="tooltip" data-placement="top" title="Click para ver documentación relaccionada" >
+							<td><?php echo $_smarty_tpl->tpl_vars['element']->value[0];?>
+</td>
+							<td><?php echo $_smarty_tpl->tpl_vars['element']->value[1];?>
+</td>
+							<td><?php echo smarty_modifier_date_format($_smarty_tpl->tpl_vars['element']->value[2],"%d/%m/%Y %H:%M:%S");?>
+</td>
+							<td><?php echo $_smarty_tpl->tpl_vars['element']->value[3];?>
+</td>
+							<td><?php echo $_smarty_tpl->tpl_vars['element']->value[4];?>
+</td>
+						</tr>
+					<?php
+}
+$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?>
+				</tbody>
+			</table>
+		</div>
+	</div>
+	<div class="x_content">
+		<div class="">
+			<h4 style = "text-align: center;">LISTADO DE ETIOLOGÍAS</h4>
+			<table id="etiologias" class="table table-striped table-bordered" cellspacing="0" width="99%" role="grid" data-order="[[ 2, &quot;desc&quot; ]]" style="font-size:13px; ">
+				<thead>
+					<tr>
+						<td>id_etiologia</td>
+						<td>Descripción</td>
+						<td>Fecha aparición parálisis</td>
+						<td>Cuadrantes afectados</td>
+						<td>Comentarios de la etiología</td>
+						<td>Patología asociada</td>
+					</tr>
+				</thead>
+
+				<tbody>
+					<?php
+$_from = $_smarty_tpl->smarty->ext->_foreach->init($_smarty_tpl, $_smarty_tpl->tpl_vars['etiologia']->value, 'element');
+$_smarty_tpl->tpl_vars['element']->do_else = true;
+if ($_from !== null) foreach ($_from as $_smarty_tpl->tpl_vars['element']->value) {
+$_smarty_tpl->tpl_vars['element']->do_else = false;
+?>
+						<tr data-toggle="tooltip" data-placement="top" >
+							<td><?php echo $_smarty_tpl->tpl_vars['element']->value[0];?>
+</td>
+							<td><?php echo $_smarty_tpl->tpl_vars['element']->value[1];?>
+</td>
+							<td><?php echo smarty_modifier_date_format($_smarty_tpl->tpl_vars['element']->value[2],"%d/%m/%Y");?>
+</td>
+							<td><?php echo $_smarty_tpl->tpl_vars['element']->value[3];?>
+</td>
+							<td><?php echo $_smarty_tpl->tpl_vars['element']->value[4];?>
+</td>
+							<td><?php echo $_smarty_tpl->tpl_vars['element']->value[5];?>
+</td>
+						</tr>
+					<?php
+}
+$_smarty_tpl->smarty->ext->_foreach->restore($_smarty_tpl, 1);?>
+				</tbody>
+			</table>
+		</div>
+	</div>
+</div>
+
+	
+<?php echo '<script'; ?>
+ type="text/javascript">
+	
+	function eliminar() {
+		var reply=confirm("¿Seguro que desea borrar el paciente, se borrarán las pruebas y etiologías asociadas?")
+		if (reply==true) 
+		{
+		window.location.href="result.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id=<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[0];?>
+&accion=1";
+		}
+		else 
+		{
+		//AQUI NO HARIA NADA, SE CERRARIA EL POPUP Y SEGUIRIA EN LA PAGINA ACTUAL
+		}
+		
+	}
+	
+	function realizar_prueba(){
+		window.location.href="add_reg.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id=<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[0];?>
+";
+	}
+
+	function n_etiologia(){
+		window.location.href="add_eti.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id=<?php echo $_smarty_tpl->tpl_vars['sujeto']->value[0];?>
+";
+	}
+	
+
+	$(document).ready(function() {
+	    $('#example').DataTable({
+   	    lengthMenu: [
+					[ 10, 25, 100, -1 ],
+					[ '10 filas', '25 filas', '100 filas', 'Todas las filas' ]
+        ]
+ 	    });
+	    var table = $('#example').DataTable();
+	 
+	    $('#example tbody').on( 'click', 'tr', function () {
+	        $(this).toggleClass('selected');
+			window.location.href="ver_datos_paciente.php?variable=<?php echo $_smarty_tpl->tpl_vars['id_admin']->value;?>
+&id="+table.rows('.selected').data()[0][0];
+	    } );
+	} );
+<?php echo '</script'; ?>
+>
+<?php $_smarty_tpl->_subTemplateRender("file:footer.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
+}
+}
diff --git a/velostat.workspace.code-workspace b/velostat.workspace.code-workspace
new file mode 100644
index 0000000000000000000000000000000000000000..876a1499c09dc083612f43c53c0ae71b9c30c5b1
--- /dev/null
+++ b/velostat.workspace.code-workspace
@@ -0,0 +1,8 @@
+{
+	"folders": [
+		{
+			"path": "."
+		}
+	],
+	"settings": {}
+}
\ No newline at end of file
diff --git a/ver_datos_paciente.php b/ver_datos_paciente.php
new file mode 100644
index 0000000000000000000000000000000000000000..7b33e4e6d897e6c043a2e4a4fa9a4b5b3010d63a
--- /dev/null
+++ b/ver_datos_paciente.php
@@ -0,0 +1,104 @@
+<?php session_start();
+require('include.php');
+require_once("funciones.php");
+/*
+* Archivo de control. Se muestran las pruebas realizadas a un paciente y sus datos
+* Caso de uso: VER DATOS DE UN PACIENTE, MODIFICAR UN PACIENTE, BORRAR UN PACIENTE y CONSULTAR PRUEBA
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+	
+$id_admin=$_GET["variable"]; 
+	$id_prueba =$_GET["id"];
+	// Comprueba que sigue en la sesión
+	$html=new Smarty;
+
+	barra();
+	
+	
+	$sql="SELECT id_datos_pruebas_pacientes, s1, s2, s3, s4, s5, s6, `timestamp`
+		FROM DATOS_PRUEBAS_PACIENTES
+		WHERE `id_prueba`='$id_prueba'
+		ORDER BY `timestamp`ASC
+	 ";
+	if($result=$conex->query($sql)){
+		// rellenamos array con tabla obtenida de las pruebas
+		//Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])),
+		$x = 0;
+		while ($row = $result->fetch_assoc()){
+			$entrada[$x]=[
+				$row['id_datos_pruebas_pacientes'],
+				$row['timestamp'],
+				$row['s1'],
+				$row['s2'],
+				$row['s3'],
+				$row['s4'],
+				$row['s5'],
+				$row['s6']
+						];
+				$labels.=$row['timestamp'].",";
+				$s1.=$row['s1'].",";
+				$s2.=$row['s2'].",";
+				$s3.=$row['s3'].",";
+				$s4.=$row['s4'].",";
+				$s5.=$row['s5'].",";
+				$s6.=$row['s6'].",";
+			$x++;
+		}
+		$html->assign("etiquetas",$labels);
+		$html->assign("s1",$s1);
+		$html->assign("s2",$s2);
+		$html->assign("s3",$s3);
+		$html->assign("s4",$s4);
+		$html->assign("s5",$s5);
+		$html->assign("s6",$s6);
+		$html->assign("entrada",$entrada);
+	}
+
+	$result = $conex->query("SELECT tipo FROM `ENSAYOS`,`PRUEBAS_PACIENTES` WHERE ENSAYOS.id_ensayo=PRUEBAS_PACIENTES.id_ensayo AND PRUEBAS_PACIENTES.id_prueba ='$id_prueba'"); 
+	$row = $result->fetch_assoc();
+	$tipo=$row['tipo'];
+	
+
+	/*$sql="SELECT dni_paciente,id_etiologia, etiologia, fecha_lesion, cuadrantes, comentarios, PATOLOGIAS.nombre
+		FROM ETIOLOGIAS, PATOLOGIAS
+		WHERE `dni_paciente`='$id_paciente' AND PATOLOGIAS.id_patologia=ETIOLOGIAS.id_patologia
+		ORDER BY fecha_lesion DESC
+	 ";
+	if($result=$conex->query($sql)){
+		// rellenamos array con tabla obtenida
+		//Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])),
+		$x = 0;
+		while ($row = $result->fetch_assoc()){
+			$etiologia[$x]=[
+				$row['id_etiologia'],
+				$row['etiologia'],
+				$row['fecha_lesion'],
+				$row['cuadrantes'],
+				$row['comentarios'],
+				$row['nombre']
+						];
+			$x++;
+		}
+		$html->assign("etiologia",$etiologia);
+	}*/
+
+	
+	$sql="SELECT nombre, PACIENTES.dni_paciente as dni_paciente, fecha FROM PACIENTES, PRUEBAS_PACIENTES WHERE PACIENTES.dni_paciente=PRUEBAS_PACIENTES.dni_paciente AND PRUEBAS_PACIENTES.id_prueba='$id_prueba'";
+	$result=$conex->query($sql);
+	$row = $result->fetch_assoc();
+	$dni_paciente = $row['dni_paciente'];
+	$nombre = $row['nombre'];
+	$fecha = $row['fecha'];
+	
+
+	$html->assign("id_admin",$id_admin);
+	$html->assign("id_prueba",$id_prueba);
+	$html->assign("dni_paciente",$dni_paciente);
+	$html->assign("nombre",$nombre);
+	$html->assign("tipo",$tipo);
+	$html->assign("fecha",$fecha);
+	
+	$html->display("ver_datos_paciente.tpl");
+}
+else	@header('location:index.php');
+?>		
diff --git a/ver_datos_sujeto.php b/ver_datos_sujeto.php
new file mode 100644
index 0000000000000000000000000000000000000000..8dd7e9d4ff15914d589e9e93d7d4b37f24b25c26
--- /dev/null
+++ b/ver_datos_sujeto.php
@@ -0,0 +1,103 @@
+<?php session_start();
+require('include.php');
+require_once("funciones.php");
+/*
+* Archivo de control. Se muestran las pruebas realizadas a un paciente y sus datos
+* Caso de uso: VER DATOS DE UN PACIENTE, MODIFICAR UN PACIENTE, BORRAR UN PACIENTE y CONSULTAR PRUEBA
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+	
+$id_admin=$_GET["variable"]; 
+	$id_prueba_sujeto =$_GET["id"];
+	// Comprueba que sigue en la sesión
+	$html=new Smarty;
+
+	barra();
+	
+	
+	$sql="SELECT id_datos_pruebas_sujetos, s1, s2, s3, s4, s5, s6, `timestamp`
+		FROM DATOS_PRUEBAS_SUJETOS
+		WHERE `id_prueba_sujeto`='$id_prueba_sujeto'
+		ORDER BY `timestamp`ASC
+	 ";
+	if($result=$conex->query($sql)){
+		// rellenamos array con tabla obtenida de las pruebas
+		//Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])),
+		$x = 0;
+		while ($row = $result->fetch_assoc()){
+			$entrada[$x]=[
+				$row['id_datos_pruebas_sujetos'],
+				$row['timestamp'],
+				$row['s1'],
+				$row['s2'],
+				$row['s3'],
+				$row['s4'],
+				$row['s5'],
+				$row['s6']
+						];
+				$labels.=$row['timestamp'].",";
+				$s1.=$row['s1'].",";
+				$s2.=$row['s2'].",";
+				$s3.=$row['s3'].",";
+				$s4.=$row['s4'].",";
+				$s5.=$row['s5'].",";
+				$s6.=$row['s6'].",";
+			$x++;
+		}
+		$html->assign("etiquetas",$labels);
+		$html->assign("s1",$s1);
+		$html->assign("s2",$s2);
+		$html->assign("s3",$s3);
+		$html->assign("s4",$s4);
+		$html->assign("s5",$s5);
+		$html->assign("s6",$s6);
+		$html->assign("entrada",$entrada);
+	}
+
+	$result = $conex->query("SELECT tipo FROM `ENSAYOS`,`PRUEBAS_SUJETOS` WHERE ENSAYOS.id_ensayo=PRUEBAS_SUJETOS.id_ensayo AND PRUEBAS_SUJETOS.id_prueba_sujeto ='$id_prueba_sujeto'"); 
+	$row = $result->fetch_assoc();
+	$tipo=$row['tipo'];
+	
+
+	/*$sql="SELECT dni_paciente,id_etiologia, etiologia, fecha_lesion, cuadrantes, comentarios, PATOLOGIAS.nombre
+		FROM ETIOLOGIAS, PATOLOGIAS
+		WHERE `dni_paciente`='$id_paciente' AND PATOLOGIAS.id_patologia=ETIOLOGIAS.id_patologia
+		ORDER BY fecha_lesion DESC
+	 ";
+	if($result=$conex->query($sql)){
+		// rellenamos array con tabla obtenida
+		//Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])),
+		$x = 0;
+		while ($row = $result->fetch_assoc()){
+			$etiologia[$x]=[
+				$row['id_etiologia'],
+				$row['etiologia'],
+				$row['fecha_lesion'],
+				$row['cuadrantes'],
+				$row['comentarios'],
+				$row['nombre']
+						];
+			$x++;
+		}
+		$html->assign("etiologia",$etiologia);
+	}*/
+
+	
+	$sql="SELECT SUJETOS.id_sujeto as nombre, fecha FROM SUJETOS, PRUEBAS_SUJETOS WHERE SUJETOS.id_sujeto =PRUEBAS_SUJETOS.id_sujeto AND PRUEBAS_SUJETOS.id_prueba_sujeto ='$id_prueba_sujeto'";
+	$result=$conex->query($sql);
+	$row = $result->fetch_assoc();;
+	$nombre = "Sujeto ".$row['nombre'];
+	$fecha = $row['fecha'];
+	
+
+	$html->assign("id_admin",$id_admin);
+	$html->assign("id_prueba",$id_prueba_sujeto);
+	$html->assign("dni_paciente",$dni_paciente);
+	$html->assign("nombre",$nombre);
+	$html->assign("tipo",$tipo);
+	$html->assign("fecha",$fecha);
+	
+	$html->display("ver_datos_sujeto.tpl");
+}
+else	@header('location:index.php');
+?>		
diff --git a/ver_pruebas_sujetos.php b/ver_pruebas_sujetos.php
new file mode 100644
index 0000000000000000000000000000000000000000..8467241d5a2ff38a9ed1ad685868714360e60f84
--- /dev/null
+++ b/ver_pruebas_sujetos.php
@@ -0,0 +1,48 @@
+<?php session_start();
+require('include.php');
+require_once("funciones.php");
+/*
+* Archivo de control. Se muestran las pruebas realizadas a un paciente y sus datos
+* Caso de uso: VER DATOS DE UN PACIENTE, MODIFICAR UN PACIENTE, BORRAR UN PACIENTE y CONSULTAR PRUEBA
+*/
+if($_SESSION['user']==$_GET["variable"] && $_SESSION["user"]!=""){
+	$id_admin=$_GET["variable"]; 
+	$id_paciente=$_GET["id"];
+	// Comprueba que sigue en la sesión
+	$html=new Smarty;
+
+	barra();
+	
+	
+	$sql="SELECT SUJETOS.edad, SUJETOS.sexo, tipo, fecha, simetria, PRUEBAS_SUJETOS.anotaciones, PRUEBAS_SUJETOS.id_prueba_sujeto
+		FROM ENSAYOS, PRUEBAS_SUJETOS, SUJETOS
+		WHERE ENSAYOS.id_ensayo=PRUEBAS_SUJETOS.id_ensayo AND SUJETOS.id_sujeto = PRUEBAS_SUJETOS.id_sujeto
+		ORDER BY fecha DESC
+	 ";
+	if($result=$conex->query($sql)){
+		// rellenamos array con tabla obtenida de las pruebas
+		//Cambiar formato de fecha: date("Y/m/d - H:i:s", strtotime($row['fecha'])),
+		$x = 0;
+		while ($row = $result->fetch_assoc()){
+			$entrada[$x]=[
+				$row['id_prueba_sujeto'],
+				$row['tipo'],
+				$row['fecha'],
+				$row['sexo'],
+				$row['edad'],
+				$row['simetria'],
+				$row['anotaciones']
+						];
+			$x++;
+		}
+		$html->assign("entrada",$entrada);
+	}else{
+		$mensaje="Error al capturar las pruebas sobre los sujetos";
+	}
+
+
+	$html->assign("id_admin",$id_admin);
+	$html->display("ver_pruebas_sujetos.tpl");
+}
+else	@header('location:index.php');
+?>