diff --git a/composer.json b/composer.json
index d90d617b9a..6a72c130d4 100644
--- a/composer.json
+++ b/composer.json
@@ -19,7 +19,8 @@
"defuse/php-encryption": "1.*",
"pear/Text_LanguageDetect": "1.*",
"pear-pear.php.net/Text_Highlighter": "*",
- "paragonie/random_compat": "^2.0"
+ "paragonie/random_compat": "^2.0",
+ "smarty/smarty": "^3.1"
},
"repositories": [
{
diff --git a/composer.lock b/composer.lock
index 4ad749273f..c5a82428df 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
- "content-hash": "a5c0c297b0e8185f2bcd3aad20ec5acc",
+ "content-hash": "40fc48f9b1e36f9f4960eb0ccf51a3c4",
"packages": [
{
"name": "defuse/php-encryption",
@@ -520,6 +520,59 @@
"description": "Identify human languages from text samples",
"homepage": "http://pear.php.net/package/Text_LanguageDetect",
"time": "2017-03-02T16:14:08+00:00"
+ },
+ {
+ "name": "smarty/smarty",
+ "version": "v3.1.31",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/smarty-php/smarty.git",
+ "reference": "c7d42e4a327c402897dd587871434888fde1e7a9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/smarty-php/smarty/zipball/c7d42e4a327c402897dd587871434888fde1e7a9",
+ "reference": "c7d42e4a327c402897dd587871434888fde1e7a9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "libs/bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-3.0"
+ ],
+ "authors": [
+ {
+ "name": "Monte Ohrt",
+ "email": "monte@ohrt.com"
+ },
+ {
+ "name": "Uwe Tews",
+ "email": "uwe.tews@googlemail.com"
+ },
+ {
+ "name": "Rodney Rehm",
+ "email": "rodney.rehm@medialize.de"
+ }
+ ],
+ "description": "Smarty - the compiling PHP template engine",
+ "homepage": "http://www.smarty.net",
+ "keywords": [
+ "templating"
+ ],
+ "time": "2016-12-14T21:57:25+00:00"
}
],
"packages-dev": [],
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
index 6aa0273ecf..20d9db7f3a 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -12,6 +12,7 @@ return array(
'Friendica\\App' => $baseDir . '/src/App.php',
'Friendica\\BaseModule' => $baseDir . '/src/BaseModule.php',
'Friendica\\BaseObject' => $baseDir . '/src/BaseObject.php',
+ 'Friendica\\Content\\ContactSelector' => $baseDir . '/src/Content/ContactSelector.php',
'Friendica\\Content\\Feature' => $baseDir . '/src/Content/Feature.php',
'Friendica\\Content\\ForumManager' => $baseDir . '/src/Content/ForumManager.php',
'Friendica\\Content\\OEmbed' => $baseDir . '/src/Content/OEmbed.php',
@@ -27,10 +28,14 @@ return array(
'Friendica\\Model\\Contact' => $baseDir . '/src/Model/Contact.php',
'Friendica\\Model\\GContact' => $baseDir . '/src/Model/GContact.php',
'Friendica\\Model\\Group' => $baseDir . '/src/Model/Group.php',
+ 'Friendica\\Model\\Item' => $baseDir . '/src/Model/Item.php',
'Friendica\\Model\\Photo' => $baseDir . '/src/Model/Photo.php',
'Friendica\\Model\\Profile' => $baseDir . '/src/Model/Profile.php',
+ 'Friendica\\Model\\Term' => $baseDir . '/src/Model/Term.php',
'Friendica\\Model\\User' => $baseDir . '/src/Model/User.php',
'Friendica\\Module\\Feed' => $baseDir . '/src/Module/Feed.php',
+ 'Friendica\\Module\\Login' => $baseDir . '/src/Module/Login.php',
+ 'Friendica\\Module\\Logout' => $baseDir . '/src/Module/Logout.php',
'Friendica\\Module\\Oembed' => $baseDir . '/src/Module/Oembed.php',
'Friendica\\Network\\FKOAuth1' => $baseDir . '/src/Network/FKOAuth1.php',
'Friendica\\Network\\FKOAuthDataStore' => $baseDir . '/src/Network/FKOAuthDataStore.php',
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
index a11144496e..df7cf3808c 100644
--- a/vendor/composer/autoload_files.php
+++ b/vendor/composer/autoload_files.php
@@ -9,4 +9,5 @@ return array(
'2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
'8170285c807a9f24f165f37b15bc9a36' => $vendorDir . '/defuse/php-encryption/Crypto.php',
'5255c38a0faeba867671b61dfda6d864' => $vendorDir . '/paragonie/random_compat/lib/random.php',
+ 'f084d01b0a599f67676cffef638aa95b' => $vendorDir . '/smarty/smarty/libs/bootstrap.php',
);
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index d09872de5c..e323edbeab 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -10,6 +10,7 @@ class ComposerStaticInitFriendica
'2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
'8170285c807a9f24f165f37b15bc9a36' => __DIR__ . '/..' . '/defuse/php-encryption/Crypto.php',
'5255c38a0faeba867671b61dfda6d864' => __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php',
+ 'f084d01b0a599f67676cffef638aa95b' => __DIR__ . '/..' . '/smarty/smarty/libs/bootstrap.php',
);
public static $prefixLengthsPsr4 = array (
@@ -65,6 +66,7 @@ class ComposerStaticInitFriendica
'Friendica\\App' => __DIR__ . '/../..' . '/src/App.php',
'Friendica\\BaseModule' => __DIR__ . '/../..' . '/src/BaseModule.php',
'Friendica\\BaseObject' => __DIR__ . '/../..' . '/src/BaseObject.php',
+ 'Friendica\\Content\\ContactSelector' => __DIR__ . '/../..' . '/src/Content/ContactSelector.php',
'Friendica\\Content\\Feature' => __DIR__ . '/../..' . '/src/Content/Feature.php',
'Friendica\\Content\\ForumManager' => __DIR__ . '/../..' . '/src/Content/ForumManager.php',
'Friendica\\Content\\OEmbed' => __DIR__ . '/../..' . '/src/Content/OEmbed.php',
@@ -80,10 +82,14 @@ class ComposerStaticInitFriendica
'Friendica\\Model\\Contact' => __DIR__ . '/../..' . '/src/Model/Contact.php',
'Friendica\\Model\\GContact' => __DIR__ . '/../..' . '/src/Model/GContact.php',
'Friendica\\Model\\Group' => __DIR__ . '/../..' . '/src/Model/Group.php',
+ 'Friendica\\Model\\Item' => __DIR__ . '/../..' . '/src/Model/Item.php',
'Friendica\\Model\\Photo' => __DIR__ . '/../..' . '/src/Model/Photo.php',
'Friendica\\Model\\Profile' => __DIR__ . '/../..' . '/src/Model/Profile.php',
+ 'Friendica\\Model\\Term' => __DIR__ . '/../..' . '/src/Model/Term.php',
'Friendica\\Model\\User' => __DIR__ . '/../..' . '/src/Model/User.php',
'Friendica\\Module\\Feed' => __DIR__ . '/../..' . '/src/Module/Feed.php',
+ 'Friendica\\Module\\Login' => __DIR__ . '/../..' . '/src/Module/Login.php',
+ 'Friendica\\Module\\Logout' => __DIR__ . '/../..' . '/src/Module/Logout.php',
'Friendica\\Module\\Oembed' => __DIR__ . '/../..' . '/src/Module/Oembed.php',
'Friendica\\Network\\FKOAuth1' => __DIR__ . '/../..' . '/src/Network/FKOAuth1.php',
'Friendica\\Network\\FKOAuthDataStore' => __DIR__ . '/../..' . '/src/Network/FKOAuthDataStore.php',
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 15012d345f..bdabd2b3ac 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -539,5 +539,60 @@
"mobile detector",
"php mobile detect"
]
+ },
+ {
+ "name": "smarty/smarty",
+ "version": "v3.1.31",
+ "version_normalized": "3.1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/smarty-php/smarty.git",
+ "reference": "c7d42e4a327c402897dd587871434888fde1e7a9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/smarty-php/smarty/zipball/c7d42e4a327c402897dd587871434888fde1e7a9",
+ "reference": "c7d42e4a327c402897dd587871434888fde1e7a9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.2"
+ },
+ "time": "2016-12-14T21:57:25+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "files": [
+ "libs/bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-3.0"
+ ],
+ "authors": [
+ {
+ "name": "Monte Ohrt",
+ "email": "monte@ohrt.com"
+ },
+ {
+ "name": "Uwe Tews",
+ "email": "uwe.tews@googlemail.com"
+ },
+ {
+ "name": "Rodney Rehm",
+ "email": "rodney.rehm@medialize.de"
+ }
+ ],
+ "description": "Smarty - the compiling PHP template engine",
+ "homepage": "http://www.smarty.net",
+ "keywords": [
+ "templating"
+ ]
}
]
diff --git a/vendor/smarty/smarty/COMPOSER_RELEASE_NOTES.txt b/vendor/smarty/smarty/COMPOSER_RELEASE_NOTES.txt
new file mode 100644
index 0000000000..c943d9f2eb
--- /dev/null
+++ b/vendor/smarty/smarty/COMPOSER_RELEASE_NOTES.txt
@@ -0,0 +1,29 @@
+
+
+Starting with Smarty 3.1.21 Composer has been configured to load the packages from github.
+
+*******************************************************************************
+* *
+* NOTE: Because of this change you must clear your local composer cache with *
+* the "composer clearcache" command *
+* *
+*******************************************************************************
+
+To get the latest stable version use
+ "require": {
+ "smarty/smarty": "~3.1"
+ }
+in your composer.json file.
+
+To get the trunk version use
+ "require": {
+ "smarty/smarty": "~3.1@dev"
+ }
+
+The "smarty/smarty" package will start at libs/.... subfolder.
+
+To retrieve the development and documentation folders add
+ "require-dev": {
+ "smarty/smarty-dev": "~3.1@dev"
+ }
+
diff --git a/vendor/smarty/smarty/INHERITANCE_RELEASE_NOTES.txt b/vendor/smarty/smarty/INHERITANCE_RELEASE_NOTES.txt
new file mode 100644
index 0000000000..c415c4ccd1
--- /dev/null
+++ b/vendor/smarty/smarty/INHERITANCE_RELEASE_NOTES.txt
@@ -0,0 +1,87 @@
+3.1.31-dev
+New tags for inheritance parent and child
+{block_parent} == {$smarty.block.parent}
+{block_child} == {$smarty.block.child}
+
+Since 3.1.28 you can mix inheritance by extends resource with the {extends} tag.
+A template called by extends resource can extend a subtemplate or chain buy the {extends} tag.
+Since 3.1.31 this feature can be turned off by setting the new Smarty property Smarty::$extends_recursion to false.
+
+
+3.1.28
+Starting with version 3.1.28 template inheritance is no longer a compile time process.
+All {block} tag parent/child relations are resolved at run time.
+This does resolve all known existing restrictions (see below).
+
+The $smarty::$inheritance_merge_compiled_includes property has been removed.
+Any access to it is ignored.
+
+New features:
+
+Any code outside root {block} tags in child templates is now executed but any output will be ignored.
+
+ {extends 'foo.tpl'}
+ {$bar = 'on'} // assigns variable $bar seen in parent templates
+ {block 'buh'}{/block}
+
+ {extends 'foo.tpl'}
+ {$bar} // the output of variable bar is ignored
+ {block 'buh'}{/block}
+
+{block} tags can be dynamically en/disabled by conditions.
+
+ {block 'root'}
+ {if $foo}
+ {block 'v1'}
+ ....
+ {/block}
+ {else}
+ {block 'v1'}
+ ....
+ {/block}
+ {/if}
+ {/block}
+
+{block} tags can have variable names.
+
+ {block $foo}
+ ....
+ {/block}
+
+Starting with 3.1.28 you can mix inheritance by extends resource with the {extends} tag.
+A template called by extends resource can extend a subtemplate or chain buy the {extends} tag.
+
+NOTE There is a BC break. If you used the extends resource {extends} tags have been ignored.
+
+THE FOLLOWING RESTRICTIONS ARE NO LONGER EXISTING:
+In Smarty 3.1 template inheritance is a compile time process. All the extending of {block} tags
+is done at compile time and the parent and child templates are compiled in a single compiled template.
+{include} subtemplate could also {block} tags. Such subtemplate could not compiled by it's own because
+it could be used in other context where the {block} extended with a different result. For that reasion
+the compiled code of {include} subtemplates gets also merged in compiled inheritance template.
+
+Merging the code into a single compile template has some drawbacks.
+1. You could not use variable file names in {include} Smarty would use the {include} of compilation time.
+2. You could not use individual compile_id in {include}
+3. Seperate caching of subtemplate was not possible
+4. Any change of the template directory structure between calls was not necessarily seen.
+
+Starting with 3.1.15 some of the above conditions got checked and resulted in an exception. It turned out
+that a couple of users did use some of above and now got exceptions.
+
+To resolve this starting with 3.1.16 there is a new configuration parameter $inheritance_merge_compiled_includes.
+For most backward compatibility its default setting is true.
+With this setting all {include} subtemplate will be merge into the compiled inheritance template, but the above cases
+could be rejected by exception.
+
+
+If $smarty->inheritance_merge_compiled_includes = false; {include} subtemplate will not be merged.
+You must now manually merge all {include} subtemplate which do contain {block} tags. This is done by setting the "inline" option.
+{include file='foo.bar' inline}
+
+1. In case of a variable file name like {include file=$foo inline} you must use the variable in a compile_id $smarty->compile_id = $foo;
+2. If you use individual compile_id in {include file='foo.tpl' compile_id=$bar inline} it must be used in the
+ global compile_id as well $smarty->compile_id = $bar;
+3. If call templates with different template_dir configurations and a parent could same named child template from different folders
+ you must make the folder name part of the compile_id.
+
diff --git a/vendor/smarty/smarty/LICENSE b/vendor/smarty/smarty/LICENSE
new file mode 100644
index 0000000000..fb8ca6c6fb
--- /dev/null
+++ b/vendor/smarty/smarty/LICENSE
@@ -0,0 +1,179 @@
+Smarty: the PHP compiling template engine
+
+ 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 2.1 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 below for more details.
+
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/vendor/smarty/smarty/NEW_FEATURES.txt b/vendor/smarty/smarty/NEW_FEATURES.txt
new file mode 100644
index 0000000000..adbc1099b9
--- /dev/null
+++ b/vendor/smarty/smarty/NEW_FEATURES.txt
@@ -0,0 +1,239 @@
+
+
+This file contains a brief description of new features which have been added to Smarty 3.1
+
+Smarty 3.1.31
+ New tags for inheritance parent and child
+ =========================================
+ {block_parent} == {$smarty.block.parent}
+ {block_child} == {$smarty.block.child}
+
+Smarty 3.1.30
+
+ Loop optimization {foreach} and {section}
+ =========================================
+ Smarty does optimize the {foreach} and {section} loops by removing code for not needed loop
+ properties.
+ The compiler collects needed properties by scanning the current template for $item@property,
+ $smarty.foreach.name.property and $smarty.section.name.property.
+ The compiler does not know if additional properties will be needed outside the current template scope.
+ Additional properties can be generated by adding them with the property attribute.
+
+ Example:
+ index.tpl
+ {foreach $from as $item properties=[iteration, index]}
+ {include 'sub.tpl'}
+ {$item.total}
+ {/foreach}
+
+ sub.tpl
+ {$item.index} {$item.iteration} {$item.total}
+
+ In above example code for the 'total' property is automatically generated as $item.total is used in
+ index.tpl. Code for 'iteration' and 'index' must be added with properties=[iteration, index].
+
+ New tag {make_nocache}
+ ======================
+ Syntax: {make_nocache $foo}
+
+ This tag makes a variable which does exists normally only while rendering the compiled template
+ available in the cached template for use in not cached expressions.
+
+ Expample:
+ {foreach from=$list item=item}
+
{$item.name} {make_nocache $item}{if $current==$item.id} ACTIVE{/if}
+ {/foreach}
+
+ The {foreach} loop is rendered while processing the compiled template, but $current is a nocache
+ variable. Normally the {if $current==$item.id} would fail as the $item variable is unkown in the
+ cached template. {make_nocache $item} does make the current $item value known in thee cached template.
+
+ {make_nocache} is ignored when caching is disabled or the variable does exists as nocache variable.
+
+ NOTE: if the variable value does contain objects these must have the __set_state method implemented.
+
+
+ Scope Attributes
+ ================
+ The scope handling has been updated to cover all cases of variable assignments in templates.
+
+ The tags {assign}, {append} direct assignments like {$foo = ...}, {$foo[...]= ...} support
+ the following optional scope attributes:
+ scope='parent' - the variable will be assigned in the current template and if the template
+ was included by {include} the calling template
+ scope='tpl_root' - the variable will be assigned in the outermost root template called by $smarty->display()
+ or $smarty->fetch() and is bubbled up all {include} sub-templates to the current template.
+ scope='smarty' - the variable will be assigned in the Smarty object and is bubbled up all {include} sub-templates
+ to the current template.
+ scope='global' - the variable will be assigned as Smarty object global variable and is bubbled up all {include}
+ sub-templates to the current template.
+ scope='root' - the variable will be assigned if a data object was used for variable definitions in the data
+ object or in the Smarty object otherwise and is bubbled up all {include} sub-templates to the
+ current template.
+ scope='local' - this scope has only a meaning if the tag is called within a template {function}.
+ The variable will be assigned in the local scope of the template function and the
+ template which did call the template function.
+
+
+ The {config_load} tag supports all of the above except the global scope.
+
+ The scope attribute can be used also with the {include} tag.
+ Supported scope are parent, tpl_root, smarty, global and root.
+ A scope used together with the {include} tag will cause that with some exceptions any variable
+ assignment within that sub-template will update/assign the variable in other scopes according
+ to the above rules. It does include also variables assigned by plugins, tags supporting the assign=foo
+ attribute and direct assignments in {if} and {while} like {if $foo=$bar}.
+ Excluded are the key and value variables of {foreach}, {for} loop variables , variables passed by attributes
+ in {include} and direct increments/decrements like {$foo++}, {$foo--}
+
+ Note: The scopes should be used only to the extend really need. If a variable value assigned in an included
+ sub-template should be returned to the calling sub-template just use {$foo='bar' scope='parent'}.
+ Use scopes only with variables for which it's realy needed. Avoid general scope settings with the
+ {include} tag as it can have a performance impact.
+
+ The {assign}, {append}, {config_load} and {$foo...=...} tags have a new option flag 'noscope'.Thi
+ Example: {$foo='bar' noscope} This will assign $foo only in the current template and any scope settings
+ at {include} is ignored.
+
+
+ Caching
+ =======
+ Caching does now observe the template_dir setting and will create separate cache files if required
+
+ Compiled Templates
+ ==================
+ The template_dir setting is now encoded in the uid of the file name.
+ The content of the compiled template may depend on the template_dir search order
+ {include .... inline} is used or $smarty->merge_compiled_includes is enabled
+
+ APC
+ ===
+ If APC is enabled force an apc_compile_file() when compiled or cached template was updated
+
+Smarty 3.1.28
+
+ OPCACHE
+ =======
+ Smarty does now invalidate automatically updated and cleared compiled or cached template files in OPCACHE.
+ Correct operation is no longer dependent on OPCACHE configuration settings.
+
+ Template inheritance
+ ====================
+ Template inheritance is now processed in run time.
+ See the INHERITANCE_RELEASE_NOTES
+
+ Modifier regex_replace
+ ======================
+ An optional limit parameter was added
+
+ fetch() and display()
+ =====================
+ The fetch() and display() methods of the template object accept now optionally the same parameter
+ as the corresponding Smarty methods to get the content of another template.
+ Example:
+ $template->display(); Does display template of template object
+ $template->display('foo.tpl'); Does display template 'foo.bar'
+
+ File: resource
+ ==============
+ Multiple template_dir entries can now be selected by a comma separated list of indices.
+ The template_dir array is searched in the order of the indices. (Could be used to change the default search order)
+ Example:
+ $smarty->display('[1],[0]foo.bar');
+
+ Filter support
+ ==============
+ Optional filter names
+ An optional filter name was added to $smarty->registerFilter(). It can be used to unregister a filter by name.
+ - $smarty->registerFilter('output', $callback, 'name');
+ $smarty->unregister('output', 'name');
+
+ Closures
+ $smarty->registerFilter() does now accept closures.
+ - $smarty->registerFilter('pre', function($source) {return $source;});
+ If no optional filter name was specified it gets the default name 'closure'.
+ If you register multiple closures register each with a unique filter name.
+ - $smarty->registerFilter('pre', function($source) {return $source;}, 'closure_1');
+ - $smarty->registerFilter('pre', function($source) {return $source;}, 'closure_2');
+
+
+Smarty 3.1.22
+
+ Namespace support within templates
+ ==================================
+ Within templates you can now use namespace specifications on:
+ - Constants like foo\bar\FOO
+ - Class names like foo\bar\Baz::FOO, foo\bar\Baz::$foo, foo\bar\Baz::foo()
+ - PHP function names like foo\bar\baz()
+
+ Security
+ ========
+ - disable special $smarty variable -
+ The Smarty_Security class has the new property $disabled_special_smarty_vars.
+ It's an array which can be loaded with the $smarty special variable names like
+ 'template_object', 'template', 'current_dir' and others which will be disabled.
+ Note: That this security check is performed at compile time.
+
+ - limit template nesting -
+ Property $max_template_nesting of Smarty_Security does set the maximum template nesting level.
+ The main template is level 1. The nesting level is checked at run time. When the maximum will be exceeded
+ an Exception will be thrown. The default setting is 0 which does disable this check.
+
+ - trusted static methods -
+ The Smarty_Security class has the new property $trusted_static_methods to restrict access to static methods.
+ It's an nested array of trusted class and method names.
+ Format:
+ array (
+ 'class_1' => array('method_1', 'method_2'), // allowed methods
+ 'class_2' => array(), // all methods of class allowed
+ )
+ To disable access for all methods of all classes set $trusted_static_methods = null;
+ The default value is an empty array() which does enables all methods of all classes, but for backward compatibility
+ the setting of $static_classes will be checked.
+ Note: That this security check is performed at compile time.
+
+ - trusted static properties -
+ The Smarty_Security class has the new property $trusted_static_properties to restrict access to static properties.
+ It's an nested array of trusted class and property names.
+ Format:
+ array (
+ 'class_1' => array('prop_1', 'prop_2'), // allowed properties listed
+ 'class_2' => array(), // all properties of class allowed
+ }
+ To disable access for all properties of all classes set $trusted_static_properties = null;
+ The default value is an empty array() which does enables all properties of all classes, but for backward compatibility
+ the setting of $static_classes will be checked.
+ Note: That this security check is performed at compile time.
+
+ - trusted constants .
+ The Smarty_Security class has the new property $trusted_constants to restrict access to constants.
+ It's an array of trusted constant names.
+ Format:
+ array (
+ 'SMARTY_DIR' , // allowed constant
+ }
+ If the array is empty (default) the usage of constants can be controlled with the
+ Smarty_Security::$allow_constants property (default true)
+
+
+
+ Compiled Templates
+ ==================
+ Smarty does now automatically detects a change of the $merge_compiled_includes and $escape_html
+ property and creates different compiled templates files depending on the setting.
+
+ Same applies to config files and the $config_overwrite, $config_booleanize and
+ $config_read_hidden properties.
+
+ Debugging
+ =========
+ The layout of the debug window has been changed for better readability
+
+ New class constants
+ Smarty::DEBUG_OFF
+ Smarty::DEBUG_ON
+ Smarty::DEBUG_INDIVIDUAL
+ have been introduced for setting the $debugging property.
+
+ Smarty::DEBUG_INDIVIDUAL will create for each display() and fetch() call an individual debug window.
+
diff --git a/vendor/smarty/smarty/README b/vendor/smarty/smarty/README
new file mode 100644
index 0000000000..08b397c3f6
--- /dev/null
+++ b/vendor/smarty/smarty/README
@@ -0,0 +1,575 @@
+Smarty 3.x
+
+Author: Monte Ohrt
+Author: Uwe Tews
+
+AN INTRODUCTION TO SMARTY 3
+
+NOTICE FOR 3.1 release:
+
+Please see the SMARTY_3.1_NOTES.txt file that comes with the distribution.
+
+NOTICE for 3.0.5 release:
+
+Smarty now follows the PHP error_reporting level by default. If PHP does not mask E_NOTICE and you try to access an unset template variable, you will now get an E_NOTICE warning. To revert to the old behavior:
+
+$smarty->error_reporting = E_ALL & ~E_NOTICE;
+
+NOTICE for 3.0 release:
+
+IMPORTANT: Some API adjustments have been made between the RC4 and 3.0 release.
+We felt it is better to make these now instead of after a 3.0 release, then have to
+immediately deprecate APIs in 3.1. Online documentation has been updated
+to reflect these changes. Specifically:
+
+---- API CHANGES RC4 -> 3.0 ----
+
+$smarty->register->*
+$smarty->unregister->*
+$smarty->utility->*
+$samrty->cache->*
+
+Have all been changed to local method calls such as:
+
+$smarty->clearAllCache()
+$smarty->registerFoo()
+$smarty->unregisterFoo()
+$smarty->testInstall()
+etc.
+
+Registration of function, block, compiler, and modifier plugins have been
+consolidated under two API calls:
+
+$smarty->registerPlugin(...)
+$smarty->unregisterPlugin(...)
+
+Registration of pre, post, output and variable filters have been
+consolidated under two API calls:
+
+$smarty->registerFilter(...)
+$smarty->unregisterFilter(...)
+
+Please refer to the online documentation for all specific changes:
+
+http://www.smarty.net/documentation
+
+----
+
+The Smarty 3 API has been refactored to a syntax geared
+for consistency and modularity. The Smarty 2 API syntax is still supported, but
+will throw a deprecation notice. You can disable the notices, but it is highly
+recommended to adjust your syntax to Smarty 3, as the Smarty 2 syntax must run
+through an extra rerouting wrapper.
+
+Basically, all Smarty methods now follow the "fooBarBaz" camel case syntax. Also,
+all Smarty properties now have getters and setters. So for example, the property
+$smarty->cache_dir can be set with $smarty->setCacheDir('foo/') and can be
+retrieved with $smarty->getCacheDir().
+
+Some of the Smarty 3 APIs have been revoked such as the "is*" methods that were
+just duplicate functions of the now available "get*" methods.
+
+Here is a rundown of the Smarty 3 API:
+
+$smarty->fetch($template, $cache_id = null, $compile_id = null, $parent = null)
+$smarty->display($template, $cache_id = null, $compile_id = null, $parent = null)
+$smarty->isCached($template, $cache_id = null, $compile_id = null)
+$smarty->createData($parent = null)
+$smarty->createTemplate($template, $cache_id = null, $compile_id = null, $parent = null)
+$smarty->enableSecurity()
+$smarty->disableSecurity()
+$smarty->setTemplateDir($template_dir)
+$smarty->addTemplateDir($template_dir)
+$smarty->templateExists($resource_name)
+$smarty->loadPlugin($plugin_name, $check = true)
+$smarty->loadFilter($type, $name)
+$smarty->setExceptionHandler($handler)
+$smarty->addPluginsDir($plugins_dir)
+$smarty->getGlobal($varname = null)
+$smarty->getRegisteredObject($name)
+$smarty->getDebugTemplate()
+$smarty->setDebugTemplate($tpl_name)
+$smarty->assign($tpl_var, $value = null, $nocache = false)
+$smarty->assignGlobal($varname, $value = null, $nocache = false)
+$smarty->assignByRef($tpl_var, &$value, $nocache = false)
+$smarty->append($tpl_var, $value = null, $merge = false, $nocache = false)
+$smarty->appendByRef($tpl_var, &$value, $merge = false)
+$smarty->clearAssign($tpl_var)
+$smarty->clearAllAssign()
+$smarty->configLoad($config_file, $sections = null)
+$smarty->getVariable($variable, $_ptr = null, $search_parents = true, $error_enable = true)
+$smarty->getConfigVariable($variable)
+$smarty->getStreamVariable($variable)
+$smarty->getConfigVars($varname = null)
+$smarty->clearConfig($varname = null)
+$smarty->getTemplateVars($varname = null, $_ptr = null, $search_parents = true)
+$smarty->clearAllCache($exp_time = null, $type = null)
+$smarty->clearCache($template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = null)
+
+$smarty->registerPlugin($type, $tag, $callback, $cacheable = true, $cache_attr = array())
+
+$smarty->registerObject($object_name, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
+
+$smarty->registerFilter($type, $function_name)
+$smarty->registerResource($resource_type, $function_names)
+$smarty->registerDefaultPluginHandler($function_name)
+$smarty->registerDefaultTemplateHandler($function_name)
+
+$smarty->unregisterPlugin($type, $tag)
+$smarty->unregisterObject($object_name)
+$smarty->unregisterFilter($type, $function_name)
+$smarty->unregisterResource($resource_type)
+
+$smarty->compileAllTemplates($extension = '.tpl', $force_compile = false, $time_limit = 0, $max_errors = null)
+$smarty->clearCompiledTemplate($resource_name = null, $compile_id = null, $exp_time = null)
+$smarty->testInstall()
+
+// then all the getters/setters, available for all properties. Here are a few:
+
+$caching = $smarty->getCaching(); // get $smarty->caching
+$smarty->setCaching(true); // set $smarty->caching
+$smarty->setDeprecationNotices(false); // set $smarty->deprecation_notices
+$smarty->setCacheId($id); // set $smarty->cache_id
+$debugging = $smarty->getDebugging(); // get $smarty->debugging
+
+
+FILE STRUCTURE
+
+The Smarty 3 file structure is similar to Smarty 2:
+
+/libs/
+ Smarty.class.php
+/libs/sysplugins/
+ internal.*
+/libs/plugins/
+ function.mailto.php
+ modifier.escape.php
+ ...
+
+A lot of Smarty 3 core functionality lies in the sysplugins directory; you do
+not need to change any files here. The /libs/plugins/ folder is where Smarty
+plugins are located. You can add your own here, or create a separate plugin
+directory, just the same as Smarty 2. You will still need to create your own
+/cache/, /templates/, /templates_c/, /configs/ folders. Be sure /cache/ and
+/templates_c/ are writable.
+
+The typical way to use Smarty 3 should also look familiar:
+
+require('Smarty.class.php');
+$smarty = new Smarty;
+$smarty->assign('foo','bar');
+$smarty->display('index.tpl');
+
+
+However, Smarty 3 works completely different on the inside. Smarty 3 is mostly
+backward compatible with Smarty 2, except for the following items:
+
+*) Smarty 3 is PHP 5 only. It will not work with PHP 4.
+*) The {php} tag is disabled by default. Enable with $smarty->allow_php_tag=true.
+*) Delimiters surrounded by whitespace are no longer treated as Smarty tags.
+ Therefore, { foo } will not compile as a tag, you must use {foo}. This change
+ Makes Javascript/CSS easier to work with, eliminating the need for {literal}.
+ This can be disabled by setting $smarty->auto_literal = false;
+*) The Smarty 3 API is a bit different. Many Smarty 2 API calls are deprecated
+ but still work. You will want to update your calls to Smarty 3 for maximum
+ efficiency.
+
+
+There are many things that are new to Smarty 3. Here are the notable items:
+
+LEXER/PARSER
+============
+
+Smarty 3 now uses a lexing tokenizer for its parser/compiler. Basically, this
+means Smarty has some syntax additions that make life easier such as in-template
+math, shorter/intuitive function parameter options, infinite function recursion,
+more accurate error handling, etc.
+
+
+WHAT IS NEW IN SMARTY TEMPLATE SYNTAX
+=====================================
+
+Smarty 3 allows expressions almost anywhere. Expressions can include PHP
+functions as long as they are not disabled by the security policy, object
+methods and properties, etc. The {math} plugin is no longer necessary but
+is still supported for BC.
+
+Examples:
+{$x+$y} will output the sum of x and y.
+{$foo = strlen($bar)} function in assignment
+{assign var=foo value= $x+$y} in attributes
+{$foo = myfunct( ($x+$y)*3 )} as function parameter
+{$foo[$x+3]} as array index
+
+Smarty tags can be used as values within other tags.
+Example: {$foo={counter}+3}
+
+Smarty tags can also be used inside double quoted strings.
+Example: {$foo="this is message {counter}"}
+
+You can define arrays within templates.
+Examples:
+{assign var=foo value=[1,2,3]}
+{assign var=foo value=['y'=>'yellow','b'=>'blue']}
+Arrays can be nested.
+{assign var=foo value=[1,[9,8],3]}
+
+There is a new short syntax supported for assigning variables.
+Example: {$foo=$bar+2}
+
+You can assign a value to a specific array element. If the variable exists but
+is not an array, it is converted to an array before the new values are assigned.
+Examples:
+{$foo['bar']=1}
+{$foo['bar']['blar']=1}
+
+You can append values to an array. If the variable exists but is not an array,
+it is converted to an array before the new values are assigned.
+Example: {$foo[]=1}
+
+You can use a PHP-like syntax for accessing array elements, as well as the
+original "dot" notation.
+Examples:
+{$foo[1]} normal access
+{$foo['bar']}
+{$foo['bar'][1]}
+{$foo[$x+$x]} index may contain any expression
+{$foo[$bar[1]]} nested index
+{$foo[section_name]} smarty section access, not array access!
+
+The original "dot" notation stays, and with improvements.
+Examples:
+{$foo.a.b.c} => $foo['a']['b']['c']
+{$foo.a.$b.c} => $foo['a'][$b]['c'] with variable index
+{$foo.a.{$b+4}.c} => $foo['a'][$b+4]['c'] with expression as index
+{$foo.a.{$b.c}} => $foo['a'][$b['c']] with nested index
+
+note that { and } are used to address ambiguties when nesting the dot syntax.
+
+Variable names themselves can be variable and contain expressions.
+Examples:
+$foo normal variable
+$foo_{$bar} variable name containing other variable
+$foo_{$x+$y} variable name containing expressions
+$foo_{$bar}_buh_{$blar} variable name with multiple segments
+{$foo_{$x}} will output the variable $foo_1 if $x has a value of 1.
+
+Object method chaining is implemented.
+Example: {$object->method1($x)->method2($y)}
+
+{for} tag added for looping (replacement for {section} tag):
+{for $x=0, $y=count($foo); $x<$y; $x++} .... {/for}
+Any number of statements can be used separated by comma as the first
+inital expression at {for}.
+
+{for $x = $start to $end step $step} ... {/for}is in the SVN now .
+You can use also
+{for $x = $start to $end} ... {/for}
+In this case the step value will be automaticall 1 or -1 depending on the start and end values.
+Instead of $start and $end you can use any valid expression.
+Inside the loop the following special vars can be accessed:
+$x@iteration = number of iteration
+$x@total = total number of iterations
+$x@first = true on first iteration
+$x@last = true on last iteration
+
+
+The Smarty 2 {section} syntax is still supported.
+
+New shorter {foreach} syntax to loop over an array.
+Example: {foreach $myarray as $var}...{/foreach}
+
+Within the foreach loop, properties are access via:
+
+$var@key foreach $var array key
+$var@iteration foreach current iteration count (1,2,3...)
+$var@index foreach current index count (0,1,2...)
+$var@total foreach $var array total
+$var@first true on first iteration
+$var@last true on last iteration
+
+The Smarty 2 {foreach} tag syntax is still supported.
+
+NOTE: {$bar[foo]} still indicates a variable inside of a {section} named foo.
+If you want to access an array element with index foo, you must use quotes
+such as {$bar['foo']}, or use the dot syntax {$bar.foo}.
+
+while block tag is now implemented:
+{while $foo}...{/while}
+{while $x lt 10}...{/while}
+
+Direct access to PHP functions:
+Just as you can use PHP functions as modifiers directly, you can now access
+PHP functions directly, provided they are permitted by security settings:
+{time()}
+
+There is a new {function}...{/function} block tag to implement a template function.
+This enables reuse of code sequences like a plugin function. It can call itself recursively.
+Template function must be called with the new {call name=foo...} tag.
+
+Example:
+
+Template file:
+{function name=menu level=0}
+
+ {foreach $data as $entry}
+ {if is_array($entry)}
+ {$entry@key}
+ {call name=menu data=$entry level=$level+1}
+ {else}
+ {$entry}
+ {/if}
+ {/foreach}
+
+{/function}
+
+{$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' =>
+ ['item3-3-1','item3-3-2']],'item4']}
+
+{call name=menu data=$menu}
+
+
+Generated output:
+ * item1
+ * item2
+ * item3
+ o item3-1
+ o item3-2
+ o item3-3
+ + item3-3-1
+ + item3-3-2
+ * item4
+
+The function tag itself must have the "name" attribute. This name is the tag
+name when calling the function. The function tag may have any number of
+additional attributes. These will be default settings for local variables.
+
+New {nocache} block function:
+{nocache}...{/nocache} will declare a section of the template to be non-cached
+when template caching is enabled.
+
+New nocache attribute:
+You can declare variable/function output as non-cached with the nocache attribute.
+Examples:
+
+{$foo nocache=true}
+{$foo nocache} /* same */
+
+{foo bar="baz" nocache=true}
+{foo bar="baz" nocache} /* same */
+
+{time() nocache=true}
+{time() nocache} /* same */
+
+Or you can also assign the variable in your script as nocache:
+$smarty->assign('foo',$something,true); // third param is nocache setting
+{$foo} /* non-cached */
+
+$smarty.current_dir returns the directory name of the current template.
+
+You can use strings directly as templates with the "string" resource type.
+Examples:
+$smarty->display('string:This is my template, {$foo}!'); // php
+{include file="string:This is my template, {$foo}!"} // template
+
+
+
+VARIABLE SCOPE / VARIABLE STORAGE
+=================================
+
+In Smarty 2, all assigned variables were stored within the Smarty object.
+Therefore, all variables assigned in PHP were accessible by all subsequent
+fetch and display template calls.
+
+In Smarty 3, we have the choice to assign variables to the main Smarty object,
+to user-created data objects, and to user-created template objects.
+These objects can be chained. The object at the end of a chain can access all
+variables belonging to that template and all variables within the parent objects.
+The Smarty object can only be the root of a chain, but a chain can be isolated
+from the Smarty object.
+
+All known Smarty assignment interfaces will work on the data and template objects.
+
+Besides the above mentioned objects, there is also a special storage area for
+global variables.
+
+A Smarty data object can be created as follows:
+$data = $smarty->createData(); // create root data object
+$data->assign('foo','bar'); // assign variables as usual
+$data->config_load('my.conf'); // load config file
+
+$data= $smarty->createData($smarty); // create data object having a parent link to
+the Smarty object
+
+$data2= $smarty->createData($data); // create data object having a parent link to
+the $data data object
+
+A template object can be created by using the createTemplate method. It has the
+same parameter assignments as the fetch() or display() method.
+Function definition:
+function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null)
+
+The first parameter can be a template name, a smarty object or a data object.
+
+Examples:
+$tpl = $smarty->createTemplate('mytpl.tpl'); // create template object not linked to any parent
+$tpl->assign('foo','bar'); // directly assign variables
+$tpl->config_load('my.conf'); // load config file
+
+$tpl = $smarty->createTemplate('mytpl.tpl',$smarty); // create template having a parent link to the Smarty object
+$tpl = $smarty->createTemplate('mytpl.tpl',$data); // create template having a parent link to the $data object
+
+The standard fetch() and display() methods will implicitly create a template object.
+If the $parent parameter is not specified in these method calls, the template object
+is will link back to the Smarty object as it's parent.
+
+If a template is called by an {include...} tag from another template, the
+subtemplate links back to the calling template as it's parent.
+
+All variables assigned locally or from a parent template are accessible. If the
+template creates or modifies a variable by using the {assign var=foo...} or
+{$foo=...} tags, these new values are only known locally (local scope). When the
+template exits, none of the new variables or modifications can be seen in the
+parent template(s). This is same behavior as in Smarty 2.
+
+With Smarty 3, we can assign variables with a scope attribute which allows the
+availablility of these new variables or modifications globally (ie in the parent
+templates.)
+
+Possible scopes are local, parent, root and global.
+Examples:
+{assign var=foo value='bar'} // no scope is specified, the default 'local'
+{$foo='bar'} // same, local scope
+{assign var=foo value='bar' scope='local'} // same, local scope
+
+{assign var=foo value='bar' scope='parent'} // Values will be available to the parent object
+{$foo='bar' scope='parent'} // (normally the calling template)
+
+{assign var=foo value='bar' scope='root'} // Values will be exported up to the root object, so they can
+{$foo='bar' scope='root'} // be seen from all templates using the same root.
+
+{assign var=foo value='bar' scope='global'} // Values will be exported to global variable storage,
+{$foo='bar' scope='global'} // they are available to any and all templates.
+
+
+The scope attribute can also be attached to the {include...} tag. In this case,
+the specified scope will be the default scope for all assignments within the
+included template.
+
+
+PLUGINS
+=======
+
+Smarty 3 plugins follow the same coding rules as in Smarty 2.
+The main difference is that the template object is now passed in place of the smarty object.
+The smarty object can be still be accessed through $template->smarty.
+
+smarty_plugintype_name (array $params, Smarty_Internal_Template $template)
+
+The Smarty 2 plugins are still compatible as long as they do not make use of specific Smarty 2 internals.
+
+
+TEMPLATE INHERITANCE:
+=====================
+
+With template inheritance you can define blocks, which are areas that can be
+overriden by child templates, so your templates could look like this:
+
+parent.tpl:
+
+
+ {block name='title'}My site name{/block}
+
+
+ {block name='page-title'}Default page title{/block}
+
+ {block name='content'}
+ Default content
+ {/block}
+
+
+
+
+child.tpl:
+{extends file='parent.tpl'}
+{block name='title'}
+Child title
+{/block}
+
+grandchild.tpl:
+{extends file='child.tpl'}
+{block name='title'}Home - {$smarty.block.parent}{/block}
+{block name='page-title'}My home{/block}
+{block name='content'}
+ {foreach $images as $img}
+
+ {/foreach}
+{/block}
+
+We redefined all the blocks here, however in the title block we used {$smarty.block.parent},
+which tells Smarty to insert the default content from the parent template in its place.
+The content block was overriden to display the image files, and page-title has also be
+overriden to display a completely different title.
+
+If we render grandchild.tpl we will get this:
+
+
+ Home - Child title
+
+
+ My home
+
+
+
+
+NOTE: In the child templates everything outside the {extends} or {block} tag sections
+is ignored.
+
+The inheritance tree can be as big as you want (meaning you can extend a file that
+extends another one that extends another one and so on..), but be aware that all files
+have to be checked for modifications at runtime so the more inheritance the more overhead you add.
+
+Instead of defining the parent/child relationships with the {extends} tag in the child template you
+can use the resource as follow:
+
+$smarty->display('extends:parent.tpl|child.tpl|grandchild.tpl');
+
+Child {block} tags may optionally have a append or prepend attribute. In this case the parent block content
+is appended or prepended to the child block content.
+
+{block name='title' append} My title {/block}
+
+
+PHP STREAMS:
+============
+
+(see online documentation)
+
+VARIBLE FILTERS:
+================
+
+(see online documentation)
+
+
+STATIC CLASS ACCESS AND NAMESPACE SUPPORT
+=========================================
+
+You can register a class with optional namespace for the use in the template like:
+
+$smarty->register->templateClass('foo','name\name2\myclass');
+
+In the template you can use it like this:
+{foo::method()} etc.
+
+
+=======================
+
+Please look through it and send any questions/suggestions/etc to the forums.
+
+http://www.phpinsider.com/smarty-forum/viewtopic.php?t=14168
+
+Monte and Uwe
diff --git a/vendor/smarty/smarty/README.md b/vendor/smarty/smarty/README.md
new file mode 100644
index 0000000000..5783eb3e05
--- /dev/null
+++ b/vendor/smarty/smarty/README.md
@@ -0,0 +1,65 @@
+#Smarty 3 template engine
+##Distribution repository
+
+> Smarty 3.1.28 introduces run time template inheritance
+
+> Read the NEW_FEATURES and INHERITANCE_RELEASE_NOTES file for recent extensions to Smarty 3.1 functionality
+
+Smarty versions 3.1.11 or later are now on github and can be installed with Composer.
+
+
+The "smarty/smarty" package will start at libs/.... subfolder.
+
+To get the latest stable version of Smarty 3.1 use
+
+```json
+"require": {
+ "smarty/smarty": "~3.1"
+}
+```
+
+in your composer.json file.
+
+To get the trunk version use
+
+```json
+"require": {
+ "smarty/smarty": "~3.1@dev"
+}
+```
+
+For a specific version use something like
+
+```json
+"require": {
+ "smarty/smarty": "3.1.19"
+}
+```
+
+PHPUnit test can be installed by corresponding composer entries like
+
+```json
+"require": {
+ "smarty/smarty-phpunit": "3.1.19"
+}
+```
+
+Similar applies for the lexer/parser generator
+
+```json
+"require": {
+ "smarty/smarty-lexer": "3.1.19"
+}
+```
+
+Or you could use
+
+```json
+"require": {
+ "smarty/smarty-dev": "3.1.19"
+}
+```
+
+Which is a wrapper to install all 3 packages
+
+Composer can also be used for Smarty2 versions 2.6.24 to 2.6.28
diff --git a/vendor/smarty/smarty/SMARTY_2_BC_NOTES.txt b/vendor/smarty/smarty/SMARTY_2_BC_NOTES.txt
new file mode 100644
index 0000000000..79a2cb1b66
--- /dev/null
+++ b/vendor/smarty/smarty/SMARTY_2_BC_NOTES.txt
@@ -0,0 +1,109 @@
+= Known incompatibilities with Smarty 2 =
+
+== Syntax ==
+
+Smarty 3 API has a new syntax. Much of the Smarty 2 syntax is supported
+by a wrapper but deprecated. See the README that comes with Smarty 3 for more
+information.
+
+The {$array|@mod} syntax has always been a bit confusing, where an "@" is required
+to apply a modifier to an array instead of the individual elements. Normally you
+always want the modifier to apply to the variable regardless of its type. In Smarty 3,
+{$array|mod} and {$array|@mod} behave identical. It is safe to drop the "@" and the
+modifier will still apply to the array. If you really want the modifier to apply to
+each array element, you must loop the array in-template, or use a custom modifier that
+supports array iteration. Most smarty functions already escape values where necessary
+such as {html_options}
+
+== PHP Version ==
+Smarty 3 is PHP 5 only. It will not work with PHP 4.
+
+== {php} Tag ==
+The {php} tag is disabled by default. The use of {php} tags is
+deprecated. It can be enabled with $smarty->allow_php_tag=true.
+
+But if you scatter PHP code which belongs together into several
+{php} tags it may not work any longer.
+
+== Delimiters and whitespace ==
+Delimiters surrounded by whitespace are no longer treated as Smarty tags.
+Therefore, { foo } will not compile as a tag, you must use {foo}. This change
+Makes Javascript/CSS easier to work with, eliminating the need for {literal}.
+This can be disabled by setting $smarty->auto_literal = false;
+
+== Unquoted Strings ==
+Smarty 2 was a bit more forgiving (and ambiguous) when it comes to unquoted strings
+in parameters. Smarty3 is more restrictive. You can still pass strings without quotes
+so long as they contain no special characters. (anything outside of A-Za-z0-9_)
+
+For example filename strings must be quoted
+
+{include file='path/foo.tpl'}
+
+
+== Extending the Smarty class ==
+Smarty 3 makes use of the __construct method for initialization. If you are extending
+the Smarty class, its constructor is not called implicitly if the your child class defines
+its own constructor. In order to run Smarty's constructor, a call to parent::__construct()
+within your child constructor is required.
+
+
+class MySmarty extends Smarty {
+ function __construct() {
+ parent::__construct();
+
+ // your initialization code goes here
+
+ }
+}
+
+
+== Autoloader ==
+Smarty 3 does register its own autoloader with spl_autoload_register. If your code has
+an existing __autoload function then this function must be explicitly registered on
+the __autoload stack. See http://us3.php.net/manual/en/function.spl-autoload-register.php
+for further details.
+
+== Plugin Filenames ==
+Smarty 3 optionally supports the PHP spl_autoloader. The autoloader requires filenames
+to be lower case. Because of this, Smarty plugin file names must also be lowercase.
+In Smarty 2, mixed case file names did work.
+
+== Scope of Special Smarty Variables ==
+In Smarty 2 the special Smarty variables $smarty.section... and $smarty.foreach...
+had global scope. If you had loops with the same name in subtemplates you could accidentally
+overwrite values of parent template.
+
+In Smarty 3 these special Smarty variable have only local scope in the template which
+is defining the loop. If you need their value in a subtemplate you have to pass them
+as parameter.
+
+{include file='path/foo.tpl' index=$smarty.section.foo.index}
+
+
+== SMARTY_RESOURCE_CHAR_SET ==
+Smarty 3 sets the constant SMARTY_RESOURCE_CHAR_SET to utf-8 as default template charset.
+This is now used also on modifiers like escape as default charset. If your templates use
+other charsets make sure that you define the constant accordingly. Otherwise you may not
+get any output.
+
+== newline at {if} tags ==
+A \n was added to the compiled code of the {if},{else},{elseif},{/if} tags to get output of newlines as expected by the template source.
+If one of the {if} tags is at the line end you will now get a newline in the HTML output.
+
+== trigger_error() ==
+The API function trigger_error() has been removed because it did just map to PHP trigger_error.
+However it's still included in the Smarty2 API wrapper.
+
+== Smarty constants ==
+The constants
+SMARTY_PHP_PASSTHRU
+SMARTY_PHP_QUOTE
+SMARTY_PHP_REMOVE
+SMARTY_PHP_ALLOW
+have been replaced with class constants
+Smarty::PHP_PASSTHRU
+Smarty::PHP_QUOTE
+Smarty::PHP_REMOVE
+Smarty::PHP_ALLOW
+
diff --git a/vendor/smarty/smarty/SMARTY_3.0_BC_NOTES.txt b/vendor/smarty/smarty/SMARTY_3.0_BC_NOTES.txt
new file mode 100644
index 0000000000..fd8b540c26
--- /dev/null
+++ b/vendor/smarty/smarty/SMARTY_3.0_BC_NOTES.txt
@@ -0,0 +1,24 @@
+== Smarty2 backward compatibility ==
+All Smarty2 specific API functions and deprecated functionallity has been moved
+to the SmartyBC class.
+
+== {php} Tag ==
+The {php} tag is no longer available in the standard Smarty calls.
+The use of {php} tags is deprecated and only available in the SmartyBC class.
+
+== {include_php} Tag ==
+The {include_php} tag is no longer available in the standard Smarty calls.
+The use of {include_php} tags is deprecated and only available in the SmartyBC class.
+
+== php template resource ==
+The support of the php template resource is removed.
+
+== $cache_dir, $compile_dir, $config_dir, $template_dir access ==
+The mentioned properties can't be accessed directly any longer. You must use
+corresponding getter/setters like addConfigDir(), setConfigDir(), getConfigDir()
+
+== obsolete Smarty class properties ==
+The following no longer used properties are removed:
+$allow_php_tag
+$allow_php_template
+$deprecation_notices
\ No newline at end of file
diff --git a/vendor/smarty/smarty/SMARTY_3.1_NOTES.txt b/vendor/smarty/smarty/SMARTY_3.1_NOTES.txt
new file mode 100644
index 0000000000..57709f0d72
--- /dev/null
+++ b/vendor/smarty/smarty/SMARTY_3.1_NOTES.txt
@@ -0,0 +1,306 @@
+Smarty 3.1 Notes
+================
+
+Smarty 3.1 is a departure from 2.0 compatibility. Most notably, all
+backward compatibility has been moved to a separate class file named
+SmartyBC.class.php. If you require compatibility with 2.0, you will
+need to use this class.
+
+Some differences from 3.0 are also present. 3.1 begins the journey of
+requiring setters/getters for property access. So far this is only
+implemented on the five directory properties: template_dir,
+plugins_dir, configs_dir, compile_dir and cache_dir. These properties
+are now protected, it is required to use the setters/getters instead.
+That said, direct property access will still work, however slightly
+slower since they will now fall through __set() and __get() and in
+turn passed through the setter/getter methods. 3.2 will exhibit a full
+list of setter/getter methods for all (currently) public properties,
+so code-completion in your IDE will work as expected.
+
+There is absolutely no PHP allowed in templates any more. All
+deprecated features of Smarty 2.0 are gone. Again, use the SmartyBC
+class if you need any backward compatibility.
+
+Internal Changes
+
+ Full UTF-8 Compatibility
+
+The plugins shipped with Smarty 3.1 have been rewritten to fully
+support UTF-8 strings if Multibyte String is available. Without
+MBString UTF-8 cannot be handled properly. For those rare cases where
+templates themselves have to juggle encodings, the new modifiers
+to_charset and from_charset may come in handy.
+
+ Plugin API and Performance
+
+All Plugins (modifiers, functions, blocks, resources,
+default_template_handlers, etc) are now receiving the
+Smarty_Internal_Template instance, where they were supplied with the
+Smarty instance in Smarty 3.0. *. As The Smarty_Internal_Template
+mimics the behavior of Smarty, this API simplification should not
+require any changes to custom plugins.
+
+The plugins shipped with Smarty 3.1 have been rewritten for better
+performance. Most notably {html_select_date} and {html_select_time}
+have been improved vastly. Performance aside, plugins have also been
+reviewed and generalized in their API. {html_select_date} and
+{html_select_time} now share almost all available options.
+
+The escape modifier now knows the $double_encode option, which will
+prevent entities from being encoded again.
+
+The capitalize modifier now know the $lc_rest option, which makes sure
+all letters following a captial letter are lower-cased.
+
+The count_sentences modifier now accepts (.?!) as
+legitimate endings of a sentence - previously only (.) was
+accepted
+
+The new unescape modifier is there to reverse the effects of the
+escape modifier. This applies to the escape formats html, htmlall and
+entity.
+
+ default_template_handler_func
+
+The invocation of $smarty->$default_template_handler_func had to be
+altered. Instead of a Smarty_Internal_Template, the fifth argument is
+now provided with the Smarty instance. New footprint:
+
+
+/**
+ * Default Template Handler
+ *
+ * called when Smarty's file: resource is unable to load a requested file
+ *
+ * @param string $type resource type (e.g. "file", "string", "eval", "resource")
+ * @param string $name resource name (e.g. "foo/bar.tpl")
+ * @param string &$content template's content
+ * @param integer &$modified template's modification time
+ * @param Smarty $smarty Smarty instance
+ * @return string|boolean path to file or boolean true if $content and $modified
+ * have been filled, boolean false if no default template
+ * could be loaded
+ */
+function default_template_handler_func($type, $name, &$content, &$modified, Smarty $smarty) {
+ if (false) {
+ // return corrected filepath
+ return "/tmp/some/foobar.tpl";
+ } elseif (false) {
+ // return a template directly
+ $content = "the template source";
+ $modified = time();
+ return true;
+ } else {
+ // tell smarty that we failed
+ return false;
+ }
+}
+
+ Stuff done to the compiler
+
+Many performance improvements have happened internally. One notable
+improvement is that all compiled templates are now handled as PHP
+functions. This speeds up repeated templates tremendously, as each one
+calls an (in-memory) PHP function instead of performing another file
+include/scan.
+
+New Features
+
+ Template syntax
+
+ {block}..{/block}
+
+The {block} tag has a new hide option flag. It does suppress the block
+content if no corresponding child block exists.
+EXAMPLE:
+parent.tpl
+{block name=body hide} child content "{$smarty.block.child}" was
+inserted {block}
+In the above example the whole block will be suppressed if no child
+block "body" is existing.
+
+ {setfilter}..{/setfilter}
+
+The new {setfilter} block tag allows the definition of filters which
+run on variable output.
+SYNTAX:
+{setfilter filter1|filter2|filter3....}
+Smarty3 will lookup up matching filters in the following search order:
+1. varibale filter plugin in plugins_dir.
+2. a valid modifier. A modifier specification will also accept
+additional parameter like filter2:'foo'
+3. a PHP function
+{/setfilter} will turn previous filter setting off again.
+{setfilter} tags can be nested.
+EXAMPLE:
+{setfilter filter1}
+ {$foo}
+ {setfilter filter2}
+ {$bar}
+ {/setfilter}
+ {$buh}
+{/setfilter}
+{$blar}
+In the above example filter1 will run on the output of $foo, filter2
+on $bar, filter1 again on $buh and no filter on $blar.
+NOTES:
+- {$foo nofilter} will suppress the filters
+- These filters will run in addition to filters defined by
+registerFilter('variable',...), autoLoadFilter('variable',...) and
+defined default modifier.
+- {setfilter} will effect only the current template, not included
+subtemplates.
+
+ Resource API
+
+Smarty 3.1 features a new approach to resource management. The
+Smarty_Resource API allows simple, yet powerful integration of custom
+resources for templates and configuration files. It offers simple
+functions for loading data from a custom resource (e.g. database) as
+well as define new template types adhering to the special
+non-compiling (e,g, plain php) and non-compile-caching (e.g. eval:
+resource type) resources.
+
+See demo/plugins/resource.mysql.php for an example custom database
+resource.
+
+Note that old-fashioned registration of callbacks for resource
+management has been deprecated but is still possible with SmartyBC.
+
+ CacheResource API
+
+In line with the Resource API, the CacheResource API offers a more
+comfortable handling of output-cache data. With the
+Smarty_CacheResource_Custom accessing databases is made simple. With
+the introduction of Smarty_CacheResource_KeyValueStore the
+implementation of resources like memcache or APC became a no-brainer;
+simple hash-based storage systems are now supporting hierarchical
+output-caches.
+
+See demo/plugins/cacheresource.mysql.php for an example custom
+database CacheResource.
+See demo/plugins/cacheresource.memcache.php for an example custom
+memcache CacheResource using the KeyValueStore helper.
+
+Note that old-fashioned registration of $cache_handler is not possible
+anymore. As the functionality had not been ported to Smarty 3.0.x
+properly, it has been dropped from 3.1 completely.
+
+Locking facilities have been implemented to avoid concurrent cache
+generation. Enable cache locking by setting
+$smarty->cache_locking = true;
+
+ Relative Paths in Templates (File-Resource)
+
+As of Smarty 3.1 {include file="../foo.tpl"} and {include
+file="./foo.tpl"} will resolve relative to the template they're in.
+Relative paths are available with {include file="..."} and
+{extends file="..."}. As $smarty->fetch('../foo.tpl') and
+$smarty->fetch('./foo.tpl') cannot be relative to a template, an
+exception is thrown.
+
+ Addressing a specific $template_dir
+
+Smarty 3.1 introduces the $template_dir index notation.
+$smarty->fetch('[foo]bar.tpl') and {include file="[foo]bar.tpl"}
+require the template bar.tpl to be loaded from $template_dir['foo'];
+Smarty::setTemplateDir() and Smarty::addTemplateDir() offer ways to
+define indexes along with the actual directories.
+
+ Mixing Resources in extends-Resource
+
+Taking the php extends: template resource one step further, it is now
+possible to mix resources within an extends: call like
+$smarty->fetch("extends:file:foo.tpl|db:bar.tpl");
+
+To make eval: and string: resources available to the inheritance
+chain, eval:base64:TPL_STRING and eval:urlencode:TPL_STRING have been
+introduced. Supplying the base64 or urlencode flags will trigger
+decoding the TPL_STRING in with either base64_decode() or urldecode().
+
+ extends-Resource in template inheritance
+
+Template based inheritance may now inherit from php's extends:
+resource like {extends file="extends:foo.tpl|db:bar.tpl"}.
+
+ New Smarty property escape_html
+
+$smarty->escape_html = true will autoescape all template variable
+output by calling htmlspecialchars({$output}, ENT_QUOTES,
+SMARTY_RESOURCE_CHAR_SET).
+NOTE:
+This is a compile time option. If you change the setting you must make
+sure that the templates get recompiled.
+
+ New option at Smarty property compile_check
+
+The automatic recompilation of modified templates can now be
+controlled by the following settings:
+$smarty->compile_check = COMPILECHECK_OFF (false) - template files
+will not be checked
+$smarty->compile_check = COMPILECHECK_ON (true) - template files will
+always be checked
+$smarty->compile_check = COMPILECHECK_CACHEMISS - template files will
+be checked if caching is enabled and there is no existing cache file
+or it has expired
+
+ Automatic recompilation on Smarty version change
+
+Templates will now be automatically recompiled on Smarty version
+changes to avoide incompatibillities in the compiled code. Compiled
+template checked against the current setting of the SMARTY_VERSION
+constant.
+
+ default_config_handler_func()
+
+Analogous to the default_template_handler_func()
+default_config_handler_func() has been introduced.
+
+ default_plugin_handler_func()
+
+An optional default_plugin_handler_func() can be defined which gets called
+by the compiler on tags which can't be resolved internally or by plugins.
+The default_plugin_handler() can map tags to plugins on the fly.
+
+New getters/setters
+
+The following setters/getters will be part of the official
+documentation, and will be strongly recommended. Direct property
+access will still work for the foreseeable future... it will be
+transparently routed through the setters/getters, and consequently a
+bit slower.
+
+array|string getTemplateDir( [string $index] )
+replaces $smarty->template_dir; and $smarty->template_dir[$index];
+Smarty setTemplateDir( array|string $path )
+replaces $smarty->template_dir = "foo"; and $smarty->template_dir =
+array("foo", "bar");
+Smarty addTemplateDir( array|string $path, [string $index])
+replaces $smarty->template_dir[] = "bar"; and
+$smarty->template_dir[$index] = "bar";
+
+array|string getConfigDir( [string $index] )
+replaces $smarty->config_dir; and $smarty->config_dir[$index];
+Smarty setConfigDir( array|string $path )
+replaces $smarty->config_dir = "foo"; and $smarty->config_dir =
+array("foo", "bar");
+Smarty addConfigDir( array|string $path, [string $index])
+replaces $smarty->config_dir[] = "bar"; and
+$smarty->config_dir[$index] = "bar";
+
+array getPluginsDir()
+replaces $smarty->plugins_dir;
+Smarty setPluginsDir( array|string $path )
+replaces $smarty->plugins_dir = "foo";
+Smarty addPluginsDir( array|string $path )
+replaces $smarty->plugins_dir[] = "bar";
+
+string getCompileDir()
+replaces $smarty->compile_dir;
+Smarty setCompileDir( string $path )
+replaces $smarty->compile_dir = "foo";
+
+string getCacheDir()
+replaces $smarty->cache_dir;
+Smarty setCacheDir( string $path )
+replaces $smarty->cache_dir;
diff --git a/vendor/smarty/smarty/change_log.txt b/vendor/smarty/smarty/change_log.txt
new file mode 100644
index 0000000000..1d42b0a769
--- /dev/null
+++ b/vendor/smarty/smarty/change_log.txt
@@ -0,0 +1,3201 @@
+===== 3.1.31 ===== (14.12.2016)
+ 23.11.2016
+ - move template object cache into static variables
+
+ 19.11.2016
+ - bugfix inheritance root child templates containing nested {block}{/block} could call sub-bock content from parent
+ template https://github.com/smarty-php/smarty/issues/317
+ - change version checking
+
+ 11.11.2016
+ - bugfix when Smarty is using a cached template object on Smarty::fetch() or Smarty::isCached() the inheritance data
+ must be removed https://github.com/smarty-php/smarty/issues/312
+ - smaller speed optimization
+
+ 08.11.2016
+ - add bootstrap file to load and register Smarty_Autoloader. Change composer.json to make it known to composer
+
+ 07.11.2016
+ - optimization of lexer speed https://github.com/smarty-php/smarty/issues/311
+
+ 27.10.2016
+ - bugfix template function definitions array has not been cached between Smarty::fetch() and Smarty::display() calls
+ https://github.com/smarty-php/smarty/issues/301
+
+ 23.10.2016
+ - improvement/bugfix when Smarty::fetch() is called on a template object the inheritance and tplFunctions property
+ should be copied to the called template object
+
+ 21.10.2016
+ - bugfix for compile locking touched timestamp of old compiled file was not restored on compilation error https://github.com/smarty-php/smarty/issues/308
+
+ 20.10.2016
+ - bugfix nocache code was not removed in cache file when subtemplate did contain PHP short tags in text but no other
+ nocache code https://github.com/smarty-php/smarty/issues/300
+
+ 19.10.2016
+ - bugfix {make_nocache $var} did fail when variable value did contain '\' https://github.com/smarty-php/smarty/issues/305
+ - bugfix {make_nocache $var} remove spaces from variable value https://github.com/smarty-php/smarty/issues/304
+
+ 12.10.2016
+ - bugfix {include} with template names including variable or constants could fail after bugfix from
+ 28.09.2016 https://github.com/smarty-php/smarty/issues/302
+
+ 08.10.2016
+ - optimization move runtime extension for template functions into Smarty objects
+
+ 29.09.2016
+ - improvement new Smarty::$extends_recursion property to disable execution of {extends} in templates called by extends resource
+ https://github.com/smarty-php/smarty/issues/296
+
+ 28.09.2016
+ - bugfix the generated code for calling a subtemplate must pass the template resource name in single quotes https://github.com/smarty-php/smarty/issues/299
+ - bugfix nocache hash was not removed for tags in subtemplates https://github.com/smarty-php/smarty/issues/300
+
+ 27.09.2016
+ - bugfix when Smarty does use an internally cached template object on Smarty::fetch() calls
+ the template and config variables must be cleared https://github.com/smarty-php/smarty/issues/297
+
+ 20.09.2016
+ - bugfix some $smarty special template variables are no longer accessed as real variable.
+ using them on calls like {if isset($smarty.foo)} or {if empty($smarty.foo)} will fail
+ http://www.smarty.net/forums/viewtopic.php?t=26222
+ - temporary fix for https://github.com/smarty-php/smarty/issues/293 main reason still under investigation
+ - improvement new tags {block_parent} {block_child} in template inheritance
+
+ 19.09.2016
+ - optimization clear compiled and cached folder completely on detected version change
+ - cleanup convert cache resource file method clear into runtime extension
+
+ 15.09.2016
+ - bugfix assigning a variable in if condition by function like {if $value = array_shift($array)} the function got called twice https://github.com/smarty-php/smarty/issues/291
+ - bugfix function plugins called with assign attribute like {foo assign='bar'} did not output returned content because
+ because assumption was made that it was assigned to a variable https://github.com/smarty-php/smarty/issues/292
+ - bugfix calling $smarty->isCached() on a not existing cache file with $smarty->cache_locking = true; could cause a 10 second delay http://www.smarty.net/forums/viewtopic.php?t=26282
+ - improvement make Smarty::clearCompiledTemplate() on custom resource independent from changes of templateId computation
+
+ 11.09.2016
+ - improvement {math} misleading E_USER_WARNING messages when parameter value = null https://github.com/smarty-php/smarty/issues/288
+ - improvement move often used code snippets into methods
+ - performance Smarty::configLoad() did load unneeded template source object
+
+ 09.09.2016
+ - bugfix/optimization {foreach} did not execute the {foreachelse} when iterating empty objects https://github.com/smarty-php/smarty/pull/287
+ - bugfix {foreach} must keep the @properties when restoring a saved $item variable as the properties might be used outside {foreach} https://github.com/smarty-php/smarty/issues/267
+ - improvement {foreach} observe {break n} and {continue n} nesting levels when restoring saved $item and $key variables
+
+ 08.09.2016
+ - bugfix implement wrapper for removed method getConfigVariable() https://github.com/smarty-php/smarty/issues/286
+
+ 07.09.2016
+ - bugfix using nocache like attribute with value true like {plugin nocache=true} did not work https://github.com/smarty-php/smarty/issues/285
+ - bugfix uppercase TRUE, FALSE and NULL did not work when security was enabled https://github.com/smarty-php/smarty/issues/282
+ - bugfix when {foreach} was looping over an object the total property like {$item@total} did always return 1 https://github.com/smarty-php/smarty/issues/281
+ - bugfix {capture}{/capture} did add in 3.1.30 unintended additional blank lines https://github.com/smarty-php/smarty/issues/268
+
+ 01.09.2016
+ - performance require_once should be called only once for shared plugins https://github.com/smarty-php/smarty/issues/280
+
+ 26.08.2016
+ - bugfix change of 23.08.2016 failed on linux when use_include_path = true
+
+ 23.08.2016
+ - bugfix remove constant DS as shortcut for DIRECTORY_SEPARATOR as the user may have defined it to something else https://github.com/smarty-php/smarty/issues/277
+
+ 20.08-2016
+ - bugfix {config_load ... scope="global"} shall not throw an arror but fallback to scope="smarty" https://github.com/smarty-php/smarty/issues/274
+ - bugfix {make_nocache} failed when using composer autoloader https://github.com/smarty-php/smarty/issues/275
+
+ 14.08.2016
+ - bugfix $smarty_>debugging = true; did E_NOTICE messages when {eval} tag was used https://github.com/smarty-php/smarty/issues/266
+ - bugfix Class 'Smarty_Internal_Runtime_ValidateCompiled' not found when upgrading from some older Smarty versions with existing
+ compiled or cached template files https://github.com/smarty-php/smarty/issues/269
+ - optimization remove unneeded call to update acopes when {assign} scope and template scope was local (default)
+
+===== 3.1.30 ===== (07.08.2016)
+
+ 07.08.2016
+ - bugfix update of 04.08.2016 was incomplete
+
+ 05.08.2016
+ - bugfix compiling of templates failed when the Smarty delimiter did contain '/' https://github.com/smarty-php/smarty/issues/264
+ - updated error checking at template and config default handler
+
+ 04.08.2016
+ - improvement move template function source parameter into extension
+
+ 26.07.2016
+ - optimization unneeded loading of compiled resource
+
+ 24.07.2016
+ - regression this->addPluginsDir('/abs/path/to/dir') adding absolute path without trailing '/' did fail https://github.com/smarty-php/smarty/issues/260
+
+ 23.07.2016
+ - bugfix setTemplateDir('/') and setTemplateDir('') did create wrong absolute filepath https://github.com/smarty-php/smarty/issues/245
+ - optimization of filepath normalization
+ - improvement remove double function declaration in plugin shared.escape_special_cars.php https://github.com/smarty-php/smarty/issues/229
+
+ 19.07.2016
+ - bugfix multiple {include} with relative filepath within {block}{/block} could fail https://github.com/smarty-php/smarty/issues/246
+ - bugfix {math} shell injection vulnerability patch provided by Tim Weber
+
+ 18.07.2016
+ - bugfix {foreach} if key variable and item@key attribute have been used both the key variable was not updated https://github.com/smarty-php/smarty/issues/254
+ - bugfix modifier on plugins like {plugin|modifier ... } did fail when the plugin does return an array https://github.com/smarty-php/smarty/issues/228
+ - bugfix avoid opcache_invalidate to result in ErrorException when opcache.restrict_api is not empty https://github.com/smarty-php/smarty/pull/244
+ - bugfix multiple {include} with relative filepath within {block}{/block} could fail https://github.com/smarty-php/smarty/issues/246
+
+ 14.07.2016
+ - bugfix wrong parameter on compileAllTemplates() and compileAllConfig() https://github.com/smarty-php/smarty/issues/231
+
+ 13.07.2016
+ - bugfix PHP 7 compatibility on registered compiler plugins https://github.com/smarty-php/smarty/issues/241
+ - update testInstall() https://github.com/smarty-php/smarty/issues/248https://github.com/smarty-php/smarty/issues/248
+ - bugfix enable debugging could fail when template objects did already exists https://github.com/smarty-php/smarty/issues/237
+ - bugfix template function data should be merged when loading subtemplate https://github.com/smarty-php/smarty/issues/240
+ - bugfix wrong parameter on compileAllTemplates() https://github.com/smarty-php/smarty/issues/231
+
+ 12.07.2016
+ - bugfix {foreach} item variable must be created also on empty from array https://github.com/smarty-php/smarty/issues/238 and https://github.com/smarty-php/smarty/issues/239
+ - bugfix enableSecurity() must init cache flags https://github.com/smarty-php/smarty/issues/247
+
+ 27.05.2016
+ - bugfix/improvement of compileAlltemplates() follow symlinks in template folder (PHP >= 5.3.1) https://github.com/smarty-php/smarty/issues/224
+ clear internal cache and expension handler for each template to avoid possible conflicts https://github.com/smarty-php/smarty/issues/231
+
+ 16.05.2016
+ - optimization {foreach} compiler and processing
+ - broken PHP 5.3 and 5.4 compatibility
+
+ 15.05.2016
+ - optimization and cleanup of resource code
+
+ 10.05.2016
+ - optimization of inheritance processing
+
+ 07.05.2016
+ -bugfix Only variables should be assigned by reference https://github.com/smarty-php/smarty/issues/227
+
+ 02.05.2016
+ - enhancement {block} tag names can now be variable https://github.com/smarty-php/smarty/issues/221
+
+ 01.05.2016
+ - bugfix same relative filepath at {include} called from template in different folders could display wrong sub-template
+
+ 29.04.2016
+ - bugfix {strip} remove space on linebreak between html tags https://github.com/smarty-php/smarty/issues/213
+
+ 24.04.2016
+ - bugfix nested {include} with relative file path could fail when called in {block} ... {/block} https://github.com/smarty-php/smarty/issues/218
+
+ 14.04.2016
+ - bugfix special variable {$smarty.capture.name} was not case sensitive on name https://github.com/smarty-php/smarty/issues/210
+ - bugfix the default template handler must calculate the source uid https://github.com/smarty-php/smarty/issues/205
+
+ 13.04.2016
+ - bugfix template inheritance status must be saved when calling sub-templates https://github.com/smarty-php/smarty/issues/215
+
+ 27.03.2016
+ - bugfix change of 11.03.2016 cause again {capture} data could not been seen in other templates with {$smarty.capture.name} https://github.com/smarty-php/smarty/issues/153
+
+ 11.03.2016
+ - optimization of capture and security handling
+ - improvement $smarty->clearCompiledTemplate() should return on recompiled or uncompiled resources
+
+ 10.03.2016
+ - optimization of resource processing
+
+ 09.03.2016
+ - improvement rework of 'scope' attribute handling see see NEW_FEATURES.txt https://github.com/smarty-php/smarty/issues/194
+ https://github.com/smarty-php/smarty/issues/186 https://github.com/smarty-php/smarty/issues/179
+ - bugfix correct Autoloader update of 2.3.2014 https://github.com/smarty-php/smarty/issues/199
+
+ 04.03.2016
+ - bugfix change from 01.03.2016 will cause $smarty->isCached(..) failure if called multiple time for same template
+ (forum topic 25935)
+
+ 02.03.2016
+ - revert autoloader optimizations because of unexplainable warning when using plugins https://github.com/smarty-php/smarty/issues/199
+
+ 01.03.2016
+ - bugfix template objects must be cached on $smarty->fetch('foo.tpl) calls incase the template is fetched
+ multiple times (forum topic 25909)
+
+ 25.02.2016
+ - bugfix wrong _realpath with 4 or more parent-directories https://github.com/smarty-php/smarty/issues/190
+ - optimization of _realpath
+ - bugfix instanceof expression in template code must be treated as value https://github.com/smarty-php/smarty/issues/191
+
+ 20.02.2016
+ - bugfix {strip} must keep space between hmtl tags. Broken by changes of 10.2.2016 https://github.com/smarty-php/smarty/issues/184
+ - new feature/bugfix {foreach}{section} add 'properties' attribute to force compilation of loop properties
+ see NEW_FEATURES.txt https://github.com/smarty-php/smarty/issues/189
+
+ 19.02.2016
+ - revert output buffer flushing on display, echo content again because possible problems when PHP files had
+ characters (newline} after ?> at file end https://github.com/smarty-php/smarty/issues/187
+
+ 14.02.2016
+ - new tag {make_nocache} read NEW_FEATURES.txt https://github.com/smarty-php/smarty/issues/110
+ - optimization of sub-template processing
+ - bugfix using extendsall as default resource and {include} inside {block} tags could produce unexpected results https://github.com/smarty-php/smarty/issues/183
+ - optimization of tag attribute compiling
+ - optimization make compiler tag object cache static for higher compilation speed
+
+ 11.02.2016
+ - improvement added KnockoutJS comments to trimwhitespace outputfilter https://github.com/smarty-php/smarty/issues/82
+ https://github.com/smarty-php/smarty/pull/181
+
+ 10.02.2016
+ - bugfix {strip} must keep space on output creating smarty tags within html tags https://github.com/smarty-php/smarty/issues/177
+ - bugfix wrong precedence on special if conditions like '$foo is ... by $bar' could cause wrong code https://github.com/smarty-php/smarty/issues/178
+ - improvement because of ambiguities the inline constant support has been removed from the $foo.bar syntax https://github.com/smarty-php/smarty/issues/149
+ - bugfix other {strip} error with output tags between hmtl https://github.com/smarty-php/smarty/issues/180
+
+ 09.02.2016
+ - move some code from parser into compiler
+ - reformat all code for unique style
+ - update/bugfix scope attribute handling reworked. Read the newfeatures.txt file
+
+ 05.02.2016
+ - improvement internal compiler changes
+
+ 01.02.2016
+ - bugfix {foreach} compilation failed when $smarty->merge_compiled_includes = true and pre-filters are used.
+
+ 29.01.2016
+ - bugfix implement replacement code for _tag_stack property https://github.com/smarty-php/smarty/issues/151
+
+ 28.01.2016
+ - bugfix allow windows network filepath or wrapper (forum topic 25876) https://github.com/smarty-php/smarty/issues/170
+ - bugfix if fetch('foo.tpl') is called on a template object the $parent parameter should default to the calling template object https://github.com/smarty-php/smarty/issues/152
+
+ 27.01.2016
+ - revert bugfix compiling {section} did create warning
+ - bugfix {$smarty.section.customer.loop} did throw compiler error https://github.com/smarty-php/smarty/issues/161
+ update of yesterdays fix
+ - bugfix string resource could inject code at {block} or inline subtemplates through PHP comments https://github.com/smarty-php/smarty/issues/157
+ - bugfix output filters did not observe nocache code flhttps://github.com/smarty-php/smarty/issues/154g https://github.com/smarty-php/smarty/issues/160
+ - bugfix {extends} with relative file path did not work https://github.com/smarty-php/smarty/issues/154
+ https://github.com/smarty-php/smarty/issues/158
+ - bugfix {capture} data could not been seen in other templates with {$smarty.capture.name} https://github.com/smarty-php/smarty/issues/153
+
+ 26.01.2016
+ - improvement observe Smarty::$_CHARSET in debugging console https://github.com/smarty-php/smarty/issues/169
+ - bugfix compiling {section} did create warning
+ - bugfix {$smarty.section.customer.loop} did throw compiler error https://github.com/smarty-php/smarty/issues/161
+
+ 02.01.2016
+ - update scope handling
+ - optimize block plugin compiler
+ - improvement runtime checks if registered block plugins are callable
+
+ 01.01.2016
+ - remove Smarty::$resource_cache_mode property
+
+ 31.12.2015
+ - optimization of {assign}, {if} and {while} compiled code
+
+ 30.12.2015
+ - bugfix plugin names starting with "php" did not compile https://github.com/smarty-php/smarty/issues/147
+
+ 29.12.2015
+ - bugfix Smarty::error_reporting was not observed when display() or fetch() was called on template objects https://github.com/smarty-php/smarty/issues/145
+
+ 28.12.2015
+ - optimization of {foreach} code size and processing
+
+ 27.12.2015
+ - improve inheritance code
+ - update external methods
+ - code fixes
+ - PHPdoc updates
+
+ 25.12.2015
+ - compile {block} tag code and its processing into classes
+ - optimization replace hhvm extension by inline code
+ - new feature If ACP is enabled force an apc_compile_file() when compiled or cached template was updated
+
+ 24.12.2015
+ - new feature Compiler does now observe the template_dir setting and will create separate compiled files if required
+ - bugfix post filter did fail on template inheritance https://github.com/smarty-php/smarty/issues/144
+
+ 23.12.2015
+ - optimization move internal method decodeProperties back into template object
+ - optimization move subtemplate processing back into template object
+ - new feature Caching does now observe the template_dir setting and will create separate cache files if required
+
+ 22.12.2015
+ - change $xxx_dir properties from private to protected in case Smarty class gets extended
+ - code optimizations
+
+ 21.12.2015
+ - bugfix a filepath starting with '/' or '\' on windows should normalize to the root dir
+ of current working drive https://github.com/smarty-php/smarty/issues/134
+ - optimization of filepath normalization
+ - bugfix {strip} must remove all blanks between html tags https://github.com/smarty-php/smarty/issues/136
+
+ ===== 3.1.29 ===== (21.12.2015)
+ 21.12.2015
+ - optimization improve speed of filetime checks on extends and extendsall resource
+
+ 20.12.2015
+ - bugfix failure when the default resource type was set to 'extendsall' https://github.com/smarty-php/smarty/issues/123
+ - update compilation of Smarty special variables
+ - bugfix add addition check for OS type on normalization of file path https://github.com/smarty-php/smarty/issues/134
+ - bugfix the source uid of the extendsall resource must contain $template_dir settings https://github.com/smarty-php/smarty/issues/123
+
+ 19.12.2015
+ - bugfix using $smarty.capture.foo in expressions could fail https://github.com/smarty-php/smarty/pull/138
+ - bugfix broken PHP 5.2 compatibility https://github.com/smarty-php/smarty/issues/139
+ - remove no longer used code
+ - improvement make sure that compiled and cache templates never can contain a trailing '?>?
+
+ 18.12.2015
+ - bugfix regression when modifier parameter was followed by math https://github.com/smarty-php/smarty/issues/132
+
+ 17.12.2015
+ - bugfix {$smarty.capture.nameFail} did lowercase capture name https://github.com/smarty-php/smarty/issues/135
+ - bugfix using {block append/prepend} on same block in multiple levels of inheritance templates could fail (forum topic 25827)
+ - bugfix text content consisting of just a single '0' like in {if true}0{/if} was suppressed (forum topic 25834)
+
+ 16.12.2015
+ - bugfix {foreach} did fail if from atrribute is a Generator class https://github.com/smarty-php/smarty/issues/128
+ - bugfix direct access $smarty->template_dir = 'foo'; should call Smarty::setTemplateDir() https://github.com/smarty-php/smarty/issues/121
+
+ 15.12.2015
+ - bugfix {$smarty.cookies.foo} did return the $_COOKIE array not the 'foo' value https://github.com/smarty-php/smarty/issues/122
+ - bugfix a call to clearAllCache() and other should clear all internal template object caches (forum topic 25828)
+
+ 14.12.2015
+ - bugfix {$smarty.config.foo} broken in 3.1.28 https://github.com/smarty-php/smarty/issues/120
+ - bugfix multiple calls of {section} with same name droped E_NOTICE error https://github.com/smarty-php/smarty/issues/118
+
+ ===== 3.1.28 ===== (13.12.2015)
+ 13.12.2015
+ - bugfix {foreach} and {section} with uppercase characters in name attribute did not work (forum topic 25819)
+ - bugfix $smarty->debugging_ctrl = 'URL' did not work (forum topic 25811)
+ - bugfix Debug Console could display incorrect data when using subtemplates
+
+ 09.12.2015
+ - bugfix Smarty did fail under PHP 7.0.0 with use_include_path = true;
+
+ 09.12.2015
+ - bugfix {strip} should exclude some html tags from stripping, related to fix for https://github.com/smarty-php/smarty/issues/111
+
+ 08.12.2015
+ - bugfix internal template function data got stored in wrong compiled file https://github.com/smarty-php/smarty/issues/114
+
+ 05.12.2015
+ -bugfix {strip} should insert a single space https://github.com/smarty-php/smarty/issues/111
+
+ 25.11.2015
+ -bugfix a left delimter like '[%' did fail on [%$var_[%$variable%]%] (forum topic 25798)
+
+ 02.11.2015
+ - bugfix {include} with variable file name like {include file="foo_`$bar`.tpl"} did fail in 3.1.28-dev https://github.com/smarty-php/smarty/issues/102
+
+ 01.11.2015
+ - update config file processing
+
+ 31.10.2015
+ - bugfix add missing $trusted_dir property to SmartyBC class (forum topic 25751)
+
+ 29.10.2015
+ - improve template scope handling
+
+ 24.10.2015
+ - more optimizations of template processing
+ - bugfix Error when using {include} within {capture} https://github.com/smarty-php/smarty/issues/100
+
+ 21.10.2015
+ - move some code into runtime extensions
+
+ 18.10.2015
+ - optimize filepath normalization
+ - rework of template inheritance
+ - speed and size optimizations
+ - bugfix under HHVM temporary cache file must only be created when caches template was updated
+ - fix compiled code for new {block} assign attribute
+ - update code generated by template function call handler
+
+ 18.09.2015
+ - bugfix {if $foo instanceof $bar} failed to compile if 2nd value is a variable https://github.com/smarty-php/smarty/issues/92
+
+ 17.09.2015
+ - bugfix {foreach} first attribute was not correctly reset since commit 05a8fa2 of 02.08.2015 https://github.com/smarty-php/smarty/issues/90
+
+ 16.09.2015
+ - update compiler by moving no longer needed properties, code optimizations and other
+
+ 14.09.2015
+ - optimize autoloader
+ - optimize subtemplate handling
+ - update template inheritance processing
+ - move code of {call} processing back into Smarty_Internal_Template class
+ - improvement invalidate OPCACHE for cleared compiled and cached template files (forum topic 25557)
+ - bugfix unintended multiple debug windows (forum topic 25699)
+
+ 30.08.2015
+ - size optimization move some runtime functions into extension
+ - optimize inline template processing
+ - optimization merge inheritance child and parent templates into one compiled template file
+
+ 29.08.2015
+ - improvement convert template inheritance into runtime processing
+ - bugfix {$smarty.block.parent} did always reference the root parent block https://github.com/smarty-php/smarty/issues/68
+
+ 23.08.2015
+ - introduce Smarty::$resource_cache_mode and cache template object of {include} inside loop
+ - load seldom used Smarty API methods dynamically to reduce memory footprint
+ - cache template object of {include} if same template is included several times
+ - convert debug console processing to object
+ - use output buffers for better performance and less memory usage
+ - optimize nocache hash processing
+ - remove not really needed properties
+ - optimize rendering
+ - move caching to Smarty::_cache
+ - remove properties with redundant content
+ - optimize Smarty::templateExists()
+ - optimize use_include_path processing
+ - relocate properties for size optimization
+ - remove redundant code
+ - bugfix compiling super globals like {$smarty.get.foo} did fail in the master branch https://github.com/smarty-php/smarty/issues/77
+
+ 06.08.2015
+ - avoid possible circular object references caused by parser/lexer objects
+ - rewrite compileAll... utility methods
+ - commit several internal improvements
+ - bugfix Smarty failed when compile_id did contain "|"
+
+ 03.08.2015
+ - rework clear cache methods
+ - bugfix compileAllConfig() was broken since 3.1.22 because of the changes in config file processing
+ - improve getIncludePath() to return directory if no file was given
+
+ 02.08.2015
+ - optimization and code cleanup of {foreach} and {section} compiler
+ - rework {capture} compiler
+
+ 01.08.2015
+ - update DateTime object can be instance of DateTimeImmutable since PHP5.5 https://github.com/smarty-php/smarty/pull/75
+ - improvement show resource type and start of template source instead of uid on eval: and string: resource (forum topic 25630)
+
+ 31.07.2015
+ - optimize {foreach} and {section} compiler
+
+ 29.07.2015
+ - optimize {section} compiler for speed and size of compiled code
+
+ 28.07.2015
+ - update for PHP 7 compatibility
+
+ 26.07.2015
+ - improvement impement workaround for HHVM PHP incompatibillity https://github.com/facebook/hhvm/issues/4797
+
+ 25.07.2015
+ - bugfix parser did hang on text starting fetch('foo.tpl') https://github.com/smarty-php/smarty/issues/70
+ - improvement Added $limit parameter to regex_replace modifier #71
+ - new feature multiple indices on file: resource
+
+ 06.07.2015
+ - optimize {block} compilation
+ - optimization get rid of __get and __set in source object
+
+ 01.07.2015
+ - optimize compile check handling
+ - update {foreach} compiler
+ - bugfix debugging console did not display string values containing \n, \r or \t correctly https://github.com/smarty-php/smarty/issues/66
+ - optimize source resources
+
+ 28.06.2015
+ - move $smarty->enableSecurity() into Smarty_Security class
+ - optimize security isTrustedResourceDir()
+ - move auto load filter methods into extension
+ - move $smarty->getTemplateVars() into extension
+ - move getStreamVariable() into extension
+ - move $smarty->append() and $smarty->appendByRef() into extension
+ - optimize autoloader
+ - optimize file path normalization
+ - bugfix PATH_SEPARATOR was replaced by mistake in autoloader
+ - remove redundant code
+
+ 27.06.2015
+ - bugfix resolve naming conflict between custom Smarty delimiter '<%' and PHP ASP tags https://github.com/smarty-php/smarty/issues/64
+ - update $smarty->_realpath for relative path not starting with './'
+ - update Smarty security with new realpath handling
+ - update {include_php} with new realpath handling
+ - move $smarty->loadPlugin() into extension
+ - minor compiler optimizations
+ - bugfix allow function plugins with name ending with 'close' https://github.com/smarty-php/smarty/issues/52
+ - rework of $smarty->clearCompiledTemplate() and move it to its own extension
+
+ 19.06.2015
+ - improvement allow closures as callback at $smarty->registerFilter() https://github.com/smarty-php/smarty/issues/59
+
+ ===== 3.1.27===== (18.06.2015)
+ 18.06.2015
+ - bugfix another update on file path normalization failed on path containing something like "/.foo/" https://github.com/smarty-php/smarty/issues/56
+
+ ===== 3.1.26===== (18.06.2015)
+ 18.06.2015
+ - bugfix file path normalization failed on path containing something like "/.foo/" https://github.com/smarty-php/smarty/issues/56
+
+ 17.06.2015
+ - bugfix calling a plugin with nocache option but no other attributes like {foo nocache} caused call to undefined function https://github.com/smarty-php/smarty/issues/55
+
+ ===== 3.1.25===== (15.06.2015)
+ 15.06.2015
+ - optimization of smarty_cachereource_keyvaluestore.php code
+
+ 14.06.2015
+ - bugfix a relative sub template path could fail if template_dir path did contain /../ https://github.com/smarty-php/smarty/issues/50
+ - optimization rework of path normalization
+ - bugfix an output tag with variable, modifier followed by an operator like {$foo|modifier+1} did fail https://github.com/smarty-php/smarty/issues/53
+
+ 13.06.2015
+ - bugfix a custom cache resource using smarty_cachereource_keyvaluestore.php did fail if php.ini mbstring.func_overload = 2 (forum topic 25568)
+
+ 11.06.2015
+ - bugfix the lexer could hang on very large quoted strings (forum topic 25570)
+
+ 08.06.2015
+ - bugfix using {$foo} as array index like $bar.{$foo} or in double quoted string like "some {$foo} thing" failed https://github.com/smarty-php/smarty/issues/49
+
+ 04.06.2015
+ - bugfix possible error message on unset() while compiling {block} tags https://github.com/smarty-php/smarty/issues/46
+
+ 01.06.2015
+ - bugfix including template variables broken since 3.1.22 https://github.com/smarty-php/smarty/issues/47
+
+ 27.05.2015
+ - bugfix {include} with variable file name must not create by default individual cache file (since 3.1.22) https://github.com/smarty-php/smarty/issues/43
+
+ 24.05.2015
+ - bugfix if condition string 'neq' broken due to a typo https://github.com/smarty-php/smarty/issues/42
+
+ ===== 3.1.24===== (23.05.2015)
+ 23.05.2015
+ - improvement on php_handling to allow very large PHP sections, better error handling
+ - improvement allow extreme large comment sections (forum 25538)
+
+ 21.05.2015
+ - bugfix broken PHP 5.2 compatibility when compiling 1 did compile into wrong code https://github.com/smarty-php/smarty/issues/41
+
+ 19.05.2015
+ - bugfix compiler did overwrite existing variable value when setting the nocache attribute https://github.com/smarty-php/smarty/issues/39
+ - bugfix output filter trimwhitespace could run into the pcre.backtrack_limit on large output (code.google issue 220)
+ - bugfix compiler could run into the pcre.backtrack_limit on larger comment or {php} tag sections (forum 25538)
+
+ 18.05.2015
+ - improvement introduce shortcuts in lexer/parser rules for most frequent terms for higher
+ compilation speed
+
+ 16.05.2015
+ - bugfix {php}{/php} did work just for single lines https://github.com/smarty-php/smarty/issues/33
+ - improvement remove not needed ?> handling from parser to new compiler module
+
+ 05.05.2015
+ - bugfix code could be messed up when {tags} are used in multiple attributes https://github.com/smarty-php/smarty/issues/23
+
+ 04.05.2015
+ - bugfix Smarty_Resource::parseResourceName incompatible with Google AppEngine (https://github.com/smarty-php/smarty/issues/22)
+ - improvement use is_file() checks to avoid errors suppressed by @ which could still cause problems (https://github.com/smarty-php/smarty/issues/24)
+
+ 28.04.2015
+ - bugfix plugins of merged subtemplates not loaded in 3.1.22-dev (forum topic 25508) 2nd fix
+
+ 28.04.2015
+ - bugfix plugins of merged subtemplates not loaded in 3.1.22-dev (forum topic 25508)
+
+ 23.04.2015
+ - bugfix a nocache template variable used as parameter at {insert} was by mistake cached
+
+ 20.04.2015
+ - bugfix at a template function containing nocache code a parmeter could overwrite a template variable of same name
+
+ 27.03.2015
+ - bugfix Smarty_Security->allow_constants=false; did also disable true, false and null (change of 16.03.2015)
+ - improvement added a whitelist for trusted constants to security Smarty_Security::$trusted_constants (forum topic 25471)
+
+ 20.03.2015
+ - bugfix make sure that function properties get saved only in compiled files containing the fuction definition {forum topic 25452}
+ - bugfix correct update of global variable values on exit of template functions. (reported under Smarty Developers)
+
+ 16.03.2015
+ - bugfix problems with {function}{/function} and {call} tags in different subtemplate cache files {forum topic 25452}
+ - bugfix Smarty_Security->allow_constants=false; did not disallow direct usage of defined constants like {SMARTY_DIR} {forum topic 25457}
+ - bugfix {block}{/block} tags did not work inside double quoted strings https://github.com/smarty-php/smarty/issues/18
+
+
+ 15.03.2015
+ - bugfix $smarty->compile_check must be restored before rendering of a just updated cache file {forum 25452}
+
+ 14.03.2015
+ - bugfix {nocache} {/nocache} tags corrupted code when used within a nocache section caused by a nocache template variable.
+
+ - bugfix template functions defined with {function} in an included subtemplate could not be called in nocache
+ mode with {call... nocache} if the subtemplate had it's own cache file {forum 25452}
+
+ 10.03.2015
+ - bugfix {include ... nocache} whith variable file or compile_id attribute was not executed in nocache mode.
+
+ 12.02.2015
+ - bugfix multiple Smarty::fetch() of same template when $smarty->merge_compiled_includes = true; could cause function already defined error
+
+ 11.02.2015
+ - bugfix recursive {includes} did create E_NOTICE message when $smarty->merge_compiled_includes = true; (github issue #16)
+
+ 22.01.2015
+ - new feature security can now control access to static methods and properties
+ see also NEW_FEATURES.txt
+
+ 21.01.2015
+ - bugfix clearCompiledTemplates(), clearAll() and clear() could try to delete whole drive at wrong path permissions because realpath() fail (forum 25397)
+ - bugfix 'self::' and 'parent::' was interpreted in template syntax as static class
+
+ 04.01.2015
+ - push last weeks changes to github
+
+ - different optimizations
+ - improvement automatically create different versions of compiled templates and config files depending
+ on property settings.
+ - optimization restructure template processing by moving code into classes it better belongs to
+ - optimization restructure config file processing
+
+ 31.12.2014
+ - bugfix use function_exists('mb_get_info') for setting Smarty::$_MBSTRING.
+ Function mb_split could be overloaded depending on php.ini mbstring.func_overload
+
+
+ 29.12.2014
+ - new feature security can now limit the template nesting level by property $max_template_nesting
+ see also NEW_FEATURES.txt (forum 25370)
+
+ 29.12.2014
+ - new feature security can now disable special $smarty variables listed in property $disabled_special_smarty_vars
+ see also NEW_FEATURES.txt (forum 25370)
+
+ 27.12.2014
+ - bugfix clear internal _is_file_cache when plugins_dir was modified
+
+ 13.12.2014
+ - improvement optimization of lexer and parser resulting in a up to 30% higher compiling speed
+
+ 11.12.2014
+ - bugfix resolve parser ambiguity between constant print tag {CONST} and other smarty tags after change of 09.12.2014
+
+ 09.12.2014
+ - bugfix variables $null, $true and $false did not work after the change of 12.11.2014 (forum 25342)
+ - bugfix call of template function by a variable name did not work after latest changes (forum 25342)
+
+ 23.11.2014
+ - bugfix a plugin with attached modifier could fail if the tag was immediately followed by another Smarty tag (since 3.1.21) (forum 25326)
+
+ 13.11.2014
+ - improvement move autoload code into Autoloader.php. Use Composer autoloader when possible
+
+ 12.11.2014
+ - new feature added support of namespaces to template code
+
+ 08.11.2014 - 10.11.2014
+ - bugfix subtemplate called in nocache mode could be called with wrong compile_id when it did change on one of the calling templates
+ - improvement add code of template functions called in nocache mode dynamically to cache file (related to bugfix of 01.11.2014)
+ - bugfix Debug Console did not include all data from merged compiled subtemplates
+
+ 04.11.2014
+ - new feature $smarty->debugging = true; => overwrite existing Debug Console window (old behaviour)
+ $smarty->debugging = 2; => individual Debug Console window by template name
+
+ 03.11.2014
+ - bugfix Debug Console did not show included subtemplates since 3.1.17 (forum 25301)
+ - bugfix Modifier debug_print_var did not limit recursion or prevent recursive object display at Debug Console
+ (ATTENTION: parameter order has changed to be able to specify maximum recursion)
+ - bugfix Debug consol did not include subtemplate information with $smarty->merge_compiled_includes = true
+ - improvement The template variables are no longer displayed as objects on the Debug Console
+ - improvement $smarty->createData($parent = null, $name = null) new optional name parameter for display at Debug Console
+ - addition of some hooks for future extension of Debug Console
+
+ 01.11.2014
+ - bugfix and enhancement on subtemplate {include} and template {function} tags.
+ * Calling a template which has a nocache section could fail if it was called from a cached and a not cached subtemplate.
+ * Calling the same subtemplate cached and not cached with the $smarty->merge_compiled_includes enabled could cause problems
+ * Many smaller related changes
+
+ 30.10.2014
+ - bugfix access to class constant by object like {$object::CONST} or variable class name {$class::CONST} did not work (forum 25301)
+
+ 26.10.2014
+ - bugfix E_NOTICE message was created during compilation when ASP tags '<%' or '%>' are in template source text
+ - bugfix merge_compiled_includes option failed when caching enables and same subtemplate was included cached and not cached
+
+ ===== 3.1.21 ===== (18.10.2014)
+ 18.10.2014
+ - composer moved to github
+
+ 17.10.2014
+ - bugfix on $php_handling security and optimization of smarty_internal_parsetree (Thue Kristensen)
+
+ 16.10.2014
+ - bugfix composer.json update
+
+ 15.10.2014
+ - bugfix calling a new created cache file with fetch() and Smarty::CACHING_LIFETIME_SAVED multiple times did fail (forum 22350)
+
+ 14.10.2014
+ - bugfix any tag placed within "
diff --git a/vendor/smarty/smarty/libs/plugins/block.textformat.php b/vendor/smarty/smarty/libs/plugins/block.textformat.php
new file mode 100644
index 0000000000..e2c5e3de4f
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/block.textformat.php
@@ -0,0 +1,114 @@
+
+ * 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
+ */
+function smarty_block_textformat($params, $content, $template, &$repeat)
+{
+ if (is_null($content)) {
+ return;
+ }
+ if (Smarty::$_MBSTRING && !is_callable('smarty_mb_wordwrap')) {
+ require_once(SMARTY_PLUGINS_DIR . 'shared.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_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/vendor/smarty/smarty/libs/plugins/function.counter.php b/vendor/smarty/smarty/libs/plugins/function.counter.php
new file mode 100644
index 0000000000..bcc8f498cc
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/function.counter.php
@@ -0,0 +1,73 @@
+
+ * Name: counter
+ * Purpose: print out a counter value
+ *
+ * @author Monte Ohrt
+ * @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/vendor/smarty/smarty/libs/plugins/function.cycle.php b/vendor/smarty/smarty/libs/plugins/function.cycle.php
new file mode 100644
index 0000000000..a76d49aed0
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/function.cycle.php
@@ -0,0 +1,105 @@
+
+ * 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
+ * @author credit to Mark Priatel
+ * @author credit to Gerard
+ * @author credit to Jason Sweat
+ * @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/vendor/smarty/smarty/libs/plugins/function.fetch.php b/vendor/smarty/smarty/libs/plugins/function.fetch.php
new file mode 100644
index 0000000000..cb60dd9183
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/function.fetch.php
@@ -0,0 +1,221 @@
+
+ * 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
+ *
+ * @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/vendor/smarty/smarty/libs/plugins/function.html_checkboxes.php b/vendor/smarty/smarty/libs/plugins/function.html_checkboxes.php
new file mode 100644
index 0000000000..04ce45733a
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/function.html_checkboxes.php
@@ -0,0 +1,251 @@
+
+ * 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=' ' output=$names}
+ * {html_checkboxes values=$ids checked=$checked separator=' ' output=$names}
+ *
+ * Params:
+ *
+ * - name (optional) - string default "checkbox"
+ * - values (required) - array
+ * - options (optional) - associative array
+ * - checked (optional) - array default not set
+ * - separator (optional) - ie or
+ * - 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
+ * @author credits to Monte Ohrt
+ * @version 1.0
+ *
+ * @param array $params parameters
+ * @param object $template template object
+ *
+ * @return string
+ * @uses smarty_function_escape_special_chars()
+ */
+function smarty_function_html_checkboxes($params, $template)
+{
+ if (!is_callable('smarty_function_escape_special_chars')) {
+ require_once(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!
+
+ 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);
+ }
+}
+
+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 .= '';
+ } else {
+ $_output .= '';
+ }
+ }
+
+ $name = smarty_function_escape_special_chars($name);
+ $value = smarty_function_escape_special_chars($value);
+ if ($escape) {
+ $output = smarty_function_escape_special_chars($output);
+ }
+
+ $_output .= ' ' . $output;
+ if ($labels) {
+ $_output .= ' ';
+ }
+
+ $_output .= $separator;
+
+ return $_output;
+}
diff --git a/vendor/smarty/smarty/libs/plugins/function.html_image.php b/vendor/smarty/smarty/libs/plugins/function.html_image.php
new file mode 100644
index 0000000000..6da8fc5447
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/function.html_image.php
@@ -0,0 +1,166 @@
+
+ * Name: html_image
+ * Date: Feb 24, 2003
+ * Purpose: format HTML tags for the image
+ * Examples: {html_image file="/images/masthead.gif"}
+ * Output:
+ * 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
+ * @author credits to Duda
+ * @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, $template)
+{
+ if (!is_callable('smarty_function_escape_special_chars')) {
+ require_once(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 = '';
+ $suffix = ' ';
+ 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 . ' ' . $suffix;
+}
diff --git a/vendor/smarty/smarty/libs/plugins/function.html_options.php b/vendor/smarty/smarty/libs/plugins/function.html_options.php
new file mode 100644
index 0000000000..bc8f36e0b3
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/function.html_options.php
@@ -0,0 +1,206 @@
+
+ * Name: html_options
+ * Purpose: Prints the list of 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
+ * @author Ralf Strehle (minor optimization)
+ *
+ * @param array $params parameters
+ *
+ * @return string
+ * @uses smarty_function_escape_special_chars()
+ */
+function smarty_function_html_options($params)
+{
+ if (!is_callable('smarty_function_escape_special_chars')) {
+ require_once(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!
+
+ 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 =
+ '' . "\n" . $_html_result .
+ ' ' . "\n";
+ }
+
+ return $_html_result;
+}
+
+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 = '__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 . ' ' . "\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;
+}
+
+function smarty_function_html_options_optgroup($key, $values, $selected, $id, $class, &$idx)
+{
+ $optgroup_html = '' . "\n";
+ foreach ($values as $key => $value) {
+ $optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, $idx);
+ }
+ $optgroup_html .= " \n";
+
+ return $optgroup_html;
+}
diff --git a/vendor/smarty/smarty/libs/plugins/function.html_radios.php b/vendor/smarty/smarty/libs/plugins/function.html_radios.php
new file mode 100644
index 0000000000..6ef84328ad
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/function.html_radios.php
@@ -0,0 +1,234 @@
+
+ * 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 or
+ * - 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=' ' output=$names}
+ * {html_radios values=$ids checked=$checked separator=' ' output=$names}
+ *
+ *
+ * @link http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios}
+ * (Smarty online manual)
+ * @author Christopher Kvarme
+ * @author credits to Monte Ohrt
+ * @version 1.0
+ *
+ * @param array $params parameters
+ * @param Smarty_Internal_Template $template template object
+ *
+ * @return string
+ * @uses smarty_function_escape_special_chars()
+ */
+function smarty_function_html_radios($params, $template)
+{
+ if (!is_callable('smarty_function_escape_special_chars')) {
+ require_once(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!
+
+ 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);
+ }
+}
+
+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 .= '';
+ } else {
+ $_output .= '';
+ }
+ }
+
+ $name = smarty_function_escape_special_chars($name);
+ $value = smarty_function_escape_special_chars($value);
+ if ($escape) {
+ $output = smarty_function_escape_special_chars($output);
+ }
+
+ $_output .= ' ' . $output;
+ if ($labels) {
+ $_output .= ' ';
+ }
+
+ $_output .= $separator;
+
+ return $_output;
+}
diff --git a/vendor/smarty/smarty/libs/plugins/function.html_select_date.php b/vendor/smarty/smarty/libs/plugins/function.html_select_date.php
new file mode 100644
index 0000000000..3a48da0bbe
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/function.html_select_date.php
@@ -0,0 +1,388 @@
+
+ * 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
+ * @author Rodney Rehm
+ *
+ * @param array $params parameters
+ *
+ * @return string
+ */
+function smarty_function_html_select_date($params)
+{
+ if (!is_callable('smarty_function_escape_special_chars')) {
+ require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php');
+ }
+ if (!is_callable('smarty_make_timestamp')) {
+ require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.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;
+ /* 's of the different tags.
+ If not set, uses default dropdown. */
+ $day_size = null;
+ $month_size = null;
+ $year_size = null;
+ /* Unparsed attributes common to *ALL* the / 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) {
+ $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 or
+ 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 =
+ ' ';
+ } else {
+ $_html_years = '' . $option_separator;
+
+ if (isset($year_empty) || isset($all_empty)) {
+ $_html_years .= '' . (isset($year_empty) ? $year_empty : $all_empty) . ' ' .
+ $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 .= '' . $i .
+ ' ' . $option_separator;
+ }
+
+ $_html_years .= ' ';
+ }
+ }
+
+ // generate month or
+ 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 = '' . $option_separator;
+
+ if (isset($month_empty) || isset($all_empty)) {
+ $_html_months .= '' . (isset($month_empty) ? $month_empty : $all_empty) . ' ' .
+ $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 .= '' . $_text . ' ' . $option_separator;
+ }
+
+ $_html_months .= ' ';
+ }
+
+ // generate day or
+ 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 = '' . $option_separator;
+
+ if (isset($day_empty) || isset($all_empty)) {
+ $_html_days .= '' . (isset($day_empty) ? $day_empty : $all_empty) . ' ' .
+ $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 .= '' .
+ $_text . ' ' . $option_separator;
+ }
+
+ $_html_days .= ' ';
+ }
+
+ // 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/vendor/smarty/smarty/libs/plugins/function.html_select_time.php b/vendor/smarty/smarty/libs/plugins/function.html_select_time.php
new file mode 100644
index 0000000000..89f0406f60
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/function.html_select_time.php
@@ -0,0 +1,363 @@
+
+ * 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
+ * @author Monte Ohrt
+ *
+ * @param array $params parameters
+ *
+ * @return string
+ * @uses smarty_make_timestamp()
+ */
+function smarty_function_html_select_time($params)
+{
+ if (!is_callable('smarty_function_escape_special_chars')) {
+ require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php');
+ }
+ if (!is_callable('smarty_make_timestamp')) {
+ require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.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) {
+ $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
+ 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 = '' . $option_separator;
+
+ if (isset($hour_empty) || isset($all_empty)) {
+ $_html_hours .= '' . (isset($hour_empty) ? $hour_empty : $all_empty) . ' ' .
+ $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 .= '' .
+ $_text . ' ' . $option_separator;
+ }
+
+ $_html_hours .= ' ';
+ }
+
+ // generate minute
+ 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 = '' . $option_separator;
+
+ if (isset($minute_empty) || isset($all_empty)) {
+ $_html_minutes .= '' . (isset($minute_empty) ? $minute_empty : $all_empty) . ' ' .
+ $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 .= '' . $_text . ' ' . $option_separator;
+ }
+
+ $_html_minutes .= ' ';
+ }
+
+ // generate second
+ 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 = '' . $option_separator;
+
+ if (isset($second_empty) || isset($all_empty)) {
+ $_html_seconds .= '' . (isset($second_empty) ? $second_empty : $all_empty) . ' ' .
+ $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 .= '' . $_text . ' ' . $option_separator;
+ }
+
+ $_html_seconds .= ' ';
+ }
+
+ // generate meridian
+ 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 = '' . $option_separator;
+
+ if (isset($meridian_empty) || isset($all_empty)) {
+ $_html_meridian .= '' . (isset($meridian_empty) ? $meridian_empty : $all_empty) .
+ ' ' . $option_separator;
+ }
+
+ $_html_meridian .= ' 0 && $_hour < 12 ? ' selected="selected"' : '') .
+ '>AM ' . $option_separator . 'PM ' . $option_separator .
+ ' ';
+ }
+
+ $_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/vendor/smarty/smarty/libs/plugins/function.html_table.php b/vendor/smarty/smarty/libs/plugins/function.html_table.php
new file mode 100644
index 0000000000..42e23e7226
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/function.html_table.php
@@ -0,0 +1,176 @@
+
+ * 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
+ * @author credit to Messju Mohr
+ * @author credit to boots
+ * @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 = ' ';
+ $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 = "\n";
+
+ if (!empty($caption)) {
+ $output .= '' . $caption . " \n";
+ }
+
+ if (is_array($cols)) {
+ $cols = ($hdir == 'right') ? $cols : array_reverse($cols);
+ $output .= "\n";
+
+ for ($r = 0; $r < $cols_count; $r ++) {
+ $output .= '';
+ $output .= $cols[ $r ];
+ $output .= " \n";
+ }
+ $output .= " \n";
+ }
+
+ $output .= "\n";
+ for ($r = 0; $r < $rows; $r ++) {
+ $output .= "\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 .= "" . $loop[ $x ] . " \n";
+ } else {
+ $output .= "$trailpad \n";
+ }
+ }
+ $output .= " \n";
+ }
+ $output .= " \n";
+ $output .= "
\n";
+
+ return $output;
+}
+
+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/vendor/smarty/smarty/libs/plugins/function.mailto.php b/vendor/smarty/smarty/libs/plugins/function.mailto.php
new file mode 100644
index 0000000000..9d2a5d2d5e
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/function.mailto.php
@@ -0,0 +1,153 @@
+
+ * 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 hexidecimal (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
+ * @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;
+
+ 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(\'' . $text . ' \');';
+
+ $js_encode = '';
+ for ($x = 0, $_length = strlen($string); $x < $_length; $x ++) {
+ $js_encode .= '%' . bin2hex($string[ $x ]);
+ }
+
+ return '';
+ } elseif ($encode == 'javascript_charcode') {
+ $string = '' . $text . ' ';
+
+ for ($x = 0, $y = strlen($string); $x < $y; $x ++) {
+ $ord[] = ord($string[ $x ]);
+ }
+
+ $_ret = "\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 .= '' . bin2hex($text[ $x ]) . ';';
+ }
+
+ $mailto = "mailto:";
+
+ return '' . $text_encode . ' ';
+ } else {
+ // no encoding
+ return '' . $text . ' ';
+ }
+}
diff --git a/vendor/smarty/smarty/libs/plugins/function.math.php b/vendor/smarty/smarty/libs/plugins/function.math.php
new file mode 100644
index 0000000000..fc5db335ca
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/function.math.php
@@ -0,0 +1,109 @@
+
+ * 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
+ *
+ * @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/vendor/smarty/smarty/libs/plugins/modifier.capitalize.php b/vendor/smarty/smarty/libs/plugins/modifier.capitalize.php
new file mode 100644
index 0000000000..6513a04957
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifier.capitalize.php
@@ -0,0 +1,101 @@
+
+ * 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
+ * @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
+ */
+function smarty_mod_cap_mbconvert_cb($matches)
+{
+ return stripslashes($matches[ 1 ]) . mb_convert_case(stripslashes($matches[ 2 ]), MB_CASE_UPPER, Smarty::$_CHARSET);
+}
+
+function smarty_mod_cap_mbconvert2_cb($matches)
+{
+ return stripslashes($matches[ 1 ]) . mb_convert_case(stripslashes($matches[ 3 ]), MB_CASE_UPPER, Smarty::$_CHARSET);
+}
+
+function smarty_mod_cap_ucfirst_cb($matches)
+{
+ return stripslashes($matches[ 1 ]) . ucfirst(stripslashes($matches[ 2 ]));
+}
+
+function smarty_mod_cap_ucfirst2_cb($matches)
+{
+ return stripslashes($matches[ 1 ]) . ucfirst(stripslashes($matches[ 3 ]));
+}
diff --git a/vendor/smarty/smarty/libs/plugins/modifier.date_format.php b/vendor/smarty/smarty/libs/plugins/modifier.date_format.php
new file mode 100644
index 0000000000..bfe363c088
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifier.date_format.php
@@ -0,0 +1,67 @@
+
+ * 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
+ *
+ * @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
+ */
+ if (!is_callable('smarty_make_timestamp')) {
+ require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php');
+ }
+ if ($string != '' && $string != '0000-00-00' && $string != '0000-00-00 00:00:00') {
+ $timestamp = smarty_make_timestamp($string);
+ } elseif ($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/vendor/smarty/smarty/libs/plugins/modifier.debug_print_var.php b/vendor/smarty/smarty/libs/plugins/modifier.debug_print_var.php
new file mode 100644
index 0000000000..34f85dcd50
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifier.debug_print_var.php
@@ -0,0 +1,112 @@
+
+ * Name: debug_print_var
+ * Purpose: formats variable contents for display in the console
+ *
+ * @author Monte Ohrt
+ *
+ * @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 = 'Array (' . count($var) . ') ';
+ if ($depth == $max) {
+ break;
+ }
+ foreach ($var as $curr_key => $curr_val) {
+ $results .= ' ' . str_repeat(' ', $depth * 2) . '' . strtr($curr_key, $_replace) .
+ ' => ' .
+ smarty_modifier_debug_print_var($curr_val, $max, $length, ++ $depth, $objects);
+ $depth --;
+ }
+ break;
+
+ case 'object' :
+ $object_vars = get_object_vars($var);
+ $results = '' . get_class($var) . ' Object (' . count($object_vars) . ') ';
+ if (in_array($var, $objects)) {
+ $results .= ' called recursive';
+ break;
+ }
+ if ($depth == $max) {
+ break;
+ }
+ $objects[] = $var;
+ foreach ($object_vars as $curr_key => $curr_val) {
+ $results .= ' ' . str_repeat(' ', $depth * 2) . ' ->' . strtr($curr_key, $_replace) .
+ ' = ' . 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 = '' . $results . ' ';
+ 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/vendor/smarty/smarty/libs/plugins/modifier.escape.php b/vendor/smarty/smarty/libs/plugins/modifier.escape.php
new file mode 100644
index 0000000000..9c247b9333
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifier.escape.php
@@ -0,0 +1,207 @@
+
+ * Name: escape
+ * Purpose: escape string for output
+ *
+ * @link http://www.smarty.net/docs/en/language.modifier.escape
+ * @author Monte Ohrt
+ *
+ * @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;
+ 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;
+ }
+ }
+
+ 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;
+ }
+ }
+
+ case 'url':
+ return rawurlencode($string);
+
+ case 'urlpathinfo':
+ return str_replace('%2F', '/', rawurlencode($string));
+
+ case 'quotes':
+ // escape unescaped single quotes
+ return preg_replace("%(? '\\\\', "'" => "\\'", '"' => '\\"', "\r" => '\\r', "\n" => '\\n',
+ '' => '<\/'));
+
+ case 'mail':
+ if (Smarty::$_MBSTRING) {
+ if (!is_callable('smarty_mb_str_replace')) {
+ require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php');
+ }
+ 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_callable('smarty_mb_to_unicode')) {
+ require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php');
+ }
+ 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/vendor/smarty/smarty/libs/plugins/modifier.regex_replace.php b/vendor/smarty/smarty/libs/plugins/modifier.regex_replace.php
new file mode 100644
index 0000000000..85f41fdda1
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifier.regex_replace.php
@@ -0,0 +1,58 @@
+
+ * 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
+ *
+ * @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/vendor/smarty/smarty/libs/plugins/modifier.replace.php b/vendor/smarty/smarty/libs/plugins/modifier.replace.php
new file mode 100644
index 0000000000..9dca259d5d
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifier.replace.php
@@ -0,0 +1,35 @@
+
+ * Name: replace
+ * Purpose: simple search/replace
+ *
+ * @link http://smarty.php.net/manual/en/language.modifier.replace.php replace (Smarty online manual)
+ * @author Monte Ohrt
+ * @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)
+{
+ if (Smarty::$_MBSTRING) {
+ if (!is_callable('smarty_mb_str_replace')) {
+ require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php');
+ }
+ return smarty_mb_str_replace($search, $replace, $string);
+ }
+
+ return str_replace($search, $replace, $string);
+}
diff --git a/vendor/smarty/smarty/libs/plugins/modifier.spacify.php b/vendor/smarty/smarty/libs/plugins/modifier.spacify.php
new file mode 100644
index 0000000000..e5c41ad8b5
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifier.spacify.php
@@ -0,0 +1,27 @@
+
+ * 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
+ *
+ * @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/vendor/smarty/smarty/libs/plugins/modifier.truncate.php b/vendor/smarty/smarty/libs/plugins/modifier.truncate.php
new file mode 100644
index 0000000000..6fe844259e
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifier.truncate.php
@@ -0,0 +1,66 @@
+
+ * 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
+ *
+ * @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/vendor/smarty/smarty/libs/plugins/modifiercompiler.cat.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.cat.php
new file mode 100644
index 0000000000..db9d81fbfa
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.cat.php
@@ -0,0 +1,29 @@
+
+ * 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/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_characters.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_characters.php
new file mode 100644
index 0000000000..0a3ce257b6
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_characters.php
@@ -0,0 +1,32 @@
+
+ * Name: count_characteres
+ * 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/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_paragraphs.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_paragraphs.php
new file mode 100644
index 0000000000..f7f447763c
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_paragraphs.php
@@ -0,0 +1,27 @@
+
+ * 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/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_sentences.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_sentences.php
new file mode 100644
index 0000000000..20032925e1
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_sentences.php
@@ -0,0 +1,27 @@
+
+ * 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/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_words.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_words.php
new file mode 100644
index 0000000000..f20a197cdc
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.count_words.php
@@ -0,0 +1,32 @@
+
+ * 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/vendor/smarty/smarty/libs/plugins/modifiercompiler.default.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.default.php
new file mode 100644
index 0000000000..2c4c00a37b
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.default.php
@@ -0,0 +1,35 @@
+
+ * 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/vendor/smarty/smarty/libs/plugins/modifiercompiler.escape.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.escape.php
new file mode 100644
index 0000000000..11565c2d9f
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.escape.php
@@ -0,0 +1,115 @@
+
+ * 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 $compiler
+ *
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_escape($params, $compiler)
+{
+ static $_double_encode = null;
+ if (!is_callable('smarty_literal_compiler_param')) {
+ require_once(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
+ }
+
+ 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
+ }
+
+ case 'url':
+ return 'rawurlencode(' . $params[ 0 ] . ')';
+
+ case 'urlpathinfo':
+ return 'str_replace("%2F", "/", rawurlencode(' . $params[ 0 ] . '))';
+
+ case 'quotes':
+ // escape unescaped single quotes
+ return 'preg_replace("%(? "\\\\\\\\", "\'" => "\\\\\'", "\"" => "\\\\\"", "\\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->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ 'escape' ][ 'modifier' ][ 'file' ] =
+ SMARTY_PLUGINS_DIR . 'modifier.escape.php';
+ $compiler->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ 'escape' ][ 'modifier' ][ 'function' ] =
+ 'smarty_modifier_escape';
+ } else {
+ $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ 'escape' ][ 'modifier' ][ 'file' ] =
+ SMARTY_PLUGINS_DIR . 'modifier.escape.php';
+ $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ 'escape' ][ 'modifier' ][ 'function' ] =
+ 'smarty_modifier_escape';
+ }
+
+ return 'smarty_modifier_escape(' . join(', ', $params) . ')';
+}
diff --git a/vendor/smarty/smarty/libs/plugins/modifiercompiler.from_charset.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.from_charset.php
new file mode 100644
index 0000000000..e25a957499
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.from_charset.php
@@ -0,0 +1,33 @@
+
+ * 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/vendor/smarty/smarty/libs/plugins/modifiercompiler.indent.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.indent.php
new file mode 100644
index 0000000000..851f184480
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.indent.php
@@ -0,0 +1,33 @@
+
+ * 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/vendor/smarty/smarty/libs/plugins/modifiercompiler.lower.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.lower.php
new file mode 100644
index 0000000000..a335eff7f4
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.lower.php
@@ -0,0 +1,31 @@
+
+ * 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
+ * @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/vendor/smarty/smarty/libs/plugins/modifiercompiler.noprint.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.noprint.php
new file mode 100644
index 0000000000..4906908b42
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.noprint.php
@@ -0,0 +1,21 @@
+
+ * Name: noprint
+ * Purpose: return an empty string
+ *
+ * @author Uwe Tews
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_noprint()
+{
+ return "''";
+}
diff --git a/vendor/smarty/smarty/libs/plugins/modifiercompiler.string_format.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.string_format.php
new file mode 100644
index 0000000000..bcf9883db6
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.string_format.php
@@ -0,0 +1,25 @@
+
+ * 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/vendor/smarty/smarty/libs/plugins/modifiercompiler.strip.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.strip.php
new file mode 100644
index 0000000000..8173eed8fb
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.strip.php
@@ -0,0 +1,33 @@
+
+ * Name: strip
+ * Purpose: Replace all repeated spaces, newlines, tabs
+ * with a single space or supplied replacement string.
+ * Example: {$var|strip} {$var|strip:" "}
+ * 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/vendor/smarty/smarty/libs/plugins/modifiercompiler.strip_tags.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.strip_tags.php
new file mode 100644
index 0000000000..e56bf93158
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.strip_tags.php
@@ -0,0 +1,29 @@
+
+ * 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/vendor/smarty/smarty/libs/plugins/modifiercompiler.to_charset.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.to_charset.php
new file mode 100644
index 0000000000..fea8d8273e
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.to_charset.php
@@ -0,0 +1,33 @@
+
+ * 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/vendor/smarty/smarty/libs/plugins/modifiercompiler.unescape.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.unescape.php
new file mode 100644
index 0000000000..a3409bc739
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.unescape.php
@@ -0,0 +1,50 @@
+
+ * 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/vendor/smarty/smarty/libs/plugins/modifiercompiler.upper.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.upper.php
new file mode 100644
index 0000000000..a083c4f7e2
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.upper.php
@@ -0,0 +1,29 @@
+
+ * 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/vendor/smarty/smarty/libs/plugins/modifiercompiler.wordwrap.php b/vendor/smarty/smarty/libs/plugins/modifiercompiler.wordwrap.php
new file mode 100644
index 0000000000..91849738ec
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/modifiercompiler.wordwrap.php
@@ -0,0 +1,51 @@
+
+ * 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 $compiler
+ *
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_wordwrap($params, $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) {
+ if ($compiler->template->caching && ($compiler->tag_nocache | $compiler->nocache)) {
+ $compiler->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ 'wordwrap' ][ 'modifier' ][ 'file' ] =
+ SMARTY_PLUGINS_DIR . 'shared.mb_wordwrap.php';
+ $compiler->template->required_plugins[ 'nocache' ][ 'wordwrap' ][ 'modifier' ][ 'function' ] =
+ 'smarty_mb_wordwrap';
+ } else {
+ $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ 'wordwrap' ][ 'modifier' ][ 'file' ] =
+ SMARTY_PLUGINS_DIR . 'shared.mb_wordwrap.php';
+ $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ 'wordwrap' ][ 'modifier' ][ 'function' ] =
+ 'smarty_mb_wordwrap';
+ }
+ $function = 'smarty_mb_wordwrap';
+ }
+
+ return $function . '(' . $params[ 0 ] . ',' . $params[ 1 ] . ',' . $params[ 2 ] . ',' . $params[ 3 ] . ')';
+}
diff --git a/vendor/smarty/smarty/libs/plugins/outputfilter.trimwhitespace.php b/vendor/smarty/smarty/libs/plugins/outputfilter.trimwhitespace.php
new file mode 100644
index 0000000000..1a67123a40
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/outputfilter.trimwhitespace.php
@@ -0,0 +1,89 @@
+.*?#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 ]*>)|(]*>)|(]*>.*? ]*>)#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/vendor/smarty/smarty/libs/plugins/shared.escape_special_chars.php b/vendor/smarty/smarty/libs/plugins/shared.escape_special_chars.php
new file mode 100644
index 0000000000..b68fe4b9d3
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/shared.escape_special_chars.php
@@ -0,0 +1,34 @@
+
+ * Purpose: used by other smarty functions to escape
+ * special chars except for already escaped ones
+ *
+ * @author Monte Ohrt
+ *
+ * @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/vendor/smarty/smarty/libs/plugins/shared.literal_compiler_param.php b/vendor/smarty/smarty/libs/plugins/shared.literal_compiler_param.php
new file mode 100644
index 0000000000..8a3711d303
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/shared.literal_compiler_param.php
@@ -0,0 +1,36 @@
+
+ * Purpose: used by other smarty functions to make a timestamp from a string.
+ *
+ * @author Monte Ohrt
+ *
+ * @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/vendor/smarty/smarty/libs/plugins/shared.mb_str_replace.php b/vendor/smarty/smarty/libs/plugins/shared.mb_str_replace.php
new file mode 100644
index 0000000000..0c3ffe2581
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/shared.mb_str_replace.php
@@ -0,0 +1,55 @@
+ $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
+ $_previous = 0;
+ $length = 0;
+ }
+ $_previous = $_space;
+ // add the token
+ $t .= $token;
+ }
+ }
+
+ return $t;
+ }
+}
diff --git a/vendor/smarty/smarty/libs/plugins/variablefilter.htmlspecialchars.php b/vendor/smarty/smarty/libs/plugins/variablefilter.htmlspecialchars.php
new file mode 100644
index 0000000000..aecd1e7e74
--- /dev/null
+++ b/vendor/smarty/smarty/libs/plugins/variablefilter.htmlspecialchars.php
@@ -0,0 +1,19 @@
+ '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 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/vendor/smarty/smarty/libs/sysplugins/smarty_cacheresource_custom.php b/vendor/smarty/smarty/libs/sysplugins/smarty_cacheresource_custom.php
new file mode 100644
index 0000000000..8f1290e491
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_cacheresource_custom.php
@@ -0,0 +1,275 @@
+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 integer number of cache files deleted
+ */
+ 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/vendor/smarty/smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php b/vendor/smarty/smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php
new file mode 100644
index 0000000000..bab1b5c09c
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php
@@ -0,0 +1,507 @@
+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 integer number of cache files deleted [always -1]
+ * @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/vendor/smarty/smarty/libs/sysplugins/smarty_data.php b/vendor/smarty/smarty/libs/sysplugins/smarty_data.php
new file mode 100644
index 0000000000..b9f5de9a53
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_data.php
@@ -0,0 +1,68 @@
+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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_block.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_block.php
new file mode 100644
index 0000000000..a33ad1b110
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_block.php
@@ -0,0 +1,90 @@
+name = $name;
+ $this->tplIndex = $tplIndex;
+ }
+
+ /**
+ * Compiled block code overloaded by {block} class
+ *
+ * @param \Smarty_Internal_Template $tpl
+ */
+ public function callBlock(Smarty_Internal_Template $tpl)
+ {
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_cacheresource_file.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_cacheresource_file.php
new file mode 100644
index 0000000000..7df4ddffb2
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_cacheresource_file.php
@@ -0,0 +1,220 @@
+source;
+ $smarty = &$_template->smarty;
+ $_compile_dir_sep = $smarty->use_sub_dirs ? $smarty->ds : '^';
+ $_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 ] . $smarty->ds . $_filepath[ 2 ] . $_filepath[ 3 ] . $smarty->ds .
+ $_filepath[ 4 ] . $_filepath[ 5 ] . $smarty->ds;
+ }
+ $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 boolean success
+ */
+ 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') && 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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_append.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_append.php
new file mode 100644
index 0000000000..8539d6b2af
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_append.php
@@ -0,0 +1,51 @@
+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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_assign.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_assign.php
new file mode 100644
index 0000000000..3bd33847b0
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_assign.php
@@ -0,0 +1,94 @@
+ 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 =
+ "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});\n?>";
+ } else {
+ $output = "_assignInScope({$_var}, {$_attr['value']}{$_params});\n?>";
+ }
+ return $output;
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block.php
new file mode 100644
index 0000000000..5098d62feb
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block.php
@@ -0,0 +1,202 @@
+
+ */
+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');
+
+ /**
+ * Saved compiler object
+ *
+ * @var Smarty_Internal_TemplateCompilerBase
+ */
+ public $compiler = null;
+
+ /**
+ * 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)
+ {
+ 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(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));
+ // must whole block be nocache ?
+ if ($compiler->tag_nocache) {
+ $i = 0;
+ }
+ $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
+ // $compiler->suppressNocacheProcessing = true;
+ if ($_attr[ 'nocache' ] === true) {
+ //$compiler->trigger_template_error('nocache option not allowed', $compiler->parser->lex->taglineno);
+ }
+ $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 = " $value) {
+ $output .= "public \${$property} = " . var_export($value,true) .";\n";
+ }
+ $output .= "public function callBlock(Smarty_Internal_Template \$_smarty_tpl) {\n";
+ //$output .= "/*/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\n";
+ 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 = "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 .= $f = $compiler->parser->current_buffer->to_smarty_php($compiler->parser);
+ $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
+ // nocache plugins must be copied
+ if (!empty($compiler->template->compiled->required_plugins[ 'nocache' ])) {
+ foreach ($compiler->template->compiled->required_plugins[ 'nocache' ] as $plugin => $tmp) {
+ foreach ($tmp as $type => $data) {
+ $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin ][ $type ] =
+ $data;
+ }
+ }
+ }
+
+ // 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 = "_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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block_child.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block_child.php
new file mode 100644
index 0000000000..bb070ebe3a
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block_child.php
@@ -0,0 +1,54 @@
+
+ */
+class Smarty_Internal_Compile_Block_Child extends Smarty_Internal_CompileBase
+{
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $option_flags = array();
+
+ /**
+ * Saved compiler object
+ *
+ * @var Smarty_Internal_TemplateCompilerBase
+ */
+ public $compiler = null;
+
+ /**
+ * Compiles code for the {block_parent} 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)
+ {
+ if (!isset($compiler->_cache[ 'blockNesting' ])) {
+ $compiler->trigger_template_error(' tag {$smarty.block.child} used outside {block} tags ',
+ $compiler->parser->lex->taglineno);
+ }
+ $compiler->has_code = true;
+ $compiler->suppressNocacheProcessing = true;
+ $compiler->_cache[ 'blockParams' ][ $compiler->_cache[ 'blockNesting' ] ][ 'callsChild' ] = 'true';
+ $output = "inheritance->callChild(\$_smarty_tpl, \$this);\n?>\n";
+ return $output;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block_parent.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block_parent.php
new file mode 100644
index 0000000000..0ec1e8485e
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_block_parent.php
@@ -0,0 +1,73 @@
+
+ */
+class Smarty_Internal_Compile_Block_Parent extends Smarty_Internal_Compile_Shared_Inheritance
+{
+
+ /**
+ * Attribute definition: Overwrites base class.
+ *
+ * @var array
+ * @see Smarty_Internal_CompileBase
+ */
+ public $optional_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();
+
+ /**
+ * Saved compiler object
+ *
+ * @var Smarty_Internal_TemplateCompilerBase
+ */
+ public $compiler = null;
+
+ /**
+ * Compiles code for the {block_parent} 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)
+ {
+ // check and get attributes
+ $_attr = $this->getAttributes($compiler, $args);
+ if (!isset($compiler->_cache[ 'blockNesting' ])) {
+ $compiler->trigger_template_error(' tag {$smarty.block.parent} used outside {block} tags ',
+ $compiler->parser->lex->taglineno);
+ }
+ $compiler->suppressNocacheProcessing = true;
+ $compiler->has_code = true;
+ $output = "inheritance->callParent(\$_smarty_tpl, \$this" .
+ (isset($_attr[ 'name' ]) ? ", {$_attr[ 'name' ]}" : '') . ");\n?>\n";
+ return $output;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_break.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_break.php
new file mode 100644
index 0000000000..50157382ab
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_break.php
@@ -0,0 +1,110 @@
+checkLevels($args, $compiler);
+ $output = "getTagCompiler('foreach');
+ $output .= $foreachCompiler->compileRestore($foreachLevels);
+ }
+ $output .= "break {$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
+ * @param string $tag tag name
+ *
+ * @return array
+ * @throws \SmartyCompilerException
+ */
+ public function checkLevels($args, Smarty_Internal_TemplateCompilerBase $compiler, $tag = 'break')
+ {
+ 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 {$tag} {$levels} level(s)", null, true);
+ }
+ if ($lastTag === 'foreach' && $tag === 'break') {
+ $foreachLevels --;
+ }
+ return array($levels, $foreachLevels);
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_call.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_call.php
new file mode 100644
index 0000000000..739df5ecab
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_call.php
@@ -0,0 +1,89 @@
+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 =
+ "smarty->ext->_tplFunction->callTemplateFunction(\$_smarty_tpl, {$_name}, {$_params}, {$_nocache});\n\$_smarty_tpl->assign({$_assign}, ob_get_clean());?>\n";
+ } else {
+ $_output =
+ "smarty->ext->_tplFunction->callTemplateFunction(\$_smarty_tpl, {$_name}, {$_params}, {$_nocache});?>\n";
+ }
+ return $_output;
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_capture.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_capture.php
new file mode 100644
index 0000000000..34fc55f9da
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_capture.php
@@ -0,0 +1,112 @@
+getId($parameter[ 1 ]) : false;
+ if (!$name) {
+ $compiler->trigger_template_error("missing or illegal \$smarty.{$tag} name attribute", null, true);
+ }
+ return "\$_smarty_tpl->smarty->ext->_capture->getBuffer(\$_smarty_tpl, '{$name}')";
+ }
+
+ /**
+ * 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 = "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 "smarty->ext->_capture->close(\$_smarty_tpl);?>";
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_config_load.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_config_load.php
new file mode 100644
index 0000000000..7c6e9b59e9
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_config_load.php
@@ -0,0 +1,98 @@
+ 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 =
+ "smarty->ext->configLoad->_loadConfigFile(\$_smarty_tpl, {$conf_file}, {$section}, {$_scope});\n?>\n";
+
+ return $_output;
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_continue.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_continue.php
new file mode 100644
index 0000000000..7492c7df23
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_continue.php
@@ -0,0 +1,42 @@
+checkLevels($args, $compiler, 'continue');
+ $output = " 1) {
+ /* @var Smarty_Internal_Compile_Foreach $foreachCompiler */
+ $foreachCompiler = $compiler->getTagCompiler('foreach');
+ $output .= $foreachCompiler->compileRestore($foreachLevels - 1);
+ }
+ $output .= "continue {$levels};?>";
+ return $output;
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_debug.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_debug.php
new file mode 100644
index 0000000000..1668e72e87
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_debug.php
@@ -0,0 +1,42 @@
+getAttributes($compiler, $args);
+
+ // compile always as nocache
+ $compiler->tag_nocache = true;
+
+ // display debug template
+ $_output =
+ "display_debug(\$_smarty_tpl);\n";
+ $_output .= "unset(\$_smarty_debug);\n?>";
+ return $_output;
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_eval.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_eval.php
new file mode 100644
index 0000000000..97a3c29c5a
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_eval.php
@@ -0,0 +1,72 @@
+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 "";
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_extends.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_extends.php
new file mode 100644
index 0000000000..83cb80500c
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_extends.php
@@ -0,0 +1,144 @@
+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
+ */
+ 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,
+ "inheritance->endChild(\$_smarty_tpl" .
+ (isset($template) ?
+ ', ' . $template . $inlineUids :
+ '') . ");\n?>\n");
+ }
+
+ /**
+ * Add code for including subtemplate to end of template
+ *
+ * @param \Smarty_Internal_TemplateCompilerBase $compiler
+ * @param string $template subtemplate name
+ */
+ 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_Source $components
+ *
+ * @return string
+ */
+ public static function extendsSourceArrayCode($components)
+ {
+ $resources = array();
+ foreach ($components as $source) {
+ $resources[] = $source->resource;
+ }
+ return '{extends file=\'extends:' . join('|', $resources) . '\' extends_resource=true}';
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_for.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_for.php
new file mode 100644
index 0000000000..e5e7c61c3c
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_for.php
@@ -0,0 +1,170 @@
+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 = "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 "";
+ }
+}
+
+/**
+ * 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 = "\n";
+ return $output;
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_foreach.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_foreach.php
new file mode 100644
index 0000000000..5ddd42d8a4
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_foreach.php
@@ -0,0 +1,344 @@
+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 = "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 .= "if (\$_from !== null) {\n";
+ $output .= "foreach (\$_from as {$keyTerm}{$itemVar}->value) {\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});\n";
+ }
+}
+
+/**
+ * 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
+ * @param array $parameter array with compilation parameter
+ *
+ * @return string compiled code
+ */
+ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+ {
+ // 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 = "\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
+ * @param array $parameter array with compilation parameter
+ *
+ * @return string compiled code
+ */
+ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+ {
+ $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 = " 0) {
+ $output .= "}\n";
+ }
+ $output .= "}\n";
+ /* @var Smarty_Internal_Compile_Foreach $foreachCompiler */
+ $foreachCompiler = $compiler->getTagCompiler('foreach');
+ $output .= $foreachCompiler->compileRestore(1);
+ $output .= "?>\n";
+ return $output;
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_function.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_function.php
new file mode 100644
index 0000000000..b7cd9e1c05
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_function.php
@@ -0,0 +1,216 @@
+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;
+ 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
+ * @param array $parameter array with compilation parameter
+ *
+ * @return bool true
+ */
+ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+ {
+ $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 = "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}";
+ $output .= "\$params = var_export(\$params, true);\n";
+ $output .= "echo \"/*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/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}%%*/\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 = "template->compiled->nocache_hash}%%*/smarty->ext->_tplFunction->restoreTemplateVariables(\\\$_smarty_tpl, '{$_name}');?>\n";
+ $output .= "/*/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\";\n?>";
+ $output .= "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 = " \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value, \$_smarty_tpl->isRenderingCache);\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 = "\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);
+ // nocache plugins must be copied
+ if (!empty($compiler->template->compiled->required_plugins[ 'nocache' ])) {
+ foreach ($compiler->template->compiled->required_plugins[ 'nocache' ] as $plugin => $tmp) {
+ foreach ($tmp as $type => $data) {
+ $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin ][ $type ] =
+ $data;
+ }
+ }
+ }
+ // restore old buffer
+
+ $compiler->parser->current_buffer = $saved_data[ 1 ];
+ // restore old status
+ $compiler->template->compiled->has_nocache_code = $saved_data[ 2 ];
+ $compiler->template->caching = $saved_data[ 3 ];
+ return true;
+ }
+
+ /**
+ * Remove nocache code
+ *
+ * @param $match
+ *
+ * @return string
+ */
+ 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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_if.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_if.php
new file mode 100644
index 0000000000..14db55d4f5
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_if.php
@@ -0,0 +1,211 @@
+getAttributes($compiler, $args);
+ $this->openTag($compiler, 'if', array(1, $compiler->nocache));
+ // must whole block be nocache ?
+ $compiler->nocache = $compiler->nocache | $compiler->tag_nocache;
+
+ if (!array_key_exists("if condition", $parameter)) {
+ $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 = "\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 .= "";
+ return $_output;
+ } else {
+ return "";
+ }
+ }
+}
+
+/**
+ * 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
+ * @param array $parameter array with compilation parameter
+ *
+ * @return string compiled code
+ */
+ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+ {
+ list($nesting, $compiler->tag_nocache) = $this->closeTag($compiler, array('if', 'elseif'));
+ $this->openTag($compiler, 'else', array($nesting, $compiler->tag_nocache));
+
+ return "";
+ }
+}
+
+/**
+ * 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 (!array_key_exists("if condition", $parameter)) {
+ $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 = "\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("", $assignCode);
+ return $compiler->appendCode($_output, "");
+ } else {
+ $this->openTag($compiler, 'elseif', array($nesting, $compiler->tag_nocache));
+ return "";
+ }
+ } else {
+ $_output = $compiler->appendCode("", $prefixCode);
+ $this->openTag($compiler, 'elseif', array($nesting + 1, $compiler->tag_nocache));
+ if ($condition_by_assign) {
+ $_output = $compiler->appendCode($_output, $assignCode);
+ return $compiler->appendCode($_output, "");
+ } else {
+ return $compiler->appendCode($_output, "");
+ }
+ }
+ }
+}
+
+/**
+ * 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
+ * @param array $parameter array with compilation parameter
+ *
+ * @return string compiled code
+ */
+ public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
+ {
+ // 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 "";
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_include.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_include.php
new file mode 100644
index 0000000000..a81b0c7409
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_include.php
@@ -0,0 +1,344 @@
+ 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
+ * @param array $parameter array with compilation parameter
+ *
+ * @throws SmartyCompilerException
+ * @return string compiled code
+ */
+ public function compile($args, Smarty_Internal_SmartyTemplateCompiler $compiler, $parameter)
+ {
+ $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 = "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('\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 .= "?>\n";
+
+ return $_output;
+ }
+
+ if ($call_nocache) {
+ $compiler->tag_nocache = true;
+ }
+ $_output = "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 .= "?>\n";
+ return $_output;
+ }
+
+ /**
+ * Compile inline sub template
+ *
+ * @param \Smarty_Internal_SmartyTemplateCompiler $compiler
+ * @param \Smarty_Internal_Template $tpl
+ * @param string $t_hash
+ *
+ * @return bool
+ */
+ 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 ($compiler->template->source->type == 'file') {
+ $sourceInfo = $compiler->template->source->filepath;
+ } else {
+ $basename = $compiler->template->source->handler->getBasename($compiler->template->source);
+ $sourceInfo = $compiler->template->source->type . ':' .
+ ($basename ? $basename : $compiler->template->source->name);
+ }
+ // get compiled code
+ $compiled_code = "compiled->unifunc} (\$_smarty_tpl) {\n";
+ $compiled_code .= "?>\n" . $tpl->compiler->compileTemplateSource($tpl, null, $compiler->parent_compiler);
+ $compiled_code .= "\n";
+ $compiled_code .= $tpl->compiler->postFilter($tpl->compiler->blockOrFunctionCode);
+ $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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_include_php.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_include_php.php
new file mode 100644
index 0000000000..77586da8b7
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_include_php.php
@@ -0,0 +1,111 @@
+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 . $compiler->smarty->ds . $_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 "assign({$_assign},ob_get_clean());\n?>";
+ } else {
+ return "\n";
+ }
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_insert.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_insert.php
new file mode 100644
index 0000000000..02ef67c3a6
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_insert.php
@@ -0,0 +1,155 @@
+getAttributes($compiler, $args);
+ //Does tag create output
+ $compiler->has_output = isset($_attr[ 'assign' ]) ? false : true;
+
+ $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 = '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, '/\\') . $compiler->smarty->ds;
+ 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}' ;";
+ require_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);?>";
+ }
+ }
+
+ return $_output;
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_ldelim.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_ldelim.php
new file mode 100644
index 0000000000..7251dcd6c3
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_ldelim.php
@@ -0,0 +1,40 @@
+getAttributes($compiler, $args);
+ if ($_attr[ 'nocache' ] === true) {
+ $compiler->trigger_template_error('nocache option not allowed', null, true);
+ }
+ // this tag does not return compiled code
+ $compiler->has_code = true;
+
+ return $compiler->smarty->left_delimiter;
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_make_nocache.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_make_nocache.php
new file mode 100644
index 0000000000..720dd68b35
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_make_nocache.php
@@ -0,0 +1,64 @@
+getAttributes($compiler, $args);
+ if ($compiler->template->caching) {
+ $output = "smarty->ext->_make_nocache->save(\$_smarty_tpl, {$_attr[ 'var' ]});\n?>\n";
+ $compiler->has_code = true;
+ $compiler->suppressNocacheProcessing = true;
+ return $output;
+ } else {
+ return true;
+ }
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_nocache.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_nocache.php
new file mode 100644
index 0000000000..b29a993aad
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_nocache.php
@@ -0,0 +1,75 @@
+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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_block_plugin.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_block_plugin.php
new file mode 100644
index 0000000000..617564276a
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_block_plugin.php
@@ -0,0 +1,122 @@
+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 = "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();\n?>";
+ $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));
+ //Does tag create output
+ $compiler->has_output = isset($_params[ 'assign' ]) ? false : true;
+ // 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 = "smarty->_cache['_tag_stack']);";
+ $output .= "?>";
+ }
+ return $output . "\n";
+ }
+
+ /**
+ * 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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_foreachsection.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_foreachsection.php
new file mode 100644
index 0000000000..bf569be3ab
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_foreachsection.php
@@ -0,0 +1,221 @@
+propertyPreg = '~(';
+ $this->startOffset = 0;
+ $this->resultOffsets = array();
+ $this->matchResults = array('named' => array(), 'item' => array());
+ if ($this->isNamed) {
+ $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 + 3;
+ $this->propertyPreg .= "([\$]smarty[.]{$this->tagName}[.]{$attributes['name']}[.](";
+ $properties = $this->nameProperties;
+ } else {
+ $this->resultOffsets[ 'item' ] = $this->startOffset + 3;
+ $this->propertyPreg .= "([\$]{$attributes['item']}[@](";
+ $properties = $this->itemProperties;
+ }
+ $this->startOffset += count($properties) + 2;
+ $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, PREG_SET_ORDER);
+ foreach ($this->resultOffsets as $key => $offset) {
+ foreach ($match as $m) {
+ if (isset($m[ $offset ]) && !empty($m[ $offset ])) {
+ $this->matchResults[ $key ][ strtolower($m[ $offset ]) ] = 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
+ */
+ 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)";
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_function_plugin.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_function_plugin.php
new file mode 100644
index 0000000000..26529bb68e
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_function_plugin.php
@@ -0,0 +1,74 @@
+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));
+ }
+ //Does tag create output
+ $compiler->has_output = true;
+ $output = "\n";
+ return $output;
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php
new file mode 100644
index 0000000000..2ee88db487
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php
@@ -0,0 +1,157 @@
+getAttributes($compiler, $args);
+ $output = $parameter[ 'value' ];
+ // loop over list of modifiers
+ foreach ($parameter[ 'modifierlist' ] as $single_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 ])) {
+ $function =
+ $compiler->smarty->registered_plugins[ Smarty::PLUGIN_MODIFIER ][ $modifier ][ 0 ];
+ if (!is_array($function)) {
+ $output = "{$function}({$params})";
+ } else {
+ if (is_object($function[ 0 ])) {
+ $output = '$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][\'' .
+ $modifier . '\'][0][0]->' . $function[ 1 ] . '(' . $params . ')';
+ } else {
+ $output = $function[ 0 ] . '::' . $function[ 1 ] . '(' . $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->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $modifier ][ Smarty::PLUGIN_MODIFIER ][ 'file' ]) ||
+ isset($compiler->parent_compiler->template->compiled->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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_object_block_function.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_object_block_function.php
new file mode 100644
index 0000000000..5c7fb6265b
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_object_block_function.php
@@ -0,0 +1,42 @@
+ $_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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_object_function.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_object_function.php
new file mode 100644
index 0000000000..7f78a421ef
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_object_function.php
@@ -0,0 +1,86 @@
+getAttributes($compiler, $args);
+ //Does tag create output
+ $compiler->has_output = isset($_attr[ 'assign' ]) ? false : true;
+
+ 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));
+ }
+ //Does tag create output
+ $compiler->has_output = isset($_attr[ 'assign' ]) ? false : true;
+
+ if (empty($_assign)) {
+ return "\n";
+ } else {
+ return "assign({$_assign},{$output});?>\n";
+ }
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_php.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_php.php
new file mode 100644
index 0000000000..8bff8499f9
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_php.php
@@ -0,0 +1,216 @@
+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("",
+ 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|=)?)|(<%)|(';
+ } 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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_print_expression.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_print_expression.php
new file mode 100644
index 0000000000..811996bcc7
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_print_expression.php
@@ -0,0 +1,162 @@
+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 "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_output_filter($compiler, $name, $output);
+ if ($result !== false) {
+ $output = $result;
+ } else {
+ // not found, throw exception
+ throw new SmartyException("Unable to load filter '{$name}'");
+ }
+ }
+ }
+ foreach ($compiler->variable_filters as $filter) {
+ if (count($filter) == 1 &&
+ ($result = $this->compile_output_filter($compiler, $filter[ 0 ], $output)) !== false
+ ) {
+ $output = $result;
+ } else {
+ $output = $compiler->compileTag('private_modifier', array(),
+ array('modifierlist' => array($filter), 'value' => $output));
+ }
+ }
+ }
+
+ $compiler->has_output = true;
+ $output = "";
+ }
+
+ return $output;
+ }
+
+ /**
+ * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
+ * @param string $name name of variable filter
+ * @param string $output embedded output
+ *
+ * @return string
+ */
+ private function compile_output_filter(Smarty_Internal_TemplateCompilerBase $compiler, $name, $output)
+ {
+ $plugin_name = "smarty_variablefilter_{$name}";
+ $path = $compiler->smarty->loadPlugin($plugin_name);
+ if ($path) {
+ /**
+ if ($compiler->template->caching) {
+ $compiler->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $name ][ Smarty::FILTER_VARIABLE ][ 'file' ] =
+ $path;
+ $compiler->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $name ][ Smarty::FILTER_VARIABLE ][ 'function' ] =
+ $plugin_name;
+ } else {
+ $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $name ][ Smarty::FILTER_VARIABLE ][ 'file' ] =
+ $path;
+ $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $name ][ Smarty::FILTER_VARIABLE ][ 'function' ] =
+ $plugin_name;
+ }
+ * */
+ return "{$plugin_name}({$output},\$_smarty_tpl)";
+ } else {
+ // not found
+ return false;
+ }
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_registered_block.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_registered_block.php
new file mode 100644
index 0000000000..987bc96f35
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_registered_block.php
@@ -0,0 +1,72 @@
+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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_registered_function.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_registered_function.php
new file mode 100644
index 0000000000..7a4cbb7f73
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_registered_function.php
@@ -0,0 +1,82 @@
+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 ];
+ } else {
+ $tag_info = $compiler->default_handler_plugins[ Smarty::PLUGIN_FUNCTION ][ $tag ];
+ }
+ // not cachable?
+ $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) . ')';
+ $function = $tag_info[ 0 ];
+ // compile code
+ if (!is_array($function)) {
+ $output = "{$function}({$_params},\$_smarty_tpl)";
+ } elseif (is_object($function[ 0 ])) {
+ $output =
+ "\$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_FUNCTION]['{$tag}'][0][0]->{$function[1]}({$_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));
+ }
+ //Does tag create output
+ $compiler->has_output = true;
+ $output = "\n";
+ return $output;
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php
new file mode 100644
index 0000000000..0c6be44f66
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php
@@ -0,0 +1,126 @@
+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 "@constant('{$_index[1]}')";
+ } else {
+ return "@constant({$_index[1]})";
+ }
+
+ 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])";
+ }
+ 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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_rdelim.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_rdelim.php
new file mode 100644
index 0000000000..2e6b43c174
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_rdelim.php
@@ -0,0 +1,40 @@
+getAttributes($compiler, $args);
+ if ($_attr[ 'nocache' ] === true) {
+ $compiler->trigger_template_error('nocache option not allowed', null, true);
+ }
+ // this tag does not return compiled code
+ $compiler->has_code = true;
+
+ return $compiler->smarty->right_delimiter;
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_section.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_section.php
new file mode 100644
index 0000000000..c3701fc636
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_section.php
@@ -0,0 +1,469 @@
+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('saved' => "isset(\$_smarty_tpl->tpl_vars['__smarty_section_{$attributes['name']}']) ? \$_smarty_tpl->tpl_vars['__smarty_section_{$attributes['name']}'] : false",);
+ $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 = " $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 (isset($namedAttr[ 'loop' ])) {
+ $initNamedProperty[ 'loop' ] = "'loop' => {$v}";
+ if ($t == 1) {
+ $v = "{$sectionVar}->value['loop']";
+ }
+ } elseif ($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['total']}";
+ }
+ 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 "";
+ }
+}
+
+/**
+ * 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 = "";
+
+ return $output;
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_setfilter.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_setfilter.php
new file mode 100644
index 0000000000..1f3ba8d48e
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_setfilter.php
@@ -0,0 +1,70 @@
+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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_shared_inheritance.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_shared_inheritance.php
new file mode 100644
index 0000000000..c955765961
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_shared_inheritance.php
@@ -0,0 +1,46 @@
+_cache[ 'inheritanceInit' ])) {
+ $compiler->registerPostCompileCallback(array('Smarty_Internal_Compile_Shared_Inheritance', 'postCompile'),
+ array($initChildSequence), 'inheritanceInit', $initChildSequence);
+
+ $compiler->_cache[ 'inheritanceInit' ] = true;
+ }
+ }
+
+ /**
+ * Compile inheritance initialization code as prefix
+ *
+ * @param \Smarty_Internal_TemplateCompilerBase $compiler
+ * @param bool|false $initChildSequence if true force child template
+ */
+ static function postCompile(Smarty_Internal_TemplateCompilerBase $compiler, $initChildSequence = false)
+ {
+ $compiler->prefixCompiledCode .= "_loadInheritance();\n\$_smarty_tpl->inheritance->init(\$_smarty_tpl, " .
+ var_export($initChildSequence, true) . ");\n?>\n";
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_while.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_while.php
new file mode 100644
index 0000000000..6025798c5b
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compile_while.php
@@ -0,0 +1,100 @@
+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 = "";
+ $_output .= $assignCompiler->compile($assignAttr, $compiler,
+ array('smarty_internal_index' => $parameter[ 'if condition' ][ 'var' ][ 'smarty_internal_index' ]));
+ } else {
+ $assignAttr[][ 'var' ] = $parameter[ 'if condition' ][ 'var' ];
+ $_output = "";
+ $_output .= $assignCompiler->compile($assignAttr, $compiler, array());
+ }
+
+ return $_output;
+ } else {
+ return "";
+ }
+ }
+}
+
+/**
+ * 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 "\n";
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compilebase.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compilebase.php
new file mode 100644
index 0000000000..08aab6f4e4
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_compilebase.php
@@ -0,0 +1,196 @@
+ 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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php
new file mode 100644
index 0000000000..b1ef958cd9
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php
@@ -0,0 +1,197 @@
+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
+ */
+ 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') && ((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 " 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 =
+ "template->source->filepath . "\" */ ?>\n";
+
+ $code = '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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_configfilelexer.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_configfilelexer.php
new file mode 100644
index 0000000000..7869ef384c
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_configfilelexer.php
@@ -0,0 +1,732 @@
+ 'START', 2 => 'VALUE', 3 => 'NAKED_STRING_VALUE', 4 => 'COMMENT', 5 => 'SECTION',
+ 6 => 'TRIPPLE');
+
+ /**
+ * 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;
+
+ /**
+ * token names
+ *
+ * @var array
+ */
+ public $smarty_token_names = array( // Text for parser error messages
+ );
+
+ /**
+ * constructor
+ *
+ * @param string $data template source
+ * @param Smarty_Internal_Config_File_Compiler $compiler
+ */
+ 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 PrintTrace()
+ {
+ $this->yyTraceFILE = fopen('php://output', 'w');
+ $this->yyTracePrompt = ' ';
+ }
+
+ private $_yy_state = 1;
+
+ private $_yy_stack = array();
+
+ 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 =
+ "/\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, null, $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);
+ } // end function
+
+ const START = 1;
+
+ function yy_r1_1()
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_COMMENTSTART;
+ $this->yypushstate(self::COMMENT);
+ }
+
+ function yy_r1_2()
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_OPENB;
+ $this->yypushstate(self::SECTION);
+ }
+
+ function yy_r1_3()
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_CLOSEB;
+ }
+
+ function yy_r1_4()
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_EQUAL;
+ $this->yypushstate(self::VALUE);
+ }
+
+ function yy_r1_5()
+ {
+
+ return false;
+ }
+
+ function yy_r1_6()
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE;
+ }
+
+ function yy_r1_7()
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_ID;
+ }
+
+ function yy_r1_8()
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_OTHER;
+ }
+
+ public function yylex2()
+ {
+ if (!isset($this->yy_global_pattern2)) {
+ $this->yy_global_pattern2 =
+ "/\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, null, $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);
+ } // end function
+
+ const VALUE = 2;
+
+ function yy_r2_1()
+ {
+
+ return false;
+ }
+
+ function yy_r2_2()
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_FLOAT;
+ $this->yypopstate();
+ }
+
+ function yy_r2_3()
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_INT;
+ $this->yypopstate();
+ }
+
+ function yy_r2_4()
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES;
+ $this->yypushstate(self::TRIPPLE);
+ }
+
+ function yy_r2_5()
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_SINGLE_QUOTED_STRING;
+ $this->yypopstate();
+ }
+
+ function yy_r2_6()
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_DOUBLE_QUOTED_STRING;
+ $this->yypopstate();
+ }
+
+ 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();
+ }
+ }
+
+ function yy_r2_8()
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
+ $this->yypopstate();
+ }
+
+ function yy_r2_9()
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
+ $this->value = "";
+ $this->yypopstate();
+ }
+
+ public function yylex3()
+ {
+ if (!isset($this->yy_global_pattern3)) {
+ $this->yy_global_pattern3 = "/\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, null, $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);
+ } // end function
+
+ const NAKED_STRING_VALUE = 3;
+
+ 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 = "/\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, null, $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);
+ } // end function
+
+ const COMMENT = 4;
+
+ function yy_r4_1()
+ {
+
+ return false;
+ }
+
+ function yy_r4_2()
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
+ }
+
+ 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 = "/\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, null, $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);
+ } // end function
+
+ const SECTION = 5;
+
+ function yy_r5_1()
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_DOT;
+ }
+
+ function yy_r5_2()
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_SECTION;
+ $this->yypopstate();
+ }
+
+ public function yylex6()
+ {
+ if (!isset($this->yy_global_pattern6)) {
+ $this->yy_global_pattern6 = "/\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, null, $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);
+ } // end function
+
+ const TRIPPLE = 6;
+
+ function yy_r6_1()
+ {
+
+ $this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES_END;
+ $this->yypopstate();
+ $this->yypushstate(self::START);
+ }
+
+ 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_template_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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_configfileparser.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_configfileparser.php
new file mode 100644
index 0000000000..b7551a2b54
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_configfileparser.php
@@ -0,0 +1,1022 @@
+string = $s->string;
+ $this->metadata = $s->metadata;
+ } else {
+ $this->string = (string) $s;
+ if ($m instanceof TPC_yyToken) {
+ $this->metadata = $m->metadata;
+ } elseif (is_array($m)) {
+ $this->metadata = $m;
+ }
+ }
+ }
+
+ public function __toString()
+ {
+ return $this->string;
+ }
+
+ public function offsetExists($offset)
+ {
+ return isset($this->metadata[ $offset ]);
+ }
+
+ public function offsetGet($offset)
+ {
+ return $this->metadata[ $offset ];
+ }
+
+ public function offsetSet($offset, $value)
+ {
+ if ($offset === null) {
+ if (isset($value[ 0 ])) {
+ $x = ($value instanceof TPC_yyToken) ? $value->metadata : $value;
+ $this->metadata = array_merge($this->metadata, $x);
+
+ return;
+ }
+ $offset = count($this->metadata);
+ }
+ if ($value === null) {
+ return;
+ }
+ if ($value instanceof TPC_yyToken) {
+ if ($value->metadata) {
+ $this->metadata[ $offset ] = $value->metadata;
+ }
+ } elseif ($value) {
+ $this->metadata[ $offset ] = $value;
+ }
+ }
+
+ public function offsetUnset($offset)
+ {
+ unset($this->metadata[ $offset ]);
+ }
+}
+
+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"
+
+ /**
+ * result status
+ *
+ * @var bool
+ */
+ public $successful = true;
+
+ /**
+ * return value
+ *
+ * @var mixed
+ */
+ public $retvalue = 0;
+
+ /**
+ * @var
+ */
+ public $yymajor;
+
+ /**
+ * lexer object
+ *
+ * @var Smarty_Internal_Configfilelexer
+ */
+ private $lex;
+
+ /**
+ * internal error flag
+ *
+ * @var bool
+ */
+ private $internalError = false;
+
+ /**
+ * compiler object
+ *
+ * @var Smarty_Internal_Config_File_Compiler
+ */
+ public $compiler = null;
+
+ /**
+ * smarty object
+ *
+ * @var Smarty
+ */
+ public $smarty = null;
+
+ /**
+ * copy of config_overwrite property
+ *
+ * @var bool
+ */
+ private $configOverwrite = false;
+
+ /**
+ * copy of config_read_hidden property
+ *
+ * @var bool
+ */
+ private $configReadHidden = false;
+
+ /**
+ * helper map
+ *
+ * @var array
+ */
+ private static $escapes_single = Array('\\' => '\\', '\'' => '\'');
+
+ /**
+ * constructor
+ *
+ * @param Smarty_Internal_Configfilelexer $lex
+ * @param Smarty_Internal_Config_File_Compiler $compiler
+ */
+ 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;
+ }
+
+ /**
+ * 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;
+ }
+
+ /**
+ * 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;
+ }
+
+ /**
+ * 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);
+ }
+
+ /**
+ * parse triple quoted string
+ *
+ * @param string $qstr
+ *
+ * @return string
+ */
+ private static function parse_tripple_double_quoted_string($qstr)
+ {
+ return stripcslashes($qstr);
+ }
+
+ /**
+ * 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 ]);
+ }
+ }
+
+ 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;
+
+ static public $yy_action = array(29, 30, 34, 33, 24, 13, 19, 25, 35, 21, 59, 8, 3, 1, 20, 12, 14, 31, 20, 12, 15,
+ 17, 23, 18, 27, 26, 4, 5, 6, 32, 2, 11, 28, 22, 16, 9, 7, 10,);
+
+ static public $yy_lookahead = array(7, 8, 9, 10, 11, 12, 5, 27, 15, 16, 20, 21, 23, 23, 17, 18, 13, 14, 17, 18, 15,
+ 2, 17, 4, 25, 26, 6, 3, 3, 14, 23, 1, 24, 17, 2, 25, 22, 25,);
+
+ const YY_SHIFT_USE_DFLT = - 8;
+
+ const YY_SHIFT_MAX = 19;
+
+ static public $yy_shift_ofst = array(- 8, 1, 1, 1, - 7, - 3, - 3, 30, - 8, - 8, - 8, 19, 5, 3, 15, 16, 24, 25, 32,
+ 20,);
+
+ const YY_REDUCE_USE_DFLT = - 21;
+
+ const YY_REDUCE_MAX = 10;
+
+ static public $yy_reduce_ofst = array(- 10, - 1, - 1, - 1, - 20, 10, 12, 8, 14, 7, - 11,);
+
+ static public $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(2, 4,), array(15, 17,),
+ array(13, 14,), array(14,), array(17,), array(3,), array(3,), array(2,),
+ array(6,), array(), array(), array(), array(), array(), array(), array(),
+ array(), array(), array(), array(), array(), array(), array(), array(),
+ array(),);
+
+ static public $yy_default = array(44, 37, 41, 40, 58, 58, 58, 36, 39, 44, 44, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+ 55, 54, 57, 56, 50, 45, 43, 42, 38, 46, 47, 52, 51, 49, 48, 53,);
+
+ const YYNOCODE = 29;
+
+ const YYSTACKDEPTH = 100;
+
+ const YYNSTATE = 36;
+
+ const YYNRULE = 22;
+
+ const YYERRORSYMBOL = 19;
+
+ const YYERRSYMDT = 'yy0';
+
+ const YYFALLBACK = 0;
+
+ public static $yyFallback = array();
+
+ 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 = ' ';
+ }
+
+ public $yyTraceFILE;
+
+ public $yyTracePrompt;
+
+ public $yyidx; /* Index of top element in stack */
+ public $yyerrcnt; /* Shifts left before out of the error */
+ public $yystack = array(); /* The parser's stack */
+
+ 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',);
+
+ 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 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 static function yy_destructor($yymajor, $yypminor)
+ {
+ switch ($yymajor) {
+ default:
+ break; /* If no destructor action specified: do nothing */
+ }
+ }
+
+ 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 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,);
+
+ #line 245 "../smarty/lexer/smarty_internal_configfileparser.y"
+ function yy_r0()
+ {
+ $this->_retvalue = null;
+ }
+
+ #line 250 "../smarty/lexer/smarty_internal_configfileparser.y"
+ function yy_r1()
+ {
+ $this->add_global_vars($this->yystack[ $this->yyidx + 0 ]->minor);
+ $this->_retvalue = null;
+ }
+
+ #line 264 "../smarty/lexer/smarty_internal_configfileparser.y"
+ function yy_r4()
+ {
+ $this->add_section_vars($this->yystack[ $this->yyidx + - 3 ]->minor, $this->yystack[ $this->yyidx + 0 ]->minor);
+ $this->_retvalue = null;
+ }
+
+ #line 269 "../smarty/lexer/smarty_internal_configfileparser.y"
+ 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 277 "../smarty/lexer/smarty_internal_configfileparser.y"
+ function yy_r6()
+ {
+ $this->_retvalue = $this->yystack[ $this->yyidx + - 1 ]->minor;
+ }
+
+ #line 281 "../smarty/lexer/smarty_internal_configfileparser.y"
+ function yy_r7()
+ {
+ $this->_retvalue =
+ array_merge($this->yystack[ $this->yyidx + - 1 ]->minor, Array($this->yystack[ $this->yyidx + 0 ]->minor));
+ }
+
+ #line 285 "../smarty/lexer/smarty_internal_configfileparser.y"
+ function yy_r8()
+ {
+ $this->_retvalue = Array();
+ }
+
+ #line 291 "../smarty/lexer/smarty_internal_configfileparser.y"
+ function yy_r9()
+ {
+ $this->_retvalue = Array("key" => $this->yystack[ $this->yyidx + - 2 ]->minor,
+ "value" => $this->yystack[ $this->yyidx + 0 ]->minor);
+ }
+
+ #line 296 "../smarty/lexer/smarty_internal_configfileparser.y"
+ function yy_r10()
+ {
+ $this->_retvalue = (float) $this->yystack[ $this->yyidx + 0 ]->minor;
+ }
+
+ #line 300 "../smarty/lexer/smarty_internal_configfileparser.y"
+ function yy_r11()
+ {
+ $this->_retvalue = (int) $this->yystack[ $this->yyidx + 0 ]->minor;
+ }
+
+ #line 304 "../smarty/lexer/smarty_internal_configfileparser.y"
+ function yy_r12()
+ {
+ $this->_retvalue = $this->parse_bool($this->yystack[ $this->yyidx + 0 ]->minor);
+ }
+
+ #line 308 "../smarty/lexer/smarty_internal_configfileparser.y"
+ function yy_r13()
+ {
+ $this->_retvalue = self::parse_single_quoted_string($this->yystack[ $this->yyidx + 0 ]->minor);
+ }
+
+ #line 312 "../smarty/lexer/smarty_internal_configfileparser.y"
+ function yy_r14()
+ {
+ $this->_retvalue = self::parse_double_quoted_string($this->yystack[ $this->yyidx + 0 ]->minor);
+ }
+
+ #line 316 "../smarty/lexer/smarty_internal_configfileparser.y"
+ function yy_r15()
+ {
+ $this->_retvalue = self::parse_tripple_double_quoted_string($this->yystack[ $this->yyidx + - 1 ]->minor);
+ }
+
+ #line 320 "../smarty/lexer/smarty_internal_configfileparser.y"
+ function yy_r16()
+ {
+ $this->_retvalue = '';
+ }
+
+ #line 324 "../smarty/lexer/smarty_internal_configfileparser.y"
+ function yy_r17()
+ {
+ $this->_retvalue = $this->yystack[ $this->yyidx + 0 ]->minor;
+ }
+
+ private $_retvalue;
+
+ 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();
+ }
+ }
+
+ 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 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);
+ }
+}
+
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_data.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_data.php
new file mode 100644
index 0000000000..fd9c3020b1
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_data.php
@@ -0,0 +1,285 @@
+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
+ * @throws SmartyException
+ */
+ public function __call($name, $args)
+ {
+ return $this->ext->_callExternalMethod($this, $name, $args);
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_debug.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_debug.php
new file mode 100644
index 0000000000..f16bd3fb15
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_debug.php
@@ -0,0 +1,426 @@
+_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
+ */
+ 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(__DIR__ . '/../plugins') ? __DIR__ . '/../plugins' : $smarty->getPluginsDir());
+ $debObj->force_compile = false;
+ $debObj->compile_check = true;
+ $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:' . __DIR__ . '/../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 = false;
+ $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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_extension_handler.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_extension_handler.php
new file mode 100644
index 0000000000..340e6dee15
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_extension_handler.php
@@ -0,0 +1,171 @@
+ 0, 'DefaultModifiers' => 0, 'ConfigVars' => 0,
+ 'DebugTemplate' => 0, 'RegisteredObject' => 0, 'StreamVariable' => 0,
+ 'TemplateVars' => 0,);#
+
+ private $resolvedProperties = array();
+
+ /**
+ * Call external Method
+ *
+ * @param \Smarty_Internal_Data $data
+ * @param string $name external method names
+ * @param array $args argument array
+ *
+ * @return mixed
+ * @throws SmartyException
+ */
+ 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)) {
+ $class = 'Smarty_Internal_Method_' . $this->upperCase($name);
+ if (preg_match('/^(set|get)([A-Z].*)$/', $name, $match)) {
+ $pn = '';
+ if (!isset($this->_property_info[ $prop = $match[ 2 ] ])) {
+ // convert camel case to underscored name
+ $this->resolvedProperties[ $prop ] = $pn = strtolower(join('_',
+ preg_split('/([A-Z][^A-Z]*)/', $prop,
+ - 1, PREG_SPLIT_NO_EMPTY |
+ PREG_SPLIT_DELIM_CAPTURE)));
+ $this->_property_info[ $prop ] =
+ property_exists($data, $pn) ? 1 : ($data->_isTplObj() && property_exists($smarty, $pn) ? 2 : 0);
+ }
+ if ($this->_property_info[ $prop ]) {
+ $pn = $this->resolvedProperties[ $prop ];
+ if ($match[ 1 ] == 'get') {
+ return $this->_property_info[ $prop ] == 1 ? $data->$pn : $data->smarty->$pn;
+ } else {
+ return $this->_property_info[ $prop ] == 1 ? $data->$pn = $args[ 0 ] :
+ $data->smarty->$pn = $args[ 0 ];
+ }
+ } elseif (!class_exists($class)) {
+ throw new SmartyException("property '$pn' does not exist.");
+ }
+ }
+ if (class_exists($class)) {
+ $callback = array($smarty->ext->$name = new $class(), $name);
+ }
+ } else {
+ $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);
+ }
+
+ /**
+ * set extension property
+ *
+ * @param string $property_name property name
+ * @param mixed $value value
+ *
+ * @throws SmartyException
+ */
+ public function __set($property_name, $value)
+ {
+ $this->$property_name = $value;
+ }
+
+ /**
+ * get extension object
+ *
+ * @param string $property_name property name
+ *
+ * @return mixed|Smarty_Template_Cached
+ * @throws SmartyException
+ */
+ 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();
+ }
+
+ /**
+ * 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)
+ {
+ return call_user_func_array(array(new Smarty_Internal_Undefined(), $name), array($this));
+ }
+
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_addautoloadfilters.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_addautoloadfilters.php
new file mode 100644
index 0000000000..3eef8a28c2
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_addautoloadfilters.php
@@ -0,0 +1,52 @@
+_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;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_adddefaultmodifiers.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_adddefaultmodifiers.php
new file mode 100644
index 0000000000..afb0b68d51
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_adddefaultmodifiers.php
@@ -0,0 +1,42 @@
+_getSmartyObj();
+ if (is_array($modifiers)) {
+ $smarty->default_modifiers = array_merge($smarty->default_modifiers, $modifiers);
+ } else {
+ $smarty->default_modifiers[] = $modifiers;
+ }
+ return $obj;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_append.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_append.php
new file mode 100644
index 0000000000..af69359198
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_append.php
@@ -0,0 +1,74 @@
+ $_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;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_appendbyref.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_appendbyref.php
new file mode 100644
index 0000000000..532ac95096
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_appendbyref.php
@@ -0,0 +1,50 @@
+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;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_assignbyref.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_assignbyref.php
new file mode 100644
index 0000000000..0060bbc5fa
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_assignbyref.php
@@ -0,0 +1,36 @@
+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;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_assignglobal.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_assignglobal.php
new file mode 100644
index 0000000000..3c2b260491
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_assignglobal.php
@@ -0,0 +1,43 @@
+_isTplObj()) {
+ $ptr->tpl_vars[ $varName ] = clone Smarty::$global_tpl_vars[ $varName ];
+ $ptr = $ptr->parent;
+ }
+ }
+ return $data;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearallassign.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearallassign.php
new file mode 100644
index 0000000000..1e5fec4bd6
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearallassign.php
@@ -0,0 +1,37 @@
+tpl_vars = array();
+
+ return $data;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearallcache.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearallcache.php
new file mode 100644
index 0000000000..5879f9a062
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearallcache.php
@@ -0,0 +1,40 @@
+_clearTemplateCache();
+ // load cache resource and call clearAll
+ $_cache_resource = Smarty_CacheResource::load($smarty, $type);
+ return $_cache_resource->clearAll($smarty, $exp_time);
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearassign.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearassign.php
new file mode 100644
index 0000000000..060a2ac493
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearassign.php
@@ -0,0 +1,44 @@
+tpl_vars[ $curr_var ]);
+ }
+ } else {
+ unset($data->tpl_vars[ $tpl_var ]);
+ }
+
+ return $data;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearcache.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearcache.php
new file mode 100644
index 0000000000..95649a7779
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearcache.php
@@ -0,0 +1,44 @@
+_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);
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php
new file mode 100644
index 0000000000..a1f1a80bb0
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php
@@ -0,0 +1,122 @@
+_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 ? $smarty->ds : '^';
+ if (isset($resource_name)) {
+ $_save_stat = $smarty->caching;
+ $smarty->caching = false;
+ /* @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('^', $smarty->ds, $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 (time() - @filemtime($_filepath) >= $exp_time) {
+ $unlink = true;
+ }
+ } else {
+ $unlink = true;
+ }
+ }
+
+ if ($unlink && @unlink($_filepath)) {
+ $_count ++;
+ if (function_exists('opcache_invalidate') && strlen(ini_get("opcache.restrict_api")) < 1) {
+ opcache_invalidate($_filepath, true);
+ }
+ }
+ }
+ }
+ return $_count;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearconfig.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearconfig.php
new file mode 100644
index 0000000000..3712478079
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_clearconfig.php
@@ -0,0 +1,41 @@
+config_vars[ $name ]);
+ } else {
+ $data->config_vars = array();
+ }
+ return $data;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_compileallconfig.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_compileallconfig.php
new file mode 100644
index 0000000000..767031bd93
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_compileallconfig.php
@@ -0,0 +1,33 @@
+compileAll($smarty, $extension, $force_compile, $time_limit, $max_errors, true);
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_compilealltemplates.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_compilealltemplates.php
new file mode 100644
index 0000000000..0abed2124f
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_compilealltemplates.php
@@ -0,0 +1,119 @@
+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)) . $smarty->ds . $_file;
+ }
+ echo "\n ", $_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 ------>Error: ", $e->getMessage(), " \n";
+ $_error_count ++;
+ }
+ // free memory
+ unset($_tpl);
+ $_smarty->_clearTemplateCache();
+ if ($max_errors !== null && $_error_count == $max_errors) {
+ echo "\n too many errors\n";
+ exit();
+ }
+ }
+ }
+ echo "\n ";
+ return $_count;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_configload.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_configload.php
new file mode 100644
index 0000000000..6113eaf982
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_configload.php
@@ -0,0 +1,183 @@
+_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
+ *
+ * @return \Smarty|\Smarty_Internal_Data|\Smarty_Internal_Template
+ * @throws \SmartyException
+ */
+ 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
+ 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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_createdata.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_createdata.php
new file mode 100644
index 0000000000..43ce894329
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_createdata.php
@@ -0,0 +1,44 @@
+_getSmartyObj();
+ $dataObj = new Smarty_Data($parent, $smarty, $name);
+ if ($smarty->debugging) {
+ Smarty_Internal_Debug::register_data($dataObj);
+ }
+ return $dataObj;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getautoloadfilters.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getautoloadfilters.php
new file mode 100644
index 0000000000..d945a01e36
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getautoloadfilters.php
@@ -0,0 +1,37 @@
+ array( 'filter1', 'filter2', … ) ) or array( 'filter1', 'filter2', …) if $type
+ * was specified
+ */
+ 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;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getconfigvariable.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getconfigvariable.php
new file mode 100644
index 0000000000..4dd398208d
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getconfigvariable.php
@@ -0,0 +1,34 @@
+ext->configLoad->_getConfigVariable($data, $varName, $errorEnable);
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getconfigvars.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getconfigvars.php
new file mode 100644
index 0000000000..b75cf81796
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getconfigvars.php
@@ -0,0 +1,58 @@
+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;
+ }
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getdebugtemplate.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getdebugtemplate.php
new file mode 100644
index 0000000000..52073c14e4
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getdebugtemplate.php
@@ -0,0 +1,35 @@
+_getSmartyObj();
+ return $smarty->debug_tpl;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getdefaultmodifiers.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getdefaultmodifiers.php
new file mode 100644
index 0000000000..f65ab7914b
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getdefaultmodifiers.php
@@ -0,0 +1,35 @@
+_getSmartyObj();
+ return $smarty->default_modifiers;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getglobal.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getglobal.php
new file mode 100644
index 0000000000..7a8a9bc713
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getglobal.php
@@ -0,0 +1,47 @@
+value;
+ } else {
+ return '';
+ }
+ } else {
+ $_result = array();
+ foreach (Smarty::$global_tpl_vars AS $key => $var) {
+ $_result[ $key ] = $var->value;
+ }
+ return $_result;
+ }
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getregisteredobject.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getregisteredobject.php
new file mode 100644
index 0000000000..c5c0646655
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getregisteredobject.php
@@ -0,0 +1,44 @@
+_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 ];
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getstreamvariable.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getstreamvariable.php
new file mode 100644
index 0000000000..b922fd0889
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_getstreamvariable.php
@@ -0,0 +1,51 @@
+smarty) ? $data->smarty : $data;
+ if ($smarty->error_unassigned) {
+ throw new SmartyException('Undefined stream variable "' . $variable . '"');
+ } else {
+ return null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_gettags.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_gettags.php
new file mode 100644
index 0000000000..5718b69e93
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_gettags.php
@@ -0,0 +1,62 @@
+_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 = false;
+ $tpl->loadCompiler();
+ $tpl->compiler->compileTemplate($tpl);
+ return $tpl->_cache[ 'used_tags' ];
+ }
+ throw new SmartyException("Missing template specification");
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_gettemplatevars.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_gettemplatevars.php
new file mode 100644
index 0000000000..1759646f3b
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_gettemplatevars.php
@@ -0,0 +1,116 @@
+_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) {
+ $_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) {
+ $_ptr = $_ptr->parent;
+ } else {
+ $_ptr = null;
+ }
+ }
+ if (isset(Smarty::$global_tpl_vars[ $varName ])) {
+ // found it, return it
+ return Smarty::$global_tpl_vars[ $varName ];
+ }
+ /* @var \Smarty $smarty */
+ $smarty = isset($data->smarty) ? $data->smarty : $data;
+ if ($smarty->error_unassigned && $errorEnable) {
+ // force a notice
+ $x = $$varName;
+ }
+
+ return new Smarty_Undefined_Variable;
+ }
+
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_loadfilter.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_loadfilter.php
new file mode 100644
index 0000000000..d092d876ea
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_loadfilter.php
@@ -0,0 +1,77 @@
+ 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}\"");
+ }
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_loadplugin.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_loadplugin.php
new file mode 100644
index 0000000000..50f3bfc2cf
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_loadplugin.php
@@ -0,0 +1,111 @@
+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;
+ require_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;
+ require_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) {
+ require_once($file);
+ return $file;
+ }
+ }
+ }
+ // no plugin loaded
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_mustcompile.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_mustcompile.php
new file mode 100644
index 0000000000..0950ba9cf2
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_mustcompile.php
@@ -0,0 +1,51 @@
+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->smarty->compile_check &&
+ $_template->compiled->getTimeStamp() <
+ $_template->source->getTimeStamp())));
+ }
+
+ return $_template->mustCompile;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registercacheresource.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registercacheresource.php
new file mode 100644
index 0000000000..ae38727226
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registercacheresource.php
@@ -0,0 +1,40 @@
+_getSmartyObj();
+ $smarty->registered_cache_resources[ $name ] = $resource_handler;
+ return $obj;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerclass.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerclass.php
new file mode 100644
index 0000000000..5469b98aac
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerclass.php
@@ -0,0 +1,46 @@
+_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;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaultconfighandler.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaultconfighandler.php
new file mode 100644
index 0000000000..43088a1d4f
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaultconfighandler.php
@@ -0,0 +1,42 @@
+_getSmartyObj();
+ if (is_callable($callback)) {
+ $smarty->default_config_handler_func = $callback;
+ } else {
+ throw new SmartyException("Default config handler not callable");
+ }
+ return $obj;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaultpluginhandler.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaultpluginhandler.php
new file mode 100644
index 0000000000..d9aecb4a9b
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaultpluginhandler.php
@@ -0,0 +1,43 @@
+_getSmartyObj();
+ if (is_callable($callback)) {
+ $smarty->default_plugin_handler_func = $callback;
+ } else {
+ throw new SmartyException("Default plugin handler '$callback' not callable");
+ }
+ return $obj;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php
new file mode 100644
index 0000000000..569ea10622
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php
@@ -0,0 +1,82 @@
+_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}'");
+ }
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerfilter.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerfilter.php
new file mode 100644
index 0000000000..ea8f75a854
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerfilter.php
@@ -0,0 +1,88 @@
+ 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}\"");
+ }
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerobject.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerobject.php
new file mode 100644
index 0000000000..ba699b2199
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerobject.php
@@ -0,0 +1,72 @@
+_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;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerplugin.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerplugin.php
new file mode 100644
index 0000000000..91f065920e
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerplugin.php
@@ -0,0 +1,51 @@
+_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");
+ } else {
+ $smarty->registered_plugins[ $type ][ $name ] = array($callback, (bool) $cacheable, (array) $cache_attr);
+ }
+ return $obj;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerresource.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerresource.php
new file mode 100644
index 0000000000..44534b7387
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_registerresource.php
@@ -0,0 +1,44 @@
+_getSmartyObj();
+ $smarty->registered_resources[ $name ] =
+ $resource_handler instanceof Smarty_Resource ? $resource_handler : array($resource_handler, false);
+ return $obj;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_setautoloadfilters.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_setautoloadfilters.php
new file mode 100644
index 0000000000..df5ca64054
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_setautoloadfilters.php
@@ -0,0 +1,70 @@
+ 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
+ */
+ 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}\"");
+ }
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_setdebugtemplate.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_setdebugtemplate.php
new file mode 100644
index 0000000000..76c87deb69
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_setdebugtemplate.php
@@ -0,0 +1,41 @@
+_getSmartyObj();
+ if (!is_readable($tpl_name)) {
+ throw new SmartyException("Unknown file '{$tpl_name}'");
+ }
+ $smarty->debug_tpl = $tpl_name;
+ return $obj;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_setdefaultmodifiers.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_setdefaultmodifiers.php
new file mode 100644
index 0000000000..81434b968a
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_setdefaultmodifiers.php
@@ -0,0 +1,38 @@
+_getSmartyObj();
+ $smarty->default_modifiers = (array) $modifiers;
+ return $obj;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unloadfilter.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unloadfilter.php
new file mode 100644
index 0000000000..9aa1d229b4
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unloadfilter.php
@@ -0,0 +1,42 @@
+_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;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unregistercacheresource.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unregistercacheresource.php
new file mode 100644
index 0000000000..1a157ffb61
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unregistercacheresource.php
@@ -0,0 +1,40 @@
+_getSmartyObj();
+ if (isset($smarty->registered_cache_resources[ $name ])) {
+ unset($smarty->registered_cache_resources[ $name ]);
+ }
+ return $obj;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterfilter.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterfilter.php
new file mode 100644
index 0000000000..c5b88f57de
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterfilter.php
@@ -0,0 +1,42 @@
+_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;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterobject.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterobject.php
new file mode 100644
index 0000000000..76d48661e6
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterobject.php
@@ -0,0 +1,40 @@
+_getSmartyObj();
+ if (isset($smarty->registered_objects[ $object_name ])) {
+ unset($smarty->registered_objects[ $object_name ]);
+ }
+ return $obj;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterplugin.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterplugin.php
new file mode 100644
index 0000000000..b5f0d505b2
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterplugin.php
@@ -0,0 +1,41 @@
+_getSmartyObj();
+ if (isset($smarty->registered_plugins[ $type ][ $name ])) {
+ unset($smarty->registered_plugins[ $type ][ $name ]);
+ }
+ return $obj;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterresource.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterresource.php
new file mode 100644
index 0000000000..ed4801d48f
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterresource.php
@@ -0,0 +1,40 @@
+_getSmartyObj();
+ if (isset($smarty->registered_resources[ $type ])) {
+ unset($smarty->registered_resources[ $type ]);
+ }
+ return $obj;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_nocache_insert.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_nocache_insert.php
new file mode 100644
index 0000000000..65fc143cdc
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_nocache_insert.php
@@ -0,0 +1,53 @@
+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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree.php
new file mode 100644
index 0000000000..32c9df094f
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree.php
@@ -0,0 +1,54 @@
+data = null;
+ $this->subtrees = null;
+ }
+
+}
+
+
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_code.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_code.php
new file mode 100644
index 0000000000..d0f0b3fd94
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_code.php
@@ -0,0 +1,42 @@
+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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_dq.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_dq.php
new file mode 100644
index 0000000000..8c2e0d9935
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_dq.php
@@ -0,0 +1,95 @@
+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,
+ 'data . ';?>');
+ } elseif ($subtree instanceof Smarty_Internal_ParseTree_DqContent) {
+ $this->subtrees[ $last_subtree ]->data =
+ $parser->compiler->appendCode($this->subtrees[ $last_subtree ]->data,
+ '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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_dqcontent.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_dqcontent.php
new file mode 100644
index 0000000000..a8ca389d9c
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_dqcontent.php
@@ -0,0 +1,42 @@
+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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_tag.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_tag.php
new file mode 100644
index 0000000000..9058aabfb4
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_tag.php
@@ -0,0 +1,69 @@
+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('', $this->data);
+ $tmp = $parser->compiler->appendCode($tmp, "");
+ $parser->compiler->prefix_code[] = sprintf("%s", $tmp);
+
+ return $var;
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_template.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_template.php
new file mode 100644
index 0000000000..f6032351e4
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_template.php
@@ -0,0 +1,128 @@
+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 = '';
+ for ($key = 0, $cnt = count($this->subtrees); $key < $cnt; $key ++) {
+ if ($this->subtrees[ $key ] instanceof Smarty_Internal_ParseTree_Text) {
+ $subtree = $this->subtrees[ $key ]->to_smarty_php($parser);
+ while ($key + 1 < $cnt && ($this->subtrees[ $key + 1 ] instanceof Smarty_Internal_ParseTree_Text ||
+ $this->subtrees[ $key + 1 ]->data == '')) {
+ $key ++;
+ if ($this->subtrees[ $key ]->data == '') {
+ continue;
+ }
+ $subtree .= $this->subtrees[ $key ]->to_smarty_php($parser);
+ }
+ if ($subtree == '') {
+ continue;
+ }
+ $code .= preg_replace('/((<%)|(%>)|(<\?php)|(<\?)|(\?>)|(<\/?script))/', "\n",
+ $subtree);
+ continue;
+ }
+ if ($this->subtrees[ $key ] instanceof Smarty_Internal_ParseTree_Tag) {
+ $subtree = $this->subtrees[ $key ]->to_smarty_php($parser);
+ while ($key + 1 < $cnt && ($this->subtrees[ $key + 1 ] instanceof Smarty_Internal_ParseTree_Tag ||
+ $this->subtrees[ $key + 1 ]->data == '')) {
+ $key ++;
+ if ($this->subtrees[ $key ]->data == '') {
+ continue;
+ }
+ $subtree = $parser->compiler->appendCode($subtree, $this->subtrees[ $key ]->to_smarty_php($parser));
+ }
+ if ($subtree == '') {
+ continue;
+ }
+ $code .= $subtree;
+ continue;
+ }
+ $code .= $this->subtrees[ $key ]->to_smarty_php($parser);
+ }
+ return $code;
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_text.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_text.php
new file mode 100644
index 0000000000..b3100fa09b
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_text.php
@@ -0,0 +1,40 @@
+data = $data;
+ }
+
+ /**
+ * 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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_eval.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_eval.php
new file mode 100644
index 0000000000..d3088bdd99
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_eval.php
@@ -0,0 +1,95 @@
+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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_extends.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_extends.php
new file mode 100644
index 0000000000..4f1f09ea54
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_extends.php
@@ -0,0 +1,125 @@
+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
+ */
+ public function checkTimestamps()
+ {
+ return false;
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_file.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_file.php
new file mode 100644
index 0000000000..a58771a17f
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_file.php
@@ -0,0 +1,176 @@
+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) . $source->smarty->ds . $file);
+ // files relative to a template only get one shot
+ return is_file($path) ? $path : false;
+ }
+ // normalize $source->smarty->ds
+ if (strpos($file, $source->smarty->ds == '/' ? '\\' : '/') !== false) {
+ $file = str_replace($source->smarty->ds == '/' ? '\\' : '/', $source->smarty->ds, $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, '.' . $source->smarty->ds) !== 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;
+ }
+
+ /**
+ * 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 = $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);
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_php.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_php.php
new file mode 100644
index 0000000000..52e7096b32
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_php.php
@@ -0,0 +1,106 @@
+short_open_tag = ini_get('short_open_tag');
+ }
+
+ /**
+ * 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}'");
+ }
+
+ /**
+ * 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
+ ini_set('short_open_tag', '1');
+ /** @var Smarty_Internal_Template $_smarty_template
+ * used in included file
+ */
+ $_smarty_template = $_template;
+ include($source->filepath);
+ ini_set('short_open_tag', $this->short_open_tag);
+ }
+
+ /**
+ * 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,);
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_registered.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_registered.php
new file mode 100644
index 0000000000..8535257ab9
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_registered.php
@@ -0,0 +1,99 @@
+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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_stream.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_stream.php
new file mode 100644
index 0000000000..b4248fbb55
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_stream.php
@@ -0,0 +1,80 @@
+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
+ * @throws SmartyException if source cannot be loaded
+ */
+ 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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_string.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_string.php
new file mode 100644
index 0000000000..f2610d9d62
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_resource_string.php
@@ -0,0 +1,107 @@
+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
+ */
+ public function checkTimestamps()
+ {
+ return false;
+ }
+}
+
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_cachemodify.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_cachemodify.php
new file mode 100644
index 0000000000..a91874a9f9
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_cachemodify.php
@@ -0,0 +1,68 @@
+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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_cacheresourcefile.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_cacheresourcefile.php
new file mode 100644
index 0000000000..7b7a9f6858
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_cacheresourcefile.php
@@ -0,0 +1,136 @@
+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 . $smarty->ds;
+ }
+ }
+ }
+ if (isset($resource_name)) {
+ $_save_stat = $smarty->caching;
+ $smarty->caching = true;
+ $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;
+ }
+ }
+ }
+ // expired ?
+ if (isset($exp_time)) {
+ if ($exp_time < 0) {
+ preg_match('#\'cache_lifetime\' =>\s*(\d*)#', file_get_contents($_file), $match);
+ if ($_time < (@filemtime($_file) + $match[ 1 ])) {
+ continue;
+ }
+ } else {
+ if ($_time - @filemtime($_file) < $exp_time) {
+ continue;
+ }
+ }
+ }
+ $_count += @unlink($_filepath) ? 1 : 0;
+ if (function_exists('opcache_invalidate') && strlen(ini_get("opcache.restrict_api")) < 1) {
+ opcache_invalidate($_filepath, true);
+ }
+ }
+ }
+ }
+ return $_count;
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_capture.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_capture.php
new file mode 100644
index 0000000000..69f1ce0cfc
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_capture.php
@@ -0,0 +1,161 @@
+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
+ *
+ * @param \Smarty_Internal_Template $_template
+ * @param $name
+ *
+ * @return null
+ */
+ public function getBuffer(Smarty_Internal_Template $_template, $name)
+ {
+ return isset($this->namedBuffer[ $name ]) ? $this->namedBuffer[ $name ] : null;
+ }
+
+ /**
+ * 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);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_codeframe.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_codeframe.php
new file mode 100644
index 0000000000..e363712a61
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_codeframe.php
@@ -0,0 +1,98 @@
+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 = "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, " .
+ var_export($compiler->tpl_function, true) . ");\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";
+
+ }
+ // include code for plugins
+ if (!$cache) {
+ if (!empty($_template->compiled->required_plugins[ 'compiled' ])) {
+ foreach ($_template->compiled->required_plugins[ 'compiled' ] as $tmp) {
+ foreach ($tmp as $data) {
+ $file = addslashes($data[ 'file' ]);
+ if (is_array($data[ 'function' ])) {
+ $output .= "if (!is_callable(array('{$data['function'][0]}','{$data['function'][1]}'))) require_once '{$file}';\n";
+ } else {
+ $output .= "if (!is_callable('{$data['function']}')) require_once '{$file}';\n";
+ }
+ }
+ }
+ }
+ if ($_template->caching && !empty($_template->compiled->required_plugins[ 'nocache' ])) {
+ $_template->compiled->has_nocache_code = true;
+ $output .= "echo '/*%%SmartyNocache:{$_template->compiled->nocache_hash}%%*/smarty; ";
+ foreach ($_template->compiled->required_plugins[ 'nocache' ] as $tmp) {
+ foreach ($tmp as $data) {
+ $file = addslashes($data[ 'file' ]);
+ if (is_array($data[ 'function' ])) {
+ $output .= addslashes("if (!is_callable(array('{$data['function'][0]}','{$data['function'][1]}'))) require_once '{$file}';\n");
+ } else {
+ $output .= addslashes("if (!is_callable('{$data['function']}')) require_once '{$file}';\n");
+ }
+ }
+ }
+ $output .= "?>/*/%%SmartyNocache:{$_template->compiled->nocache_hash}%%*/';\n";
+ }
+ }
+ $output .= "?>\n";
+ $output .= $content;
+ $output .= "";
+ $output .= $functions;
+ $output .= "[\n]?<\?php\s*/', '/\?>\s*$/'), array("\n", ''), $output);
+ }
+}
\ No newline at end of file
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_filterhandler.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_filterhandler.php
new file mode 100644
index 0000000000..f6cfa7c447
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_filterhandler.php
@@ -0,0 +1,69 @@
+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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_foreach.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_foreach.php
new file mode 100644
index 0000000000..1e8655d923
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_foreach.php
@@ -0,0 +1,149 @@
+count($from);
+ } else {
+ settype($from, 'array');
+ }
+ }
+ if (!isset($total)) {
+ $total = empty($from) ? 0 : (($needTotal || isset($properties[ 'total' ])) ? 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;
+ }
+
+ /**
+ * 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--;
+ }
+ }
+
+ /*
+ *
+ * [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 Countable) {
+ return count($value);
+ } elseif ($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 PDOStatement) {
+ return $value->rowCount();
+ } elseif ($value instanceof Traversable) {
+ return iterator_count($value);
+ } elseif ($value instanceof ArrayAccess) {
+ return $value->offsetExists(0) ? 1 : 0;
+ }
+ return count((array) $value);
+ }
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_getincludepath.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_getincludepath.php
new file mode 100644
index 0000000000..e12b0c57c6
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_getincludepath.php
@@ -0,0 +1,182 @@
+_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 . $smarty->ds, 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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_inheritance.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_inheritance.php
new file mode 100644
index 0000000000..7ec5924e6d
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_inheritance.php
@@ -0,0 +1,241 @@
+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 optinal name of inheritance parent template
+ * @param null|string $uid uid of inline template
+ * @param null|string $func function call name of inline template
+ */
+ 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
+ */
+ 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->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);
+ }
+ 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);
+ 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
+ */
+ public function callChild(Smarty_Internal_Template $tpl, Smarty_Internal_Block $block)
+ {
+ if (isset($block->child)) {
+ $this->process($tpl, $block->child, $block);
+ }
+ }
+
+ /**
+ * Render parent on {$smarty.block.parent} or {block append/prepend} *
+ *
+ * @param \Smarty_Internal_Template $tpl
+ * @param \Smarty_Internal_Block $block
+ *
+ * @param null $name
+ *
+ * @throws \SmartyException
+ */
+ public function callParent(Smarty_Internal_Template $tpl, Smarty_Internal_Block $block, $name = null)
+ {
+ if (isset($name)) {
+ $block = $block->parent;
+ while (isset($block)) {
+ if (isset($block->subBlocks[ $name ])) {
+ } else {
+ $block = $block->parent;
+ }
+ }
+ return;
+ } else if (isset($block->parent)) {
+ $this->callBlock($block->parent, $tpl);
+ } else {
+ throw new SmartyException("inheritance: illegal {\$smarty.block.parent} or {block append/prepend} used in parent template '{$tpl->inheritance->sources[$block->tplIndex]->filepath}' block '{$block->name}'");
+ }
+ }
+
+ /**
+ * @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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_make_nocache.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_make_nocache.php
new file mode 100644
index 0000000000..65382772d0
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_make_nocache.php
@@ -0,0 +1,56 @@
+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}%%*/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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_tplfunction.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_tplfunction.php
new file mode 100644
index 0000000000..f6b36f2a56
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_tplfunction.php
@@ -0,0 +1,171 @@
+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)) {
+ /* @var Smarty_Template_Cached $cache */
+ $cache = $tplPtr->cached;
+ $content = $cache->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($cache, $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/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_updatecache.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_updatecache.php
new file mode 100644
index 0000000000..ceee3b718e
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_updatecache.php
@@ -0,0 +1,165 @@
+hashes[ $_template->compiled->nocache_hash ]);
+ if (!empty($cached->hashes)) {
+ $hash_array = array();
+ foreach ($cached->hashes as $hash => $foo) {
+ $hash_array[] = "/{$hash}/";
+ }
+ $content = preg_replace($hash_array, $_template->compiled->nocache_hash, $content);
+ }
+ $_template->cached->has_nocache_code = false;
+ // get text between non-cached items
+ $cache_split =
+ preg_split("!/\*%%SmartyNocache:{$_template->compiled->nocache_hash}%%\*\/(.+?)/\*/%%SmartyNocache:{$_template->compiled->nocache_hash}%%\*/!s",
+ $content);
+ // get non-cached items
+ preg_match_all("!/\*%%SmartyNocache:{$_template->compiled->nocache_hash}%%\*\/(.+?)/\*/%%SmartyNocache:{$_template->compiled->nocache_hash}%%\*/!s",
+ $content, $cache_parts);
+ $content = '';
+ // loop over items, stitch back together
+ foreach ($cache_split as $curr_idx => $curr_split) {
+ // escape PHP tags in template content
+ $content .= preg_replace('/(<%|%>|<\?php|<\?|\?>|]*>)|(]*>)|(]*>.*? ]*>)#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 ++;
+ }
+ }
+ } else {
+ $text = preg_replace($this->stripRegEx, '', $text);
+ }
+ }
+ return new Smarty_Internal_ParseTree_Text($text);
+ }
+ return null;
+ }
+
+ /**
+ * 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 string|bool compiled code or false
+ */
+ public function callTagCompiler($tag, $args, $param1 = null, $param2 = null, $param3 = null)
+ {
+ $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 Smarty_Internal_CompileBase|bool 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
+ */
+ public function getPlugin($plugin_name, $plugin_type)
+ {
+ $function = null;
+ if ($this->template->caching && ($this->nocache || $this->tag_nocache)) {
+ if (isset($this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ])) {
+ $function =
+ $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ];
+ } elseif (isset($this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ])) {
+ $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ] =
+ $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ];
+ $function =
+ $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ];
+ }
+ } else {
+ if (isset($this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ])) {
+ $function =
+ $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'function' ];
+ } elseif (isset($this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ])) {
+ $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ] =
+ $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ];
+ $function =
+ $this->parent_compiler->template->compiled->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->template->caching && ($this->nocache || $this->tag_nocache)) {
+ $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'file' ] =
+ $file;
+ $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ $plugin_type ][ 'function' ] =
+ $function;
+ } else {
+ $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ $plugin_type ][ 'file' ] =
+ $file;
+ $this->parent_compiler->template->compiled->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 boolean true if found
+ */
+ 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->template->caching && ($this->nocache || $this->tag_nocache)) {
+ $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $tag ][ $plugin_type ][ 'file' ] =
+ $script;
+ $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $tag ][ $plugin_type ][ 'function' ] =
+ $callback;
+ } else {
+ $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $tag ][ $plugin_type ][ 'file' ] =
+ $script;
+ $this->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $tag ][ $plugin_type ][ 'function' ] =
+ $callback;
+ }
+ require_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 ?> \s*$/', $left) && preg_match('/^\s*<\?php\s+/', $right)) {
+ $left = preg_replace('/\s*\?>\s*$/', "\n", $left);
+ $left .= preg_replace('/^\s*<\?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->template->caching &&
+ !$this->suppressNocacheProcessing && ($this->nocache || $this->tag_nocache)
+ ) {
+ $this->template->compiled->has_nocache_code = true;
+ $_output = addcslashes($content, '\'\\');
+ $_output = str_replace("^#^", "'", $_output);
+ $_output = "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->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ $plugin_name ][ 'modifier' ])) {
+ $this->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ $plugin_name ][ 'modifier' ] =
+ $this->parent_compiler->template->compiled->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}%%*//*/%%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);
+ }
+ }
+ $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));
+ }
+
+ /**
+ * 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;
+ }
+
+}
diff --git a/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatelexer.php b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatelexer.php
new file mode 100644
index 0000000000..8e870b75c4
--- /dev/null
+++ b/vendor/smarty/smarty/libs/sysplugins/smarty_internal_templatelexer.php
@@ -0,0 +1,1169 @@
+
+ */
+class Smarty_Internal_Templatelexer
+{
+ /**
+ * 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 = '';
+
+ /**
+ * escaped left delimiter
+ *
+ * @var string
+ */
+ public $ldel = '';
+
+ /**
+ * escaped left delimiter length
+ *
+ * @var int
+ */
+ public $ldel_length = 0;
+
+ /**
+ * escaped right delimiter
+ *
+ * @var string
+ */
+ public $rdel = '';
+
+ /**
+ * escaped right delimiter length
+ *
+ * @var int
+ */
+ public $rdel_length = 0;
+
+ /**
+ * state number
+ *
+ * @var int
+ */
+ public $state = 1;
+
+ /**
+ * Smarty object
+ *
+ * @var Smarty
+ */
+ public $smarty = null;
+
+ /**
+ * compiler object
+ *
+ * @var Smarty_Internal_TemplateCompilerBase
+ */
+ public $compiler = null;
+
+ /**
+ * literal tag nesting level
+ *
+ * @var int
+ */
+ private $literal_cnt = 0;
+
+ /**
+ * PHP start tag string
+ *
+ * @var string
+ */
+
+ /**
+ * 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',);
+
+ /**
+ * 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;
+
+ /**
+ * 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' => '" '"<", "==" ... logical operator',
+ 'TLOGOP' => '"lt", "eq" ... logical operator; "is div by" ... if condition',
+ 'SCOND' => '"is even" ... if condition',);
+
+ /**
+ * constructor
+ *
+ * @param string $data template source
+ * @param Smarty_Internal_TemplateCompilerBase $compiler
+ */
+ function __construct($data, Smarty_Internal_TemplateCompilerBase $compiler)
+ {
+ $this->data = $data;
+ $this->dataLength = strlen($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->smarty;
+ $this->compiler = $compiler;
+ $this->ldel = preg_quote($this->smarty->left_delimiter, '/');
+ $this->ldel_length = strlen($this->smarty->left_delimiter);
+ $this->rdel = preg_quote($this->smarty->right_delimiter, '/');
+ $this->rdel_length = strlen($this->smarty->right_delimiter);
+ $this->smarty_token_names[ 'LDEL' ] = $this->smarty->left_delimiter;
+ $this->smarty_token_names[ 'RDEL' ] = $this->smarty->right_delimiter;
+ }
+
+ public function PrintTrace()
+ {
+ $this->yyTraceFILE = fopen('php://output', 'w');
+ $this->yyTracePrompt = ' ';
+ }
+
+ /*
+ * Check if this tag is autoliteral
+ */
+ public function isAutoLiteral()
+ {
+ return $this->smarty->auto_literal && isset($this->value[ $this->ldel_length ]) ?
+ strpos(" \n\t\r", $this->value[ $this->ldel_length ]) !== false : false;
+ }
+
+ private $_yy_state = 1;
+
+ private $_yy_stack = array();
+
+ 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 =
+ "/\G([{][}])|\G(" . $this->ldel . "[*])|\G((" . $this->ldel . "\\s*php([ ].*?)?" . $this->rdel . ")|(" .
+ $this->ldel . "\\s*[\/]php" . $this->rdel . "))|\G(" . $this->ldel . "\\s*literal\\s*" . $this->rdel .
+ ")|\G(" . $this->ldel . "\\s*)|\G(\\s*" . $this->rdel .
+ ")|\G((<[?]((php\\s+|=)|\\s+))|(<[%])|(<[?]xml\\s+)|(